RE: CronJob Russian Solution - data-stream_ru - 02-06-2010 06:34 PM
Управления разрешениями и запретами Крона из админки.
В общем то это излишесто для тех, кому влом в файлах всё проставить или не знает как ![Wink Wink](images/smilies/wink.gif)
Открываем базу в пхпмайадмине.
В таблицу config вставить строки CUSTOM_CRON_ALLOWED_CMD CUSTOM_CRON_ALLOWED_EXT
CUSTOM_CRON_STOP_WORD
Ох уш мне эта параноидальная защита! Вот самим им влом создаваться.
admin/domain_detais.tpl
admin/settings.tpl
Добавляем где нить между настройками мыла и "прочими настройками"
PHP Code:
<td colspan="2" class="content3"><strong>{TR_CRON_SETTINGS}</strong></td> </tr> <tr> <td> </td> <td class="content2">{TR_CRON_ALLOWED_CMD}</td> <td class="content"><input class="textinput" maxwidth="20" size="40" name="cron_allowed_commands" id="cron_allowed_commands" value="{CUSTOM_CRON_ALLOWED_CMD}"> </td> </tr> <tr> <td> </td> <td class="content2">{TR_CRON_ALLOWED_EXT}</td> <td class="content"><input class="textinput" maxwidth="20" size="40" name="cron_allowed_extension" id="cron_allowed_extension" value="{CUSTOM_CRON_ALLOWED_EXT}"> </td> </tr> <tr> <td> </td> <td class="content2">{TR_CRON_STOP_WORD}</td> <td class="content"><input class="textinput" maxwidth="20" size="40" name="cron_stop_words" id="cron_stop_words" value="{CUSTOM_CRON_STOP_WORD}"> </td> </tr> <tr> <td> </td>
admin/settings.php
Добавляем следующие строки (первая строка после которой надо добавить и образаем внимание на запятые в массивах)
PHP Code:
$max_subdnames_labels = clean_input($_POST['max_subdnames_labels']); $cron_allowed_commands = $_POST['cron_allowed_commands']; $cron_allowed_extension = $_POST['cron_allowed_extension']; $cron_stop_words = $_POST['cron_stop_words'];
'TR_MAX_SUBDNAMES_LABELS' => tr('Maximal number of labels for subdomains'), 'TR_CRON_ALLOWED_CMD' => tr('Allowed commands in only'), 'TR_CRON_ALLOWED_EXT' => tr('Allowed files extensions'), 'TR_CRON_STOP_WORD' => tr('Denied words')
setConfig_Value('MAX_SUBDNAMES_LABELS', $max_subdnames_labels); setConfig_Value('CUSTOM_CRON_ALLOWED_CMD', $cron_allowed_commands); setConfig_Value('CUSTOM_CRON_ALLOWED_EXT', $cron_allowed_extension); setConfig_Value('CUSTOM_CRON_STOP_WORD', $cron_stop_words); set_page_message(tr('Settings saved !'));
'MAX_SUBDNAMES_LABELS_VALUE' => Config::get('MAX_SUBDNAMES_LABELS'), 'CUSTOM_CRON_ALLOWED_CMD' => Config::get('CUSTOM_CRON_ALLOWED_CMD'), 'CUSTOM_CRON_ALLOWED_EXT' => Config::get('CUSTOM_CRON_ALLOWED_EXT'), 'CUSTOM_CRON_STOP_WORD' => Config::get('CUSTOM_CRON_STOP_WORD'), 'TR_CRON_SETTINGS' => tr('Set CronJobs Rights (Separator is a COMMA!)')
client/cronjob_add.php
PHP Code:
<?php /* * (с) 2009, Russia, Moscow * Serge Obookhoff AKA Hong Lee * www.data-stream.ru && www.veterinars.ru * Last Revision at 01/2009 * Written for ispCP Team (www.isp-control.net) ONLY. * Written using the old, dead blanks VHCS. * All Functions rewritten. * * Notice: If you use this script you have own risks. * */
//bypass ispCP HTML input control
$min = implode ("," , $_POST['min']); $hour = implode ("," , $_POST['hour']); $day_of_month = implode ("," , $_POST['day_of_month']); $month = implode ("," , $_POST['month']); $day_of_week = implode ("," , $_POST['day_of_week']);
unset($_POST['month'], $_POST['day_of_week'], $_POST['min'], $_POST['hour'], $_POST['day_of_month']);
require '../include/ispcp-lib.php';
check_login(__FILE__);
$tpl = new pTemplate(); $tpl->define_dynamic('page', Config::get('CLIENT_TEMPLATE_PATH') . '/cronjobs_add.tpl'); $tpl->define_dynamic('page_message', 'page'); $tpl->define_dynamic('logged_from', 'page');
$theme_color = Config::get('USER_INITIAL_THEME');
$tpl->assign( array('TR_CLIENT_CRONJOBS_TITLE' => tr('ispCP - Client/Cronjob Manager'), 'THEME_COLOR_PATH' => "../themes/$theme_color", 'THEME_CHARSET' => tr('encoding'), 'ISP_LOGO' => get_logo($_SESSION['user_id']) ) );
function add_cron_job(&$tpl, &$sql, $user_id, &$file_type, &$min, &$hour, &$day_of_month, &$month, &$day_of_week) {
if (!isset($_POST['Submit'])) { return; }
if ((empty($min) | empty($hour) | empty($day_of_month) | empty($month) | empty($day_of_week) | empty($_POST['name']) | empty($_POST['description']) | empty($_POST['command_line'])) && isset($_POST['Submit'])) {
set_page_message(tr('Please type All Fields and choise all Values!')); return; }
foreach($_POST as $key => $value) { $a = $key; $$a = $value; }
//do all checks of command_line /* Start (c) Vladimir Sinitsyn*/ // Vladimir Sinitsyn aka SenatoR // Russia, Yekaterinburg // Русские, привет! =) // $command_line mey be "perl /var/www/virtual/hackers.ru/htdocs/cgi-bin/decoder.pl?file=/etc/passwd-" // We must use security check!
# $stop_word = array('/etc/','password','passwd','groups'); //STOP Words!
$stop_word = Config::get('CUSTOM_CRON_STOP_WORD'); //STOP Words! $stop_word = explode(",", $stop_word);
//Let`s start our work!
$temp = explode(" ", $command_line); //We`ve divided line two parts - command (php) and values.
$command = $temp[0]; $stream = $temp[1];
unset($temp);
//We have only 3 commands, so, make it without "cool" things, use simle code..
$cron_allowed_commands = Config::get('CUSTOM_CRON_ALLOWED_CMD'); $cron_allowed_commands = explode(",", $cron_allowed_commands);
$flag = 0;
foreach($cron_allowed_commands as $k=>$v) { if(strpos($command,$v) === 0) { $flag++; break; //Stop } }
unset ($cron_allowed_commands);
if ($flag == 0) { set_page_message(tr('Comand not Allowed!')); return; }
foreach($stop_word as $k=>$v) { if(strpos($stream,$v) == true) { set_page_message(tr('Are you a cunning Hacker ?! But I am not only stupid machine!!! I will write delation to Admin!')); write_log("WARNING: Perhaps hacking! ". $_SESSION['user_logged'] . ": add Cron Job: " . $name . " with comnd: " . $command_line); return; } //Hackers ALLERT... `stop word' }
$flag = 0; //Use one thing!
foreach($file_type as $k=>$v) //Start {
if(strpos($stream,$v) == true) //Works fast!!! (its important) { $flag++; //Yeah! Its good! $file = preg_replace("/(\\".".".$v.").*/i","\\1",$stream); //CUT ALL!!! Only filename in $file! break; //Stop } }
if($flag == 0) { set_page_message(tr('File type wrong!')); return; }//File type wrong!
//Check files and permission
if(!file_exists($file)) { set_page_message(tr('File not found! '.$file)); return; } //No file!
if(!is_readable($file)) { set_page_message(tr('File not readable!')); return; }; //Wrong permissions!
if(strpos("cgi",$file) || strpos("pl",$file)) // only for cgi and pl and so.. { if(!is_executable($file)) { set_page_message(tr('Wrong permissions!')); return; }; //Wrong permissions! } /* End (c) */
//get user gid & uid
$query = " SELECT `domain_uid`, `domain_gid` FROM `domain` WHERE `domain_admin_id` = ? ";
$rs = exec_query($sql, $query, array($user_id)); $uid = 'vu' . $rs->fields['domain_uid']; $gid = 'vu' . $rs->fields['domain_gid'];
// add cron_job in the ispcp DB; $query = " INSERT INTO `hcrondtab` (`min`, `hour`, `day`, `mon`, `dow`, `uid`, `gid`, `cmd`, `name`, `runonce`, `activ`, `coment`, `domain`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
"; $rs = exec_query($sql, $query, array($min, $hour, $day_of_month, $month, $day_of_week, $uid, $gid, $command_line, $name, $runonce, $activ, $description, $user_id));
$query = " SELECT `id` `name` FROM `hcrondtab` WHERE `name` = ? ";
$rs = exec_query($sql, $query, array($name)); $cron_name = $rs->fields['name'];
# send_request(); write_log($_SESSION['user_logged'] . ": add Cron Job: " . $name); set_page_message(tr('Cron Job successfully added!')); user_goto('cronjobs_overview.php');
} // End of add_cron_job();
function get_cron_domain(&$tpl, &$sql, $user_id) {
$query = " SELECT `admin_name` FROM `admin` WHERE admin_id = ? "; $rs = exec_query($sql, $query, array($user_id));
return $rs->fields['admin_name']; }
/* * * static page messages. * */
gen_client_mainmenu($tpl, Config::get('CLIENT_TEMPLATE_PATH') . '/main_menu_webtools.tpl'); gen_client_menu($tpl, Config::get('CLIENT_TEMPLATE_PATH') . '/menu_webtools.tpl');
gen_logged_from($tpl);
check_permissions($tpl);
# $file_type = array('.php','.php4','.php5','.cgi','.pl','.py'); //List of GOOD files ;-) $file_type = Config::get('CUSTOM_CRON_ALLOWED_EXT'); //List of GOOD files ;-) $file_type = explode (",", $file_type); $new_value = implode (",", $file_type);
add_cron_job($tpl, $sql, $_SESSION['user_id'], $file_type, $min, $hour, $day_of_month, $month, $day_of_week);
if (isset($_POST['command_line'])) {$example = $_POST['command_line'];} else { $example = 'php ' . Config::get('APACHE_WWW_DIR') . '/' . get_cron_domain($tpl, $sql, $_SESSION['user_id']) . '/htdocs/test.php' ; }
if (isset($_POST['activ']) && $_POST['activ'] == 0) {$active_no = 'selected'; $active_yes = '';} else {$active_yes = 'selected'; $active_no = '';} if (isset($_POST['runonce']) && $_POST['runonce'] == 1) {$runonce_yes = 'selected'; $runonce_no = '';} else {$runonce_no = 'selected'; $runonce_yes = '';} if (isset($_POST['name'])) {$name = $_POST['name'];} else {$name='';} if (isset($_POST['description'])) {$description = $_POST['description'];} else {$description='';}
$tpl->assign( array('TR_CRON_MANAGER' => tr('Cronjob Manager'), 'TR_ADD_CRONJOB' => tr('Add Cronjob'), 'TR_NAME' => tr('Name'), 'TR_DESCRIPTION' => tr('Description'), 'TR_ACTIVE' => tr('Active'), 'YES' => tr('Yes'), 'NO' => tr('No'), 'TR_CRONJOB' => tr('Cronjob'), 'TR_COMMAND' => tr('Command to run:'), 'TR_MIN' => tr('Minute(s):'), 'TR_HOUR' => tr('Hour(s):'), 'TR_DAY' => tr('Day(s):'), 'TR_MONTHS' => tr('Month(s):'), 'TR_WEEKDAYS' => tr('Weekday(s):'), 'TR_ADD' => tr('Add'), 'TR_RESET' => tr('Reset'), 'TR_CANCEL' => tr('Cancel'), 'EXAMPLE' => $example, 'ALLOWED' => 'php, perl, python', 'FILETYPE' => $new_value, 'ACTIVE_YES' => $active_yes, 'ACTIVE_NO' => $active_no, 'RUNONCE_YES' => $runonce_yes, 'RUNONCE_NO' => $runonce_no, 'NAME' => $name, 'DESCRIPTION' => $description, ) );
gen_page_message($tpl);
$tpl->parse('PAGE', 'page'); $tpl->prnt();
if (Config::get('DUMP_GUI_DEBUG')) dump_gui_debug();
unset_messages();
?>
client/cronjob_edit.php
PHP Code:
<?php /* * (с) 2009, Russia, Moscow * Serge Obookhoff AKA Hong Lee * www.data-stream.ru && www.veterinars.ru * Last Revision at 01/2009 * Written for ispCP Team (www.isp-control.net) ONLY. * Written using the old, dead blanks VHCS. * All Functions rewritten. * * Notice: If you use this script you have own risks. * */
//bypass ispCP HTML input control
$min = implode ("," , $_POST['min']); $hour = implode ("," , $_POST['hour']); $day_of_month = implode ("," , $_POST['day_of_month']); $month = implode ("," , $_POST['month']); $day_of_week = implode ("," , $_POST['day_of_week']);
unset($_POST['month'], $_POST['day_of_week'], $_POST['min'], $_POST['hour'], $_POST['day_of_month']);
require '../include/ispcp-lib.php';
check_login(__FILE__);
$tpl = new pTemplate(); $tpl->define_dynamic('page', Config::get('CLIENT_TEMPLATE_PATH') . '/cronjobs_edit.tpl'); $tpl->define_dynamic('page_message', 'page'); $tpl->define_dynamic('logged_from', 'page');
$theme_color = Config::get('USER_INITIAL_THEME');
$tpl->assign( array('TR_CLIENT_CRONJOBS_TITLE' => tr('ispCP - Client/Cronjob Manager'), 'THEME_COLOR_PATH' => "../themes/$theme_color", 'THEME_CHARSET' => tr('encoding'), 'ISP_LOGO' => get_logo($_SESSION['user_id']) ) );
if (!isset($_GET['cron_id']) && !isset($_POST['Submit'])) { set_page_message(tr('Nothing to do!')); user_goto('cronjobs_overview.php'); }
if (isset($_GET['cron_id']) && $_GET['cron_id'] !== '') { $cron_id = $_GET['cron_id'];}
function update_cron_job(&$tpl, &$sql, $cron_id, $user_id, &$min, &$hour, &$day_of_month, &$month, &$day_of_week, &$file_type) {
/* if ((empty($min) | empty($hour) | empty($day_of_month) | empty($month) | empty($day_of_week) | empty($_POST['name']) | empty($_POST['description']) | empty($_POST['command_line'])) && isset($_POST['Submit'])) { * * set_page_message(tr('Please type All Fields and choise all Values!')); * return; * } */ foreach($_POST as $key => $value) { $a = $key; $$a = $value; }
//do all checks of command_line /* Start (c) Vladimir Sinitsyn*/ // Vladimir Sinitsyn aka SenatoR // Russia, Yekaterinburg // Русские, привет! =) // $command_line mey be "perl /var/www/virtual/hackers.ru/htdocs/cgi-bin/decoder.pl?file=/etc/passwd-" // We must use security check!
# $stop_word = array('/etc/','password','passwd','groups'); //STOP Words!
$stop_word = Config::get('CUSTOM_CRON_STOP_WORD'); //STOP Words! $stop_word = explode(",", $stop_word); //Let`s start our work!
$temp = explode(" ", $command_line); //We`ve divided line two parts - command (php) and values.
$command = $temp[0]; $stream = $temp[1];
unset($temp);
//We have commands, so, make it without "cool" things, use simle code..
$cron_allowed_commands = Config::get('CUSTOM_CRON_ALLOWED_CMD'); $cron_allowed_commands = explode(",", $cron_allowed_commands);
$flag = 0;
foreach($cron_allowed_commands as $k=>$v) { if(strpos($command,$v) === 0) { $flag++; break; //Stop } }
unset ($cron_allowed_commands);
if ($flag == 0) { set_page_message(tr('Comand not Allowed!')); return; }
foreach($stop_word as $k=>$v) { if(strpos($stream,$v) == true) { set_page_message(tr('Are you a cunning Hacker ?! But I am not only stupid machine!!! I will write delation to Admin!')); write_log("WARNING: Perhaps hacking! ". $_SESSION['user_logged'] . ": add Cron Job: " . $name . " with comnd: " . $command_line); user_goto('cronjobs_edit.php'); return 0; } //Hackers ALLERT... `stop word' }
$flag = 0; //Use one thing!
foreach($file_type as $k=>$v) //Start { if(strpos($stream,$v) == true) //Works fast!!! (its important) { $flag++; //Yeah! Its good! $file = preg_replace("/(\\".".".$v.").*/i","\\1",$stream); //CUT ALL!!! Only filename in $file!
break; //Stop } }
if($flag == 0) { set_page_message(tr('File type wrong!')); return; }//File type wrong!
//Check files and permission
if(!file_exists($file)) { set_page_message(tr('File not found!')); return; } //No file!
if(!is_readable($file)) { set_page_message(tr('File not readable!')); return; }; //Wrong permissions!
if(strpos("cgi",$file) || strpos("pl",$file)) // only for cgi and pl and so.. { if(!is_executable($file)) { set_page_message(tr('Wrong permissions!')); return; }; //Wrong permissions! } /* End (c) */
$query = " UPDATE hcrondtab SET name = ?, coment = ?, min = ?, hour = ?, day = ?, mon = ?, dow = ?, cmd = ?, activ = ?, runonce = ?, lastrun = ? WHERE id = ? ";
$rs = exec_query($sql, $query, array($name, $description, $min, $hour, $day_of_month, $month, $day_of_week, $command_line, $activ, $runonce, $lastrun =0, $cron_id));
write_log($_SESSION['user_logged'] . ": updeted Cron Job: " . $name); set_page_message(tr('Cron Job successfully updated!')); user_goto('cronjobs_overview.php');
} // End of update_cron_job();
function gen_cron_job(&$tpl, &$sql, $cron_id, $user_id, &$new_value) {
$query = " SELECT `id`, `domain`, `name`, `coment`, `min`, `hour`, `day`, `mon`, `dow`, `cmd`, `runonce`,`lastrun`, `activ` FROM `hcrondtab` WHERE domain = $user_id AND id = $cron_id ";
$rs = exec_query($sql, $query, $cron_id);
if ($rs->RecordCount() == 0) { set_page_message(tr('No CronJob with this ID!')); header('Location: cronjobs_overview.php'); exit(0); }
if ($rs->fields['activ'] == 1) {$active_yes = 'selected'; $active_no = '';} else {$active_no = 'selected'; $active_yes = '';} if ($rs->fields['runonce'] == 1) {$runonce_yes = 'selected'; $runonce_no = '';} else {$runonce_no = 'selected'; $runonce_yes = '';} $tpl->assign( array('NAME' => $rs->fields['name'], 'DESCRIPTION' => $rs->fields['coment'], 'COMMAND_LINE' => $rs->fields['cmd'], 'ACTIVE' => $rs->fields['activ'], 'ACTIVE_YES' => $active_yes, 'ACTIVE_NO' => $active_no, 'ID' => $rs->fields['id'], 'ALLOWED' => 'php, perl, python', 'FILETYPE' => $new_value, 'RUNONCE_YES' => $runonce_yes, 'RUNONCE_NO' => $runonce_no, ) );
} // End of gen_cron_job();
/* * * static page messages. * */
gen_client_mainmenu($tpl, Config::get('CLIENT_TEMPLATE_PATH') . '/main_menu_webtools.tpl'); gen_client_menu($tpl, Config::get('CLIENT_TEMPLATE_PATH') . '/menu_webtools.tpl');
gen_logged_from($tpl);
check_permissions($tpl);
# $file_type = array('.php','.php4','.php5','.cgi','.pl','.py'); //List of GOOD files ;-) $file_type = Config::get('CUSTOM_CRON_ALLOWED_EXT'); //List of GOOD files ;-) $file_type = explode (",", $file_type); $new_value = implode (",", $file_type);
if (isset($_GET['cron_id']) && is_numeric($_GET['cron_id']) && isset($_POST['Submit'])) update_cron_job($tpl, $sql, $_GET['cron_id'], $_SESSION['user_id'], $min, $hour, $day_of_month, $month, $day_of_week, $file_type);
gen_cron_job($tpl, $sql, $cron_id, $_SESSION['user_id'], $new_value);
$tpl->assign( array('TR_CRON_MANAGER' => tr('Cronjob Manager'), 'TR_EDIT_CRONJOB' => tr('Edit Cronjob'), 'TR_NAME' => tr('Name'), 'TR_DESCRIPTION' => tr('Description'), 'TR_ACTIVE' => tr('Active'), 'YES' => tr('Yes'), 'NO' => tr('No'), 'TR_CRONJOB' => tr('Cronjob'), 'TR_COMMAND' => tr('Command to run:'), 'TR_MIN' => tr('Minute(s):'), 'TR_HOUR' => tr('Hour(s):'), 'TR_DAY' => tr('Day(s):'), 'TR_MONTHS' => tr('Month(s):'), 'TR_WEEKDAYS' => tr('Weekday(s):'), 'TR_UPDATE' => tr('Update'), 'TR_CANCEL' => tr('Cancel') ) );
gen_page_message($tpl);
$tpl->parse('PAGE', 'page'); $tpl->prnt();
if (Config::get('DUMP_GUI_DEBUG')) dump_gui_debug();
unset_messages();
?>
Вуаля!
Если кто то что то не понял или у кого то что то неработает, курим бамбук и ждём пока я всё это собиру в новый пакет.
RE: CronJob Russian Solution - data-stream_ru - 02-06-2010 07:47 PM
Подсветка текущих значений времени крона в режиме редактирования.
Не знаю как к этому отнесутся все броузеры, но опера стерпела. Определять же все масссивы ручками в нуль мне жуть как лень.
client/cronjobs_edit.tpl
PHP Code:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset={THEME_CHARSET}"> <title>{TR_CLIENT_CRONJOBS_TITLE}</title> <meta name="robots" content="noindex"> <meta name="robots" content="nofollow"> <link href="{THEME_COLOR_PATH}/css/ispcp.css" rel="stylesheet" type="text/css"> <script type="text/javascript" src="{THEME_COLOR_PATH}/css/ispcp.js"></script> </head>
<body onload="MM_preloadImages('{THEME_COLOR_PATH}/images/icons/database_a.gif','{THEME_COLOR_PATH}/images/icons/domains_a.gif','{THEME_COLOR_PATH}/images/icons/ftp_a.gif','{THEME_COLOR_PATH}/images/icons/general_a.gif' ,'{THEME_COLOR_PATH}/images/icons/email_a.gif','{THEME_COLOR_PATH}/images/icons/webtools_a.gif','{THEME_COLOR_PATH}/images/icons/statistics_a.gif','{THEME_COLOR_PATH}/images/icons/support_a.gif')"> <!-- BDP: logged_from --><table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td height="20" nowrap="nowrap" class="backButton"> <a href="change_user_interface.php?action=go_back"><img src="{THEME_COLOR_PATH}/images/icons/close_interface.png" width="16" height="16" border="0" align="absmiddle"></a> {YOU_ARE_LOGGED_AS}</td> </tr> </table> <!-- EDP: logged_from --> <table width="100%" border="0" cellspacing="0" cellpadding="0" height="100%" style="border-collapse: collapse;padding:0;margin:0;"> <tr> <td align="left" valign="top" style="vertical-align: top; width: 195px; height: 56px;"><img src="{THEME_COLOR_PATH}/images/top/top_left.jpg" border="0"></td> <td style="height: 56px; width:100%; background-image: url({THEME_COLOR_PATH}/images/top/top_bg.jpg)"><img src="{THEME_COLOR_PATH}/images/top/top_left_bg.jpg" border="0"></td> <td style="width: 73px; height: 56px;"><img src="{THEME_COLOR_PATH}/images/top/top_right.jpg" border="0"></td> </tr> <tr> <td style="width: 195px; vertical-align: top;">{MENU}</td> <td colspan="2" style="vertical-align: top;"><table style="width: 100%; border-collapse: collapse;padding:0;margin:0;"> <tr height="95"> <td style="padding-left:30px; width: 100%; background-image: url({THEME_COLOR_PATH}/images/top/middle_bg.jpg);">{MAIN_MENU}</td> <td style="padding:0;margin:0;text-align: right; width: 73px;vertical-align: top;"><img src="{THEME_COLOR_PATH}/images/top/middle_right.jpg" border="0"></td> </tr> <tr> <td colspan="3"><table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td align="left"><table width="100%" cellpadding="5" cellspacing="5"> <tr> <td width="25"><img src="{THEME_COLOR_PATH}/images/content/table_icon_tools.png" width="25" height="25"></td> <td colspan="2" class="title">{TR_CRON_MANAGER}</td> </tr> </table></td> <td width="27" align="right"> </td> </tr> <tr> <td><form name="add_cronjob" method="post" action="cronjobs_edit.php?cron_id={ID}"> <table width="100%" cellpadding="5" cellspacing="5"> <tr> <td width="25"> </td> <td colspan="5" class="content3"><b>{TR_EDIT_CRONJOB}</b></td> </tr> <!-- BDP: page_message --> <tr> <td width="25"> </td> <td colspan="5" class="title"><span class="message">{MESSAGE}</span></td> </tr> <!-- EDP: page_message --> <tr> <td nowrap="nowrap"> </td> <td nowrap="nowrap" class="content2">{TR_NAME}</td> <td colspan="4" class="content"><input name="name" type="text" class="textinput" id="name" style="width:170px" value="{NAME}"></td> </tr> <tr> <td nowrap="nowrap"> </td> <td nowrap="nowrap" class="content2">{TR_DESCRIPTION}</td> <!--td colspan="4" class="content"><input name="description" type="text" class="textinput" id="description" style="width:170px" value="{DESCTIPTON}"></td--> <td colspan="4" class="content"><input name="description" type="text" class="textinput" id="description" style="width:170px" value="{DESCRIPTION}"></td> </tr> <tr> <td nowrap="nowrap"> </td> <td nowrap="nowrap" class="content2">{TR_ACTIVE}</td> <td colspan="4" class="content"><select name="activ"> <option value="1" {ACTIVE_YES}>{YES}</option> <option value="0" {ACTIVE_NO}>{NO}</option> </select></td> </tr> <tr> <td nowrap="nowrap"> </td> <td nowrap="nowrap" class="content2">Run only once and when delete Job</td> <td colspan="4" class="content"><select name="runonce"> <option value="1" {RUNONCE_YES}>{YES}</option> <option value="-1" {RUNONCE_NO}>{NO}</option> </select></td> </tr> <tr> <td> </td> <td colspan="5" class="content3"><b>{TR_CRONJOB}</b></td> </tr> <tr> <td width="25"> </td> <td colspan="3" class="content2">{TR_COMMAND}</td> <td colspan="2" class="content2">Comand Line Syntax:</td> </tr> <tr> <td width="25"> </td> <td colspan="3" class="content"><input name="command_line" type="text" class="textinput" id="command_line" style="width:370px" value="{COMMAND_LINE}"></td> <td colspan="2" class="content2">Enter properly COMMAND, space, full SERVER PATH to executed script!</td> </tr> <tr> <td width="25"> </td> <td colspan="5" class="content2">Allowed commands in only <b>{ALLOWED}</b> . And allowed file extension is <b>{FILETYPE}</b></td> </tr> <tr> <td nowrap="nowrap"> </td> <td align="center" nowrap="nowrap" class="content2">{TR_MIN}</td> <td align="center" class="content2">{TR_HOUR}</td> <td align="center" class="content2">{TR_DAY}</td> <td align="center" class="content2">{TR_MONTHS}</td> <td align="center" class="content2">{TR_WEEKDAYS}</td> </tr> <tr align="center" valign="top"> <td width="25" nowrap="nowrap"> </td> <td width="200" nowrap="nowrap" class="content"><select name="min[]" size="6" multiple id="min""> <option value="*" {TR_SELECTED_MIN_*}>Every Minute</option> <option value="*/2" {TR_SELECTED_MIN_*/2}>Every Other Minute</option> <option value="*/5" {TR_SELECTED_MIN_*/5}>Every Five Minutes</option> <option value="*/10" {TR_SELECTED_MIN_*/10}>Every Ten Minutes</option> <option value="*/15" {TR_SELECTED_MIN_*/15}>Every Fifteen Minutes</option> <option value="0" {TR_SELECTED_MIN_0}>0</option> <option value="1" {TR_SELECTED_MIN_1}>1</option> <option value="2" {TR_SELECTED_MIN_2}>2</option> <option value="3" {TR_SELECTED_MIN_3}>3</option> <option value="4" {TR_SELECTED_MIN_4}>4</option> <option value="5" {TR_SELECTED_MIN_5}>5</option> <option value="6" {TR_SELECTED_MIN_6}>6</option> <option value="7" {TR_SELECTED_MIN_7}>7</option> <option value="8" {TR_SELECTED_MIN_8}>8</option> <option value="9" {TR_SELECTED_MIN_9}>9</option> <option value="10" {TR_SELECTED_MIN_10}>10</option> <option value="11" {TR_SELECTED_MIN_11}>11</option> <option value="12" {TR_SELECTED_MIN_12}>12</option> <option value="13" {TR_SELECTED_MIN_13}>13</option> <option value="14" {TR_SELECTED_MIN_14}>14</option> <option value="15" {TR_SELECTED_MIN_15}>15</option> <option value="16" {TR_SELECTED_MIN_16}>16</option> <option value="17" {TR_SELECTED_MIN_17}>17</option> <option value="18" {TR_SELECTED_MIN_18}>18</option> <option value="19" {TR_SELECTED_MIN_19}>19</option> <option value="20" {TR_SELECTED_MIN_20}>20</option> <option value="21" {TR_SELECTED_MIN_21}>21</option> <option value="22" {TR_SELECTED_MIN_22}>22</option> <option value="23" {TR_SELECTED_MIN_23}>23</option> <option value="24" {TR_SELECTED_MIN_24}>24</option> <option value="25" {TR_SELECTED_MIN_25}>25</option> <option value="26" {TR_SELECTED_MIN_26}>26</option> <option value="27" {TR_SELECTED_MIN_27}>27</option> <option value="28" {TR_SELECTED_MIN_28}>28</option> <option value="29" {TR_SELECTED_MIN_29}>29</option> <option value="30" {TR_SELECTED_MIN_30}>30</option> <option value="31" {TR_SELECTED_MIN_31}>31</option> <option value="32" {TR_SELECTED_MIN_32}>32</option> <option value="33" {TR_SELECTED_MIN_33}>33</option> <option value="34" {TR_SELECTED_MIN_34}>34</option> <option value="35" {TR_SELECTED_MIN_35}>35</option> <option value="36" {TR_SELECTED_MIN_36}>36</option> <option value="37" {TR_SELECTED_MIN_37}>37</option> <option value="38" {TR_SELECTED_MIN_38}>38</option> <option value="39" {TR_SELECTED_MIN_39}>39</option> <option value="40" {TR_SELECTED_MIN_40}>40</option> <option value="41" {TR_SELECTED_MIN_41}>41</option> <option value="42" {TR_SELECTED_MIN_42}>42</option> <option value="43" {TR_SELECTED_MIN_43}>43</option> <option value="44" {TR_SELECTED_MIN_44}>44</option> <option value="45" {TR_SELECTED_MIN_45}>45</option> <option value="46" {TR_SELECTED_MIN_46}>46</option> <option value="47" {TR_SELECTED_MIN_47}>47</option> <option value="48" {TR_SELECTED_MIN_48}>48</option> <option value="49" {TR_SELECTED_MIN_49}>49</option> <option value="50" {TR_SELECTED_MIN_50}>50</option> <option value="51" {TR_SELECTED_MIN_51}>51</option> <option value="52" {TR_SELECTED_MIN_52}>52</option> <option value="53" {TR_SELECTED_MIN_53}>53</option> <option value="54" {TR_SELECTED_MIN_54}>54</option> <option value="55" {TR_SELECTED_MIN_55}>55</option> <option value="56" {TR_SELECTED_MIN_56}>56</option> <option value="57" {TR_SELECTED_MIN_57}>57</option> <option value="58" {TR_SELECTED_MIN_58}>58</option> <option value="59" {TR_SELECTED_MIN_59}>59</option> </select></td> <td class="content"><select name="hour[]" multiple size="6" id="hour"> <option value="*" {TR_SELECTED_HOUR_*}>Every Hour</option> <option value="*/2" {TR_SELECTED_HOUR_*/2}>Every Other Hour</option> <option value="*/4" {TR_SELECTED_HOUR_*/4}>Every Four Hours</option> <option value="*/6" {TR_SELECTED_HOUR_*/6}>Every Six Hours</option> <option value="0" {TR_SELECTED_HOUR_0}>0 = 12 AM/Midnight</option> <option value="1" {TR_SELECTED_HOUR_1}>1 = 1 AM</option> <option value="2" {TR_SELECTED_HOUR_2}>2 = 2 AM</option> <option value="3" {TR_SELECTED_HOUR_3}>3 = 3 AM</option> <option value="4" {TR_SELECTED_HOUR_4}>4 = 4 AM</option> <option value="5" {TR_SELECTED_HOUR_5}>5 = 5 AM</option> <option value="6" {TR_SELECTED_HOUR_6}>6 = 6 AM</option> <option value="7" {TR_SELECTED_HOUR_7}>7 = 7 AM</option> <option value="8" {TR_SELECTED_HOUR_8}>8 = 8 AM</option> <option value="9" {TR_SELECTED_HOUR_9}>9 = 9 AM</option> <option value="10" {TR_SELECTED_HOUR_10}>10 = 10 AM</option> <option value="11" {TR_SELECTED_HOUR_11}>11 = 11 AM</option> <option value="12" {TR_SELECTED_HOUR_12}>12 = 12 PM/Noon</option> <option value="13" {TR_SELECTED_HOUR_13}>13 = 1 PM</option> <option value="14" {TR_SELECTED_HOUR_14}>14 = 2 PM</option> <option value="15" {TR_SELECTED_HOUR_15}>15 = 3 PM</option> <option value="16" {TR_SELECTED_HOUR_16}>16 = 4 PM</option> <option value="17" {TR_SELECTED_HOUR_17}>17 = 5 PM</option> <option value="18" {TR_SELECTED_HOUR_18}>18 = 6 PM</option> <option value="19" {TR_SELECTED_HOUR_19}>19 = 7 PM</option> <option value="20" {TR_SELECTED_HOUR_20}>20 = 8 PM</option> <option value="21" {TR_SELECTED_HOUR_21}>21 = 9 PM</option> <option value="22" {TR_SELECTED_HOUR_22}>22 = 10 PM</option> <option value="23" {TR_SELECTED_HOUR_23}>23 = 11 PM</option> </select></td> <td class="content"><select name="day_of_month[]" multiple size="6" id="day_of_month"> <option value="*" {TR_SELECTED_DOM_*}>Every Day</option> <option value="1" {TR_SELECTED_DOM_1}>1</option> <option value="2" {TR_SELECTED_DOM_2}>2</option> <option value="3" {TR_SELECTED_DOM_3}>3</option> <option value="4" {TR_SELECTED_DOM_4}>4</option> <option value="5" {TR_SELECTED_DOM_5}>5</option> <option value="6" {TR_SELECTED_DOM_6}>6</option> <option value="7" {TR_SELECTED_DOM_7}>7</option> <option value="8" {TR_SELECTED_DOM_8}>8</option> <option value="9" {TR_SELECTED_DOM_9}>9</option> <option value="10" {TR_SELECTED_DOM_10}>10</option> <option value="11" {TR_SELECTED_DOM_11}>11</option> <option value="12" {TR_SELECTED_DOM_12}>12</option> <option value="13" {TR_SELECTED_DOM_13}>13</option> <option value="14" {TR_SELECTED_DOM_14}>14</option> <option value="15" {TR_SELECTED_DOM_15}>15</option> <option value="16" {TR_SELECTED_DOM_16}>16</option> <option value="17" {TR_SELECTED_DOM_17}>17</option> <option value="18" {TR_SELECTED_DOM_18}>18</option> <option value="19" {TR_SELECTED_DOM_19}>19</option> <option value="20" {TR_SELECTED_DOM_20}>20</option> <option value="21" {TR_SELECTED_DOM_21}>21</option> <option value="22" {TR_SELECTED_DOM_22}>22</option> <option value="23" {TR_SELECTED_DOM_23}>23</option> <option value="24" {TR_SELECTED_DOM_24}>24</option> <option value="25" {TR_SELECTED_DOM_25}>25</option> <option value="26" {TR_SELECTED_DOM_26}>26</option> <option value="27" {TR_SELECTED_DOM_27}>27</option> <option value="28" {TR_SELECTED_DOM_28}>28</option> <option value="29" {TR_SELECTED_DOM_29}>29</option> <option value="30" {TR_SELECTED_DOM_30}>30</option> <option value="31" {TR_SELECTED_DOM_31}>31</option> </select></td> <td class="content"><select name="month[]" multiple size="6" id="month"> <option value="*" {TR_SELECTED_MONTH_*}>Every Month</option> <option value="1" {TR_SELECTED_MONTH_1}>January</option> <option value="2" {TR_SELECTED_MONTH_2}>February</option> <option value="3" {TR_SELECTED_MONTH_3}>March</option> <option value="4" {TR_SELECTED_MONTH_4}>April</option> <option value="5" {TR_SELECTED_MONTH_5}>May</option> <option value="6" {TR_SELECTED_MONTH_6}>June</option> <option value="7" {TR_SELECTED_MONTH_7}>July</option> <option value="8" {TR_SELECTED_MONTH_8}>August</option> <option value="9" {TR_SELECTED_MONTH_9}>September</option> <option value="10" {TR_SELECTED_MONTH_10}>October</option> <option value="11" {TR_SELECTED_MONTH_11}>November</option> <option value="12" {TR_SELECTED_MONTH_12}>December</option> </select></td> <td class="content"><select name="day_of_week[]" multiple size="6" id="day_of_week"> <option value="*" {TR_SELECTED_DOW_*}>Every Weekday</option> <option value="0" {TR_SELECTED_DOW_0}>Sunday</option> <option value="1" {TR_SELECTED_DOW_1}>Monday</option> <option value="2" {TR_SELECTED_DOW_2}>Tuesday</option> <option value="3" {TR_SELECTED_DOW_3}>Wednesday</option> <option value="4" {TR_SELECTED_DOW_4}>Thursday</option> <option value="5" {TR_SELECTED_DOW_5}>Friday</option> <option value="6" {TR_SELECTED_DOW_6}>Saturday</option> </select></td> </tr> <tr> <td width="25"> </td> <td colspan="5"><input name="Submit" type="submit" class="button" value=" {TR_UPDATE} "> <input name="button" type="button" class="button" onclick="MM_goToURL('parent','cronjobs_overview.php');return document.MM_returnValue" value="{TR_CANCEL}"></td> </tr> </table> <input type="hidden" name="uaction" value="update_cronjob"> </form></td> <td> </td> </tr> <tr> <td> </td> <td> </td> </tr> </table></td> </tr> </table></td> </tr> </table> </body> </html>
client/cronjobs_edit.php
PHP Code:
<?php /* * (с) 2009, Russia, Moscow * Serge Obookhoff AKA Hong Lee * www.data-stream.ru && www.veterinars.ru * Last Revision at 01/2009 * Written for ispCP Team (www.isp-control.net) ONLY. * Written using the old, dead blanks VHCS. * All Functions rewritten. * * Notice: If you use this script you have own risks. * */
//bypass ispCP HTML input control
$min = implode ("," , $_POST['min']); $hour = implode ("," , $_POST['hour']); $day_of_month = implode ("," , $_POST['day_of_month']); $month = implode ("," , $_POST['month']); $day_of_week = implode ("," , $_POST['day_of_week']);
unset($_POST['month'], $_POST['day_of_week'], $_POST['min'], $_POST['hour'], $_POST['day_of_month']);
require '../include/ispcp-lib.php';
check_login(__FILE__);
$tpl = new pTemplate(); $tpl->define_dynamic('page', Config::get('CLIENT_TEMPLATE_PATH') . '/cronjobs_edit.tpl'); $tpl->define_dynamic('page_message', 'page'); $tpl->define_dynamic('logged_from', 'page');
$theme_color = Config::get('USER_INITIAL_THEME');
$tpl->assign( array('TR_CLIENT_CRONJOBS_TITLE' => tr('ispCP - Client/Cronjob Manager'), 'THEME_COLOR_PATH' => "../themes/$theme_color", 'THEME_CHARSET' => tr('encoding'), 'ISP_LOGO' => get_logo($_SESSION['user_id']) ) );
if (!isset($_GET['cron_id']) && !isset($_POST['Submit'])) { set_page_message(tr('Nothing to do!')); user_goto('cronjobs_overview.php'); }
if (isset($_GET['cron_id']) && $_GET['cron_id'] !== '') { $cron_id = $_GET['cron_id'];}
function update_cron_job(&$tpl, &$sql, $cron_id, $user_id, &$min, &$hour, &$day_of_month, &$month, &$day_of_week, &$file_type) {
/* if ((empty($min) | empty($hour) | empty($day_of_month) | empty($month) | empty($day_of_week) | empty($_POST['name']) | empty($_POST['description']) | empty($_POST['command_line'])) && isset($_POST['Submit'])) { * * set_page_message(tr('Please type All Fields and choise all Values!')); * return; * } */ foreach($_POST as $key => $value) { $a = $key; $$a = $value; }
//do all checks of command_line /* Start (c) Vladimir Sinitsyn*/ // Vladimir Sinitsyn aka SenatoR // Russia, Yekaterinburg // Русские, привет! =) // $command_line mey be "perl /var/www/virtual/hackers.ru/htdocs/cgi-bin/decoder.pl?file=/etc/passwd-" // We must use security check!
# $stop_word = array('/etc/','password','passwd','groups'); //STOP Words!
$stop_word = Config::get('CUSTOM_CRON_STOP_WORD'); //STOP Words! $stop_word = explode(",", $stop_word); //Let`s start our work!
$temp = explode(" ", $command_line); //We`ve divided line two parts - command (php) and values.
$command = $temp[0]; $stream = $temp[1];
unset($temp);
//We have commands, so, make it without "cool" things, use simle code..
$cron_allowed_commands = Config::get('CUSTOM_CRON_ALLOWED_CMD'); $cron_allowed_commands = explode(",", $cron_allowed_commands);
$flag = 0;
foreach($cron_allowed_commands as $k=>$v) { if(strpos($command,$v) === 0) { $flag++; break; //Stop } }
unset ($cron_allowed_commands);
if ($flag == 0) { set_page_message(tr('Comand not Allowed!')); return; }
foreach($stop_word as $k=>$v) { if(strpos($stream,$v) == true) { set_page_message(tr('Are you a cunning Hacker ?! But I am not only stupid machine!!! I will write delation to Admin!')); write_log("WARNING: Perhaps hacking! ". $_SESSION['user_logged'] . ": add Cron Job: " . $name . " with comnd: " . $command_line); user_goto('cronjobs_edit.php'); return 0; } //Hackers ALLERT... `stop word' }
$flag = 0; //Use one thing!
foreach($file_type as $k=>$v) //Start { if(strpos($stream,$v) == true) //Works fast!!! (its important) { $flag++; //Yeah! Its good! $file = preg_replace("/(\\".".".$v.").*/i","\\1",$stream); //CUT ALL!!! Only filename in $file!
break; //Stop } }
if($flag == 0) { set_page_message(tr('File type wrong!')); return; }//File type wrong!
//Check files and permission
if(!file_exists($file)) { set_page_message(tr('File not found!')); return; } //No file!
if(!is_readable($file)) { set_page_message(tr('File not readable!')); return; }; //Wrong permissions!
if(strpos("cgi",$file) || strpos("pl",$file)) // only for cgi and pl and so.. { if(!is_executable($file)) { set_page_message(tr('Wrong permissions!')); return; }; //Wrong permissions! } /* End (c) */
$query = " UPDATE hcrondtab SET name = ?, coment = ?, min = ?, hour = ?, day = ?, mon = ?, dow = ?, cmd = ?, activ = ?, runonce = ?, lastrun = ? WHERE id = ? ";
$rs = exec_query($sql, $query, array($name, $description, $min, $hour, $day_of_month, $month, $day_of_week, $command_line, $activ, $runonce, $lastrun =0, $cron_id));
write_log($_SESSION['user_logged'] . ": updeted Cron Job: " . $name); set_page_message(tr('Cron Job successfully updated!')); user_goto('cronjobs_overview.php');
} // End of update_cron_job();
function gen_cron_job(&$tpl, &$sql, $cron_id, $user_id, &$new_value) {
$query = " SELECT `id`, `domain`, `name`, `coment`, `min`, `hour`, `day`, `mon`, `dow`, `cmd`, `runonce`,`lastrun`, `activ` FROM `hcrondtab` WHERE domain = $user_id AND id = $cron_id ";
$rs = exec_query($sql, $query, $cron_id);
if ($rs->RecordCount() == 0) { set_page_message(tr('No CronJob with this ID!')); header('Location: cronjobs_overview.php'); exit(0); }
if ($rs->fields['activ'] == 1) {$active_yes = 'selected'; $active_no = '';} else {$active_no = 'selected'; $active_yes = '';} if ($rs->fields['runonce'] == 1) {$runonce_yes = 'selected'; $runonce_no = '';} else {$runonce_no = 'selected'; $runonce_yes = '';} $tpl->assign( array('NAME' => $rs->fields['name'], 'DESCRIPTION' => $rs->fields['coment'], 'COMMAND_LINE' => $rs->fields['cmd'], 'ACTIVE' => $rs->fields['activ'], 'ACTIVE_YES' => $active_yes, 'ACTIVE_NO' => $active_no, 'ID' => $rs->fields['id'], 'ALLOWED' => 'php, perl, python', 'FILETYPE' => $new_value, 'RUNONCE_YES' => $runonce_yes, 'RUNONCE_NO' => $runonce_no, ) );
//Highlite time selection
$cron_time = explode(",",$rs->fields['min']);
foreach($cron_time as $k=>$v) { $selected_time[$k] = "TR_SELECTED_MIN_".$v; $tpl->assign(array($selected_time[$k] => tr('selected') )); }
$cron_time = explode(",",$rs->fields['hour']);
foreach($cron_time as $k=>$v) { $selected_time[$k] = "TR_SELECTED_HOUR_".$v; $tpl->assign(array($selected_time[$k] => tr('selected') )); }
$cron_time = explode(",",$rs->fields['day']);
foreach($cron_time as $k=>$v) { $selected_time[$k] = "TR_SELECTED_DOM_".$v; $tpl->assign(array($selected_time[$k] => tr('selected') )); }
$cron_time = explode(",",$rs->fields['mon']);
foreach($cron_time as $k=>$v) { $selected_time[$k] = "TR_SELECTED_MONTH_".$v; $tpl->assign(array($selected_time[$k] => tr('selected') )); }
$cron_time = explode(",",$rs->fields['dow']);
foreach($cron_time as $k=>$v) { $selected_time[$k] = "TR_SELECTED_DOW_".$v; $tpl->assign(array($selected_time[$k] => tr('selected') )); }
} // End of gen_cron_job();
/* * * static page messages. * */
gen_client_mainmenu($tpl, Config::get('CLIENT_TEMPLATE_PATH') . '/main_menu_webtools.tpl'); gen_client_menu($tpl, Config::get('CLIENT_TEMPLATE_PATH') . '/menu_webtools.tpl');
gen_logged_from($tpl);
check_permissions($tpl);
# $file_type = array('.php','.php4','.php5','.cgi','.pl','.py'); //List of GOOD files ;-) $file_type = Config::get('CUSTOM_CRON_ALLOWED_EXT'); //List of GOOD files ;-) $file_type = explode (",", $file_type); $new_value = implode (",", $file_type);
if (isset($_GET['cron_id']) && is_numeric($_GET['cron_id']) && isset($_POST['Submit'])) update_cron_job($tpl, $sql, $_GET['cron_id'], $_SESSION['user_id'], $min, $hour, $day_of_month, $month, $day_of_week, $file_type);
gen_cron_job($tpl, $sql, $cron_id, $_SESSION['user_id'], $new_value);
$tpl->assign( array('TR_CRON_MANAGER' => tr('Cronjob Manager'), 'TR_EDIT_CRONJOB' => tr('Edit Cronjob'), 'TR_NAME' => tr('Name'), 'TR_DESCRIPTION' => tr('Description'), 'TR_ACTIVE' => tr('Active'), 'YES' => tr('Yes'), 'NO' => tr('No'), 'TR_CRONJOB' => tr('Cronjob'), 'TR_COMMAND' => tr('Command to run:'), 'TR_MIN' => tr('Minute(s):'), 'TR_HOUR' => tr('Hour(s):'), 'TR_DAY' => tr('Day(s):'), 'TR_MONTHS' => tr('Month(s):'), 'TR_WEEKDAYS' => tr('Weekday(s):'), 'TR_UPDATE' => tr('Update'), 'TR_CANCEL' => tr('Cancel') ) );
gen_page_message($tpl);
$tpl->parse('PAGE', 'page'); $tpl->prnt();
if (Config::get('DUMP_GUI_DEBUG')) dump_gui_debug();
unset_messages();
?>
Уффф! Я уж и не чаял заставить эту хрень работать как надо.
Ну я так понимаю можно делать мультиленг нормальный и собирать пакет.
Надеюсь вспомню какие файлы подвергались редакции на лету.
RE: CronJob Russian Solution - data-stream_ru - 02-06-2010 09:28 PM
Локализацию тож нормально уже сделал.
Какие там ещё пожелания по существу были и есть? А то я ща слеплю пакет и забуду про это дело надолго.
RE: CronJob Russian Solution - data-stream_ru - 02-12-2010 04:23 PM
Новый под ispCP 1.0.3-1 со всеми фичами и новой русификацией.
Внимательно читаем инструкцию.
Проверьте плиз все страницы в левом подменю меню Web-Инструменты.
Если у кого то вылезет что то вроде {CROJOB_MANAGER} то пишите, доложу файло. Я там слишком много менял, потом понял что всё это можно прописать в одном месте. Прописал. Вроде должно работать везде.
RE: CronJob Russian Solution - data-stream_ru - 03-19-2010 02:46 AM
Писец, последний всарианты выложил буржуям.
Больше развивать это не буду. Ибо задолбали не по деццки. Сами не могут сделать, так наше хают.
Короч, я им уже сказал "Если я не работаю за славу страны, то я работаю за деньги". Сталбыть так тому и быть - Кому надо крон под новые версии или своих админов под старые не хатает - пишите в приат. Или на моём форуме. Желательно начинать с версии ОС, версии панели и предлагаемой суммы. Ну чтоб мы хотя бы имели приоритет кому в какой последовательности отвечать. Или посылать...
RE: CronJob Russian Solution - server801 - 03-19-2010 07:29 AM
жесть......
RE: CronJob Russian Solution - webspy - 03-19-2010 08:36 PM
Едрить колотить... эмм... геморрой с этой установкой много...
RE: CronJob Russian Solution - data-stream_ru - 03-20-2010 09:34 AM
Хочешь кататься - люби и саночки возить.
RE: CronJob Russian Solution - fatalist - 01-06-2011 08:31 PM
Всем привет!
Заглохла темка, однако... Хотя весьма актуально. Я вот сейчас ставлю на 1.0.7... Ну как бы не ставлю, а, скорее, вкрячиваю.
Панель 1.0.7 на debian 6 (squeeze) гостем под OpenVZ...
В main.c нужно поменять местами setuid и setgid, ибо после установки uid'а процесс уже не имеет прав чтобы поставить gid. На выходе получаем owner'а vuXXXX:root.
В мускульной таблице пришлось руцями заменить vuXXXX на XXXX ибо atoi не может преобразовать из юзернейма в юзерайди... Скрипт добавления в БД уже переписал полностью.
короче, напильник должен быть весьма внушительный!
В любом случае авторам респект и уважуха, потому как тут все-таки проще допилить, чем написАть.
RE: CronJob Russian Solution - beliy - 01-07-2011 12:12 AM
2fatalist
По возможности выкладываем свои наработки, что меняли и т.д. ибо это может кому то значительно сэкономить времени, точно также кто то может тебе помочь...
|