_execActions(); } /* This function is called when a change in one of the registered tables is detected. The function then raises the events for the plugins. */ function process($tablename, $action, $data) { // not needed } // end function private function _actionDone($id, $state) { /* * First set the state */ global $app; $sql = "UPDATE sys_remoteaction " . "SET action_state = '" . $app->dbmaster->quote($state) . "' " . "WHERE action_id = " . intval($id); $app->dbmaster->query($sql); /* * Then save the maxid for the next time... */ $fp = fopen(dirname(__FILE__) . "/../lib/remote_action.inc.php", 'wb'); $content = '"; fwrite($fp, $content); fclose($fp); } /** * This method searches for scheduled actions and exec then */ private function _execActions() { global $app; global $conf; /* the id of the server as int */ $server_id = intval($conf["server_id"]); /* * First we (till and i, oliver) thought, it was enough to write * "select from where action_status = 'pending'" and then execute this actions. * But it is not! * If a hacker can hack into a server, she can change the valus of action_status * and so re-exec a action, executed some days bevore. So she can (for example) * stop a service, a admin stopped some days before! To avoid this, we ignore * the status (it is only for the interface to show) and use our own maxid */ include_once (dirname(__FILE__) . "/../lib/remote_action.inc.php"); /* * Get all actions this server should execute */ $sql = "SELECT action_id, action_type, action_param " . "FROM sys_remoteaction " . "WHERE server_id = " . $server_id . " ". " AND action_id > " . intval($maxid_remote_action) . " ". "ORDER BY action_id"; $actions = $app->dbmaster->queryAllRecords($sql); /* * process all actions */ if(is_array($actions)) { foreach ($actions as $action) { if ($action['action_type'] == 'os_update') { /* do the update */ $this->_doOsUpdate($action); /* this action takes so much time, * we stop executing the actions not to waste more time */ return; } if ($action['action_type'] == 'ispc_update') { /* do the update */ $this->_doIspCUpdate($action); /* this action takes so much time, * we stop executing the actions not to waste more time */ return; } } } } private function _doOsUpdate($action) { /* * Do the update */ //TODO : change this when distribution information has been integrated into server record if(file_exists('/etc/gentoo-release')) { exec("glsa-check -f --nocolor affected"); } else { exec("aptitude update"); exec("aptitude upgrade -y"); } /* * All well done! */ $this->_actionDone($action['action_id'], 'ok'); } private function _doIspCUpdate($action) { /* * Get the version-number of the newest version */ $new_version = @file_get_contents('http://www.ispconfig.org/downloads/ispconfig3_version.txt'); $new_version = trim($new_version); /* * Do the update */ /* jump into the temporary dir */ $oldDir = getcwd(); chdir("/tmp"); /* delete the old files (if there are any...) */ exec("rm /tmp/ISPConfig-" . $new_version . ".tar.gz"); exec("rm /tmp/ispconfig3_install -R"); /* get the newest version */ exec("wget http://www.ispconfig.org/downloads/ISPConfig-" . $new_version . ".tar.gz"); /* extract the files */ exec("tar xvfz ISPConfig-" . $new_version . ".tar.gz"); /* * Start the automated update */ chdir("/tmp/ispconfig3_install/install"); exec("touch autoupdate"); exec("php -q autoupdate.php"); /* * do some clean-up */ exec("rm /tmp/ISPConfig-" . $new_version . ".tar.gz"); exec("rm /tmp/ispconfig3_install -R"); /* * go back to the "old path" */ chdir($oldDir); /* * All well done! */ $this->_actionDone($action['action_id'], 'ok'); } } ?>