(2003-2009) * @author Froxlor team (2010-) * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * @package Cron * */ // necessary includes require_once makeCorrectFile(dirname(__FILE__) . '/cron_tasks.inc.dns.10.bind.php'); require_once makeCorrectFile(dirname(__FILE__) . '/cron_tasks.inc.http.10.apache.php'); require_once makeCorrectFile(dirname(__FILE__) . '/cron_tasks.inc.http.15.apache_fcgid.php'); require_once makeCorrectFile(dirname(__FILE__) . '/cron_tasks.inc.http.20.lighttpd.php'); require_once makeCorrectFile(dirname(__FILE__) . '/cron_tasks.inc.http.25.lighttpd_fcgid.php'); require_once makeCorrectFile(dirname(__FILE__) . '/cron_tasks.inc.http.30.nginx.php'); require_once makeCorrectFile(dirname(__FILE__) . '/cron_tasks.inc.http.35.nginx_phpfpm.php'); /** * LOOK INTO TASKS TABLE TO SEE IF THERE ARE ANY UNDONE JOBS */ fwrite($debugHandler, ' cron_tasks: Searching for tasks to do' . "\n"); $cronlog->logAction(CRON_ACTION, LOG_INFO, "Searching for tasks to do"); $result_tasks_stmt = Database::query(" SELECT `id`, `type`, `data` FROM `" . TABLE_PANEL_TASKS . "` ORDER BY `id` ASC "); $num_results = Database::num_rows(); $resultIDs = array(); while ($row = $result_tasks_stmt->fetch(PDO::FETCH_ASSOC)) { $resultIDs[] = $row['id']; if ($row['data'] != '') { $row['data'] = unserialize($row['data']); } /** * TYPE=1 MEANS TO REBUILD APACHE VHOSTS.CONF */ if ($row['type'] == '1') { // get configuration-I/O object $configio = new ConfigIO($settings); // clean up old configs $configio->cleanUp(); if (!isset($webserver)) { if ($settings['system']['webserver'] == "apache2") { $websrv = 'apache'; if ($settings['system']['mod_fcgid'] == 1 || $settings['phpfpm']['enabled'] == 1) { $websrv .= '_fcgid'; } } elseif ($settings['system']['webserver'] == "lighttpd") { $websrv = 'lighttpd'; if ($settings['system']['mod_fcgid'] == 1 || $settings['phpfpm']['enabled'] == 1) { $websrv .= '_fcgid'; } } elseif($settings['system']['webserver'] == "nginx") { $websrv = 'nginx'; if ($settings['phpfpm']['enabled'] == 1) { $websrv .= '_phpfpm'; } } $webserver = new $websrv($cronlog, $debugHandler, $idna_convert, $settings); } if (isset($webserver)) { $webserver->createIpPort(); $webserver->createVirtualHosts(); $webserver->createFileDirOptions(); $webserver->writeConfigs(); $webserver->createOwnVhostStarter(); $webserver->reload(); } else { echo "Please check you Webserver settings\n"; } /** * FIXME * as we might have a change from mod_php to fcgid/fpm or the other way around * we need to check customer directory permissions * -> 0.9.31 */ } /** * TYPE=2 MEANS TO CREATE A NEW HOME AND CHOWN */ elseif ($row['type'] == '2') { fwrite($debugHandler, ' cron_tasks: Task2 started - create new home' . "\n"); $cronlog->logAction(CRON_ACTION, LOG_INFO, 'Task2 started - create new home'); if (is_array($row['data'])) { // define paths $userhomedir = makeCorrectDir($settings['system']['documentroot_prefix'] . '/' . $row['data']['loginname'] . '/'); $usermaildir = makeCorrectDir($settings['system']['vmail_homedir'] . '/' . $row['data']['loginname'] . '/'); // stats directory if ($settings['system']['awstats_enabled'] == '1') { $cronlog->logAction(CRON_ACTION, LOG_NOTICE, 'Running: mkdir -p ' . escapeshellarg($userhomedir . 'awstats')); safe_exec('mkdir -p ' . escapeshellarg($userhomedir . 'awstats')); // in case we changed from the other stats -> remove old // (yes i know, the stats are lost - that's why you should not change all the time!) if (file_exists($userhomedir . 'webalizer')) { safe_exec('rm -rf ' . escapeshellarg($userhomedir . 'webalizer')); } } else { $cronlog->logAction(CRON_ACTION, LOG_NOTICE, 'Running: mkdir -p ' . escapeshellarg($userhomedir . 'webalizer')); safe_exec('mkdir -p ' . escapeshellarg($userhomedir . 'webalizer')); // in case we changed from the other stats -> remove old // (yes i know, the stats are lost - that's why you should not change all the time!) if (file_exists($userhomedir . 'awstats')) { safe_exec('rm -rf ' . escapeshellarg($userhomedir . 'awstats')); } } // maildir $cronlog->logAction(CRON_ACTION, LOG_NOTICE, 'Running: mkdir -p ' . escapeshellarg($usermaildir)); safe_exec('mkdir -p ' . escapeshellarg($usermaildir)); //check if admin of customer has added template for new customer directories if ((int)$row['data']['store_defaultindex'] == 1) { storeDefaultIndex($row['data']['loginname'], $userhomedir, $cronlog, true); } // strip of last slash of paths to have correct chown results $userhomedir = (substr($userhomedir, 0, -1) == '/') ? substr($userhomedir, 0, -1) : $userhomedir; $usermaildir = (substr($usermaildir, 0, -1) == '/') ? substr($usermaildir, 0, -1) : $usermaildir; $cronlog->logAction(CRON_ACTION, LOG_NOTICE, 'Running: chown -R ' . (int)$row['data']['uid'] . ':' . (int)$row['data']['gid'] . ' ' . escapeshellarg($userhomedir)); safe_exec('chown -R ' . (int)$row['data']['uid'] . ':' . (int)$row['data']['gid'] . ' ' . escapeshellarg($userhomedir)); $cronlog->logAction(CRON_ACTION, LOG_NOTICE, 'Running: chown -R ' . (int)$settings['system']['vmail_uid'] . ':' . (int)$settings['system']['vmail_gid'] . ' ' . escapeshellarg($usermaildir)); safe_exec('chown -R ' . (int)$settings['system']['vmail_uid'] . ':' . (int)$settings['system']['vmail_gid'] . ' ' . escapeshellarg($usermaildir)); } } /** * TYPE=4 MEANS THAT SOMETHING IN THE BIND CONFIG HAS CHANGED. REBUILD froxlor_bind.conf IF BIND IS ENABLED */ elseif ($row['type'] == '4' && (int)$settings['system']['bind_enable'] != 0) { if (!isset($nameserver)) { $nameserver = new bind($cronlog, $debugHandler, $settings); } if ($settings['dkim']['use_dkim'] == '1') { $nameserver->writeDKIMconfigs(); } $nameserver->writeConfigs(); } /** * TYPE=5 MEANS THAT A NEW FTP-ACCOUNT HAS BEEN CREATED, CREATE THE DIRECTORY */ elseif ($row['type'] == '5') { $cronlog->logAction(CRON_ACTION, LOG_INFO, 'Creating new FTP-home'); // FIXME %_backup clause not necessary after backup-feature is being removed $result_directories_stmt = Database::query(" SELECT `f`.`homedir`, `f`.`uid`, `f`.`gid`, `c`.`documentroot` AS `customerroot` FROM `" . TABLE_FTP_USERS . "` `f` LEFT JOIN `" . TABLE_PANEL_CUSTOMERS . "` `c` USING (`customerid`) WHERE `f`.`username` NOT LIKE '%_backup' "); while ($directory = $result_directories_stmt->fetch(PDO::FETCH_ASSOC)) { mkDirWithCorrectOwnership($directory['customerroot'], $directory['homedir'], $directory['uid'], $directory['gid']); } } /** * TYPE=6 MEANS THAT A CUSTOMER HAS BEEN DELETED AND THAT WE HAVE TO REMOVE ITS FILES */ elseif ($row['type'] == '6') { fwrite($debugHandler, ' cron_tasks: Task6 started - deleting customer data' . "\n"); $cronlog->logAction(CRON_ACTION, LOG_INFO, 'Task6 started - deleting customer data'); if (is_array($row['data'])) { if (isset($row['data']['loginname'])) { // remove homedir $homedir = makeCorrectDir($settings['system']['documentroot_prefix'] . '/' . $row['data']['loginname']); if (file_exists($homedir) && $homedir != '/' && $homedir != $settings['system']['documentroot_prefix'] && substr($homedir, 0, strlen($settings['system']['documentroot_prefix'])) == $settings['system']['documentroot_prefix'] ) { $cronlog->logAction(CRON_ACTION, LOG_NOTICE, 'Running: rm -rf ' . escapeshellarg($homedir)); safe_exec('rm -rf '.escapeshellarg($homedir)); } // remove backup dir // FIXME remove when backup-feature has been removed $backupdir = makeCorrectDir($settings['system']['backup_dir'] . $row['data']['loginname']); if (file_exists($backupdir) && $backupdir != '/' && $backupdir != $settings['system']['backup_dir'] && substr($backupdir, 0, strlen($settings['system']['backup_dir'])) == $settings['system']['backup_dir'] ) { $cronlog->logAction(CRON_ACTION, LOG_NOTICE, 'Running: rm -rf ' . escapeshellarg($backupdir)); safe_exec('rm -rf '.escapeshellarg($backupdir)); } // remove maildir $maildir = makeCorrectDir($settings['system']['vmail_homedir'] . '/' . $row['data']['loginname']); if (file_exists($maildir) && $maildir != '/' && $maildir != $settings['system']['vmail_homedir'] && substr($maildir, 0, strlen($settings['system']['vmail_homedir'])) == $settings['system']['vmail_homedir'] && is_dir($maildir) && fileowner($maildir) == $settings['system']['vmail_uid'] && filegroup($maildir) == $settings['system']['vmail_gid'] ) { $cronlog->logAction(CRON_ACTION, LOG_NOTICE, 'Running: rm -rf ' . escapeshellarg($maildir)); safe_exec('rm -rf '.escapeshellarg($maildir)); } // remove tmpdir if it exists $tmpdir = makeCorrectDir($settings['system']['mod_fcgid_tmpdir'] . '/' . $row['data']['loginname'] . '/'); if (file_exists($tmpdir) && is_dir($tmpdir) && $tmpdir != "/" && $tmpdir != $settings['system']['mod_fcgid_tmpdir'] && substr($tmpdir, 0, strlen($settings['system']['mod_fcgid_tmpdir'])) == $settings['system']['mod_fcgid_tmpdir'] ) { $cronlog->logAction(CRON_ACTION, LOG_NOTICE, 'Running: rm -rf ' . escapeshellarg($tmpdir)); safe_exec('rm -rf '.escapeshellarg($tmpdir)); } // webserver logs $logsdir = makeCorrectFile($settings['system']['logfiles_directory'].'/'.$row['data']['loginname']); if (file_exists($logsdir) && $logsdir != '/' && $logsdir != makeCorrectDir($settings['system']['logfiles_directory']) && substr($logsdir, 0, strlen($settings['system']['logfiles_directory'])) == $settings['system']['logfiles_directory'] ) { // build up wildcard for webX-{access,error}.log{*} $logfiles .= '-*'; safe_exec('rm -f '.escapeshellarg($logfiles)); } } } } /** * TYPE=7 Customer deleted an email account and wants the data to be deleted on the filesystem */ elseif ($row['type'] == '7') { fwrite($debugHandler, ' cron_tasks: Task7 started - deleting customer e-mail data' . "\n"); $cronlog->logAction(CRON_ACTION, LOG_INFO, 'Task7 started - deleting customer e-mail data'); if (is_array($row['data'])) { if (isset($row['data']['loginname']) && isset($row['data']['email']) ) { // remove specific maildir $email_full = $row['data']['email']; if (empty($email_full)) { $cronlog->logAction(CRON_ACTION, LOG_ERROR, 'FATAL: Task7 asks to delete a email account but email field is empty!'); } $email_user = substr($email_full,0,strrpos($email_full,"@")); $email_domain = substr($email_full,strrpos($email_full,"@")+1); $maildirname = trim($settings['system']['vmail_maildirname']); // Add trailing slash to Maildir if needed $maildirpath = $maildirname; if (!empty($maildirname) and substr($maildirname,-1) != "/") { $maildirpath .= "/"; } $maildir = makeCorrectDir($settings['system']['vmail_homedir'] .'/'. $row['data']['loginname'] .'/'. $email_domain .'/'. $email_user); if ($maildir != '/' && !empty($maildir) && !empty($email_full) && $maildir != $settings['system']['vmail_homedir'] && substr($maildir, 0, strlen($settings['system']['vmail_homedir'])) == $settings['system']['vmail_homedir'] && is_dir($maildir) && is_dir(makeCorrectDir($maildir.'/'.$maildirpath)) && fileowner($maildir) == $settings['system']['vmail_uid'] && filegroup($maildir) == $settings['system']['vmail_gid'] ) { $cronlog->logAction(CRON_ACTION, LOG_NOTICE, 'Running: rm -rf ' . escapeshellarg($maildir)); safe_exec('rm -rf '.escapeshellarg($maildir)); } else { // backward-compatibility for old folder-structure $maildir_old = makeCorrectDir($settings['system']['vmail_homedir'] .'/'. $row['data']['loginname'] .'/'. $row['data']['email']); if ($maildir_old != '/' && !empty($maildir_old) && $maildir_old != $settings['system']['vmail_homedir'] && substr($maildir_old, 0, strlen($settings['system']['vmail_homedir'])) == $settings['system']['vmail_homedir'] && is_dir($maildir_old) && fileowner($maildir_old) == $settings['system']['vmail_uid'] && filegroup($maildir_old) == $settings['system']['vmail_gid'] ) { $cronlog->logAction(CRON_ACTION, LOG_NOTICE, 'Running: rm -rf ' . escapeshellarg($maildir_old)); safe_exec('rm -rf '.escapeshellarg($maildir_old)); } } } } } /** * TYPE=8 Customer deleted a ftp account and wants the homedir to be deleted on the filesystem * refs #293 */ elseif ($row['type'] == '8') { fwrite($debugHandler, ' cron_tasks: Task8 started - deleting customer ftp homedir' . "\n"); $cronlog->logAction(CRON_ACTION, LOG_INFO, 'Task8 started - deleting customer ftp homedir'); if (is_array($row['data'])) { if (isset($row['data']['loginname']) && isset($row['data']['homedir']) ) { // remove specific homedir $ftphomedir = makeCorrectDir($row['data']['homedir']); $customerdocroot = makeCorrectDir($settings['system']['documentroot_prefix'].'/'.$row['data']['loginname'].'/'); if(file_exists($ftphomedir) && $ftphomedir != '/' && $ftphomedir != $settings['system']['documentroot_prefix'] && $ftphomedir != $customerdocroot ) { $cronlog->logAction(CRON_ACTION, LOG_NOTICE, 'Running: rm -rf ' . escapeshellarg($ftphomedir)); safe_exec('rm -rf '.escapeshellarg($ftphomedir)); } } } } /** * TYPE=10 Set the filesystem - quota */ elseif ($row['type'] == '10' && (int)$settings['system']['diskquota_enabled'] != 0) { fwrite($debugHandler, ' cron_tasks: Task10 started - setting filesystem quota' . "\n"); $cronlog->logAction(CRON_ACTION, LOG_INFO, 'Task10 started - setting filesystem quota'); $usedquota = getFilesystemQuota(); // Select all customers Froxlor knows about $result_stmt = Database::query("SELECT `guid`, `loginname`, `diskspace` FROM `" . TABLE_PANEL_CUSTOMERS . "`;"); while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) { // We do not want to set a quota for root by accident if ($row['guid'] != 0) { // The user has no quota in Froxlor, but on the filesystem if (($row['diskspace'] == 0 || $row['diskspace'] == -1024) && $usedquota[$row['guid']]['block']['hard'] != 0 ) { $cronlog->logAction(CRON_ACTION, LOG_NOTICE, "Disabling quota for " . $row['loginname']); safe_exec($settings['system']['diskquota_quotatool_path'] . " -u " . $row['guid'] . " -bl 0 -q 0 " . escapeshellarg($settings['system']['diskquota_customer_partition'])); } // The user quota in Froxlor is different than on the filesystem elseif ($row['diskspace'] != $usedquota[$row['guid']]['block']['hard'] && $row['diskspace'] != -1024 ) { $cronlog->logAction(CRON_ACTION, LOG_NOTICE, "Setting quota for " . $row['loginname'] . " from " . $usedquota[$row['guid']]['block']['hard'] . " to " . $row['diskspace']); safe_exec($settings['system']['diskquota_quotatool_path'] . " -u " . $row['guid'] . " -bl " . $row['diskspace'] . " -q " . $row['diskspace'] . " " . escapeshellarg($settings['system']['diskquota_customer_partition'])); } } } } } if ($num_results != 0) { $where = array(); $where_data = array(); foreach ($resultIDs as $id) { $where[] = "`id` = :id_" . (int)$id; $where_data['id_'.$id] = $id; } $where = implode($where, ' OR '); $del_stmt = Database::prepare("DELETE FROM `" . TABLE_PANEL_TASKS . "` WHERE " . $where); Database::pexecute($del_stmt, $where_data); unset($resultIDs); unset($where); } Database::query("UPDATE `" . TABLE_PANEL_SETTINGS . "` SET `value` = UNIX_TIMESTAMP() WHERE `settinggroup` = 'system' AND `varname` = 'last_tasks_run';");