From 0316d01e81d9d1376059431f51c56519d91f2de9 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Fri, 14 Dec 2018 12:45:59 +0100 Subject: [PATCH] - added automatic jailkit update, contributed by Timme Hosting --- install/sql/incremental/upd_0086.sql | 2 +- .../sql/incremental/upd_dev_collection.sql | 2 + install/sql/ispconfig3.sql | 1 + .../web/sites/form/web_vhost_domain.tform.php | 6 + .../sites/lib/lang/de_web_vhost_domain.lng | 2 +- .../sites/lib/lang/en_web_vhost_domain.lng | 2 +- .../templates/web_vhost_domain_advanced.htm | 6 + .../lib/classes/cron.d/500-jkupdate.inc.php | 137 ++++++++++++++++++ 8 files changed, 155 insertions(+), 3 deletions(-) create mode 100644 server/lib/classes/cron.d/500-jkupdate.inc.php diff --git a/install/sql/incremental/upd_0086.sql b/install/sql/incremental/upd_0086.sql index 563b2153cf..fc1d0c38d7 100644 --- a/install/sql/incremental/upd_0086.sql +++ b/install/sql/incremental/upd_0086.sql @@ -2,4 +2,4 @@ ALTER TABLE `web_domain` ADD COLUMN `ssl_letsencrypt_exclude` enum('n','y') NOT ALTER TABLE `remote_user` ADD `remote_access` ENUM('y','n') NOT NULL DEFAULT 'y' AFTER `remote_password`; ALTER TABLE `remote_user` ADD `remote_ips` TEXT AFTER `remote_access`; ALTER TABLE `server_php` ADD `active` enum('y','n') NOT NULL DEFAULT 'y' AFTER `php_fpm_pool_dir`; -ALTER TABLE `web_domain` CHANGE `log_retention` `log_retention` INT(11) NOT NULL DEFAULT '10'; \ No newline at end of file +ALTER TABLE `web_domain` CHANGE `log_retention` `log_retention` INT(11) NOT NULL DEFAULT '10'; diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 68228ca52d..bda812f68b 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -160,3 +160,5 @@ CREATE TABLE IF NOT EXISTS `sys_mailqueue` ( `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +ALTER TABLE `web_domain` ADD `jailkit_jkupdate_cron` enum('n','y') NOT NULL DEFAULT 'y' AFTER `custom_php_ini`; \ No newline at end of file diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 9f30013469..cf0586b612 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1850,6 +1850,7 @@ CREATE TABLE `web_domain` ( `pm_max_requests` int(11) NOT NULL DEFAULT '0', `php_open_basedir` mediumtext, `custom_php_ini` mediumtext, + `jailkit_jkupdate_cron` enum('n','y') NOT NULL DEFAULT 'y', `backup_interval` VARCHAR( 255 ) NOT NULL DEFAULT 'none', `backup_copies` INT NOT NULL DEFAULT '1', `backup_excludes` mediumtext, diff --git a/interface/web/sites/form/web_vhost_domain.tform.php b/interface/web/sites/form/web_vhost_domain.tform.php index ad1d4ff55b..84de25dee5 100644 --- a/interface/web/sites/form/web_vhost_domain.tform.php +++ b/interface/web/sites/form/web_vhost_domain.tform.php @@ -970,6 +970,12 @@ if($_SESSION["s"]["user"]["typ"] == 'admin' 'value' => '', 'width' => '4', 'maxlength' => '4' + ), + 'jailkit_jkupdate_cron' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') ) //################################# // ENDE Datatable fields diff --git a/interface/web/sites/lib/lang/de_web_vhost_domain.lng b/interface/web/sites/lib/lang/de_web_vhost_domain.lng index ecfb1994cd..674f311574 100644 --- a/interface/web/sites/lib/lang/de_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/de_web_vhost_domain.lng @@ -155,4 +155,4 @@ $wb['error_server_change_not_possible'] = 'Der Server kann nicht geƤndert werde $wb['enable_pagespeed_txt'] = 'Enable PageSpeed'; $wb['log_retention_txt'] = 'Log-Dateien Aufbewahrungszeit'; $wb['log_retention_error_regex'] = 'Aufbewahrungszeit in Tagen (Erlaubte Werte: min. 0 - max. 9999)'; -?> +$wb['jailkit_jkupdate_cron_txt'] = 'Automatisches jkupdate'; \ No newline at end of file diff --git a/interface/web/sites/lib/lang/en_web_vhost_domain.lng b/interface/web/sites/lib/lang/en_web_vhost_domain.lng index 17d47ed464..85096f4dcd 100644 --- a/interface/web/sites/lib/lang/en_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/en_web_vhost_domain.lng @@ -161,4 +161,4 @@ $wb['error_domain_change_forbidden'] = 'The domain name cannot be changed. Pleas $wb['error_server_change_not_possible'] = 'The server cannot be changed.'; $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; -?> +$wb['jailkit_jkupdate_cron_txt'] = 'Automate jkupdate'; \ No newline at end of file diff --git a/interface/web/sites/templates/web_vhost_domain_advanced.htm b/interface/web/sites/templates/web_vhost_domain_advanced.htm index 322748257b..d7ed5a53c6 100644 --- a/interface/web/sites/templates/web_vhost_domain_advanced.htm +++ b/interface/web/sites/templates/web_vhost_domain_advanced.htm @@ -101,6 +101,12 @@ {tmpl_var name="available_php_directive_snippets_txt"}

 {tmpl_var name="php_directive_snippets_txt"} +
+ +
+ {tmpl_var name='jailkit_jkupdate_cron'} +
+
diff --git a/server/lib/classes/cron.d/500-jkupdate.inc.php b/server/lib/classes/cron.d/500-jkupdate.inc.php new file mode 100644 index 0000000000..2eaacdbcfc --- /dev/null +++ b/server/lib/classes/cron.d/500-jkupdate.inc.php @@ -0,0 +1,137 @@ +uses('getconf'); + $jailkit_conf = $app->getconf->get_server_config($conf['server_id'], 'jailkit'); + $jailkit_programs = explode(' ', $jailkit_conf['jailkit_chroot_app_programs']); + + $sites = $app->db->queryAllRecords('SELECT domain_id, document_root FROM web_domain WHERE jailkit_jkupdate_cron = \'y\''); + + foreach($sites as $site) { + $users = $app->db->queryOneRecord('SELECT COUNT(*) AS user_count FROM shell_user WHERE parent_domain_id = ? AND active=\'y\' AND chroot=\'jailkit\'', $site['domain_id']); + $crons = $app->db->queryOneRecord('SELECT COUNT(*) AS cron_count FROM cron WHERE parent_domain_id = ? AND active=\'y\' AND type=\'chrooted\'', $site['domain_id']); + if ($users['user_count'] > 0 || $crons['cron_count'] > 0) { + if (!is_dir($site['document_root'])) { + return; + } + + $app->log('Running jailkit updates for '.$site['document_root']); + + $this->run_jk_update($site['document_root']); + $this->run_jk_cp($site['document_root'], $jailkit_programs); + } + } + + parent::onRunJob(); + } + + private function run_jk_update($document_root) { + global $app; + + $return_var = $this->exec_log('/usr/sbin/jk_update -j '.escapeshellarg($document_root)); + + if ($return_var > 0) { + $app->log('jk_update failed with -j, trying again without -j', LOGLEVEL_DEBUG); + $return_var = $this->exec_log('/usr/sbin/jk_update '.escapeshellarg($document_root)); + + if ($return_var > 0) { + $app->log('jk_update failed (with and without -j parameter)', LOGLEVEL_WARN); + } + } + } + + private function run_jk_cp($document_root, $programs) { + global $app; + + foreach($programs as $program) { + if (!file_exists($program)) { + continue; + } + + $return_var = $this->exec_log('/usr/sbin/jk_cp '.escapeshellarg($document_root).' '.escapeshellarg($program)); + + if ($return_var > 0) { + $app->log('jk_cp failed with -j, trying again with -j', LOGLEVEL_DEBUG); + $return_var = $this->exec_log('/usr/sbin/jk_cp '.escapeshellarg($document_root).' '.escapeshellarg($program)); + + if ($return_var > 0) { + $app->log('jk_cp failed (without and with -j parameter)', LOGLEVEL_WARN); + } + } + } + } + + private function exec_log($cmd) { + global $app; + + $app->log("Running $cmd", LOGLEVEL_DEBUG); + + exec($cmd, $output, $return_var); + + if (count($output) > 0) { + $app->log("Output:\n" . implode("\n", $output), LOGLEVEL_DEBUG); + } + + return $return_var; + } + + /* this function is optional if it contains no custom code */ + public function onAfterRun() { + global $app; + + parent::onAfterRun(); + } + +} + +?> -- GitLab