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