khanat-code-old/code/ryzom/tools/server/admin/functions_tool_main.php

1723 lines
50 KiB
PHP
Raw Normal View History

2013-06-15 14:08:38 +00:00
<?php
$refresh_rates = array(
array('desc' => 'Every 5 secs',
'secs' => 5,
),
array('desc' => 'Every 30 secs',
'secs' => 30,
),
array('desc' => 'Every 1 min.',
'secs' => 60,
),
array('desc' => 'Every 5 min.',
'secs' => 300,
),
array('desc' => 'Every 10 min.',
'secs' => 600,
),
array('desc' => 'Every 30 min.',
'secs' => 1800,
),
array('desc' => 'Never',
'secs' => 0,
),
);
class MyAdminService extends CAdminServiceWeb
{
function commandResult($serviceModuleName, $result)
{
global $tpl;
global $command_return_data;
nt_common_add_debug("Service $serviceModuleName returned '$result'");
$data = "===[ Service ". strtoupper($serviceModuleName) ." returned ]===\n". trim($result) ."\n\n";
if (isset($command_return_data)) $command_return_data[] = explode("\n", $data);
$tpl->append('tool_execute_result', $data);
}
function invokeError($methodName, $errorString)
{
global $tpl;
nt_common_add_debug("AS Error in '$methodName' : $errorString");
$tpl->assign('tool_as_error', "AS Error in '$methodName' : $errorString");
}
}
function tool_main_check_user_domain($domain_id)
{
global $nel_user;
if (!$domain_id) return false;
$ud = $nel_user['access']['domains'];
if (is_array($ud))
{
reset($ud);
foreach($ud as $udomain)
{
if ($domain_id == $udomain['domain_id']) return true;
}
}
return false;
}
function tool_main_check_user_shard($shard_id)
{
global $nel_user;
if (!$shard_id) return false;
$us = $nel_user['access']['shards'];
if (is_array($us))
{
reset($us);
foreach($us as $ushard)
{
if ($shard_id == $ushard['shard_id']) return true;
}
}
return false;
}
function tool_main_get_domain_name($domain_id)
{
global $nel_user;
reset($nel_user['access']['domains']);
foreach($nel_user['access']['domains'] as $domain)
{
if ($domain['domain_id'] == $domain_id)
{
return $domain['domain_name'];
}
}
return null;
}
function tool_main_get_domain_data($domain_id, $field)
{
global $nel_user;
reset($nel_user['access']['domains']);
foreach($nel_user['access']['domains'] as $domain)
{
if ($domain['domain_id'] == $domain_id)
{
// echo "ok $domain_id : $field : ".$domain[$field];
return $domain[$field];
}
}
return null;
}
function tool_main_get_domain_rrd_path($domain_id)
{
global $nel_user;
reset($nel_user['access']['domains']);
foreach($nel_user['access']['domains'] as $domain)
{
if ($domain['domain_id'] == $domain_id)
{
return $domain['domain_rrd_path'];
}
}
return null;
}
function tool_main_get_shard_name($shard_id)
{
global $nel_user;
reset($nel_user['access']['shards']);
foreach($nel_user['access']['shards'] as $shard)
{
if ($shard['shard_id'] == $shard_id)
{
return $shard['shard_name'];
}
}
return null;
}
function tool_main_get_shard_as_id($shard_id)
{
global $nel_user;
reset($nel_user['access']['shards']);
foreach($nel_user['access']['shards'] as $shard)
{
if ($shard['shard_id'] == $shard_id)
{
return $shard['shard_as_id'];
}
}
return null;
}
function tool_main_get_shard_data($shard_id, $field)
{
global $nel_user;
reset($nel_user['access']['shards']);
foreach($nel_user['access']['shards'] as $shard)
{
if ($shard['shard_id'] == $shard_id)
{
return $shard[$field];
}
}
return null;
}
function tool_main_get_domain_host($domain_id)
{
global $nel_user;
reset($nel_user['access']['domains']);
foreach($nel_user['access']['domains'] as $domain)
{
if ($domain['domain_id'] == $domain_id)
{
return $domain['domain_as_host'];
}
}
return null;
}
function tool_main_get_domain_port($domain_id)
{
global $nel_user;
reset($nel_user['access']['domains']);
foreach($nel_user['access']['domains'] as $domain)
{
if ($domain['domain_id'] == $domain_id)
{
return $domain['domain_as_port'];
}
}
return null;
}
function tool_main_get_elapsed_time_string($seconds, &$string)
{
//returns an array of numeric values representing days, hours, minutes & seconds respectively
$ret=array('days'=>0,'hours'=>0,'minutes'=>0,'seconds'=>0,'totalseconds'=>0);
$totalsec = $seconds;
$ret['totalseconds'] = $totalsec;
//print $earlierDate. ":". $laterDate. ":". $totalsec ."<br>";
if ($totalsec >= 86400)
{
$ret['days'] = floor($totalsec/86400);
$totalsec = $totalsec % 86400;
}
if ($totalsec >= 3600)
{
$ret['hours'] = floor($totalsec/3600);
$totalsec = $totalsec % 3600;
}
if ($totalsec >= 60)
{
$ret['minutes'] = floor($totalsec/60);
}
$ret['seconds'] = $totalsec % 60;
$string = '';
$string .= ($ret['days'] > 0) ? tool_main_leftpad($ret['days']).'d ' : '';
$string .= (($ret['hours'] > 0) || (strlen($string) > 0)) ? tool_main_leftpad($ret['hours']).'h ' : '';
$string .= (($ret['minutes'] > 0) || (strlen($string) > 0)) ? tool_main_leftpad($ret['minutes']).'m ' : '';
$string .= (($ret['seconds'] > 0) || (strlen($string) > 0)) ? tool_main_leftpad($ret['seconds']).'s ' : '';
$ret['string'] = trim($string);
return $ret;
}
function tool_main_leftpad($n,$cc=2,$ch='0')
{
return str_pad($n, $cc, $ch, STR_PAD_LEFT);
}
function tool_main_get_shards_from_status($status, $filters)
{
$result = array();
if (is_array($status) && sizeof($status))
{
reset($status);
foreach($status as $sline)
{
$shard_name = trim($sline['ShardName']);
if (($shard_name != '') && (isset($filters[$shard_name]) || isset($filters['_all_'])))
{
$result[] = $shard_name;
}
}
$result = array_values(array_unique($result));
}
return $result;
}
function tool_main_get_aes_from_status($status)
{
$result = array();
if (is_array($status) && sizeof($status))
{
reset($status);
foreach($status as $skey => $sline)
{
$short_name = trim($sline['ShortName']);
$running_state = trim($sline['RunningState']);
if (($short_name == 'AES') && ($running_state == 'online'))
{
$result[] = $sline['AliasName'];
}
}
}
return $result;
}
function tool_main_parse_status($status)
{
$check_graphs = tool_admin_applications_check('tool_main_graphs');
$_sort_list = array();
$domainServices = array();
$sortedServices = array();
if (is_array($status) && sizeof($status))
{
reset($status);
foreach($status as $sline)
{
$vars = array();
$vars['_flags_'] = array();
$sline_vars = explode("\t", $sline);
reset($sline_vars);
foreach($sline_vars as $sline_var)
{
$sline_parts = explode("=", $sline_var);
if ($sline_parts[0] == 'RunningState')
{
// this is a small fix to an unknown server bug :)
if (trim($sline_parts[1]) == 'topped') $sline_parts[1] = 'rs_stopped';
elseif (trim($sline_parts[1]) == 'nline') $sline_parts[1] = 'rs_online';
$vars['_flags_'][$sline_parts[1]] = true;
$sline_parts[1] = substr($sline_parts[1], 3);
}
elseif ($sline_parts[0] == 'RunningOrders')
{
$vars['_flags_'][$sline_parts[1]] = true;
$sline_parts[1] = substr($sline_parts[1], 3);
}
elseif ($sline_parts[0] == 'RunningTags')
{
$_tmp = explode(" ", trim($sline_parts[1]));
reset($_tmp);
foreach($_tmp as $_tmp_key => $_tmp_part)
{
$vars['_flags_'][$_tmp_part] = true;
$_tmp_part = str_replace('_',' ',substr($_tmp_part, 3));
$_tmp[$_tmp_key] = $_tmp_part;
}
$sline_parts[1] = implode(' / ', $_tmp);
}
elseif ($sline_parts[0] == 'NoReportSince')
{
$_today = time();
$_day = date("d", $_today);
$_month = date("m", $_today);
$_year = date("Y", $_today);
$_base_day = mktime(0, 0, 0, $_month, $_day, $_year);
if ($sline_parts[1] >= $_base_day)
{
$sline_parts[1] = 'n/a';
}
else
{
$time0 = 0 + $sline_parts[1]; // convert to a number ;)
if ($time0 > 60) $vars['_flags_']['alert_red'] = true;
elseif ($time0 > 40) $vars['_flags_']['alert_orange_dark'] = true;
elseif ($time0 > 25) $vars['_flags_']['alert_orange_light'] = true;
tool_main_get_elapsed_time_string($sline_parts[1],$sline_parts[1]);
}
}
elseif ($sline_parts[0] == 'UpTime')
{
$_today = time();
$_day = date("d", $_today);
$_month = date("m", $_today);
$_year = date("Y", $_today);
$_base_day = mktime(0, 0, 0, $_month, $_day, $_year);
if ($sline_parts[1] >= $_base_day)
{
$sline_parts[1] = 'n/a';
}
else
{
tool_main_get_elapsed_time_string($sline_parts[1],$sline_parts[1]);
}
}
elseif ($sline_parts[0] == 'State')
{
if (strtolower($sline_parts[1]) == 'stalled') $vars['_flags_']['alert_red'] = true;
elseif (strtolower($sline_parts[1]) == 'halted') $vars['_flags_']['alert_red'] = true;
$vars['_flags_'][$sline_parts[1]] = true;
}
elseif ($sline_parts[0] == 'Hostname')
{
$sline_parts[1] = substr($sline_parts[1], 0, strpos($sline_parts[1], '.'));
}
elseif ($sline_parts[0] == 'AliasName')
{
$vars['_flags_']['alias_code'] = '';
}
$vars[$sline_parts[0]] = $sline_parts[1];
}
// check is service is chain crashing
if (in_array('rt_chain_crashing', array_keys($vars['_flags_'])))
{
// check is service is online (anything that is not stopped)
if (!in_array('rs_stopped', array_keys($vars['_flags_'])))
{
// check the start counts for crashing age
$crash_counts = explode(' ', $vars['StartCounter']);
if ($crash_counts[0] >= 5) $vars['_flags_']['alert_red'] = true;
elseif ($crash_counts[1] >= 5) $vars['_flags_']['alert_orange_dark'] = true;
elseif ($crash_counts[2] >= 5) $vars['_flags_']['alert_orange_light'] = true;
}
}
//$vars['_flags_']['has_graphs'] = tool_main_check_rrd_files($vars['AliasName']);
$_sort_list[] = $vars['AliasName'];
$domainServices[] = $vars;
}
sort($_sort_list);
reset($_sort_list);
foreach($_sort_list as $_sort_name)
{
reset($domainServices);
foreach($domainServices as $serviceRow)
{
if ($_sort_name == $serviceRow['AliasName'])
{
$sortedServices[] = $serviceRow;
break;
}
}
}
}
return $sortedServices;
}
function tool_main_check_rrd_files($service)
{
if ($handle = opendir(NELTOOL_RRDBASE))
{
while (false !== ($file = readdir($handle)))
{
if ($file != "." && $file != "..")
{
$file_parts = explode(".", $file);
if (sizeof($file_parts) == 3)
{
if (($service == $file_parts[0]) && (($file_parts[2] == 'rrd') || ($file_parts[2] == 'hrd')))
{
closedir($handle);
return true;
}
}
}
}
closedir($handle);
}
return false;
}
function tool_main_get_checked_services()
{
global $NELTOOL;
$services = array();
reset($NELTOOL['POST_VARS']);
foreach($NELTOOL['POST_VARS'] as $post_key => $post_val)
{
$val = 'service_'. $post_val;
if ($post_key == $val)
{
$services[] = $post_val;
}
}
return $services;
}
function tool_main_get_shard_ids($shard_id)
{
global $nel_user;
$data = array();
reset($nel_user['access']['shards']);
foreach($nel_user['access']['shards'] as $shards)
{
if ($shards['shard_id'] == $shard_id)
{
$shards_tmp = trim($shards['shard_as_id']);
if ($shards_tmp == '*')
{
$data['_all_'] = true;
}
elseif ($shards_tmp == '?')
{
$data['_unknown_'] = true;
}
else
{
$shard_parts = explode(':', $shards_tmp);
reset($shard_parts);
foreach($shard_parts as $shard_as_id)
{
if ($shard_as_id == '?')
{
$data['_unknown_'] = true;
}
else
{
$data[$shard_as_id] = true;
}
}
}
}
}
return $data;
}
function tool_main_get_shards_orders($orders)
{
$data = array();
if (is_array($orders) && sizeof($orders))
{
reset($orders);
foreach($orders as $order_line)
{
$order_items = explode("\t", $order_line);
$shard_name = "";
$shard_order = "";
reset($order_items);
foreach($order_items as $order_parts)
{
$order_bits = explode("=", $order_parts);
$order_bits[0] = trim($order_bits[0]);
$order_bits[1] = trim($order_bits[1]);
if ($order_bits[0] == 'ShardName')
{
$shard_name = $order_bits[1];
}
elseif ($order_bits[0] == 'Orders')
{
$shard_order = substr($order_bits[1],3);
}
}
if ($shard_name != "" && $shard_order != "")
{
$data[$shard_name] = $shard_order;
}
}
}
return $data;
}
function tool_main_get_last_hd_time_for_domain($domain_id)
{
global $db;
$timer = 0;
$sql = "SELECT * FROM ". NELDB_STAT_HD_TIME_TABLE ." WHERE hd_domain_id=". $domain_id;
if ($result = $db->sql_query($sql))
{
if ($db->sql_numrows($result))
{
$data = $db->sql_fetchrow($result);
$timer = $data['hd_last_time'];
}
}
return $timer;
}
function tool_main_update_hd_time_for_domain($domain_id, $now)
{
global $db;
//if ($stat_time == 0) $sql = "INSERT INTO ". NELDB_STAT_HD_TIME_TABLE ." (`hd_domain_id`,`hd_last_time`) VALUES (". $domain_id .",". $now .")";
//else $sql = "UPDATE ". NELDB_STAT_HD_TIME_TABLE ." SET hd_last_time=". $now ." WHERE hd_domain_id=". $domain_id;
$sql = "SELECT * FROM ". NELDB_STAT_HD_TIME_TABLE ." WHERE hd_domain_id=". $domain_id;
if ($result = $db->sql_query($sql))
{
if ($db->sql_numrows($result))
{
$sql = "UPDATE ". NELDB_STAT_HD_TIME_TABLE ." SET hd_last_time=". $now ." WHERE hd_domain_id=". $domain_id;
$db->sql_query($sql);
}
else
{
$sql = "INSERT INTO ". NELDB_STAT_HD_TIME_TABLE ." (`hd_domain_id`,`hd_last_time`) VALUES (". $domain_id .",". $now .")";
$db->sql_query($sql);
}
}
}
function tool_main_update_hd_data_for_domain($domain_id, $data)
{
global $db;
$aes_status = array();
if (is_array($data) && sizeof($data))
{
reset($data);
foreach($data as $aes)
{
$aes_server = null;
//$hd_found_slash_mount = null;
//$hd_found_slash_home = null;
//$hd_found_slash_home_nevrax = null;
//$hd_found_slash = null;
$aes_hd_ready = false;
$aes_data = explode("\n", $aes);
reset($aes_data);
foreach($aes_data as $aes_line)
{
$aes_line = trim($aes_line);
// clean up the multiple blank characters
$aes_line = ereg_replace("[[:space:]]+"," ",$aes_line);
if (ereg("^===\[ Service AES_([^[:space:]]+) returned \]===$", $aes_line, $regs))
{
$aes_server = strtolower($regs[1]);
$aes_status[$aes_server] = array();
}
elseif (ereg("^-* Command output begin -*$", $aes_line, $regs))
{
$aes_hd_ready = true;
}
elseif (ereg("^-* Command output end -*$", $aes_line, $regs))
{
$aes_hd_ready = false;
}
if ($aes_hd_ready)
{
$aes_line_data = explode(" ", $aes_line);
if (($aes_line_data[0] != 'Filesystem') && ($aes_line_data[1] != 'Command'))
{
//if ((strpos($aes_line_data[5],"/mnt/rsbk") == 0)
// || ($aes_line_data[5] == "/home")
// || ($aes_line_data[5] == "/home/nevrax")
// || ($aes_line_data[5] == "/"))
//{
$aes_status[$aes_server][] = array( 'device' => $aes_line_data[0],
'size' => $aes_line_data[1],
'used' => $aes_line_data[2],
'free' => $aes_line_data[3],
'usedpercent' => str_replace('%','',$aes_line_data[4]),
'mount' => $aes_line_data[5],
);
//}
}
}
//if ((substr($aes_line, 0, 5) == "/dev/") && $aes_server)
//{
//
// $aes_line_data = explode(" ", $aes_line);
//
// // 0 : device name
// // 1 : device size
// // 2 : used
// // 3 : available
// // 4 : used percentage
// // 5 : mount point
//
// if ($aes_line_data[5] == "/home")
// {
// $hd_found_slash_home = $aes_line_data;
// }
//
// if ($aes_line_data[5] == "/home/nevrax")
// {
// $hd_found_slash_home_nevrax = $aes_line_data;
// }
//
// if ($aes_line_data[5] == "/")
// {
// $hd_found_slash = $aes_line_data;
// }
//
// //if (($aes_line_data[5] == "/") || ($aes_line_data[5] == "/home/nevrax"))
// //{
// // $aes_status[$aes_server][] = array( 'device' => $aes_line_data[0],
// // 'size' => $aes_line_data[1],
// // 'used' => $aes_line_data[2],
// // 'free' => $aes_line_data[3],
// // 'usedpercent' => str_replace('%','',$aes_line_data[4]),
// // 'mount' => $aes_line_data[5],
// // );
// //}
//
//}
}
//$tmp = null;
//
//if (is_array($hd_found_slash_mount)) $tmp = $hd_found_slash_mount;
//elseif (is_array($hd_found_slash_home)) $tmp = $hd_found_slash_home;
//elseif (is_array($hd_found_slash_home_nevrax)) $tmp = $hd_found_slash_home_nevrax;
//elseif (is_array($hd_found_slash)) $tmp = $hd_found_slash;
//
//if (is_array($tmp))
//{
// $aes_status[$aes_server][] = array( 'device' => $tmp[0],
// 'size' => $tmp[1],
// 'used' => $tmp[2],
// 'free' => $tmp[3],
// 'usedpercent' => str_replace('%','',$tmp[4]),
// 'mount' => $tmp[5],
// );
//}
}
if (sizeof($aes_status))
{
nt_common_add_debug($aes_status);
//echo '<pre>'. print_r($aes_status, true) .'</pre>';
$sql = "DELETE FROM ". NELDB_STAT_HD_TABLE ." WHERE hd_domain_id=". $domain_id;
$db->sql_query($sql);
reset($aes_status);
foreach($aes_status as $server_name => $server_datas)
{
reset($server_datas);
foreach($server_datas as $server_hd)
{
if (trim($server_name) != '')
{
$sql = "INSERT INTO ". NELDB_STAT_HD_TABLE ." (`hd_domain_id`,`hd_server`,`hd_device`,`hd_size`,`hd_used`,`hd_free`,`hd_percent`,`hd_mount`)";
$sql .= " VALUES (". $domain_id .",'". $server_name ."','". $server_hd['device'] ."','". $server_hd['size'] ."',";
$sql .= "'". $server_hd['used'] ."','". $server_hd['free'] ."','". $server_hd['usedpercent'] ."','". $server_hd['mount'] ."')";
$db->sql_query($sql);
}
if (defined('NELTOOL_CRON_DEBUG')) echo "<br />SQL:$sql";
}
}
tool_main_update_hd_time_for_domain($domain_id, time());
}
}
}
function tool_main_get_hd_data_for_domain($domain_id)
{
global $db;
$data = array();
//$sql = "SELECT * FROM ". NELDB_STAT_HD_TABLE ." WHERE hd_domain_id=". $domain_id ." AND hd_mount='/' ORDER BY hd_percent DESC";
$sql = "SELECT * FROM ". NELDB_STAT_HD_TABLE ." WHERE hd_domain_id=". $domain_id ." ORDER BY hd_percent DESC";
if ($result = $db->sql_query($sql))
{
if ($db->sql_numrows($result))
{
while ($row = $db->sql_fetchrow($result))
{
$outp = '<b>'. $row['hd_server'] .'</b> : '. $row['hd_device'] .'<br>';
$outp .= '<27> Mount : '. $row['hd_mount'] .'<br>';
$outp .= '<27> Size : '. $row['hd_size'] .'<br>';
$outp .= '<27> Used : '. $row['hd_used'] .'<br>';
$outp .= '<27> Free : '. $row['hd_free'] .'<br>';
$row['summary'] = $outp;
$data[] = $row;
}
}
}
return $data;
}
function tool_main_get_annotation($domain_id, $shard_id)
{
global $db;
$data = null;
$sql = "SELECT * FROM ". NELDB_ANNOTATION_TABLE ." WHERE 1=0";
if ($domain_id > 0) $sql .= " OR annotation_domain_id=". $domain_id;
if ($shard_id > 0) $sql .= " OR annotation_shard_id=". $shard_id;
$sql .= " ORDER BY annotation_date DESC";
if ($result = $db->sql_query($sql))
{
if ($db->sql_numrows($result))
{
$data = $db->sql_fetchrow($result);
}
}
return $data;
}
function tool_main_get_lock($domain_id, $shard_id)
{
global $db;
$data = null;
$sql = "SELECT * FROM ". NELDB_LOCK_TABLE ." WHERE 1=0 ";
if ($domain_id > 0) $sql .= " OR lock_domain_id=". $domain_id;
if ($shard_id > 0) $sql .= " OR lock_shard_id=". $shard_id;
$sql .= " ORDER BY lock_date DESC";
if ($result = $db->sql_query($sql))
{
if ($db->sql_numrows($result))
{
$data = $db->sql_fetchrow($result);
}
}
return $data;
}
function tool_main_delete_lock_shard($shard_id)
{
global $db;
global $nel_user;
global $AS_Name, $AS_ShardName;
nt_log("Shard Unlock (Domain: '". $AS_Name ."' - Shard: '". $AS_ShardName ."') by '". $nel_user['user_name'] ."'");
$sql = "DELETE FROM ". NELDB_LOCK_TABLE ." WHERE lock_shard_id=". $shard_id;
$db->sql_query($sql);
}
function tool_main_delete_lock_domain($domain_id)
{
global $db;
global $nel_user;
global $AS_Name, $AS_ShardName;
nt_log("Domain Unlock (Domain: '". $AS_Name ."') by '". $nel_user['user_name'] ."'");
$sql = "DELETE FROM ". NELDB_LOCK_TABLE ." WHERE lock_domain_id=". $domain_id;
$db->sql_query($sql);
}
function tool_main_set_lock_shard($domain_id, $shard_id, $log=true)
{
global $db;
global $nel_user;
global $AS_Name, $AS_ShardName;
// we need to check if the shard is *all*
// if its the case, we go for a lock domain instead
$sql = "SELECT * FROM ". NELDB_SHARD_TABLE ." WHERE shard_id=". $shard_id;
if ($result = $db->sql_query($sql))
{
if ($db->sql_numrows($result))
{
$shard_row = $db->sql_fetchrow($result);
if ($shard_row['shard_as_id'] == "*")
{
return tool_main_set_lock_domain($domain_id, $log);
}
}
}
$data = tool_main_get_lock($domain_id, $shard_id);
$now = time();
if (is_array($data) && ($data['lock_shard_id'] > 0))
{
if ($log) nt_log("Shard Lock (Domain: '". $AS_Name ."' - Shard: '". $AS_ShardName ."') by '". $nel_user['user_name'] ."'");
$sql = "UPDATE ". NELDB_LOCK_TABLE ." SET lock_user_name='". $nel_user['user_name'] ."',lock_update=". $now ." WHERE lock_id=". $data['lock_id'];
$db->sql_query($sql);
}
elseif (!$data)
{
if ($log) nt_log("Shard Lock (Domain: '". $AS_Name ."' - Shard: '". $AS_ShardName ."') by '". $nel_user['user_name'] ."'");
$sql = "INSERT INTO ". NELDB_LOCK_TABLE ." (`lock_shard_id`,`lock_user_name`,`lock_date`,`lock_update`) VALUES (". $shard_id .",'". $nel_user['user_name'] ."',". $now .",". $now .")";
$db->sql_query($sql);
}
}
function tool_main_get_domain_shard_list($domain_id)
{
global $db;
$data = array();
$sql = "SELECT * FROM ". NELDB_SHARD_TABLE ." WHERE shard_domain_id=". $domain_id;
if ($result = $db->sql_query($sql))
{
if ($db->sql_numrows($result))
{
while ($row = $db->sql_fetchrow($result))
{
$data[] = $row['shard_id'];
}
}
}
return $data;
}
function tool_main_set_lock_domain($domain_id, $log=true)
{
global $db;
global $nel_user;
global $AS_Name, $AS_ShardName;
// to lock a domain you need to remove all locks from any shard in it
$lock_data = tool_main_get_lock($domain_id, 0);
$now = time();
if (is_array($lock_data))
{
$sql = "UPDATE ". NELDB_LOCK_TABLE ." SET lock_user_name='". $nel_user['user_name'] ."',lock_update=". $now ." WHERE lock_id=". $lock_data['lock_id'];
$db->sql_query($sql);
}
else
{
$shard_list = tool_main_get_domain_shard_list($domain_id);
$shard_list = array_values($shard_list);
$sql = "DELETE FROM ". NELDB_LOCK_TABLE ." WHERE lock_shard_id IN (". implode(',', $shard_list) .")";
$db->sql_query($sql);
$sql = "INSERT INTO ". NELDB_LOCK_TABLE ." (`lock_domain_id`,`lock_user_name`,`lock_date`,`lock_update`) VALUES (". $domain_id .",'". $nel_user['user_name'] ."',". $now .",". $now .")";
$db->sql_query($sql);
}
if ($log) nt_log("Domain Lock (Domain: '". $AS_Name ."') by '". $nel_user['user_name'] ."'");
}
function tool_main_set_annotation($domain_id, $shard_id, $annotation)
{
global $db;
global $nel_user;
global $AS_Name, $AS_ShardName;
$annotation = htmlentities(trim($annotation), ENT_QUOTES);
$data = tool_main_get_lock($domain_id, $shard_id);
if ($data['lock_domain_id'])
{
// its a domain lock
$shard_list = tool_main_get_domain_shard_list($domain_id);
$shard_list = array_values($shard_list);
$sql = "DELETE FROM ". NELDB_ANNOTATION_TABLE ." WHERE annotation_shard_id IN (". implode(',', $shard_list) .")";
$db->sql_query($sql);
$annotation_data = tool_main_get_annotation($domain_id, 0);
if ($annotation_data)
{
nt_log("Domain Annotation (Domain: '". $AS_Name ."') by '". $nel_user['user_name'] ."' : ". $annotation);
$sql = "UPDATE ". NELDB_ANNOTATION_TABLE ." SET annotation_data='". $annotation ."',annotation_user_name='". $nel_user['user_name'] ."',annotation_date=". time() ." WHERE annotation_id=". $annotation_data['annotation_id'];
$db->sql_query($sql);
}
else
{
nt_log("Domain Annotation (Domain: '". $AS_Name ."') by '". $nel_user['user_name'] ."' : ". $annotation);
$sql = "INSERT INTO ". NELDB_ANNOTATION_TABLE ." (`annotation_domain_id`,`annotation_data`,`annotation_user_name`,`annotation_date`) VALUES ";
$sql .= "(". $domain_id .",'". $annotation ."','". $nel_user['user_name'] ."',". time() .")";
$db->sql_query($sql);
}
}
else
{
// its a shard lock
$annotation_data = tool_main_get_annotation(0, $shard_id);
if ($annotation_data)
{
nt_log("Shard Annotation (Domain: '". $AS_Name ."' - Shard: '". $AS_ShardName ."') by '". $nel_user['user_name'] ."' : ". $annotation);
$sql = "UPDATE ". NELDB_ANNOTATION_TABLE ." SET annotation_data='". $annotation ."',annotation_user_name='". $nel_user['user_name'] ."',annotation_date=". time() ." WHERE annotation_id=". $annotation_data['annotation_id'];
$db->sql_query($sql);
}
else
{
nt_log("Shard Annotation (Domain: '". $AS_Name ."' - Shard: '". $AS_ShardName ."') by '". $nel_user['user_name'] ."' : ". $annotation);
$sql = "INSERT INTO ". NELDB_ANNOTATION_TABLE ." (`annotation_shard_id`,`annotation_data`,`annotation_user_name`,`annotation_date`) VALUES ";
$sql .= "(". $shard_id .",'". $annotation ."','". $nel_user['user_name'] ."',". time() .")";
$db->sql_query($sql);
}
}
}
function tool_main_get_shards_info_from_db($application, $status, $filters, $ringsqlstring='')
{
$shard_list = array();
$shard_list_result = array();
//nt_common_add_debug('in tool_main_get_shards_info_from_db()');
//nt_common_add_debug($status);
if (is_array($status) && sizeof($status))
{
reset($status);
foreach($status as $sline)
{
$shard_name = trim($sline['ShardName']);
$shard_id = trim($sline['ShardId']);
if (($shard_name != '' && $shard_id != '') && (isset($filters[$shard_name]) || isset($filters['_all_'])))
{
if (!in_array($shard_name, array_values($shard_list)))
{
$shard_list[$shard_id] = $shard_name;
}
}
}
}
nt_common_add_debug('shard_list :');
nt_common_add_debug($shard_list);
reset($shard_list);
foreach($shard_list as $shard_key => $shard_application)
{
if (is_numeric($shard_key))
{
$shard_list2[$shard_key] = $shard_application;
}
}
//nt_common_add_debug('shard_list2 :');
//nt_common_add_debug($shard_list2);
if ($ringsqlstring == '')
{
global $db;
$db->sql_select_db('nel');
//$sql = "SELECT * FROM shard WHERE ShardId IN (". implode(',', array_keys($shard_list)) .")";
if (is_array($shard_list2) && sizeof($shard_list2))
{
$sql = "SELECT * FROM shard, domain WHERE shard.domain_id=domain.domain_id AND shard.ShardId IN (". implode(',', array_keys($shard_list2)) .") AND domain.domain_name='". $application ."'";
if ($result = $db->sql_query($sql))
{
if ($db->sql_numrows($result))
{
while ($row = $db->sql_fetchrow($result))
{
// patch to support live and ats mysql changes
$state = '';
if (isset($row['State'])) $state = $row['State'];
elseif (isset($row['RequiredState'])) $state = $row['RequiredState'];
$shard_name = $shard_list[$row['ShardId']];
$shard_list_result[$shard_name] = array('shard_id' => $row['ShardId'],
'version' => $row['Version'],
'state' => substr($state,3),
'motd' => $row['MOTD'],
);
}
}
}
}
$db->sql_reselect_db();
}
else
{
$db = new sql_db_string($ringsqlstring);
if (is_object($db))
{
if (is_array($shard_list2) && sizeof($shard_list2))
{
//nt_common_add_debug("tool_main_get_shards_info_from_db()");
//nt_common_add_debug($shard_list2);
$sql = "SELECT * FROM shard WHERE shard_id IN (". implode(',', array_keys($shard_list2)) .")";
if ($result = $db->sql_query($sql))
{
if ($db->sql_numrows($result))
{
while ($row = $db->sql_fetchrow($result))
{
// patch to support live and ats mysql changes
$state = '';
if (isset($row['State'])) $state = $row['State'];
elseif (isset($row['RequiredState'])) $state = $row['RequiredState'];
$shard_name = $shard_list[$row['shard_id']];
$shard_list_result[$shard_name] = array('shard_id' => $row['shard_id'],
//'version' => $row['Version'],
'state' => substr($state,3),
'motd' => $row['MOTD'],
);
}
}
}
}
else
{
nt_common_add_debug('in tool_main_get_shards_info_from_db() : shard_list2 is empty !');
//nt_common_add_debug('dumping : filters');
//nt_common_add_debug($filters);
}
}
else
{
// db error
}
}
return $shard_list_result;
}
function tool_main_get_su_from_status($status)
{
if (is_array($status) && sizeof($status))
{
reset($status);
foreach($status as $sline)
{
if ($sline['ShortName'] == 'SU')
{
return $sline['AliasName'];
}
}
}
return null;
}
function tool_main_set_restart_mode($domain_id, $shard_id, $restart_mode=0)
{
global $db, $nel_user, $tpl;
global $AS_ShardRestart, $AS_ShardDomainRestart;
$sequence_info = tool_main_get_restart_sequence($nel_user['user_name'], $domain_id, $shard_id);
if (!$sequence_info)
{
$sequence_info = tool_main_add_restart_sequence($nel_user['user_name'], $domain_id, $shard_id, $restart_mode);
}
if ($sequence_info)
{
$sql = "UPDATE ". NELDB_SHARD_TABLE ." SET shard_restart=". $sequence_info['restart_sequence_id'] ." WHERE shard_id=". $shard_id ." AND shard_domain_id=". $domain_id;
$db->sql_query($sql);
// update shards information
$nel_user['access']['user_shards'] = tool_admin_users_shards_get_list($nel_user['user_id']);
$nel_user['access']['group_shards'] = tool_admin_groups_shards_get_list($nel_user['user_group_id']);
$nel_user['access']['shards'] = tool_admin_users_groups_shards_merge();
$tpl->assign('tool_shard_list', $nel_user['access']['shards']);
// update shard restart information
$AS_ShardRestart = tool_main_get_shard_data($shard_id, 'shard_restart');
$AS_ShardDomainRestart = tool_main_get_domain_shard_restart($view_domain_id);
$tpl->assign('tool_shard_restart_status', $AS_ShardRestart);
$tpl->assign('tool_domain_has_shard_restart', $AS_ShardDomainRestart);
}
return $sequence_info;
}
function tool_main_add_restart_sequence($user_name, $domain_id, $shard_id, $step=0)
{
global $db;
global $nel_user;
global $AS_Name, $AS_ShardName;
global $restart_notification_emails;
$now = time();
$sql = "INSERT INTO ". NELDB_RESTART_SEQUENCE_TABLE;
$sql .= " (`restart_sequence_domain_id`,`restart_sequence_shard_id`,`restart_sequence_user_name`,";
$sql .= " `restart_sequence_step`,`restart_sequence_date_start`,`restart_sequence_date_end`) VALUES ";
$sql .= " (". $domain_id .",". $shard_id .",'". $user_name ."',";
$sql .= $step .",". $now .",". $now .")";
$db->sql_query($sql);
$sequence_info = tool_main_get_restart_sequence_by_id($db->sql_nextid());
nt_log("Shard Restart (Domain: '". $AS_Name ."' - Shard: '". $AS_ShardName ."' - Sequence: '". $sequence_info['restart_sequence_id'] ."') started by '". $nel_user['user_name'] ."'");
$email_subject = "[Shard Admin Tool] Restart Sequence Begins (id: ".$sequence_info['restart_sequence_id'].", step: ". $step .") for shard ".$AS_Name."/".$AS_ShardName." by ".$nel_user['user_name'];
$email_message = $email_subject;
nt_email($email_subject,$email_message,$restart_notification_emails);
return $sequence_info;
}
function tool_main_get_restart_sequence($user_name, $domain_id, $shard_id)
{
global $db;
$data = null;
$sql = "SELECT * FROM ". NELDB_RESTART_SEQUENCE_TABLE ." WHERE restart_sequence_domain_id=". $domain_id ." AND restart_sequence_shard_id=". $shard_id ." AND restart_sequence_user_name='". $user_name ."' AND restart_sequence_step=0 AND restart_sequence_date_start=restart_sequence_date_end";
if ($result = $db->sql_query($sql))
{
if ($db->sql_numrows($result))
{
$data = $db->sql_fetchrow($result);
}
}
return $data;
}
function tool_main_get_restart_sequence_by_id($sequence_id)
{
global $db;
$data = null;
$sql = "SELECT * FROM ". NELDB_RESTART_SEQUENCE_TABLE ." WHERE restart_sequence_id=". $sequence_id;
if ($result = $db->sql_query($sql))
{
if ($db->sql_numrows($result))
{
$data = $db->sql_fetchrow($result);
}
}
return $data;
}
function tool_main_set_next_restart_sequence_step($sequence_id, $step=null)
{
global $db;
global $nel_user;
global $AS_Name, $AS_ShardName;
global $restart_notification_emails;
$now = time();
if ($step === null)
{
$sequence_info = tool_main_get_restart_sequence_by_id($sequence_id);
$step = $sequence_info['restart_sequence_step'] + 1;
}
$sql = "UPDATE ". NELDB_RESTART_SEQUENCE_TABLE ." SET restart_sequence_step=". $step .",restart_sequence_date_end=". $now ." WHERE restart_sequence_id=". $sequence_id;
$db->sql_query($sql);
nt_log("Shard Restart (Domain: '". $AS_Name ."' - Shard: '". $AS_ShardName ."' - Sequence: '". $sequence_id ."') - ". $nel_user['user_name'] ." moved to step ". $step);
if ($step !== null)
{
$email_subject = "[Shard Admin Tool] Restart Sequence Updated (id: ".$sequence_id.", step: ". $step .") for shard ".$AS_Name."/".$AS_ShardName." by ".$nel_user['user_name'];
$email_message = $email_subject;
nt_email($email_subject,$email_message,$restart_notification_emails);
}
return tool_main_get_restart_sequence_by_id($sequence_id);
}
function tool_main_set_end_restart_sequence($sequence_id)
{
global $db;
global $nel_user;
global $AS_Name, $AS_ShardName;
global $restart_notification_emails;
//$sequence_info = tool_main_set_next_restart_sequence_step($sequence_id);
$sequence_info = tool_main_get_restart_sequence_by_id($sequence_id);
$sql = "UPDATE ". NELDB_SHARD_TABLE ." SET shard_restart=0 WHERE shard_domain_id=". $sequence_info['restart_sequence_domain_id'] ." AND shard_id=". $sequence_info['restart_sequence_shard_id'];
$db->sql_query($sql);
nt_log("Shard Restart (Domain: '". $AS_Name ."' - Shard: '". $AS_ShardName ."' - Sequence: '". $sequence_id ."') - ". $nel_user['user_name'] ." ended the sequence !". $step);
$email_subject = "[Shard Admin Tool] Restart Sequence Ends (id: ".$sequence_info['restart_sequence_id'].", step: ". $sequence_info['restart_sequence_step'] .") for shard ".$AS_Name."/".$AS_ShardName." by ".$nel_user['user_name'];
$email_message = $email_subject;
nt_email($email_subject,$email_message,$restart_notification_emails);
}
function tool_main_get_domain_shard_restart($domain_id)
{
global $db;
$num = 0;
$sql = "SELECT * FROM ". NELDB_SHARD_TABLE ." WHERE shard_domain_id=". $domain_id ." AND shard_restart>0";
if ($result = $db->sql_query($sql))
{
$num = $db->sql_numrows($result);
}
return $num;
}
function tool_main_get_restart_services($InternalName, $domainServices, $restart_list)
{
// lets sort each services by 'type'
nt_common_add_debug("RESTART DEBUG");
nt_common_add_debug($domainServices);
$sortedServices = array();
reset($domainServices);
foreach($domainServices as $domainService)
{
if ($domainService['ShardName'] == $InternalName)
{
// this should be the real 'type'
// $type = $domainService['ShortName'];
// but instead we'll take the first part of the AliasName (as in "rws" or "rws_aniro")
$type = explode('_',$domainService['AliasName']);
$type = trim(strtolower($type[0]));
if (!isset($sortedServices[$type]))
{
$sortedServices[$type] = array();
}
$sortedServices[$type][] = $domainService['AliasName'];
nt_common_add_debug("Adding '". $domainService['AliasName'] ."' to '$type'");
}
}
reset($restart_list);
foreach($restart_list as $restart_key => $restart_group)
{
$group_list = explode(',', $restart_group['restart_group_list']);
$tmp_list = array();
reset($group_list);
foreach($group_list as $group_service_type)
{
$group_service_type = trim($group_service_type);
nt_common_add_debug("looking for '$group_service_type'");
if (isset($sortedServices[$group_service_type]))
{
$tmp_list[] = implode(',',$sortedServices[$group_service_type]);
}
else
{
nt_common_add_debug("not found!");
}
}
$restart_list[$restart_key]['service_list'] = implode(',',$tmp_list);
}
nt_common_add_debug("RESTART SERVICES DEBUG");
nt_common_add_debug($restart_list);
return $restart_list;
}
function tool_main_get_all_restart_services($restart_list)
{
$stop_data = array();
$stop_list = '';
reset($restart_list);
foreach($restart_list as $restart_key => $restart_group)
{
$stop_data[] = $restart_group['service_list'];
}
$stop_list = implode(',', $stop_data);
return $stop_list;
}
function tool_main_get_shardid_from_status($domainServices, $InternalName)
{
reset($domainServices);
foreach($domainServices as $service)
{
if (($service['ShardName'] == $InternalName) && (is_numeric($service['ShardId'])))
{
return $service['ShardId'];
}
}
return null;
}
function tool_main_get_egs_from_status($domainServices, $InternalName)
{
reset($domainServices);
foreach ($domainServices as $service)
{
if (($service['ShardName'] == $InternalName) && ($service['ShortName'] == 'EGS'))
{
return $service['AliasName'];
}
}
return null;
}
function tool_main_set_restart_sequence_timer($sequence_id, $timer)
{
global $db;
$now = time();
$timer = $timer;
$new_timer = $now + $timer;
$sql = "UPDATE ". NELDB_RESTART_SEQUENCE_TABLE ." SET restart_sequence_date_end=". $now .",restart_sequence_timer=". $new_timer ." WHERE restart_sequence_id=". $sequence_id;
$db->sql_query($sql);
return array('start' => $now, 'end' => $new_timer);
}
function tool_main_change_restart_notification($event_list, $mode, $sql_connection)
{
if ($sql_connection != '' && sizeof($event_list))
{
$csdb = new sql_db_string($sql_connection);
if (is_object($csdb))
{
$sql = "UPDATE Sorbot_events SET event_action=". $mode .",event_time=". time() .",event_lap=0 WHERE event_id IN (". implode(',', array_values($event_list)) .")";
$csdb->sql_query($sql);
$csdb->sql_close();
}
}
}
function tool_main_add_restart_notification($sequence_id, $service_su, $service_egs, $shard_id, $sorbot_message_type, $sql_connection, $shard_lang='en')
{
nt_common_add_debug('tool_main_add_restart_notification()');
if ($sql_connection != '')
{
$csdb = new sql_db_string($sql_connection);
if (is_object($csdb))
{
$sequence_info = tool_main_get_restart_sequence_by_id($sequence_id);
$shard_info = tool_main_get_domain_shard_data($sequence_info['restart_sequence_domain_id'], $sequence_info['restart_sequence_shard_id']);
if ($sorbot_message_type == 4102)
{
//$open_timer = 60*25; // 25 minutes before a shard opens itself
// new timer
$open_timer = 60*10; // 10 minutes before a shard opens itself
}
else // 4101
{
$open_timer = 0;
}
if ($sequence_info && $shard_info)
{
// lets find the shard id used by the ticket system
$sql = "SELECT * FROM ForumCS_tickets_shards WHERE shard_ca='". $shard_info['domain_application'] ."' AND shard_id='". $shard_id ."'";
if ($result = $csdb->sql_query($sql))
{
if ($csdb->sql_numrows($result))
{
$ticketsystem_shard_info = $csdb->sql_fetchrow($result);
nt_common_add_debug($ticketsystem_shard_info);
$ticketsystem_shard_id = $ticketsystem_shard_info['id'];
// now we have the shard id, lets see which klients servers wants events for it
$sql = "SELECT * FROM Sorbot_botconfig WHERE config_name='shardRestart' AND config_value LIKE '%:". $ticketsystem_shard_id .":%'";
if ($result2 = $csdb->sql_query($sql))
{
if ($csdb->sql_numrows($result2))
{
//$klients_servers = array();
//while ($row = $csdb->sql_fetchrow($result2))
//{
// $klients_servers[] = $row['server_name'];
//}
// NOTE: live but not in CVS yet !
$local_timer = $open_timer;
$klients_servers = array();
while ($row = $csdb->sql_fetchrow($result2))
{
$klients_servers[] = $row['server_name'];
// lets find if there is any specific opening timer, and keep the lowest one
$sql = "SELECT * FROM Sorbot_botconfig WHERE server_name='". $row['server_name'] ."' AND config_name='shardRestartOpenTimer'";
if ($result3 = $csdb->sql_query($sql))
{
if ($csdb->sql_numrows($result3))
{
$timer_row = $csdb->sql_fetchrow($result3);
if ($timer_row['config_value'] < $local_timer)
{
$local_timer = $timer_row['config_value'];
}
}
}
}
$open_timer = $local_timer;
// END NOTE: live but not in CVS yet !
// ok now we the list of servers that want this event, lets give it to them
// lets build some messages
$klients_countdown = '';
tool_main_get_elapsed_time_string($sequence_info['restart_sequence_timer'] - $sequence_info['restart_sequence_date_end'], $klients_countdown);
$klients_countdown = trim($klients_countdown);
$klients_open_countdown = '';
tool_main_get_elapsed_time_string($open_timer, $klients_open_countdown);
$klients_open_countdown = trim($klients_open_countdown);
$opening_message = tool_admin_restart_messages_get_list_from_name('opening',$shard_lang);
$opening_message = $opening_message[0]['restart_message_value'];
$opened_message = tool_admin_restart_messages_get_list_from_name('opened',$shard_lang);
$opened_message = $opening_message[0]['restart_message_value'];
$klients_messages = array( 'before' => array(
".topic Shard Maintenance in progress for '". $ticketsystem_shard_info['shard_name'] ."' - Shard LOCKED - (". date("r",$sequence_info['restart_sequence_date_start']) ." - Countdown set to ". $klients_countdown .")",
"[Shard Maintenance] A Shard Restart has been triggered for shard '". $ticketsystem_shard_info['shard_name'] ."' on ". date("r",$sequence_info['restart_sequence_date_start']),
"[Shard Maintenance] Shard is LOCKED and should go down in ". $klients_countdown,
),
'at' => array(
".topic Shard Maintenance in progress for '". $ticketsystem_shard_info['shard_name'] ."' - Shard DOWN - (". date("r",$sequence_info['restart_sequence_date_start']) .")",
"[Shard Maintenance] A Shard Restart has been triggered for shard '". $ticketsystem_shard_info['shard_name'] ."' on ". date("r",$sequence_info['restart_sequence_date_start']),
"[Shard Maintenance] Shard is DOWN after a countdown of ". $klients_countdown,
),
'over' => array(
".topic Shard Maintenance in finished for '". $ticketsystem_shard_info['shard_name'] ."' - Shard LOCKED - Ready for CSRs ! ETA : |EventETA| - To Open : .sorOpenShard |EventID| 0",
"[Shard Maintenance] The Shard Restart that has been triggered for shard '". $ticketsystem_shard_info['shard_name'] ."' on ". date("r",$sequence_info['restart_sequence_date_start']) ." is now finished !",
"[Shard Maintenance] Shard is LOCKED and Ready for CSRs, it will OPEN automatically in |EventTIME| !",/*. $klients_open_countdown ." !",*/
"[Shard Maintenance] To change the OPEN countdown, you need to send me the command : .sorOpenShard |EventID| <seconds>",
"[Shard Maintenance] Example to OPEN the Shard now, you need to send me the command : .sorOpenShard |EventID| 0",
),
'open' => array(
".topic Shard Maintenance over for '". $ticketsystem_shard_info['shard_name'] ."' - Shard OPEN ",
"[Shard Maintenance] The shard '". $ticketsystem_shard_info['shard_name'] ."' should now be OPEN to all !",
),
'cancel' => array(
".topic Shard Maintenance has been cancelled for '". $ticketsystem_shard_info['shard_name'] ."' - Shard OPEN",
"[Shard Maintenance] The shard restart has been CANCELLED for '". $ticketsystem_shard_info['shard_name'] ."', the shard is OPEN again !",
),
'giveup' => array(
".topic Shard Maintenance for '". $ticketsystem_shard_info['shard_name'] ."' is on hold for technical issues - Shard DOWN",
"[Shard Maintenance] The shard restart has been set ON HOLD for technical issues !",
),
'opening' => $opening_message,
'opened' => $opened_message,
);
$notification_info = array( 'sequence' => $sequence_info,
'ts' => $ticketsystem_shard_info,
'messages' => $klients_messages,
'shard' => $shard_info,
'opentimer' => $open_timer,
'shardid' => $shard_id,
'shardsu' => $service_su,
'shardegs' => $service_egs,
);
$notification_data = base64_encode(serialize($notification_info));
$event_insert_ids = array();
$sql = "LOCK TABLES Sorbot_events WRITE";
$csdb->sql_query($sql);
reset($klients_servers);
foreach($klients_servers as $klient_server)
{
$sql = "INSERT INTO Sorbot_events (`server_name`,`event_action`,`event_time`,`event_lap`,`event_params`) ";
$sql .= " VALUES ('". $klient_server ."',". $sorbot_message_type .",". time() .",". $open_timer .",'". $notification_data ."')";
$csdb->sql_query($sql);
$event_insert_ids[] = $csdb->sql_nextid();
}
// we have a list of all the events, lets save them somewhere
// lets inform each events of all other events for the same sequence
if (sizeof($event_insert_ids))
{
$notification_info['eventlist'] = array_values($event_insert_ids);
$notification_data = base64_encode(serialize($notification_info));
$sql = "UPDATE Sorbot_events SET event_params='". $notification_data ."' WHERE event_id IN (". implode(',', array_values($event_insert_ids)) .")";
$csdb->sql_query($sql);
// save the events locally too
tool_main_set_restart_sequence_events($sequence_id, implode(',',array_values($event_insert_ids)));
}
$sql = "UNLOCK TABLES";
$csdb->sql_query($sql);
}
else
{
nt_common_add_debug('no klients server found wanting to hear about this event');
}
}
}
else
{
nt_common_add_debug('no shard found in TS matching the application and shard id');
}
}
else
{
nt_common_add_debug('query failed ?!');
}
}
else
{
nt_common_add_debug('missing some information about the sequence ?!');
}
$csdb->sql_close();
}
else
{
nt_common_add_debug('failed to init db!');
}
}
else
{
nt_common_add_debug('no db string to work with');
}
}
function tool_main_set_restart_sequence_events($sequence_id, $events)
{
global $db;
$sql = "UPDATE ". NELDB_RESTART_SEQUENCE_TABLE ." SET restart_sequence_events='". $events ."' WHERE restart_sequence_id=". $sequence_id;
$db->sql_query($sql);
}
function tool_main_get_domain_shard_data($domain_id, $shard_id)
{
global $db;
$data = null;
$sql = "SELECT ". NELDB_DOMAIN_TABLE .".domain_id,";
$sql .= NELDB_DOMAIN_TABLE .".domain_name,";
$sql .= NELDB_DOMAIN_TABLE .".domain_as_host,";
$sql .= NELDB_DOMAIN_TABLE .".domain_as_port,";
$sql .= NELDB_DOMAIN_TABLE .".domain_application,";
$sql .= NELDB_SHARD_TABLE .".shard_id,";
$sql .= NELDB_SHARD_TABLE .".shard_name,";
$sql .= NELDB_SHARD_TABLE .".shard_as_id,";
$sql .= NELDB_SHARD_TABLE .".shard_domain_id,";
$sql .= NELDB_SHARD_TABLE .".shard_lang,";
$sql .= NELDB_SHARD_TABLE .".shard_restart";
$sql .= " FROM ". NELDB_DOMAIN_TABLE .",". NELDB_SHARD_TABLE;
$sql .= " WHERE domain_id=shard_domain_id AND domain_id=". $domain_id ." AND shard_id=". $shard_id;
if ($result = $db->sql_query($sql))
{
if ($db->sql_numrows($result))
{
$data = $db->sql_fetchrow($result);
}
}
return $data;
}
function tool_main_set_restart_sequence_user($AS_ShardRestart)
{
global $db;
global $AS_Name, $AS_ShardName;
global $nel_user;
global $restart_notification_emails;
$sequence_info = tool_main_get_restart_sequence_by_id($AS_ShardRestart);
if ($sequence_info)
{
$sql = "UPDATE ". NELDB_RESTART_SEQUENCE_TABLE ." SET restart_sequence_user_name='". $nel_user['user_name'] ."' WHERE restart_sequence_id=". $AS_ShardRestart;
$db->sql_query($sql);
nt_log("Shard Restart (Domain: '". $AS_Name ."' - Shard: '". $AS_ShardName ."' - Sequence: '". $AS_ShardRestart ."') owner set to '". $nel_user['user_name'] ."'");
$email_subject = "[Shard Admin Tool] Restart Sequence Takeover (id: ".$sequence_info['restart_sequence_id'].", step: ". $sequence_info['restart_sequence_step'] .") for shard ".$AS_Name."/".$AS_ShardName." by ".$nel_user['user_name'];
$email_message = $email_subject;
nt_email($email_subject,$email_message,$restart_notification_emails);
}
}
?>