PageRenderTime 48ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/hypervm/bin/common/lxportmonitor.php

https://github.com/lxcenter/hypervm
PHP | 526 lines | 431 code | 86 blank | 9 comment | 43 complexity | ebc458ea85ee9bc2c005e663b95d6364 MD5 | raw file
  1. <?php
  2. class Remote { }
  3. $sgbl = new Remote();
  4. $global_failure = false;
  5. set_global_debug();
  6. monitor_main();
  7. function monitor_main()
  8. {
  9. global $gbl, $sgbl, $login, $ghtml;
  10. global $argv;
  11. global $global_ip_array;
  12. global $global_remoteserver;
  13. global $global_remoteport;
  14. error_reporting(E_ALL);
  15. $list = parse_opt($argv);
  16. if (isset($list['data-server'])) {
  17. $global_remoteserver = $list['data-server'];
  18. $global_remoteport = "8888";
  19. } else {
  20. $global_remoteserver = "localhost";
  21. $global_remoteport = "5558";
  22. }
  23. if (false) {
  24. if (function_exists("posix_getpwnam")) {
  25. if (!isset($list['switch-user'])) {
  26. print("Needs a non-privileged user to be suplied as --switch-user=<user>... Using lxlabs\n");
  27. $list['switch-user'] = 'lxlabs';
  28. }
  29. $pw = posix_getpwnam($list['switch-user']);
  30. if (!$pw) {
  31. print("User {$list['switch-user']} doesnt exist. Please create it\n\n\n\n");
  32. exit;
  33. }
  34. posix_setuid($pw['uid']);
  35. posix_setgid($pw['gid']);
  36. }
  37. }
  38. $sgbl->thisserver = get_my_name();
  39. $list = get_data_from_server();
  40. if (!$list) {
  41. print("No list from the server...\n");
  42. }
  43. dprintr($list);
  44. getDnsesFirst($list);
  45. $oldserverhistlist = null;
  46. $maincount = 0;
  47. while (1) {
  48. $maincount++;
  49. $serverhistlist = null;
  50. $sendserverhistlist = null;
  51. $startmaintime = time();
  52. foreach($list as $l) {
  53. $ports = $l['monitorport_l'];
  54. $porthistlist = null;
  55. foreach($ports as $p) {
  56. if (isset($portmonlist[$l['nname']][$p['nname']][2])) {
  57. print("Socket Already exists... \n");
  58. socket_close($portmonlist[$l['nname']][$p['nname']][2]);
  59. }
  60. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  61. socket_set_nonblock($socket);
  62. $portmonlist[$l['nname']][$p['nname']] = array($l['servername'], $p['portnumber'], $socket);
  63. }
  64. }
  65. $serverhistlist = null;
  66. dprintr($portmonlist);
  67. do_monitor_list($portmonlist, $serverhistlist);
  68. $portmonlist = prepare_error_portmonlist($serverhistlist);
  69. dprintr("Second try\n\n");
  70. dprintr($portmonlist);
  71. sleep(1);
  72. do_monitor_list($portmonlist, $serverhistlist);
  73. $endmaintime = time();
  74. if ($oldserverhistlist) {
  75. foreach($serverhistlist as $s => $slist) {
  76. foreach($slist as $p => $plist) {
  77. if (!isset($oldserverhistlist[$s][$p])) {
  78. $sendserverhistlist[$s][$p] = $serverhistlist[$s][$p];
  79. continue;
  80. }
  81. if ($serverhistlist[$s][$p]['portstatus'] !== $oldserverhistlist[$s][$p]['portstatus']) {
  82. $sendserverhistlist[$s][$p] = $serverhistlist[$s][$p];
  83. }
  84. }
  85. }
  86. } else {
  87. $sendserverhistlist = $serverhistlist;
  88. }
  89. $oldserverhistlist = $serverhistlist;
  90. if ($sendserverhistlist) {
  91. dprint("Sending Data\n");
  92. //print_r($sendserverhistlist);
  93. dprintr($sendserverhistlist);
  94. send_data_to_server($sendserverhistlist);
  95. }
  96. $timeleft = 60 - $endmaintime + $startmaintime;
  97. if ($timeleft > 0) {
  98. //print("Sleep for $timeleft\n");
  99. sleep($timeleft);
  100. } else {
  101. //print("No sleep for $timeleft\n");
  102. }
  103. if ($maincount === 10) {
  104. $maincount = 1;
  105. if ($global_failure) {
  106. //print("Sending Data\n");
  107. //print($serverhistlist);
  108. send_data_to_server($serverhistlist);
  109. }
  110. $list = get_data_from_server();
  111. send_alive_info();
  112. //print("Getting again from server\n");
  113. //$oldserverhistlist = null;
  114. //print_r($list);
  115. getDnsesFirst($list);
  116. }
  117. }
  118. }
  119. function get_my_name()
  120. {
  121. global $global_remoteserver;
  122. $rmt = new Remote();
  123. $rmt->cmd = "my_name";
  124. $res = remote_http_exec_monitor($global_remoteserver, "80", $rmt);
  125. return $res;
  126. }
  127. function send_alive_info()
  128. {
  129. $host = `hostname`;
  130. global $global_remoteserver;
  131. $rmt = new Remote();
  132. $rmt->cmd = "im_alive";
  133. $rmt->ddata = null;
  134. $res = remote_http_exec_monitor($global_remoteserver, "80", $rmt);
  135. }
  136. function send_data_to_server($serverhistlist)
  137. {
  138. global $global_remoteserver;
  139. $rmt = new Remote();
  140. $rmt->cmd = "set_list";
  141. $rmt->ddata = $serverhistlist;
  142. $res = remote_http_exec_monitor($global_remoteserver, "80", $rmt);
  143. }
  144. function get_data_from_server()
  145. {
  146. $rmt = new Remote();
  147. global $global_remoteserver;
  148. $rmt->cmd = "get_list";
  149. $res = remote_http_exec_monitor($global_remoteserver, "80", $rmt);
  150. return $res;
  151. }
  152. function remote_http_exec_monitor($server, $port, $rmt)
  153. {
  154. global $global_remoteport;
  155. global $global_remoteserver;
  156. $port = $global_remoteport;
  157. $server = $global_remoteserver;
  158. $var = base64_encode(serialize($rmt));
  159. $data = send_to_some_http_server_monitor($server, "", $port, $var);
  160. dprint($server);
  161. $res = unserialize(base64_decode($data));
  162. dprintr($res);
  163. if (!$res) {
  164. print("Got Nothing from server for command: $rmt->cmd\n");
  165. print($data);
  166. $global_failure = true;
  167. } else {
  168. $global_failure = false;
  169. }
  170. if ($res->exception) {
  171. throw $res->exception;
  172. }
  173. return $res->ddata;
  174. }
  175. function send_to_some_http_server_monitor($raddress, $socket_type, $port, $var)
  176. {
  177. global $gbl, $sgbl, $login, $ghtml;
  178. //print_time('server');
  179. $ch = curl_init("http://$raddress:$port/htmllib/mibin/monitordata.php");
  180. curl_setopt($ch, CURLOPT_POST, true);
  181. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  182. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  183. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  184. curl_setopt($ch, CURLOPT_POSTFIELDS, "frm_rmt=$var");
  185. $totalout = curl_exec($ch);
  186. print(curl_error($ch));
  187. print($totalout);
  188. $totalout = trim($totalout);
  189. return $totalout;
  190. }
  191. function checkPort($sname, $num, $nname)
  192. {
  193. global $gbl, $sgbl, $login, $ghtml;
  194. $sip = gethostbyname($sname);
  195. if (validate_ipaddress($sip)) {
  196. $res = fsockopen($sip, $num, $erno, $erstr, 10);
  197. } else {
  198. $res = null;
  199. $erno = 1;
  200. $erstr = "Dns failed";
  201. }
  202. if (!$res) {
  203. $obj['portstatus'] = 'off';
  204. $obj['errornumber'] = $erno;
  205. $obj['errorstring'] = $erstr;
  206. } else {
  207. fclose($res);
  208. $obj['portstatus'] = 'on';
  209. $obj['errorstring'] = "";
  210. }
  211. $obj['portnname'] = $nname;
  212. $obj['servername'] = $sgbl->thisserver;
  213. return $obj;
  214. }
  215. function validate_ipaddress($ip)
  216. {
  217. $ind= explode(".",$ip);
  218. $d=0;
  219. $c=0;
  220. foreach($ind as $in) {
  221. $c++;
  222. if(is_numeric($in) && $in >= 0 && $in <= 255 ) {
  223. $d++;
  224. } else {
  225. return 0;
  226. }
  227. }
  228. if($c === 4) {
  229. if($d === 4) {
  230. return 1;
  231. } else {
  232. return 0;
  233. }
  234. } else {
  235. return 0;
  236. }
  237. }
  238. function parse_opt($argv)
  239. {
  240. unset($argv[0]);
  241. if (!$argv) {
  242. return null;
  243. }
  244. foreach($argv as $v) {
  245. if (!(strpos($v, "--") === 0)) {
  246. $ret['final'] = $v;
  247. continue;
  248. }
  249. $v = strfrom($v, "--");
  250. if (strstr($v, "=") !== false) {
  251. $opt = explode("=", $v);
  252. $ret[$opt[0]] = $opt[1];
  253. } else {
  254. $ret[$v] = $v;
  255. }
  256. }
  257. return $ret;
  258. }
  259. function getDnsesFirst($list)
  260. {
  261. global $global_ip_array;
  262. $global_ip_array = null;
  263. foreach($list as $l) {
  264. if (!isset($global_ip_array[$l['servername']])) {
  265. $ip = gethostbyname($l['servername']);
  266. $global_ip_array[$l['servername']] = $ip;
  267. }
  268. }
  269. }
  270. function strfrom($string, $needle)
  271. {
  272. return substr($string, strpos($string, $needle) + strlen($needle));
  273. }
  274. function do_monitor_list($portmonlist, &$serverhistlist)
  275. {
  276. global $global_ip_array;
  277. global $global_remoteserver;
  278. global $global_remoteport;
  279. $loopcount = 0;
  280. while (true) {
  281. $count = 0;
  282. $loopcount++;
  283. foreach($portmonlist as $s => &$serv) {
  284. foreach($serv as $k => &$data) {
  285. $nname = $k;
  286. if ($data[4] === 'done') {
  287. continue;
  288. }
  289. if (isset($global_ip_array[$data[0]])) {
  290. $ip = $global_ip_array[$data[0]];
  291. } else {
  292. $ip = "Silly screwup. Can't find dns for {$data[0]}\n";
  293. }
  294. if (!validate_ipaddress($ip)) {
  295. //print("failed Dns $ip for *{$data[0]}*\n");
  296. $obj['portstatus'] = 'off';
  297. //$obj['errornumber'] = 100;
  298. $obj['errorstring'] = "DNS failed for $ip";
  299. $obj['portnname'] = $nname;
  300. $data[2] = null;
  301. $data[4] = 'done';
  302. $serverhistlist[$s][$k] = $obj;
  303. socket_clear_error();
  304. continue;
  305. }
  306. $ret = socket_connect($data[2], $ip, $data[1]);
  307. $err = socket_last_error($data[2]);
  308. if ($ret === true || $err === 10056 || $err === 0) {
  309. fclose($data[2]);
  310. $data[2] = null;
  311. $data[4] = 'done';
  312. $obj['portstatus'] = 'on';
  313. $obj['errorstring'] = "SSS";
  314. // $obj['errornumber'] = 0;
  315. $obj['portnname'] = $nname;
  316. $serverhistlist[$s][$k] = $obj;
  317. continue;
  318. }
  319. //print("$s: $k, $ret, $err $here\n");
  320. if ($err === 115 || $err === 114 || $err === 10035 || $err === 10037) {
  321. $data[4] = 'notdone';
  322. $count++;
  323. if ($loopcount < 14) {
  324. //print("Timeout not reached ... " . time() . " $startmon\n");
  325. } else {
  326. $obj['portstatus'] = 'off';
  327. //$obj['errornumber'] = $err;
  328. $obj['errorstring'] = "Timeout";
  329. $obj['portnname'] = $nname;
  330. $data[2] = null;
  331. $data[4] = 'done';
  332. $serverhistlist[$s][$k] = $obj;
  333. socket_clear_error();
  334. }
  335. continue;
  336. }
  337. //$obj['errornumber'] = $err;
  338. $strerror = socket_strerror($err);
  339. $vrttt = var_export($ret, true);
  340. if (!$err || !$strerror || $strerror === "Success") {
  341. $obj['errorstring'] = "Got NO error. Errno $err... ret was $vrttt";
  342. $obj['portstatus'] = 'on';
  343. } else {
  344. $obj['errorstring'] = "($err) $strerror (ret: $vrttt)";
  345. $obj['portstatus'] = 'off';
  346. }
  347. $obj['portnname'] = $nname;
  348. $data[2] = null;
  349. $data[4] = 'done';
  350. $serverhistlist[$s][$k] = $obj;
  351. socket_clear_error();
  352. }
  353. }
  354. if ($count === 0) {
  355. break;
  356. }
  357. sleep(1);
  358. }
  359. return $serverhistlist;
  360. }
  361. function set_global_debug()
  362. {
  363. global $debug_var;
  364. $val = @ file_get_contents("commands.php");
  365. if ($val === "2") {
  366. $debug_var = 2;
  367. } else {
  368. $debug_var = 0;
  369. }
  370. }
  371. function dprint($mess)
  372. {
  373. global $debug_var;
  374. if ($debug_var >= 2) {
  375. print($mess);
  376. }
  377. }
  378. function dprintr($var)
  379. {
  380. global $debug_var;
  381. if ($debug_var >= 2) {
  382. print_r($var);
  383. }
  384. }
  385. function prepare_error_portmonlist($serverhistlist)
  386. {
  387. foreach($serverhistlist as $k => $l) {
  388. $servername = strtilfirst($k, "___");
  389. foreach($l as $kk => $p) {
  390. if ($p['portstatus'] === 'on') {
  391. continue;
  392. }
  393. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  394. socket_set_nonblock($socket);
  395. $portnumber = strtilfirst($kk, "___");
  396. $portmonlist[$k][$kk] = array($servername, $portnumber, $socket);
  397. }
  398. }
  399. return $portmonlist;
  400. }
  401. function strtil($string, $needle)
  402. {
  403. if (strrpos($string, $needle)) {
  404. return substr($string, 0, strrpos($string, $needle));
  405. } else {
  406. return $string;
  407. }
  408. }
  409. function strtilfirst($string, $needle)
  410. {
  411. if (strpos($string, $needle)) {
  412. return substr($string, 0, strpos($string, $needle));
  413. } else {
  414. return $string;
  415. }
  416. }