2017-03-15 19:29:34 +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 );
}
}
?>