/** * Create cron file for one user * * @param int $userID * @param string $userName * @return mixed */ protected static function handleCronjobForUser($userID, $userName) { System_Daemon::debug('Starting "handleCronjobForUser" subprocess.'); // Due to bug https://bugs.launchpad.net/ubuntu/+source/cron/+bug/706565 all . in username must be removed or // replaced. Otherwise the cronjobs never run. $confUser = str_replace('.', '_', $userName); $confFile = DaemonConfig::$distro->{'CRON_DIR'} . '/EasySCP_' . $confUser; $sql_param = array(':user_id' => $userID, ':active' => 'yes'); $sql_query = "\n\t\t\tSELECT\n\t\t\t\t*\n\t\t\tFROM\n\t\t\t\tcronjobs\n\t\t\tWHERE\n\t\t\t\tactive = :active\n\t\t\tAND\n\t\t\t\tuser_id = :user_id\n\t\t"; DB::prepare($sql_query); $cronData = DB::execute($sql_param); if ($cronData->rowCount() == 0) { @unlink($confFile); } else { $tpl_param = array('ADMIN' => $userName); $tpl = DaemonCommon::getTemplate($tpl_param); while ($cronJob = $cronData->fetch()) { $tpl->append(array('DESCRIPTION' => "# " . $cronJob['description'], 'SCHEDULE' => $cronJob['schedule'], 'USER' => $cronJob['user'], 'COMMAND' => $cronJob['command'])); } // write Cron config $config = $tpl->fetch("tpl/cron.tpl"); System_Daemon::debug($confFile); $retVal = DaemonCommon::systemWriteContentToFile($confFile, $config, DaemonConfig::$cfg->{'ROOT_USER'}, DaemonConfig::$cfg->{'ROOT_GROUP'}, 0644, false); if ($retVal !== true) { $msg = 'Failed to write' . $confFile; System_Daemon::warning($msg); return $msg . '<br />' . $retVal; } else { System_Daemon::debug($confFile . ' successfully written!'); } } System_Daemon::debug('Finished "handleCronjobForUser" subprocess.'); return true; }
function myHandler($signal) { if ($signal === SIGTERM) { System_Daemon::warning('I received the termination signal. ' . $sig); // Execute some final code // and be sure to: System_Daemon::stop(); } }
/** * Handles DaemonCore requests. * * @param string $Input * @return boolean */ public static function Start($Input) { System_Daemon::debug('Starting "DaemonCore::Start" subprocess.'); $retVal = null; $Input = explode(" ", $Input, 2); switch ($Input[0]) { case 'checkAll': $retVal = self::checkAllData(); break; case 'Restart': System_Daemon::info('Running Restart subprocess.'); SocketHandler::Close(); System_Daemon::restart(); break; case 'SaveConfig': System_Daemon::debug('Running SaveConfig subprocess.'); if (isset($Input[1]) && is_array($Input[1])) { foreach (json_decode(trim($Input[1])) as $name => $wert) { if (isset(DaemonConfig::$cfg->{$name})) { DaemonConfig::$cfg->{$name} = $wert; } } } DaemonConfig::Save(); DaemonConfig::SaveOldConfig(); System_Daemon::debug('Finished SaveConfig subprocess.'); $retVal = true; break; case 'Setup': if (file_exists(dirname(__FILE__) . '/DaemonCoreSetup.php')) { require_once dirname(__FILE__) . '/DaemonCoreSetup.php'; if (isset($Input[1]) && $Input[1] != '') { $retVal = Setup($Input[1]); } } else { $retVal = false; } break; default: System_Daemon::warning("Don't know what to do with " . $Input[0]); $retVal = false; break; } System_Daemon::debug('Finished "DaemonCore::Start" subprocess.'); return $retVal; }
protected static function handleSubDomainAlias($subDomainAliasData) { System_Daemon::debug('Starting "DaemonDomain::handleSubDomainAlias = ' . $subDomainAliasData['subdomain_name'] . '.' . $subDomainAliasData['alias_name'] . '" subprocess.'); switch ($subDomainAliasData['alias_status']) { case 'add': $retVal = self::apacheWriteDomainConfig($subDomainAliasData); if ($retVal !== true) { $msg = 'Writing subdomain-alias configuration failed'; System_Daemon::debug($msg); return $msg . '<br />' . $retVal; } $retVal = DaemonDNS::AddDNSEntry($subDomainAliasData); if ($retVal !== true) { $msg = 'Creating of subdomain-alias dns entry failed'; System_Daemon::debug($msg); return $msg . '<br />' . $retVal; } break; case 'change': $retVal = self::apacheWriteDomainConfig($subDomainAliasData); if ($retVal !== true) { $msg = 'Writing subdomain-alias configuration failed'; System_Daemon::debug($msg); return $msg . '<br />' . $retVal; } break; case 'delete': $retVal = self::deleteAliasSubDomain($subDomainAliasData); if ($retVal !== true) { $msg = 'Deleting of subdomain-alias failed'; System_Daemon::debug($msg); return $msg . '<br />' . $retVal; } $retVal = DaemonDNS::DeleteDNSEntry($subDomainAliasData); if ($retVal !== true) { $msg = 'Deleting of subdomain-alias dns entry failed'; System_Daemon::debug($msg); return $msg . '<br />' . $retVal; } break; case 'ok': // Configuration has to be rewritten every time to ensure that // all domains and subdomains are completely configured $retVal = self::apacheWriteDomainConfig($subDomainAliasData); if ($retVal !== true) { $msg = 'Writing subdomain-alias configuration failed'; System_Daemon::debug($msg); return $msg . '<br />' . $retVal; } break; default: $msg = "Don't know what to do with " . $subDomainAliasData['status'] . " (handlesubdomainalias)"; System_Daemon::warning($msg); return $msg . '<br />'; break; } if ($retVal === true) { $retVal = self::dbSetAliasSubDomainStatus('ok', $subDomainAliasData['subdomain_alias_id']); if ($retVal !== true) { $msg = 'Setting Aliassubdomain status failed'; System_Daemon::debug($msg); return $msg . '<br />' . $retVal; } } return true; }
/** * Handles DaemonSystem requests * * @param string $Input * @return mixed */ public static function Start($Input) { System_Daemon::debug('Starting "DaemonSystem::Start" subprocess.'); $data = explode(" ", $Input); switch ($data[0]) { case 'cron': System_Daemon::debug('Starting "cron" subprocess.'); $retVal = self::handleCronjobsForAllUsers(); if ($retVal !== true) { System_Daemon::warning('Failed to handle Cronjobs'); System_Daemon::debug('Finished "cron" subprocess.'); return false; } System_Daemon::debug('Finished "cron" subprocess.'); break; case 'direxists': System_Daemon::debug('Starting "direxists" subprocess.'); if (is_dir($data[1])) { System_Daemon::debug('Directory ' . $data[1] . ' exists'); System_Daemon::debug('Finished "direxists" subprocess.'); return true; } else { System_Daemon::debug('Directory ' . $data[1] . ' does not exist'); System_Daemon::debug('Finished "direxists" subprocess.'); return false; } break; case 'fileexists': System_Daemon::debug('Starting "fileexists" subprocess.'); if (is_file($data[1])) { System_Daemon::debug('File ' . $data[1] . ' exists'); System_Daemon::debug('Finished "fileexists" subprocess.'); return true; } else { System_Daemon::debug('File ' . $data[1] . ' does not exist'); System_Daemon::debug('Finished "fileexists" subprocess.'); return false; } break; case 'isexecutable': System_Daemon::debug('Starting "isexecutable" subprocess.'); $internalCMD = explode(',', DaemonConfig::$cmd->SHELL_INTERNAL_CMDS); System_Daemon::debug(DaemonConfig::$cmd->SHELL_INTERNAL_CMDS); if (in_array($data[1], $internalCMD)) { System_Daemon::debug('Command ' . $data[1] . ' is an internal command'); System_Daemon::debug('Finished "isexecutable" subprocess.'); return true; } if (self::Start('fileexists ' . $data[1])) { if (is_executable($data[1])) { System_Daemon::debug('File ' . $data[1] . ' is executable'); System_Daemon::debug('Finished "isexecutable" subprocess.'); return true; } else { System_Daemon::debug('File ' . $data[1] . ' is not executable'); System_Daemon::debug('Finished "isexecutable" subprocess.'); return false; } } else { System_Daemon::debug('Finished "isexecutable" subprocess.'); return false; } break; case 'rebuildConfig': System_Daemon::debug('Starting "rebuildConfig" subprocess.'); $rebuildConfig = DaemonConfigCommon::rebuildConfig($data[1]); if ($rebuildConfig !== true) { return $rebuildConfig; } System_Daemon::debug('Finished "rebuildConfig" subprocess.'); break; case 'setPermissions': System_Daemon::debug('Starting "setPermissions" subprocess.'); DaemonCommon::systemSetSystemPermissions(); DaemonCommon::systemSetGUIPermissions(); System_Daemon::debug('Finished "setPermissions" subprocess.'); break; case 'updateIana': System_Daemon::debug('Starting "updateIana" subprocess.'); self::updateIanaXML(); DaemonCommon::systemSetFolderPermissions(EasyConfig_PATH . 'Iana_TLD.xml', 'root', 'root', '644'); System_Daemon::debug('Finished "updateIana" subprocess.'); break; case 'updateSystem': System_Daemon::debug('Starting "updateSystem" subprocess.'); if (self::verifySystemUpdate()) { self::handleSystemUpdate(); } System_Daemon::debug('Finished "updateSystem" subprocess.'); break; case 'userexists': System_Daemon::debug('Starting "userexists" subprocess.'); exec(DaemonConfig::$cmd->CMD_ID . ' -u ' . $data['1'] . ' 2>&1', $result, $error); if ($error != 0) { System_Daemon::debug('User ' . $data['1'] . ' does not exist'); unset($result); return false; } System_Daemon::debug('Finished "userexists" subprocess.'); break; default: System_Daemon::warning("Don't know what to do with " . $data[0]); return false; } System_Daemon::debug('Finished "DaemonSystem::Start" subprocess.'); return true; }
* and stopped directly. You should find a log enty in * /var/log/optest.log * */ // Make it possible to test in source directory // This is for PEAR developers only ini_set('include_path', ini_get('include_path') . ':..'); // Include Class error_reporting(E_ALL); require_once 'System/Daemon.php'; // Bare minimum setup System_Daemon::setOption('appName', 'optest'); System_Daemon::setOption('authorEmail', '*****@*****.**'); System_Daemon::setOption('logLocation', '/var/log/sysdaemon.devtest.log'); System_Daemon::setOption('logFilePosition', true); System_Daemon::warning('{appName} daemon encountered an empty appPidLocation'); System_Daemon::err('{appName} daemon encountered an empty appPidLocation'); die; $options = array(); $options['appName'] = 'devtest'; $options['appExecutable'] = 'devtest.php'; $options['appDir'] = realpath(dirname(__FILE__)); $options['appDescription'] = 'Developer test daemon'; $options['authorName'] = 'kevman'; $options['authorEmail'] = '*****@*****.**'; if (($os = System_Daemon_OS::factory('BSD')) === false) { echo 'Cannot create OS\\n'; } else { print_r($os->errors); echo '\\n'; echo $os->getAutoRunTemplatePath();
protected static function writeMasterConfig() { $append = false; $sysGroup = DaemonConfig::$cfg->APACHE_SUEXEC_USER_PREF . DaemonConfig::$cfg->APACHE_SUEXEC_MIN_GID; $sysUser = DaemonConfig::$cfg->APACHE_SUEXEC_USER_PREF . DaemonConfig::$cfg->APACHE_SUEXEC_MIN_UID; $sql_query = "\n\t\t\tSELECT\n\t\t\t\t*\n\t\t\tFROM\n\t\t\t\tconfig\n\t\t\tWHERE\n\t\t\t\tname IN (\n\t\t\t\t\t'SSL_KEY',\n\t\t\t\t\t'SSL_CERT',\n\t\t\t\t\t'SSL_CACERT',\n\t\t\t\t\t'SSL_STATUS')\n\t\t"; $rs = DB::query($sql_query); $sslData = array(); while ($row = $rs->fetch()) { $sslData[strtolower($row['name'])] = $row['value']; } $tpl_param = array('BASE_SERVER_IP' => DaemonConfig::$cfg->BASE_SERVER_IP, 'SUEXEC_GID' => $sysUser, 'SUEXEC_UID' => $sysGroup, 'DEFAULT_ADMIN_ADDRESS' => DaemonConfig::$cfg->DEFAULT_ADMIN_ADDRESS, 'GUI_ROOT_DIR' => DaemonConfig::$cfg->GUI_ROOT_DIR, 'BASE_SERVER_VHOST' => DaemonConfig::$cfg->BASE_SERVER_VHOST, 'APACHE_LOG_DIR' => DaemonConfig::$distro->APACHE_LOG_DIR, 'PHP_STARTER_DIR' => DaemonConfig::$distro->PHP_STARTER_DIR); if (isset(DaemonConfig::$cfg->BASE_SERVER_IPv6) && DaemonConfig::$cfg->BASE_SERVER_IPv6 != '') { $tpl_param['BASE_SERVER_IPv6'] = DaemonConfig::$cfg->BASE_SERVER_IPv6; } if ($sslData['ssl_status'] == 1) { $tpl_param['BASE_PORT'] = 80; $tpl_param['REDIRECT'] = true; } else { $tpl_param['BASE_PORT'] = 80; } $tpl = DaemonCommon::getTemplate($tpl_param); // write Apache config $config = $tpl->fetch('apache/parts/' . DaemonConfig::$cfg->{'DistName'} . '_' . DaemonConfig::$cfg->{'DistVersion'} . '/00_master.conf.tpl'); $tpl = NULL; unset($tpl); $confFile = DaemonConfig::$cfg->CONF_DIR . '/apache/working/00_master.conf'; $retVal = DaemonCommon::systemWriteContentToFile($confFile, $config, DaemonConfig::$cfg->ROOT_USER, DaemonConfig::$cfg->ROOT_GROUP, 0644, $append); if ($retVal !== true) { $msg = 'Failed to write' . $confFile; System_Daemon::warning($msg); return $msg . '<br />' . $retVal; } if ($sslData['ssl_status'] > 0) { $append = true; $sslData['domain_name'] = 'master'; $retVal = self::writeSSLKeys($sslData); if ($retVal !== true) { $msg = 'Writing SSL keys failed'; System_Daemon::debug($msg); return $msg . '<br />' . $retVal; } $tpl_param['BASE_PORT'] = 443; $tpl_param['SSL_CERT_DIR'] = DaemonConfig::$distro->SSL_CERT_DIR; $tpl_param['SSL_KEY_DIR'] = DaemonConfig::$distro->SSL_KEY_DIR; $tpl_param['REDIRECT'] = false; if (isset($sslData['ssl_cacert']) && $sslData['ssl_cacert'] != '') { $tpl_param['SSL_CACERT'] = true; } $tpl = DaemonCommon::getTemplate($tpl_param); // write Apache config $config = $tpl->fetch('apache/parts/' . DaemonConfig::$cfg->{'DistName'} . '_' . DaemonConfig::$cfg->{'DistVersion'} . '/00_master.conf.tpl'); $tpl = NULL; unset($tpl); $confFile = DaemonConfig::$cfg->CONF_DIR . '/apache/working/00_master.conf'; $retVal = DaemonCommon::systemWriteContentToFile($confFile, $config, DaemonConfig::$cfg->ROOT_USER, DaemonConfig::$cfg->ROOT_GROUP, 0644, $append); if ($retVal !== true) { $msg = 'Failed to write' . $confFile; System_Daemon::warning($msg); return $msg . '<br />' . $retVal; } } exec(DaemonConfig::$cmd->CMD_CP . ' -pf ' . DaemonConfig::$cfg->CONF_DIR . '/apache/working/00_master.conf ' . DaemonConfig::$distro->APACHE_SITES_DIR . '/00_master.conf', $result, $error); return true; }
/** * * @param string $fileName * @param mixed $content * @param mixed $user * @param mixed $group * @param mixed $perm * @param bool $append * @return boolean */ public static function systemWriteContentToFile($fileName, $content, $user, $group, $perm, $append = false) { $flags = $append == true ? FILE_APPEND : 0; if (file_put_contents($fileName, $content, $flags)) { return DaemonCommon::systemSetFilePermissions($fileName, $user, $group, $perm); } else { System_Daemon::warning("Failed to write content to {$fileName}"); return false; } }
/** * @param string $config * @return mixed */ public static function rebuildConfigPass($config = 'system') { System_Daemon::debug('Starting "DaemonConfigCommon::rebuildConfigPass" subprocess.'); switch ($config) { case 'DNS': System_Daemon::debug('Starting "DNS" subprocess.'); $SavePDNSConfig = DaemonConfigDNS::SavePDNSConfig(); if ($SavePDNSConfig !== true) { return $SavePDNSConfig; } System_Daemon::debug('Finished "DNS" subprocess.'); break; case 'FTP': System_Daemon::debug('Starting "FTP" subprocess.'); $SaveProFTPdConfig = DaemonConfigFTP::SaveProFTPdConfig(); if ($SaveProFTPdConfig !== true) { return $SaveProFTPdConfig; } System_Daemon::debug('Finished "FTP" subprocess.'); break; case 'MTA': System_Daemon::debug('Starting "MTA" subprocess.'); $SaveMTAConfig = DaemonConfigMail::SaveMTAConfig(); if ($SaveMTAConfig !== true) { return $SaveMTAConfig; } System_Daemon::debug('Finished "MTA" subprocess.'); break; case 'PMA': System_Daemon::debug('Starting "PMA" subprocess.'); DaemonConfigTools::SavePMAConfig(); System_Daemon::debug('Finished "PMA" subprocess.'); break; case 'RC': System_Daemon::debug('Starting "RC" subprocess.'); DaemonConfigTools::SaveRCConfig(); System_Daemon::debug('Finished "RC" subprocess.'); break; case 'system': System_Daemon::debug('Starting "system" subprocess.'); $SavePDNSConfig = DaemonConfigDNS::SavePDNSConfig(); if ($SavePDNSConfig !== true) { return $SavePDNSConfig; } $SaveProFTPdConfig = DaemonConfigFTP::SaveProFTPdConfig(); if ($SaveProFTPdConfig !== true) { return $SaveProFTPdConfig; } $SaveMTAConfig = DaemonConfigMail::SaveMTAConfig(); if ($SaveMTAConfig !== true) { return $SaveMTAConfig; } System_Daemon::debug('Finished "system" subprocess.'); break; default: System_Daemon::warning("Don't know what to do with " . $config); return false; } System_Daemon::debug('Finished "DaemonConfigCommon::rebuildConfigPass" subprocess.'); return true; }