Trassirサーバーの監視

そのため、CISのさまざまな都市にある多数(50台以上、複数台)のTrassirサーバー(ビデオ監視サーバー)を管理する必要がありました。 一般的に、機器は不良ではありませんが、システムアーキテクチャの特性により、集中管理には問題があり、各サーバー(NVR)は独自の生活を送っています。 多数のデバイスで一度に操作する機会は「ネイティブ」クラウドによって提供されますが、絶対に構成可能ではなく、そのまま使用できます。



各稼働日の朝は、各サーバーの操作性のテストから始まりますが、これには多くの時間がかかります。



DSSLにはSDK があります詳細説明はこちらから入手できます



数晩過ごして、PHPでクラスを作成しました。これにより、WebサーバーはTrassirサーバーのステータスを確認し、ページに表示することができます。 Webを介してTrassirサーバーにアクセスするには、それらを構成する必要があります。 最初に、サーバー設定で「ブラウザーからTrassirへのアクセスを許可する」を有効にし、次に「Trassir SDK」を有効にします(そしてSDKパスワードを設定します)。 さらに、スクリプトを承認する権限が切り捨てられたユーザー(私の場合、監視ユーザー、パスワード123、SDKパスワード12345)を作成することをお勧めします。



画像



一般に、SDKには大きなチャンスがあります。上記のリンクをご覧ください。



クラスコード自体:



<?php class TrassirServer { /* 1.   . $serv = new TrassirServer('10.18.242.33', 'Monitoring', '123', '12345'); 2.           ! $serv->check_connection(); 3.   $serv->get_sid(); 4.      $objects = $serv->get_objects();   SDK 5.   $serv->get_health();      3 (get_sid()) */ public $status = array(); //public $objects = array(); private $ip_address, $user, $sid, $sdk_sid; public function __construct($ip_address, $user, $password, $sdk_password) { //. $this->ip_address = $ip_address; $this->status['ip_address']= NULL; $this->user = $user; $this->password = $password; $this->sdk_password = $sdk_password; } public function check_connection (){ //  . $url = 'http://'.trim($this->ip_address).':80/'; $curlInit = curl_init($url); curl_setopt($curlInit,CURLOPT_CONNECTTIMEOUT,2); //  -       curl_setopt($curlInit,CURLOPT_HEADER,true); curl_setopt($curlInit,CURLOPT_NOBODY,true); curl_setopt($curlInit,CURLOPT_RETURNTRANSFER,true); $response = curl_exec($curlInit); curl_close($curlInit); if ($response){ $this->status['online'] = true; } else { $this->status['online'] = false; } return $this->status['online']; } /* { "success" : "0", "error_code" : "invalid username or password" } /* Username and Password should match to one of the server users. */ public function get_sid(){ //  if ($this->status['online']){ $url = 'https://' . trim($this->ip_address) . ':8080/login?username=' . $this->user . '&password='.$this->password; //     $responseJson_str = file_get_contents ($url); $server_auth = json_decode ($responseJson_str, true); // JSON   if($server_auth['success']==1){ $this->status['sid'] = $server_auth['sid']; // sid  } else{ $this->status['sid'] = false; } } return $this->status['sid']; } public function get_objects(){//   if ($this->status['online']){ $url = 'https://' . trim($this->ip_address) . ':8080/objects/?password='.$this->sdk_password; $responseJson_str = file_get_contents ($url); //     $comment_position = strripos ($responseJson_str, '/*'); //      $responseJson_str = substr ($responseJson_str, 0, $comment_position); $objects = json_decode ($responseJson_str, true); return $objects; } return false; } /*    { "disks": "1", "database": "1", "channels_total": "10", "channels_online": "5", "uptime": "12902", "cpu_load": "22.50", "network": "1", "automation": "1", "disks_stat_main_days": "56.15", "disks_stat_priv_days": "35.03", "disks_stat_subs_days": "40.20" } */ public function get_health() { if ($this->status['online'] && $this->status['sid']){ $url = 'https://' . trim($this->ip_address) . ':8080/health?sid='.$this->status['sid']; $responseJson_str = file_get_contents ($url); //     $comment_position = strripos ($responseJson_str, '/*'); //      $responseJson_str = substr ($responseJson_str, 0, $comment_position); $server_health = json_decode ($responseJson_str, true); // JSON   } return $server_health; } } ?>
      
      





使用例は、3つのファイル、index.php、view.css(スタイルシートはオプションですが、それなしではすべてが悲しい)、list_of_servers.txt(検証のためにすべてのサーバーのIPアドレスをそれぞれ新しい行から表示するテキストファイル)が存在することを意味します。



view.css:



 .error{ background-color: cc3f5b; #border: 1px dotted red; #width: 99%; padding-left: 5px; } .trassir_server{ #border-bottom: 1px solid black; width: 250px; height: 240px; background-color: #4682B4; color: white; margin-top: 15px; margin-left: 5px; display: inline-block; vertical-align: top; } .OK{ background-color: #4169E0; border-bottom: 1px solid black; padding-left: 5px; } .trassir_server_name{ font-size: 20px; text-align: center; height: 30px; } body{ background-color: #DCDCDC; }
      
      





index.php



 <?php header('Content-Type: text/html; charset=utf-8'); ini_set('max_execution_time', 60); error_reporting(E_ALL); require ('classes/TrassirServer.php'); ?> <html> <head> <link rel='stylesheet' href='./css/view.css'> </head> <body> <?php $user = 'Monitoring'; $password = '123'; $sdk_password = '12345'; function trassir_server_monitor($ip, $user, $password, $sdk_password){ $serv = new TrassirServer($ip, $user, $password, $sdk_password); echo '<div class = "trassir_server">'; if ($serv->check_connection()) { if ($serv->get_sid()) { $objects = $serv->get_objects(); if($objects){ foreach ($objects as $obj) //      { if ($obj['class'] == 'Server') { $serv->status['name']= $obj['name']; } } } echo '<div class = "trassir_server_name">'; //   echo $serv->status['name']; echo '</div>'; echo '<div class = "trassir_server_status">'; //  $health = $serv->get_health(); foreach ($health as $key => $value){ if (($key == 'disks' || $key == 'database' || $key == 'network' || $key == 'automation')&& $value=='1') { echo '<div class = "OK">'; echo $key . ': '; echo 'OK'; echo '</div>'; } else if ($key == 'cpu_load' && $value <= 75) { echo '<div class = "OK">'; echo ' : '; echo $value . '%'; echo '</div>'; } else if ($key == 'uptime' && $value > 3600) { echo '<div class = "OK">'; echo ': '; $day = floor($value/86400); $value1 = $value - $day*86400; $hour = floor(($value - $day*86400)/3600); echo $day.' days '.$hour . ' hours'; echo '</div>'; } else if ($key == 'uptime' && $value <= 3600) { echo '<div class = "error">'; echo $key . ' less than hour : '; echo $value . ' seconds'; echo '</div>'; } else if ($key == 'channels_total') { echo '<div class = "OK">'; echo ' : '; echo $value; $ch_total = $value; echo '</div>'; } else if ($key == 'channels_online' && $value == $ch_total) { echo '<div class = "OK">'; echo ' : '; echo $value; $ch_total = $value; echo '</div>'; } else if (($key == 'disks_stat_main_days' || $key == 'disks_stat_subs_days')&& $value > 45) { echo '<div class = "OK">'; echo $key . ': '; echo $value; echo '</div>'; } else if ( $key == 'disks_stat_priv_days') { echo '<div class = "OK">'; echo $key . ': '; echo $value; echo '</div>'; } else { echo '<div class = "error">'; echo $key . ': '; echo $value; echo '</div>'; } } echo '</div>'; } } if (!$serv->status['online'] || !$serv->status['sid'] || !$objects){ //   ,          . echo '<div class = "error">'; echo 'server ' . $ip . '</br>'; echo 'connection error'; echo '</div>'; } echo '</div>'; } $list_of_servers = fopen("conf/list_of_servers.txt", "r"); if ($list_of_servers) { while (($buffer = fgets($list_of_servers)) !== false) { trassir_server_monitor($buffer, $user, $password, $sdk_password); } } fclose($list_of_servers); echo '<br/>'; ?> </body> </html>
      
      





私の場合の結果(わずか4台のサーバーのテスト期間):



画像



計画:



  1. スクリプトを定期的に(1日に2、3回)自動的に実行し、サーバーステータス統計をデータベースに保存します。
  2. UZユーザーの集中管理が可能です(最初の実装が可能になるまでに関連があれば)。


このシステムの「幸せな」管理者がまだいる場合、機能を共同で改善したい場合は喜んでお手伝いします。 また、誰かが最終結果に興味を持っているが、開発に従事する準備ができていない場合は、denis.glushakov @ bk.ruに書き込み、あなたのことを忘れないようにします。



コードを最適化するためのヒントは、コメントで喜んで受け入れます。



2018年6月22日からUPD。 素材にまだある程度の関心があったので、小さな更新を行います。この恐怖をすべて、packagistで利用可能なまともなlibに書き直し(Trassirという言葉で検索)、完全な機能を備えた別の実装のシンフォニーで作成しました(データベース、ディスプレイの状態を保存します)統計など)。 誰でも構いません-メールに書き込みます。まだ公開する時間がないため、まだ完了していません。



All Articles