diff --git a/install/dist/lib/opensuse.lib.php b/install/dist/lib/opensuse.lib.php index fd4b5175a56b1d7a0d28553c46ac36c08406eaee..c66d8886cd680a28171f324c7d25a71dc0f04e33 100644 --- a/install/dist/lib/opensuse.lib.php +++ b/install/dist/lib/opensuse.lib.php @@ -677,7 +677,7 @@ class installer_dist extends installer_base { $content = rf('/etc/apache2/httpd.conf'); if(!stristr($content, 'Include /etc/apache2/sites-enabled/')) { - af('/etc/apache2/httpd.conf', "\n<Directory /srv/www>\n Options FollowSymlinks\n</Directory>\n\nInclude /etc/apache2/sites-enabled/\n\n"); + af('/etc/apache2/httpd.conf', "\n<Directory /srv/www>\n Options +FollowSymlinks\n</Directory>\n\nInclude /etc/apache2/sites-enabled/\n\n"); } unset($content); diff --git a/install/dist/tpl/gentoo/apache_apps.vhost.master b/install/dist/tpl/gentoo/apache_apps.vhost.master index aa90a73afa3442bbbb2f46885bc6c6188224b13b..ac29f81bb3ba72fbc1e06d075e5c039151e5635a 100644 --- a/install/dist/tpl/gentoo/apache_apps.vhost.master +++ b/install/dist/tpl/gentoo/apache_apps.vhost.master @@ -15,7 +15,7 @@ DocumentRoot {apps_vhost_dir} SuexecUserGroup ispapps ispapps <Directory {apps_vhost_dir}> - Options Indexes FollowSymLinks MultiViews +ExecCGI + Options +Indexes +FollowSymLinks +MultiViews +ExecCGI AllowOverride AuthConfig Indexes Limit Options FileInfo <FilesMatch "\.ph(p[3-5]?|tml)$"> SetHandler fcgid-script @@ -31,7 +31,7 @@ DocumentRoot {apps_vhost_dir} AddType application/x-httpd-php .php <Directory {apps_vhost_dir}> - Options FollowSymLinks + Options +FollowSymLinks AllowOverride None Order allow,deny Allow from all diff --git a/install/dist/tpl/gentoo/apache_ispconfig.vhost.master b/install/dist/tpl/gentoo/apache_ispconfig.vhost.master index bfd67bb8eaa3c021027936183b751192f3aea3df..f4f08d2bb6e878d742ae023de172f9d664b189b1 100644 --- a/install/dist/tpl/gentoo/apache_ispconfig.vhost.master +++ b/install/dist/tpl/gentoo/apache_ispconfig.vhost.master @@ -14,7 +14,7 @@ NameVirtualHost *:{vhost_port} DocumentRoot /var/www/ispconfig/ SuexecUserGroup ispconfig ispconfig <Directory /var/www/ispconfig/> - Options Indexes FollowSymLinks MultiViews +ExecCGI + Options +Indexes +FollowSymLinks +MultiViews +ExecCGI AllowOverride AuthConfig Indexes Limit Options FileInfo <FilesMatch "\.ph(p[3-5]?|tml)$"> SetHandler fcgid-script @@ -30,7 +30,7 @@ NameVirtualHost *:{vhost_port} DocumentRoot /usr/local/ispconfig/interface/web/ AddType application/x-httpd-php .php <Directory /usr/local/ispconfig/interface/web> - Options FollowSymLinks + Options +FollowSymLinks AllowOverride None Order allow,deny Allow from all diff --git a/install/sql/incremental/upd_0068.sql b/install/sql/incremental/upd_0068.sql index e7a00181127bf1d992981d7e9ff664253bbb851b..ab6425b0b53b42988caba2716742365d4009ea01 100644 --- a/install/sql/incremental/upd_0068.sql +++ b/install/sql/incremental/upd_0068.sql @@ -1,4 +1,5 @@ ALTER TABLE `dbispconfig`.`web_domain` ADD UNIQUE `serverdomain` ( `server_id` , `domain` ); -DROP INDEX rr ON dns_rr; -ALTER TABLE `dns_rr` CHANGE `name` `name` VARCHAR( 128 ) NOT NULL ; -CREATE INDEX `rr` ON dns_rr (`zone`,`type`,`name`); \ No newline at end of file + +ALTER TABLE `dns_rr` DROP KEY rr, + CHANGE `name` `name` VARCHAR( 128 ) NOT NULL, + ADD KEY `rr` (`zone`,`type`,`name`); diff --git a/install/sql/incremental/upd_0069.sql b/install/sql/incremental/upd_0069.sql new file mode 100644 index 0000000000000000000000000000000000000000..44b20e9e34552db8c546602af0022b2772abaf2b --- /dev/null +++ b/install/sql/incremental/upd_0069.sql @@ -0,0 +1 @@ +ALTER TABLE `cron` ADD `log` enum('n','y') NOT NULL default 'n' AFTER `run_wday`; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index d255aaa06962f9e7c02ed657b0606f2a597d52f2..71f84b142273d62f9d24baa65efa9f0d045d4343 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -402,6 +402,7 @@ CREATE TABLE `cron` ( `run_mday` varchar(100) NULL, `run_month` varchar(100) NULL, `run_wday` varchar(100) NULL, + `log` enum('n','y') NOT NULL default 'n', `active` enum('n','y') NOT NULL default 'y', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; diff --git a/install/tpl/apache_apps.vhost.master b/install/tpl/apache_apps.vhost.master index cfedb9eb280158c8c6db9a820319b26f8a28b387..d132b503ffbd2b5bb2471803a86c338f9ef7eb88 100644 --- a/install/tpl/apache_apps.vhost.master +++ b/install/tpl/apache_apps.vhost.master @@ -20,7 +20,7 @@ AddType application/x-httpd-php .php <Directory {apps_vhost_dir}> # php_admin_value open_basedir "{apps_vhost_dir}:/usr/share:/tmp" - Options FollowSymLinks + Options +FollowSymLinks AllowOverride None Order allow,deny Allow from all @@ -31,7 +31,7 @@ DocumentRoot {apps_vhost_dir} SuexecUserGroup ispapps ispapps <Directory {apps_vhost_dir}> - Options Indexes FollowSymLinks MultiViews +ExecCGI + Options +Indexes +FollowSymLinks +MultiViews +ExecCGI AllowOverride AuthConfig Indexes Limit Options FileInfo AddHandler fcgid-script .php FCGIWrapper {website_basedir}/php-fcgi-scripts/apps/.php-fcgi-starter .php diff --git a/install/tpl/apache_ispconfig.vhost.master b/install/tpl/apache_ispconfig.vhost.master index f3b32c009bb38293f1bc546ee5772afebe5dd767..7067cdaf66be520d6a76640692e11441d93aa4c2 100644 --- a/install/tpl/apache_ispconfig.vhost.master +++ b/install/tpl/apache_ispconfig.vhost.master @@ -18,7 +18,7 @@ NameVirtualHost *:{vhost_port} DocumentRoot /var/www/ispconfig/ SuexecUserGroup ispconfig ispconfig <Directory /var/www/ispconfig/> - Options -Indexes FollowSymLinks MultiViews +ExecCGI + Options -Indexes +FollowSymLinks +MultiViews +ExecCGI AllowOverride AuthConfig Indexes Limit Options FileInfo AddHandler fcgid-script .php FCGIWrapper /var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter .php @@ -35,7 +35,7 @@ NameVirtualHost *:{vhost_port} AddType application/x-httpd-php .php <Directory /usr/local/ispconfig/interface/web> # php_admin_value open_basedir "/usr/local/ispconfig/interface:/usr/share:/tmp" - Options FollowSymLinks + Options +FollowSymLinks AllowOverride None Order allow,deny Allow from all diff --git a/interface/web/client/form/domain.tform.php b/interface/web/client/form/domain.tform.php index a12878380f57947f917a796f465b5cff219c5e08..549617e713cc3f0bc23e1d312513e3c8f1a7d46a 100644 --- a/interface/web/client/form/domain.tform.php +++ b/interface/web/client/form/domain.tform.php @@ -100,7 +100,7 @@ $form["tabs"]['domain'] = array ( 1 => array ( 'type' => 'UNIQUE', 'errmsg'=> 'domain_error_unique'), 2 => array ( 'type' => 'REGEX', - 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z\-]{2,10}$/', + 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,30}$/', 'errmsg'=> 'domain_error_regex'), ), 'default' => '', diff --git a/interface/web/sites/form/cron.tform.php b/interface/web/sites/form/cron.tform.php index 488896731ef28ce5659527b48007c0dc49019ddb..4a169c3a6710f46926c73cddd68ef066c27acdac 100644 --- a/interface/web/sites/form/cron.tform.php +++ b/interface/web/sites/form/cron.tform.php @@ -172,6 +172,12 @@ $form["tabs"]['cron'] = array ( 'valuelimit' => 'list:url,full,chrooted', 'value' => array('url' => 'Url', 'full' => 'Full', 'chrooted' => 'Chrooted') ), + 'log' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n', 1 => 'y') + ), 'active' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', diff --git a/interface/web/sites/lib/lang/de_cron.lng b/interface/web/sites/lib/lang/de_cron.lng index e9fed6846dd810ed1c5404c64e462b27e0381634..8be69ee1799a7825c90d6c491e3125d36366001a 100644 --- a/interface/web/sites/lib/lang/de_cron.lng +++ b/interface/web/sites/lib/lang/de_cron.lng @@ -19,4 +19,6 @@ $wb['run_wday_error_format'] = 'Das Format für Wochentage ist nicht korrekt.'; $wb['command_error_format'] = 'Das Format für den Befehl ist nicht korrekt. Beachten Sie, dass bei einem URL Aufruf nur http und https erlaubt ist.'; $wb['unknown_fieldtype_error'] = 'Es wurde ein unbekanntes Feld verwendet.'; $wb['server_id_error_empty'] = 'Die Server-ID ist leer.'; +$wb['command_hint_txt'] = 'z. B. /var/www/clients/clientX/webY/myscript.sh oder http://www.mydomain.com/path/script.php. Der Platzhalter [web_root] wird durch /var/www/clients/clientX/webY/web ersetzt.'; +$wb['log_output_txt'] = 'Ausgabe loggen'; ?> diff --git a/interface/web/sites/lib/lang/en_cron.lng b/interface/web/sites/lib/lang/en_cron.lng index e6ba8ad3dc1a4133cf728403d6d883c63767f978..6f3074a0530aeac0e69dcdf8c811e6a75d3ad79a 100644 --- a/interface/web/sites/lib/lang/en_cron.lng +++ b/interface/web/sites/lib/lang/en_cron.lng @@ -19,4 +19,6 @@ $wb['run_wday_error_format'] = 'Invalid format for days of the week.'; $wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.'; $wb['unknown_fieldtype_error'] = 'An unknown field type has been used.'; $wb['server_id_error_empty'] = 'The server ID is empty.'; +$wb['command_hint_txt'] = 'e.g. /var/www/clients/clientX/webY/myscript.sh or http://www.mydomain.com/path/script.php, you can use [web_root] placeholder that is replaced by /var/www/clients/clientX/webY/web.'; +$wb['log_output_txt'] = 'Log output'; ?> \ No newline at end of file diff --git a/interface/web/sites/templates/cron_edit.htm b/interface/web/sites/templates/cron_edit.htm index 1c0cd02ed59b0bbecabeca9388186ad3a80fba56..20b1922cd38ea7924024698face1b027368c7f92 100644 --- a/interface/web/sites/templates/cron_edit.htm +++ b/interface/web/sites/templates/cron_edit.htm @@ -47,7 +47,13 @@ <div class="ctrlHolder"> <label for="command">{tmpl_var name='command_txt'}</label> <input name="command" id="command" value="{tmpl_var name='command'}" size="30" maxlength="255" type="text" class="textInput" /> - <p class="formHint">e.g. /var/www/clients/client1/myscript.sh or http://www.mydomain.com/path/script.php</p> + <p class="formHint">{tmpl_var name='command_hint_txt'}</p> + </div> + <div class="ctrlHolder"> + <p class="label">{tmpl_var name='log_output_txt'}</p> + <div class="multiField"> + {tmpl_var name='log'} + </div> </div> <div class="ctrlHolder"> <p class="label">{tmpl_var name='active_txt'}</p> diff --git a/server/conf/apache_apps.vhost.master b/server/conf/apache_apps.vhost.master index 99665df0d64ef43309f7d4ac6ce99b22f57a8ab4..6d6d4e232f3dba62b28f9f6e7f4443b1a85ffb42 100644 --- a/server/conf/apache_apps.vhost.master +++ b/server/conf/apache_apps.vhost.master @@ -34,7 +34,7 @@ DocumentRoot {tmpl_var name='apps_vhost_dir'} SuexecUserGroup ispapps ispapps <Directory {tmpl_var name='apps_vhost_dir'}> - Options Indexes FollowSymLinks MultiViews +ExecCGI + Options +Indexes +FollowSymLinks +MultiViews +ExecCGI AllowOverride AuthConfig Indexes Limit Options FileInfo AddHandler fcgid-script .php FCGIWrapper {tmpl_var name='apps_vhost_basedir'}/php-fcgi-scripts/apps/.php-fcgi-starter .php diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master index 271d3fd71410729e73bf69954697a6b227a8f1b6..2e90ddeab374b097f4cd1bf21092bb7a3e48b391 100644 --- a/server/conf/vhost.conf.master +++ b/server/conf/vhost.conf.master @@ -57,7 +57,7 @@ </IfModule> <Directory {tmpl_var name='web_document_root_www'}> - Options FollowSymLinks + Options +FollowSymLinks AllowOverride <tmpl_var name='allow_override'> <tmpl_if name='apache_version' op='>' value='2.2' format='version'> Require all granted @@ -85,7 +85,7 @@ </tmpl_if> </Directory> <Directory {tmpl_var name='web_document_root'}> - Options FollowSymLinks + Options +FollowSymLinks AllowOverride <tmpl_var name='allow_override'> <tmpl_if name='apache_version' op='>' value='2.2' format='version'> Require all granted diff --git a/server/lib/classes/cron.d/100-monitor_disk_usage.inc.php b/server/lib/classes/cron.d/100-monitor_disk_usage.inc.php index 4f7f89089f2d5bf0ad2a931b2ecd003d14353770..2af40411e12ad01874609f98473ea0ec573d2bba 100644 --- a/server/lib/classes/cron.d/100-monitor_disk_usage.inc.php +++ b/server/lib/classes/cron.d/100-monitor_disk_usage.inc.php @@ -73,8 +73,9 @@ class cronjob_monitor_disk_usage extends cronjob { //$dfData = shell_exec('df -hT 2>/dev/null'); $app->uses('getconf'); $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); - $dfData = shell_exec('df -hT|grep -v "'.$web_config['website_basedir'].'/" 2>/dev/null'); - + + $dfData = shell_exec('df -hT -x simfs | awk \'!x[$1]++\' 2>/dev/null'); + // split into array $df = explode("\n", $dfData); diff --git a/server/lib/classes/cron.d/200-logfiles.inc.php b/server/lib/classes/cron.d/200-logfiles.inc.php index ebf159c877d2d05e73ef52f5fd0df084fadd1961..a802ff9eee3132aed204bf69ec3545ec9d0a208e 100644 --- a/server/lib/classes/cron.d/200-logfiles.inc.php +++ b/server/lib/classes/cron.d/200-logfiles.inc.php @@ -112,6 +112,30 @@ class cronjob_logfiles extends cronjob { exec("gzip -c $logfile > $logfile.gz"); unlink($logfile); } + + $cron_logfiles = array('cron.log', 'cron_error.log', 'cron_wget.log'); + foreach($cron_logfiles as $cron_logfile) { + $cron_logfile = escapeshellcmd($rec['document_root'].'/' . $log_folder . '/' . $cron_logfile); + + // rename older files (move up by one) + $num = 7; + while($num >= 1 && is_file($cron_logfile . '.' . $num . '.gz')) { + rename($cron_logfile . '.' . $num . '.gz', $cron_logfile . '.' . ($num + 1) . '.gz'); + $num--; + } + + // compress current logfile + if(is_file($cron_logfile)) { + exec("gzip -c $cron_logfile > $cron_logfile.1.gz"); + exec("cat /dev/null > $cron_logfile"); + } + // remove older logs + $num = 7; + while(is_file($cron_logfile . '.' . $num . '.gz')) { + @unlink($cron_logfile . '.' . $num . '.gz'); + $num++; + } + } // rotate and compress the error.log when it exceeds a size of 10 MB $logfile = escapeshellcmd($rec['document_root'].'/' . $log_folder . '/error.log'); diff --git a/server/plugins-available/cron_plugin.inc.php b/server/plugins-available/cron_plugin.inc.php index 21d72e6431e346f8ee46bc89421407c02a70d171..d02b1fdeb9dafc18456e40936321c4427e129205 100644 --- a/server/plugins-available/cron_plugin.inc.php +++ b/server/plugins-available/cron_plugin.inc.php @@ -193,7 +193,7 @@ class cron_plugin { $chr_cmd_count = 0; //* read all active cron jobs from database and write them to file - $cron_jobs = $app->db->queryAllRecords("SELECT c.`run_min`, c.`run_hour`, c.`run_mday`, c.`run_month`, c.`run_wday`, c.`command`, c.`type`, `web_domain`.`domain` as `domain` FROM `cron` as c INNER JOIN `web_domain` ON `web_domain`.`domain_id` = c.`parent_domain_id` WHERE c.`parent_domain_id` = ".intval($this->parent_domain["domain_id"]) . " AND c.`active` = 'y'"); + $cron_jobs = $app->db->queryAllRecords("SELECT c.`run_min`, c.`run_hour`, c.`run_mday`, c.`run_month`, c.`run_wday`, c.`command`, c.`type`, c.`log`, `web_domain`.`domain` as `domain` FROM `cron` as c INNER JOIN `web_domain` ON `web_domain`.`domain_id` = c.`parent_domain_id` WHERE c.`parent_domain_id` = ".intval($this->parent_domain["domain_id"]) . " AND c.`active` = 'y'"); if($cron_jobs && count($cron_jobs) > 0) { foreach($cron_jobs as $job) { if($job['run_month'] == '@reboot') { @@ -201,20 +201,38 @@ class cron_plugin { } else { $command = str_replace(" ", "", $job['run_min']) . "\t" . str_replace(" ", "", $job['run_hour']) . "\t" . str_replace(" ", "", $job['run_mday']) . "\t" . str_replace(" ", "", $job['run_month']) . "\t" . str_replace(" ", "", $job['run_wday']); } + + $log_target = ">/dev/null 2>&1"; + $log_wget_target = '/dev/null'; + $log_root = ''; + if($job['log'] == 'y') { + if($job['type'] != 'chrooted') $log_root = $this->parent_domain['document_root']; + $log_root .= '/log'; + + $log_target = '>>' . $log_root . '/cron.log 2>>' . $log_root . '/cron_error.log'; + $log_wget_target = $log_root . '/cron_wget.log'; + } + $command .= "\t{$this->parent_domain['system_user']}"; //* running as user if($job['type'] == 'url') { - $command .= "\t{$cron_config['wget']} -q -t 1 -T 7200 -O /dev/null " . escapeshellarg($job['command']) . " >/dev/null 2>&1"; + $command .= "\t{$cron_config['wget']} -q -t 1 -T 7200 -O " . $log_wget_target . " " . escapeshellarg($job['command']) . " " . $log_target; } else { + $web_root = ''; if($job['type'] == 'chrooted') { if(substr($job['command'], 0, strlen($this->parent_domain['document_root'])) == $this->parent_domain['document_root']) { //* delete the unneeded path part $job['command'] = substr($job['command'], strlen($this->parent_domain['document_root'])); } + } else { + $web_root = $this->parent_domain['document_root']; } + + $web_root .= '/web'; + $job['command'] = str_replace('[web_root]', $web_root, $job['command']); $command .= "\t"; - if($job['type'] == 'chrooted' && substr($job['command'], 0, 1) != "/") $command .= $this->parent_domain['document_root'].'/'; - $command .= $job['command']; + if($job['type'] != 'chrooted' && substr($job['command'], 0, 1) != "/") $command .= $this->parent_domain['document_root'].'/'; + $command .= $job['command'] . " " . $log_target; } if($job['type'] == 'chrooted') {