1 | <?php
|
---|
2 | include('../style.php');
|
---|
3 | $SambaBinDir = '/usr/bin/';
|
---|
4 | $SambaSbinDir = '/usr/sbin/';
|
---|
5 | $Database->select_db('share');
|
---|
6 | $ZanoreniMax = 8; // Maximální úroven zanoreni
|
---|
7 | $MaxProgress = 70; // Pocet casti stavu prubehu operace
|
---|
8 | $StartTime = time();
|
---|
9 | $MountDir = '/tmp/browse/host'; // Složka, kde se dočasně připojují síťové disky
|
---|
10 | $TempDir = '/tmp/browse/'; // Složka, kde se dočasně připojují síťové disky
|
---|
11 | if (!is_dir($TempDir)) mkdir($TempDir, 0777);
|
---|
12 | if (!is_dir($MountDir)) mkdir($MountDir, 0777);
|
---|
13 |
|
---|
14 | // Nacteni seznamu sdileni
|
---|
15 | $Host = strtoupper(getenv('browse_host'));
|
---|
16 | if ($Host=='') die("Musite nastavit browse_host!\n");
|
---|
17 | $HostID = getenv('browse_id');
|
---|
18 | if ($HostID=='') die("Musite nastavit browse_id!\n");
|
---|
19 | //echo("\n================== Prochazec sdileni =================\n\n");
|
---|
20 | echo("Nacitam seznam sdileni pro ".$Host.'('.$HostID.')...');
|
---|
21 | $Output = array();
|
---|
22 | exec($SambaBinDir.'smbclient -d0 -N -L='.$Host,$Output);
|
---|
23 | echo("OK\n");
|
---|
24 |
|
---|
25 | if ($Output[0]=='Connection to '.$Host.' failed') die('Pocitac '.$Host." nenalezen!\n");
|
---|
26 | $Output = array_slice($Output,3);
|
---|
27 | $Shares = array();
|
---|
28 | foreach ($Output as $Radek)
|
---|
29 | {
|
---|
30 | if ($Radek=='') break;
|
---|
31 | //$Radek = iconv('UTF-8','ISO-8859-2',$Radek);
|
---|
32 | $Title = trim(substr($Radek,1,16));
|
---|
33 | $Type = trim(substr($Radek,16,10));
|
---|
34 | $Desc = trim(substr($Radek,26));
|
---|
35 | //echo($Title.','.$Type.','.$Desc."\n");
|
---|
36 | if (($Type=='Disk') && (substr($Title,-1,1)!='$')) array_push($Shares,$Title);
|
---|
37 | //ShowArray($Radek);
|
---|
38 | }
|
---|
39 | //ShowArray($Shares);
|
---|
40 |
|
---|
41 | // Analyzuj slozku a projdi podslozky
|
---|
42 | function Vetev($Cesta,$Zanoreni)
|
---|
43 | {
|
---|
44 | global $Citac, $Soubor, $Host, $HostID, $Share, $ZanoreniMax, $Pocet, $Hotovo, $MountDir, $TempDir, $FileSize, $MaxProgress, $Database;
|
---|
45 |
|
---|
46 | $VelikostSlozky = 0;
|
---|
47 | //$Vlozit = '';
|
---|
48 | // Nacti parent ID
|
---|
49 | $DbResult = $Database->query('SELECT LAST_INSERT_ID() FROM NetworkShareItem LIMIT 0,1');
|
---|
50 | //echo(DB_NumRows());
|
---|
51 | $Row = $DbResult->fetch_array();
|
---|
52 | $Parent = $Row[0];
|
---|
53 | //echo($Cesta."\n");
|
---|
54 | $Output = array();
|
---|
55 | $Cesta2 = fgets($Soubor,1024);
|
---|
56 | fgets($Soubor,1024);
|
---|
57 | $Files = array();
|
---|
58 | do {
|
---|
59 | $Nazev = fgets($Soubor,1024);
|
---|
60 | //echo(strlen($Nazev).",");
|
---|
61 | array_push($Files,$Nazev);
|
---|
62 | } while (($Nazev != "\n") && (!feof($Soubor)));
|
---|
63 | array_pop($Files);
|
---|
64 | //if (($Pocet-floor($Pocet/10)*10)==9)
|
---|
65 | $Hotovo = floor(ftell($Soubor) / $FileSize * $MaxProgress);
|
---|
66 | if ($Hotovo >= $Pocet)
|
---|
67 | {
|
---|
68 | echo(str_repeat('#', $Hotovo-$Pocet));
|
---|
69 | $Pocet = $Hotovo;
|
---|
70 | }
|
---|
71 | //echo('['.memory_get_usage().'] '.$Cesta."\n");
|
---|
72 | foreach ($Files as $Radek)
|
---|
73 | {
|
---|
74 | //echo($Radek."");
|
---|
75 | $Radek = substr($Radek,0,-1);
|
---|
76 | //echo($Radek.",\n");
|
---|
77 | if ($Radek[0] == 'd') $Type = 2; else $Type = 0;
|
---|
78 | $Prava = substr($Radek,0,strpos($Radek,' '));
|
---|
79 | $Radek = ltrim(substr($Radek,strlen($Prava)+1));
|
---|
80 | $Neco = substr($Radek,0,strpos($Radek,' '));
|
---|
81 | $Radek = ltrim(substr($Radek,strlen($Neco)+1));
|
---|
82 | $User = substr($Radek,0,strpos($Radek,' '));
|
---|
83 | $Radek = ltrim(substr($Radek,strlen($User)+1));
|
---|
84 | $Group = substr($Radek,0,strpos($Radek,' '));
|
---|
85 | $Radek = ltrim(substr($Radek,strlen($Group)+1));
|
---|
86 | $Velikost = substr($Radek,0,strpos($Radek,' '));
|
---|
87 | $VelikostSlozky += $Velikost;
|
---|
88 | $Radek = ltrim(substr($Radek,strlen($Velikost)+1));
|
---|
89 | $Date = substr($Radek,0,strpos($Radek,' '));
|
---|
90 | $Radek = ltrim(substr($Radek,strlen($Date)+1));
|
---|
91 | $Time = substr($Radek,0,strpos($Radek,' '));
|
---|
92 | $Nazev = ltrim(substr($Radek,strlen($Time)+1));
|
---|
93 | //echo($Date.','.$Time.','.$Radek.' ');
|
---|
94 |
|
---|
95 | if ((strpos($Nazev,'.') > 0) && ($Type != 2))
|
---|
96 | {
|
---|
97 | $Ext = substr($Nazev,strrpos($Nazev,'.')+1);
|
---|
98 | $Nazev = substr($Nazev,0,strrpos($Nazev,'.'));
|
---|
99 | } else $Ext = '';
|
---|
100 | //$Vlozit .= "INSERT INTO NetworkShareItem (name,size,date,ext,parent,type,host) ".
|
---|
101 | //"VALUES ('$Nazev','$Velikost',NOW(),'$Ext','$Parent','$Type','$HostID'); ";
|
---|
102 |
|
---|
103 | $Database->insert('NetworkShareItem', array(
|
---|
104 | 'name' => $Nazev,
|
---|
105 | 'size' => $Velikost,
|
---|
106 | 'date' => $Date.' '.$Time,
|
---|
107 | //'date' => '',
|
---|
108 | 'ext' => $Ext,
|
---|
109 | 'parent' => $Parent,
|
---|
110 | 'type' => $Type,
|
---|
111 | 'host' => $HostID,
|
---|
112 | ));
|
---|
113 | $Citac = $Citac + 1;
|
---|
114 | // Pokud jde o sloľku, tak projdi jeji obsah a aktualizuj velikost
|
---|
115 | if ($Type == 2)
|
---|
116 | {
|
---|
117 | //echo($Vlozit);
|
---|
118 | // if ($Vlozit!='') DB_Query($Vlozit); // Vloz vsechny polozky
|
---|
119 | // $Vlozit = '';
|
---|
120 | $VelikostSlozky += Vetev($Cesta.$Nazev.'/',$Zanoreni+1);
|
---|
121 | }
|
---|
122 | }
|
---|
123 | //echo($Vlozit);
|
---|
124 | //if ($Vlozit!='') DB_Query($Vlozit); // Vloz vsechny polozky
|
---|
125 |
|
---|
126 | // Aktualizuj velikost
|
---|
127 | //DB_Query("SELECT SUM(size) FROM NetworkShareItem WHERE (parent=".$Parent.")");
|
---|
128 | //$Row = DB_Row();
|
---|
129 | $Database->update('NetworkShareItem', 'id='.$Parent, array('size' => $VelikostSlozky));
|
---|
130 | //closedir($Dir);
|
---|
131 | return $VelikostSlozky;
|
---|
132 | }
|
---|
133 |
|
---|
134 | // Proskenuj jednotlive sdileni
|
---|
135 | $Database->query('DELETE FROM NetworkShareItem WHERE host='.$HostID); // Smaz predchozi polozky
|
---|
136 |
|
---|
137 | // Zapis nazev pocitace
|
---|
138 | $Database->insert('NetworkShareItem',array(
|
---|
139 | 'name' => $Host,
|
---|
140 | 'size' => 0,
|
---|
141 | 'date' => 'NOW()',
|
---|
142 | 'ext' => '',
|
---|
143 | 'parent' => 1,
|
---|
144 | 'type' => 2,
|
---|
145 | 'host' => $HostID,
|
---|
146 | ));
|
---|
147 |
|
---|
148 | // Nacti Parent ID
|
---|
149 | $DbResult = $Database->query('SELECT LAST_INSERT_ID() FROM NetworkShareItem LIMIT 0,1');
|
---|
150 | $Row = $DbResult->fetch_array();
|
---|
151 | $Parent = $Row[0];
|
---|
152 |
|
---|
153 | foreach ($Shares as $Share)
|
---|
154 | {
|
---|
155 | $Pocet = 0;
|
---|
156 |
|
---|
157 | // Načtení seznamu souborů sdílené jednotky
|
---|
158 | $ShareFull = '//'.$Host.'/'.$Share;
|
---|
159 | echo("Načítám strom sdílení ".$Share."...");
|
---|
160 | unset($Output);
|
---|
161 | passthru($SambaSbinDir."mount.cifs '".$ShareFull."' ".$MountDir.' -o guest codepage=cp852 iocharset=iso8859-2');
|
---|
162 | // echo($SambaSbinDir."mount.cifs '".$ShareFull."' ".$MountDir.' -o guest,codepage=cp852,iocharset=iso8859-2');
|
---|
163 | passthru('ls -A -R -X -l --time-style=+"%Y-%m-%d %I:%M:%S" '.$MountDir.'>'.$TempDir.$Host.'.list 2>'.$TempDir.'errors/'.$Host.'_'.$Share.'.err',$Result);
|
---|
164 | //if ($Result==0)
|
---|
165 | //{
|
---|
166 | echo("OK\n");
|
---|
167 |
|
---|
168 | if (file_exists($TempDir.$Host.'.list'))
|
---|
169 | {
|
---|
170 | // Přidej poloľku sdílení do datanáze
|
---|
171 | $Database->insert('NetworkShareItem',array(
|
---|
172 | 'name' => $Share,
|
---|
173 | 'size' => 0,
|
---|
174 | 'date' => 'NOW()',
|
---|
175 | 'ext' => '',
|
---|
176 | 'parent' => $Parent,
|
---|
177 | 'type' => 2,
|
---|
178 | 'host' => $HostID,
|
---|
179 | ));
|
---|
180 |
|
---|
181 | // Analýza souboru
|
---|
182 | echo("Analyzuji obsah...\n[");
|
---|
183 | $FileSize = filesize($TempDir.$Host.'.list');
|
---|
184 | $Soubor = fopen($TempDir.$Host.'.list','r');
|
---|
185 | $Citac = 0;
|
---|
186 | Vetev('/', 0); // Skenuj sdileni
|
---|
187 | fclose($Soubor); // Uzavřít soubor
|
---|
188 | unlink($TempDir.$Host.'.list'); // Smazat soubor stromu adresářové struktury
|
---|
189 | //echo(str_repeat('#',40-$Pocet));
|
---|
190 | echo("] $Citac\n");
|
---|
191 | //} else echo("CHYBA\n");
|
---|
192 | } else echo('Soubor sdílení nenalezen!');
|
---|
193 | passthru('umount '.$MountDir); // Odpojit sitovy disk
|
---|
194 | }
|
---|
195 |
|
---|
196 | // Aktualizuj velikost dat pocitace
|
---|
197 | $DbResult = $Database->query("SELECT SUM(size) FROM NetworkShareItem WHERE parent=".$Parent);
|
---|
198 | $Row = $DbResult->fetch_array();
|
---|
199 | $Database->update('NetworkShareItem','id='.$Parent,array('size' => $Row[0]));
|
---|
200 |
|
---|
201 | // Zaktivuj strom
|
---|
202 | echo("Provadim aktivaci nove naskenovaneho stromu...");
|
---|
203 | $Database->select_db('is');
|
---|
204 | $DbResult = $Database->query("SELECT id FROM hosts WHERE name='".$Host."'");
|
---|
205 | $Row = $DbResult->fetch_array();
|
---|
206 | $NewID = $Row['id'];
|
---|
207 | $Database->select_db('share');
|
---|
208 | $Database->query("DELETE FROM NetworkShareItem WHERE host=".$NewID);
|
---|
209 | $Database->update('NetworkShareItem','host='.$HostID,array('host' => $NewID));
|
---|
210 | echo("OK\n");
|
---|
211 |
|
---|
212 | // Spočítej celkové obsazené místo
|
---|
213 | $Database->select_db('is');
|
---|
214 | $DbResult = $Database->query('SELECT id FROM hosts');
|
---|
215 | $Vyber = '';
|
---|
216 | while ($Row = $DbResult->fetch_array())
|
---|
217 | $Vyber .= $Row['id'].',';
|
---|
218 |
|
---|
219 | $Database->select_db('share');
|
---|
220 | $DbResult = $Database->query("SELECT SUM(size) FROM NetworkShareItem WHERE ((parent=1) AND (host IN (".substr($Vyber,0,-1).')))');
|
---|
221 | $Row = $DbResult->fetch_array();
|
---|
222 | $Database->update('NetworkShareItem','id=1',array('size' => $Row[0]));
|
---|
223 |
|
---|
224 | // Zapiš chyby do databáze
|
---|
225 | echo("Chyby sdílení...\n");
|
---|
226 | $Database->delete('NetworkShareError', 'host="'.$Host.'"');
|
---|
227 | if (is_dir($TempDir.'errors'))
|
---|
228 | {
|
---|
229 | $Dir = scandir($TempDir.'errors');
|
---|
230 | foreach ($Dir as $File)
|
---|
231 | {
|
---|
232 | if (substr($File, 0, strpos($File, '_')) == $Host)
|
---|
233 | {
|
---|
234 | $Share = substr($File, strpos($File, '_')+1, -4);
|
---|
235 | $ShareFull = '//'.$Host.'/'.$Share;
|
---|
236 | if (filesize($TempDir.'errors/'.$File) > 0)
|
---|
237 | {
|
---|
238 | $ErrorFile = fopen($TempDir.'errors/'.$File, 'r+');
|
---|
239 | while (!feof($ErrorFile))
|
---|
240 | {
|
---|
241 | $Row = fgets($ErrorFile);
|
---|
242 | if ($Row != '')
|
---|
243 | {
|
---|
244 | $Row = substr($ShareFull.'/'.substr($Row, 39), 0, -1);
|
---|
245 | $Database->insert('NetworkShareError', array('host' => $Host, 'message' => $Row));
|
---|
246 | echo($Row."\n");
|
---|
247 | }
|
---|
248 | }
|
---|
249 | fclose($ErrorFile);
|
---|
250 | }
|
---|
251 | }
|
---|
252 | }
|
---|
253 | }
|
---|
254 |
|
---|
255 | echo("Doba procházení: ".date("H:i:s", time() - $StartTime - 3600)."\n\n");
|
---|