Class: OsCtld::SendReceive::Commands::ReceiveBase
- Inherits:
-
Base
- Object
- Commands::Base
- Base
- OsCtld::SendReceive::Commands::ReceiveBase
- Includes:
- Utils::Receive
- Defined in:
- lib/osctld/send_receive/commands/receive_base.rb
Instance Attribute Summary
Attributes inherited from Commands::Base
#client, #client_handler, #id, #opts
Instance Method Summary collapse
- #dataset_name(ct) ⇒ Object protected
- #execute ⇒ Object
Methods included from Utils::Receive
Methods inherited from Base
Methods inherited from Commands::Base
#base_execute, #call_cmd, #call_cmd!, cmd, #error, #error!, handle, #handled, #indirect?, #initialize, #manipulate, #manipulation_holder, #ok, #progress, #request_stop, run, run!
Constructor Details
This class inherits a constructor from OsCtld::Commands::Base
Instance Method Details
#dataset_name(ct) ⇒ Object (protected)
46 47 48 49 50 51 52 |
# File 'lib/osctld/send_receive/commands/receive_base.rb', line 46 def dataset_name(ct) if opts[:dataset] == '/' ct.dataset.name else File.join(ct.dataset.name, opts[:dataset]) end end |
#execute ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/osctld/send_receive/commands/receive_base.rb', line 9 def execute ct = SendReceive::Tokens.find_container(opts[:token]) error!('container not found') unless ct ct.manipulate(self, block: true) do error!('this container is not staged') if ct.state != :staged if !ct.send_log || !ct.send_log.can_receive_continue?(:base) error!('invalid send sequence') elsif !check_auth_pubkey(opts[:key_pool], opts[:key_name], ct) error!('authentication key mismatch') end ds = OsCtl::Lib::Zfs::Dataset.new(dataset_name(ct), base: ct.dataset.name) error!('dataset does not exist') unless ds.exist? client.send({status: true, response: 'continue'}.to_json + "\n", 0) io = client.recv_io pid = Process.spawn('zfs', 'recv', '-F', '-u', ds.name, in: io) Process.wait(pid) if $?.exitstatus == 0 ct.exclusively do ct.send_log.state = :base ct.send_log.snapshots << [ds.name, opts[:snapshot]] if opts[:snapshot] ct.save_config end ok else error("unable to receive stream, zfs recv exited with #{$?.exitstatus}") end end end |