source: trunk/Modules/NetworkTopology/NetworkTopology.php

Last change on this file was 912, checked in by chronos, 3 years ago
  • Modified: Updated Common package.
File size: 6.4 KB
Line 
1<?php
2
3class PageNetworkTopology extends Page
4{
5 public string $TopHostName = 'NIX-ROUTER';
6
7 function __construct(System $System)
8 {
9 parent::__construct($System);
10 $this->Title = 'Topologie sítě';
11 $this->Description = 'Grafické zobrazení topologie sítě';
12 $this->ParentClass = 'PagePortal';
13 }
14
15 function Show(): string
16 {
17 if (count($this->System->PathItems) > 1)
18 {
19 if ($this->System->PathItems[1] == 'topologie.png') return $this->ShowImage();
20 else return PAGE_NOT_FOUND;
21
22 } else return $this->ShowOverview();
23 }
24
25 function ShowImage(): string
26 {
27 $this->SimplePage = true;
28 $this->FormatHTML = false;
29
30 if (array_key_exists('debug', $_GET)) $debug = $_GET['debug'];
31 else $debug = 0;
32
33 // Vytvoř stromy a ulož výsledek do databáze
34 $DbResult = $this->Database->query("SELECT MAX(Pos), MAX(Depth) FROM NetworkTopology");
35 $item = $DbResult->fetch_array();
36 $width = $item[0];
37 $height = $item[1];
38
39 $spacex = 32;
40 $spacey = 68;
41 $halfx = $spacex / 2;
42 $halfy = $spacey / 2;
43 // Načtení pomocných obrázků
44 $im_comp = imagecreatefrompng(dirname(__FILE__).'/images/comp.png');
45 $im_dev = imagecreatefrompng(dirname(__FILE__).'/images/device.png');
46 // Generování obrázku
47 $im = imagecreate(($width + 1.6) * $spacex, ($height + 1) * $spacey);
48 $background_color = imagecolorallocate($im, 255, 255, 255);
49 $black = imagecolorallocate($im, 0, 0, 0);
50 $red = imagecolorallocate($im, 255, 0, 0);
51 $green = imagecolorallocate($im, 0, 128, 0);
52 $blue = imagecolorallocate($im, 100, 100, 255);
53 $gray = imagecolorallocate($im, 160, 160, 160);
54
55 //$DbResult = $Database->query("SELECT * FROM hosts, NetworkTopology WHERE host = id AND used=1");
56 $DbResult = $this->Database->query('SELECT NetworkTopology.*, NetworkTopology.Host AS Id, '.
57 'NetworkDevice.Name AS Name, '.
58 'NetworkDevice.Online AS Online, NetworkDeviceType.IconName AS IconName, 1 AS ShowOnline '.
59 'FROM NetworkTopology LEFT JOIN NetworkDevice ON NetworkDevice.Id = NetworkTopology.Host '.
60 'LEFT JOIN NetworkDeviceType ON NetworkDevice.Type = NetworkDeviceType.Id');
61 while ($item = $DbResult->fetch_array())
62 {
63 $id = $item['Id'];
64 $vleft = $item['Pos'];
65 $vtop = $item['Depth'];
66 $vfirst = $item['First'];
67 $vlast = $item['Last'];
68 $xpos = $vleft * $spacex;
69 if (($vtop > 0) or ($item['Name'] == $this->TopHostName))
70 {
71 if ($vtop > 0) imageline($im, $xpos + $halfx, $vtop * $spacey, $xpos + $halfx, $vtop * $spacey + 8, $black);
72 if ($vfirst >= 0)
73 {
74 imageline($im, $vfirst*$spacex + $halfx, $vtop * $spacey + $spacey, $vlast*$spacex + $halfx, $vtop * $spacey + $spacey, $black);
75 imageline($im, $xpos + $halfx, ($vtop + 1) * $spacey - 10, $xpos + $halfx, ($vtop + 1) * $spacey, $black);
76 }
77 // $ip = explode('.',$item['IP']);
78 // if (!array_key_exists(3, $ip)) $ip[3] = '';
79 if ($item['IconName'] == 'comp')
80 {
81 if ($item['Online'] == 1) $color = $green;
82 else $color = $black;
83 $image = $im_comp;
84 } else $image = $im_dev;
85 if ($item['IconName'] == 'device')
86 {
87 if ($item['Online'] == 1) $color = $green;
88 else $color = $red;
89 $image = $im_dev;
90 }
91 if ($item['ShowOnline'] == 0)
92 {
93 $color = $gray;
94 $image = $im_dev;
95 }
96 // $text='IP: '.$ip[0];
97 // imagestring($im,2,xpos($id)+($spacex-strlen($text)*imagefontwidth(2))/2,$vtop[$id]*$spacey+24+imagefontheight(2),$text,$black);
98 imagecopy($im, $image, $xpos+$halfx-15, $vtop*$spacey+12, 0, 0, 30, 30);
99 // imagerectangle($im,xpos($id)+$halfx-6,$vtop[$id]*$spacey+16,xpos($id)+$halfx+6,$vtop[$id]*$spacey+28,$color);
100 if ($debug) {
101 imagestring($im, 2, $xpos+($spacex-strlen($item['Id'])*imagefontwidth(2))/2, $vtop*$spacey+31+imagefontheight(2), $item['Id'], $color);
102 } else imagestring($im,2,$xpos+($spacex-strlen($item['Name'])*imagefontwidth(2))/2, $vtop*$spacey+31+imagefontheight(2), $item['Name'], $color);
103 }
104 }
105
106 // === Sestavení výsledného souboru ============================================
107 if ($debug == 0)
108 {
109 Header("Content-type: image/png");
110 Header("Cache-Control: no-cache"); // Dynamický graf, nekešovat
111 imagepng($im);
112 imagedestroy($im);
113 imagedestroy($im_comp);
114 imagedestroy($im_dev);
115 }
116 return '';
117 }
118
119 function ShowOverview(): string
120 {
121 $Output = '<img src="topologie.png"><br/>
122<p>Vysvětlivky: Obrázek znázorňuje připojení prvků sítě do internetu.<br/>
123<img src="Modules/NetworkTopology/images/comp.png"> Je počítač zapojený v síti a pod ním je uvedeno jeho jméno.
124<span style="color:green">Zelená barva</span> znamená, že počitač je zapnutý a
125online. Černá barva znamená, že počítač je vypnutý, nebo není online.<br/>
126<img src="Modules/NetworkTopology/images/device.png"> Představuje komunikační zařízení připojené do sítě, které
127mají běžet nepřetržitě. Pokud je zařízení online, je text pod ním zobrazen
128<span style="color:green">zelenou barvou</span>, pokud není online, je zobrazen
129<span style="color:red">červenou barvou</span>. Dostupnost prvků je kontrolována
130z počítače Centrála, takže při výpadku zařízení nebude možné zjistit stav
131zařízení, které jsou přes něj připojeny. U zařízení, kde není stav možné
132zjišťovat je použita <span style="color:gray">šedá barvou</span>.</p>';
133 return $Output;
134 }
135}
136
137class ModuleNetworkTopology extends Module
138{
139 function __construct(System $System)
140 {
141 parent::__construct($System);
142 $this->Name = 'NetworkTopology';
143 $this->Version = '1.0';
144 $this->Creator = 'Chronos';
145 $this->License = 'GNU/GPLv3';
146 $this->Description = 'Generate image of network device interconnection';
147 $this->Dependencies = array(ModuleNetwork::GetName());
148 $this->Models = array(NetworkTopology::GetClassName());
149 }
150
151 function DoStart(): void
152 {
153 $this->System->RegisterPage(['topologie'], 'PageNetworkTopology');
154 }
155}
156
157class NetworkTopology extends Model
158{
159 static function GetModelDesc(): ModelDesc
160 {
161 $Desc = new ModelDesc(self::GetClassName());
162 $Desc->AddInteger('Host');
163 $Desc->AddInteger('Depth');
164 $Desc->AddInteger('Pos');
165 $Desc->AddInteger('First');
166 $Desc->AddInteger('Last');
167 return $Desc;
168 }
169}
Note: See TracBrowser for help on using the repository browser.