Jump to content
Froxlor Forum
  • 0

Cronjobs - Master Cronjob


Netsurfer

Question

Hallo!

 

Ich habe mich jetzt mal ein wenig mit den Cronjobs in Froxlor besch?ftigt, weil es mich u.a. "st?rt", dass ich bei der Standardeinstellung von 5 Minuten f?r den Master Cronjob st?ndig Mails vom Cron Daemon erhalte, wenn bspw. der Backup Cronjob l?uft (da dieser bei mir weit l?nger als 5 Minuten zur Ausf?hrung braucht).

 

Und obwohl ich "erst an der Oberfl?che gekratzt" habe, sind mir schon einige Dinge aufgefallen, die imho zumindest "suboptimal" gel?st sind ...!

 

Meiner Meinung nach sollte man den Backup Job, genauso wie ?brigens mit dem Traffic Job schon verfahren wird, per 'pcntl_fork()' verzweigen und somit von dem Master losl?sen.

 

Auch sehe ich Raum f?r "Optimierungen", was den Backup Job anbelangt. So wird bspw. aktuell f?r jede DB per mysqldump erst ein unkomprimierter Dump erzeugt, dieser anschlie?end komprimiert und zum Schluss die unkomprimierte Datei gel?scht.

 

Siehe /var/www/froxlor/scripts/jobs/cron_backup.php:

// get customer dbs
$dbs_result = $db->query("SELECT databasename FROM `" . TABLE_PANEL_DATABASES . "` WHERE `customerid` = '" . $db->escape($row['customerid']) . "';");
while($dbs_row = $db->fetch_array($dbs_result)){
// create customers sql backup
safe_exec(escapeshellarg($settings['system']['backup_mysqldump_path']) . ' --opt --force --allow-keywords -u ' . escapeshellarg($sql_root[0]['user']) . ' -p' . escapeshellarg($sql_root[0]['password']) . ' -h ' . $sql_root[0]['host'] . ' ' . escapeshellarg($dbs_row['databasename']) . ' -r ' . escapeshellarg($settings['system']['backup_dir']) . escapeshellarg($row['loginname']) . '/' . escapeshellarg($dbs_row['databasename']) . '.sql'  );
// compress sql backup
safe_exec('tar -C ' . escapeshellarg($settings['system']['backup_dir']) . escapeshellarg($row['loginname']) . ' -c -z -f ' . escapeshellarg($settings['system']['backup_dir']) . $row['loginname'] . '/' . escapeshellarg($dbs_row['databasename']) . '.tar.gz ' . escapeshellarg($dbs_row['databasename']) . '.sql');
// remove uncompresed sql files
safe_exec('rm ' . escapeshellarg($settings['system']['backup_dir']) . escapeshellarg($row['loginname']) . '/' . escapeshellarg($dbs_row['databasename']) . '.sql');
}

Das ist imho "suboptimal". Denn aus diesen 3 Schritten kann man auch nur einen machen und den jeweiligen Dump direkt gzip'ed ausgeben:

// get customer dbs
$dbs_result = $db->query("SELECT databasename FROM `" . TABLE_PANEL_DATABASES . "` WHERE `customerid` = '" . $db->escape($row['customerid']) . "';");
while($dbs_row = $db->fetch_array($dbs_result)){
// create customers sql backup
safe_exec(escapeshellarg($settings['system']['backup_mysqldump_path']) . ' --opt --force --allow-keywords -u ' . escapeshellarg($sql_root[0]['user']) . ' -p' . escapeshellarg($sql_root[0]['password']) . ' -h ' . $sql_root[0]['host'] . ' ' . escapeshellarg($dbs_row['databasename']) . ' | gzip -6 > ' . escapeshellarg($settings['system']['backup_dir']) . escapeshellarg($row['loginname']) . '/' . escapeshellarg($dbs_row['databasename']) . '.sql.gz'  );
}

Eine Einschr?nkung gibt es jedoch dabei: Der Parameter '-r' oder auch '--result-file' kann nicht mehr verwendet werden!

Das ist aber imho kein Problem, zumindest solange nicht, wie wir uns rein auf Linux Systemen bewegen.

 

Damit obige ?nderung "funktioniert", muss man auch noch die Datei '/var/www/froxlor/lib/functions/filedir/function.safe_exec.php' anpassen.

Original:

	$allowed_commands = array(
		'touch',
		'chown',
		'mkdir',
		'webalizer',
		'cp',
		'du',
		'chmod',
		'chattr',
		'chflags', /* freebsd equivalent to linux' chattr */
		$settings['system']['apachereload_command'],
		$settings['system']['bindreload_command'],
		$settings['dkim']['dkimrestart_command'],
		'openssl',
		'unzip',
		'php',
		'rm',
		'awstats_buildstaticpages.pl',
		'ln'
	);

	//
	// check for ; in execute command
	//

	if((stristr($exec_string, ';'))
	   or (stristr($exec_string, '|'))
	   or (stristr($exec_string, '&'))
	   or (stristr($exec_string, '>'))
	   or (stristr($exec_string, '<'))
	   or (stristr($exec_string, '`'))
	   or (stristr($exec_string, '$'))
	   or (stristr($exec_string, '~'))
	   or (stristr($exec_string, '?')))
	{
		die('SECURITY CHECK FAILED!' . "\n" . 'The execute string "' . htmlspecialchars($exec_string) . '" is a possible security risk!' . "\n" . 'Please check your whole server for security problems by hand!' . "\n");
	}

Neu:

	$allowed_commands = array(
		'| gzip -6 >'
	);

	//
	// check for ; in execute command
	//

	if((stripos($exec_string, ';'))
	   or (stripos($exec_string, '|'))
	   or (stripos($exec_string, '&'))
	   or (stripos($exec_string, '>'))
	   or (stripos($exec_string, '<'))
	   or (stripos($exec_string, '`'))
	   or (stripos($exec_string, '$'))
	   or (stripos($exec_string, '~'))
	   or (stripos($exec_string, '?')))
	{
		$ok = false;
		foreach($allowed_commands as $allowed_command) {
			if(stripos($exec_string, $allowed_command)) {
			$ok = true;
			break;
			}
		}
		if(! $ok) die('SECURITY CHECK FAILED!' . "\n" . 'The execute string "' . htmlspecialchars($exec_string) . '" is a possible security risk!' . "\n" . 'Please check your whole server for security problems by hand!' . "\n");
	}

Die urspr?ngliche Verwendung von 'stristr' ist an dieser Stelle auch nicht erforderlich, steht doch im PHP Manual extra:

Wenn Sie nur herausfinden m?chten, ob ein bestimmter needle innerhalb von haystack vorkommt, verwenden Sie stattdessen die schnellere und weniger speicherintensive Funktion strpos().

 

Anmerkung: Wer die Kompressionsrate von gzip anpassen/ ?ndern will, der muss dieses dann auch entsprechend in der Datei '/var/www/froxlor/lib/functions/filedir/function.safe_exec.php' anpassen.

Der Wert von '-6' ist nach meiner bisherigen Erfahrung der ideale Kompromiss zwischen Gr??e und ben?tigter Zeit. Damit sind meine Dumps auch noch nie gr??er geworden, als mit der originalen Variante - teilweise sogar kleiner.

 

Hinweis: Die Verwendung von 'tar' macht an dieser Stelle auch keinen Sinn, da es sich nur jeweils um eine einzelne Datei handelt.

 

Den Rest habe ich mir noch nicht weiter angeguckt ...!

 

Ich bin halt der Meinung, dass man insbesondere bei den Cronjobs schon auf m?glichst "effizienten" Code achten sollte, und somit jedes "Optimierungspotential" aussch?pfen sollte.

 

To be continued ...!

 

Gru?

Gunther

Link to comment
Share on other sites

3 answers to this question

Recommended Posts

Das an den Crons noch einiges verbessert werden kann, ist ganz klar. Das wird sich auch f?r den neuen Zweig 0.99 garantiert ?ndern (bzw. neu-geschrieben). Gerne kannst du dich da mit "dranh?ngen" und an der Entwicklung mitwirken.

 

Daher, all zu viel Optimierungs-Arbeit w?rde ich pers?nlich jetzt in den 0.9.x Cron nicht mehr stecken...

Link to comment
Share on other sites

Hi!

 

Das an den Crons noch einiges verbessert werden kann, ist ganz klar. Das wird sich auch f?r den neuen Zweig 0.99 garantiert ?ndern (bzw. neu-geschrieben). Gerne kannst du dich da mit "dranh?ngen" und an der Entwicklung mitwirken.

 

Daher, all zu viel Optimierungs-Arbeit w?rde ich pers?nlich jetzt in den 0.9.x Cron nicht mehr stecken...

 

Auf das Angebot w?rde ich gerne eingehen!

Ich verwende Froxlor zur Administration eines vServers und bin ein Fan von Open-Source. Davon abgesehen, komme ich pers?nlich mit Froxlor auch am besten zurecht im Vergleich zu allen anderen Administrations Paneln, die ich sonst noch so ausprobiert habe (u.a. auch Confixx).

 

Und ja, nach dem zu urteilen, was ich bis jetzt bez?glich der Cronjobs gesehen habe, wird es wohl das Beste sein, diesen ganzen Part "umzustricken", sprich komplett neu zu schreiben.

 

An wen wende ich mich denn, bzw. wie sieht denn so eure aktuelle "Aufgabenverteilung" aus?

 

Wir k?nnen das auch gerne per Mail diskutieren.

 

Gru?

Gunther

 

PS: Ich habe gerade mal verschiedene Komprimierungseinstellungen f?r gzip getestet:

Dump mit der bisherigen Variante: 50,0 MB

Dump mit gzip -6: 49,3 MB

Dump mit gzip -9: 47,4 MB

Link to comment
Share on other sites

An wen wende ich mich denn, bzw. wie sieht denn so eure aktuelle "Aufgabenverteilung" aus?

 

Wir k?nnen das auch gerne per Mail diskutieren.

 

An mich :) Und Mail ist langsam und ?tzend - IRC wird bevorzugt (irc.freenode.net/#froxlor)

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...