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!, #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)
68 69 70 71 72 73 74 |
# File 'lib/osctld/send_receive/commands/receive_base.rb', line 68 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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# 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 r, w = IO.pipe mbuffer_pid = Process.spawn( 'mbuffer', '-q', *Daemon.get.config.send_receive.receive_mbuffer., in: io, out: w ) recv_pid = Process.spawn( 'zfs', 'recv', '-F', '-u', ds.name, in: r ) io.close r.close w.close Process.wait(mbuffer_pid) Process.wait(recv_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 |