diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -841,6 +841,7 @@ 'DrydockManagementCreateResourceWorkflow' => 'applications/drydock/management/DrydockManagementCreateResourceWorkflow.php', 'DrydockManagementLeaseWorkflow' => 'applications/drydock/management/DrydockManagementLeaseWorkflow.php', 'DrydockManagementReleaseWorkflow' => 'applications/drydock/management/DrydockManagementReleaseWorkflow.php', + 'DrydockManagementRunCommandWorkflow' => 'applications/drydock/management/DrydockManagementRunCommandWorkflow.php', 'DrydockManagementWorkflow' => 'applications/drydock/management/DrydockManagementWorkflow.php', 'DrydockPreallocatedHostBlueprintImplementation' => 'applications/drydock/blueprint/DrydockPreallocatedHostBlueprintImplementation.php', 'DrydockQuery' => 'applications/drydock/query/DrydockQuery.php', @@ -4528,6 +4529,7 @@ 'DrydockManagementCreateResourceWorkflow' => 'DrydockManagementWorkflow', 'DrydockManagementLeaseWorkflow' => 'DrydockManagementWorkflow', 'DrydockManagementReleaseWorkflow' => 'DrydockManagementWorkflow', + 'DrydockManagementRunCommandWorkflow' => 'DrydockManagementWorkflow', 'DrydockManagementWorkflow' => 'PhabricatorManagementWorkflow', 'DrydockPreallocatedHostBlueprintImplementation' => 'DrydockBlueprintImplementation', 'DrydockQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', diff --git a/src/applications/drydock/management/DrydockManagementRunCommandWorkflow.php b/src/applications/drydock/management/DrydockManagementRunCommandWorkflow.php new file mode 100644 --- /dev/null +++ b/src/applications/drydock/management/DrydockManagementRunCommandWorkflow.php @@ -0,0 +1,55 @@ +setName('run-command') + ->setSynopsis(pht('Run a command on a remote host.')) + ->setArguments( + array( + array( + 'name' => 'id', + 'param' => 'lease', + 'help' => 'The Drydock lease ID.', + ), + array( + 'name' => 'command', + 'param' => 'command', + 'help' => 'The command to run on the remote host.', + ), + )); + } + + public function execute(PhutilArgumentParser $args) { + $console = PhutilConsole::getConsole(); + + $id = $args->getArg('id'); + if (!$id) { + throw new PhutilArgumentUsageException(pht( + 'Specify a lease ID to run the command on.')); + } + + $viewer = $this->getViewer(); + + $lease = id(new DrydockLeaseQuery()) + ->setViewer($viewer) + ->withIDs(array($id)) + ->executeOne(); + if (!$lease) { + $console->writeErr("Lease %d does not exist!\n", $id); + return 1; + } else { + $interface = $lease->getInterface('command'); + $future = $interface->getExecFuture('%C', $args->getArg('command')); + + list($err, $stdout, $stderr) = $future->resolve(); + $console->writeOut('%s', $stdout); + $console->writeErr('%s', $stderr); + return $err; + } + + } + +}