From 95c8a36dfc7e63f23eae3b411fd1a371da6f774c Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 22 Nov 2019 17:14:06 +0100 Subject: [rebootcontrol] Start adding WOL functionality --- .../rebootcontrol/inc/rebootcontrol.inc.php | 64 ++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'modules-available/rebootcontrol/inc/rebootcontrol.inc.php') diff --git a/modules-available/rebootcontrol/inc/rebootcontrol.inc.php b/modules-available/rebootcontrol/inc/rebootcontrol.inc.php index ec4b84ed..680f9eff 100644 --- a/modules-available/rebootcontrol/inc/rebootcontrol.inc.php +++ b/modules-available/rebootcontrol/inc/rebootcontrol.inc.php @@ -82,4 +82,68 @@ class RebootControl return $return; } + /** + * Execute given command or script on a list of hosts. The list of hosts is an array of structs containing + * each a known machine-uuid and/or hostname, and optionally a port to use, which would otherwise default to 9922, + * and optionally a username to use, which would default to root. + * The command should be compatible with the remote user's default shell (most likely bash). + * + * @param array $clients [ { clientip: , machineuuid: , port: , username: }, ... ] + * @param string $command Command or script to execute on client + * @param int $timeout in seconds + * @param string|false $privkey SSH private key to use to connect + * @return array|false + */ + public static function runScript($clients, $command, $timeout = 5, $privkey = false) + { + $valid = []; + $invalid = []; + foreach ($clients as $client) { + if (is_string($client)) { + $invalid[strtoupper($client)] = []; // Assume machineuuid + } elseif (!isset($client['clientip']) && !isset($client['machineuuid'])) { + error_log('RebootControl::runScript called with list entry that has neither IP nor UUID'); + } elseif (!isset($client['clientip'])) { + $invalid[$client['machineuuid']] = $client; + } else { + $valid[] = $client; + } + } + if (!empty($invalid)) { + $res = Database::simpleQuery('SELECT machineuuid, clientip FROM machine WHERE machineuuid IN (:uuids)', + ['uuids' => array_keys($invalid)]); + while ($row = $res->fetch(PDO::FETCH_ASSOC)) { + if (isset($invalid[$row['machineuuid']])) { + $valid[] = $row + $invalid[$row['machineuuid']]; + } else { + $valid[] = $row; + } + } + } + if ($privkey === false) { + $privkey = SSHKey::getPrivateKey(); + } + return Taskmanager::submit('RemoteExec', [ + 'clients' => $valid, + 'command' => $command, + 'timeoutSeconds' => $timeout, + 'sshkey' => $privkey, + 'port' => 9922, // Fallback if no port given in client struct + ]); + } + + public static function connectionCheckCallback($task, $hostId) + { + $reachable = 0; + if (isset($task['data']['result'])) { + foreach ($task['data']['result'] as $res) { + if ($res['exitCode'] == 0) { + $reachable = 1; + } + } + } + Database::exec('UPDATE reboot_jumphost SET reachable = :reachable WHERE hostid = :id', + ['id' => $hostId, 'reachable' => $reachable]); + } + } \ No newline at end of file -- cgit v1.2.3-55-g7522