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