source: lliurex-analytics-server/trunk/fuentes/lliurex-analytics-server/usr/lib/analytics-server/analytics/db.php

Last change on this file was 8233, checked in by mabarracus, 2 years ago

Fix css styles
Add debug version data
Add weekly cronjob restarting service
Add new release 19
Fix postrm

File size: 51.7 KB
Line 
1<?php
2$USE_CACHE = true;
3class Cache{
4    private $cache_file;
5    private $cache_dir;
6    private $data_file;
7    private $data;
8    private $cache_timeout=3600;
9
10    function Cache(){
11        $this->cache_dir = sys_get_temp_dir();
12        $this->cache_file = "cache_analytics.db.tmp";
13        $this->datafile=$this->cache_dir.'/'.$this->cache_file;
14        $this->data = array();
15    }
16    function readFile(){
17        if (is_file($this->datafile) and is_writable($this->datafile)){
18            $this->filecontents = file_get_contents($this->datafile);
19        }else{
20            // do nothing or throw error
21            return false;
22        }
23        return true;
24    }
25    function newFile($data=array()){
26        // create new file
27        $obj=$data;
28        $json='';
29        try{
30            $json=json_encode($obj);
31        }catch(Exception $e){
32            return false;
33        }
34        file_put_contents($this->datafile,$json);
35    }
36    function parseJson(){
37        try{
38            $json=json_decode($this->filecontents,true);
39            $this->data=$json;
40        }catch(Exception $e){
41            return false;
42        }
43        return true;
44    }
45    function process(){
46        $continue = false;
47        if ($this->readFile()){
48            $continue = true;
49        }else{
50            $this->newFile();
51            if ($this->readFile()){
52                $continue=true;
53            }
54        }
55        if (! $continue){
56            return false;
57        }
58        if (! $this->parseJson()){
59            return false;
60        }
61        return true;
62    }
63    function get($key){
64        global $USE_CACHE;
65        if (! $USE_CACHE){
66            return false;
67        }
68        if (! $this->process()){
69            return false;
70        }
71        try{
72            $data=$this->data;
73            if ($data == null or ! is_array($data) or ! array_key_exists($key,$data))
74                return false;
75            $data=$data[$key];
76            if (time() - (int)$data['timestamp'] > $this->cache_timeout){
77                return false; //'invalid';
78            }else{
79                return $data['value'];
80            }
81        }catch(Exception $e){
82            return false;
83        }
84    }
85    function invalidate($key){
86        global $USE_CACHE;
87        if (! $USE_CACHE){
88            return false;
89        }
90        if (! $this->process()){
91            return false;
92        }
93        try{
94            $data=$this->data;
95            if ($data == null or ! is_array($data) or ! array_key_exists($key,$data))
96                return false;
97            if (array_key_exists($key,$this->data)){
98                unset($this->data[$key]);
99                return $this->newFile($this->data);
100            }else{
101                return false;
102            }
103        }catch(Exception $e){
104            return false;
105        }
106    }
107    function store($obj,$key){
108        if (! $this->process()){
109            return false;
110        }
111        try{
112            $this->data[$key]=['timestamp'=>time(),'value'=>$obj];
113            return $this->newFile($this->data);
114        }catch(Exception $e){
115            return false;
116        }
117    }
118}
119
120class DB{
121
122     private $dbhost;
123     private $dbname;
124     private $dbuser;
125     private $dbpass;
126     private $ka_file='/var/run/analyticsd.keepalive';
127     private $alias;
128     public $dbconn;
129
130     function DB(){
131         require_once('config.php');
132         global $dbhost,$dbname,$dbpass,$dbuser,$distros,$swversion;
133
134         $this->dbhost=$dbhost;
135         $this->dbname=$dbname;
136         $this->dbpass=$dbpass;
137         $this->dbuser=$dbuser;
138         $this->swversion=$swversion;
139         $this->alias=array();
140         $this->info_distro=json_decode($distros,true);
141         if ($this->info_distro == NULL){
142             die('Error: Wrong json in Config.php');
143         }
144         $this->init_dates();
145         $this->times=0;
146     }
147     function init_dates($range=NULL){
148         $this->dates=array();
149         $this->dates['today']=date("Y-m-d");
150         $this->dates['first_current']=date("Y-m-01");
151         $this->dates['last_old']=date("Y-m-d",strtotime($this->dates['first_current']." -1 days"));
152         $this->dates['first_old']=date("Y-m-01",strtotime($this->dates['last_old']));
153         $this->dates['last_very_old']=date("Y-m-d",strtotime($this->dates['first_old']." -1 days"));
154         $this->dates['first_very_old']=date("Y-m-01",strtotime($this->dates['last_very_old']));
155         $this->dates['date_current']="(date between '".$this->dates['first_current']."' and '".$this->dates['today']."')";
156         $this->dates['date_old']="(date between '".$this->dates['first_old']."' and '".$this->dates['last_old']."')";
157         $this->dates['date_very_old']="(date between '".$this->dates['first_very_old']."' and '".$this->dates['last_very_old']."')";
158         $this->dates['date_range_last_three_months']="(date between '".$this->dates['first_very_old']."' and '".$this->dates['today']."')";
159
160         if ($range != NULL){
161            $y=intval($range['year']);
162            $m=intval($range['month']);
163            $w=intval($range['window']);
164            $this->dates['init_range']=date("Y-m-01",strtotime($y.'-'.$m.'-01'));
165            $this->dates['end_range']=date("Y-m-01",strtotime($y.'-'.$m.'-01 +'.$w.' month'));
166            $this->dates['end_range']=date("Y-m-d",strtotime($this->dates['end_range'].' -1 day'));
167            if (strtotime($this->dates['end_range']) > strtotime($this->dates['today'])){
168                $this->dates['end_range']=$this->dates['today'];
169            }
170            $this->dates['custom_range']="(date between '".$this->dates['init_range']."' and '".$this->dates['end_range']."')";
171         }
172     }
173     function connect(){
174        $this->dbconn=new mysqli($this->dbhost, $this->dbuser , $this->dbpass, $this->dbname);
175        if ($this->dbconn->connect_error) {
176            die('Connect Error:'. $this->dbconn->connect_error);
177        }
178     }
179     function disconnect(){
180         $this->dbconn->close();
181     }
182     function init_trans(){
183         $this->dbconn->autocommit(FALSE);
184         $this->dbconn->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);
185     }
186
187    function send_data($user,$version,$sabor,$apps,$specs,$date=''){
188        $spec_sql_names = '';
189        $spec_sql_values = '';
190
191        $ltsp_sql_names = '';
192        $ltsp_sql_values = '';
193
194        $use_data=array();
195        $use_name=array();
196        if ($specs != false){
197            if (array_key_exists('arch',$specs)){
198                $arch = $specs['arch'];
199                $use_data[]="'$arch'";
200                $use_name[]='arch';
201            }
202            if (array_key_exists('mem',$specs)){
203                $mem = $specs['mem'];
204                if (is_numeric($mem)){
205                    $mem=(int)$mem;
206                }
207                $use_data[]=$mem;
208                $use_name[]='mem';
209            }
210            if (array_key_exists('vga',$specs)){
211                $vga = substr($specs['vga'],0,80);
212                $use_name[]='vga';
213                $use_data[]="'$vga'";
214            }
215            if (array_key_exists('cpu',$specs)){
216                if (array_key_exists('model',$specs['cpu'])){
217                    $cpu = substr($specs['cpu']['model'],0,80);
218                    $use_name[]='cpu';
219                    $use_data[]="'$cpu'";
220                }
221                if (array_key_exists('ncpus',$specs['cpu'])){
222                    $ncpu = $specs['cpu']['ncpus'];
223                    if (is_numeric($ncpu)){
224                        $ncpu=(int)$ncpu;
225                    }
226                    $use_name[]='ncpu';
227                    $use_data[]=$ncpu;
228                }
229            }
230            if (count($use_data) > 0){
231                $spec_sql_names = ',';
232                $spec_sql_names .= implode(',',$use_name);
233                $spec_sql_values = ',';
234                $spec_sql_values .= implode(',',$use_data);
235            }else{
236                $spec_sql_names = '';
237                $spec_sql_values = '';
238            }
239            $use_data=array();
240            $use_name=array();
241            if (array_key_exists('subtype',$specs)){
242                if (array_key_exists('LTSP',$specs['subtype'])){
243                    $ltsp = $specs['subtype']['LTSP'];
244                    if ($ltsp){
245                        $ltsp='TRUE';
246                    }else{
247                        $ltsp='FALSE';
248                    }
249                    $use_name[]='ltsp';
250                    $use_data[]=$ltsp;
251                }
252                if (array_key_exists('MODE',$specs['subtype'])){
253                    $ltsp_mode = $specs['subtype']['MODE'];
254                    $ltsp_mode = substr($ltsp_mode,0,4);
255                    if (strtolower($ltsp_mode) != 'null'){
256                        $use_name[]='mode';
257                        $use_data[]="'$ltsp_mode'";
258                    }
259                }
260            }
261            if (count($use_name) > 0){
262                $ltsp_sql_names = ',';
263                $ltsp_sql_names .= implode(',',$use_name);
264                $ltsp_sql_values = ',';
265                $ltsp_sql_values .= implode(',',$use_data);
266            }else{
267                $ltsp_sql_names = '';
268                $ltsp_sql_values = "";
269            }
270        }
271        if ($date == ''){
272            $sql="INSERT INTO tmp_clients(user,version,sabor,status $spec_sql_names $ltsp_sql_names) values ('$user','$version','$sabor',0 $spec_sql_values $ltsp_sql_values)";
273        }else{
274            $sql="INSERT INTO tmp_clients(user,version,sabor,status,date $spec_sql_names $ltsp_sql_names) values ('$user','$version','$sabor',0,'$date' $spec_sql_values $ltsp_sql_values)";
275        }
276        $retry=1;
277        $done=false;
278        $cli_id=false;
279        while (! $done and $retry < 4){
280            $res=$this->dbconn->query($sql);
281            if ($res){
282                $cli_id=$this->dbconn->insert_id; 
283                $done=true;
284            }else{
285                $retry+=1;
286                sleep($retry);
287            }
288        }
289        if ($retry == 4 or $cli_id == false)
290            throw new Exception('Error sending client data: '.$this->dbconn->error);
291        $err_apps=false;
292        $err_exception=false;
293        if (count($apps) != 0){
294            if ($date == ''){
295                $sql="insert into tmp_packages(client,app,value) values";
296            }else{
297                $sql="insert into tmp_packages(client,app,value,date) values";
298            }
299            $values=array();
300            // Prevent DoS attack
301            $i = 1000;
302            foreach ($apps as $app => $value){
303                // Max 1000 apps
304                if ( $i > 0 ){
305                    $i = $i - 1;
306                }else{
307                    throw new Exception('*** DoS detected, aborting more processing on this request ***');
308                } 
309
310                if (trim($app) == '' or trim($value) == ''){
311                    $err_apps=true;
312                    $err_exception=new Exception('Wrong application values');
313                    continue;
314                }
315                if ($date == ''){
316                    $values[]="($cli_id,'$app',$value)";
317                }else{
318                    $values[]="($cli_id,'$app',$value,'$date')";
319                }
320            }
321            if (count($values) > 0){
322                $sql.=implode(',',$values);
323                $done=false;
324                $retry=1;
325                while (! $done and $retry < 4){
326                    $res=$this->dbconn->query($sql);
327                    if ($res){
328                        $done=true;
329                    }else{
330                        $retry += 1;
331                        sleep($retry);
332                    }
333                }
334                if ($retry == 4 or ! $done){
335                    $err_apps=true;
336                    $err_exception=new Exception('Error sending client app data: '.$this->dbconn->error.' QUERY='.$sql);
337                }
338            }
339        }
340        //End operations
341        $sql = "Update tmp_clients set status=1 where id = $cli_id and status=0";
342        $retry=1;
343        $done=false;
344        while (! $done and $retry < 4){
345            $res=$this->dbconn->query($sql);
346            if ($res){
347                $done=true;
348            }else{
349                $retry+=1;
350                sleep($retry);
351            }
352        }
353        if ($retry == 4 or $cli_id == false){
354            throw new Exception('Error commiting client data: '.$this->dbconn->error);
355        }
356        if ($err_apps){
357            throw $err_exception;
358        }
359    }
360
361     private function load_alias(){
362         $sql="SELECT name,alias from Alias";
363         $result=$this->dbconn->query($sql);
364         while($row=$result->fetch_array(MYSQLI_ASSOC)){
365             $this->alias[$row['name']]=$row['alias'];
366         }
367     }
368        function get_system_data(){
369            $sql="select * from Config";
370            $result=$this->dbconn->query($sql);
371            if ($result){
372                $tmp=[];
373                while ($row=$result->fetch_array(MYSQLI_ASSOC)){
374                    $tmp[$row['name']]=$row['value'];
375                }
376                return json_encode($tmp);
377            }
378        }
379    function execute_sql_array($arr,$fkey=false){
380        if (! is_array($arr)){
381                return false;
382        }
383        $time=0;
384        foreach ($arr as $key => $value){
385                if (! $fkey or $key == $fkey){
386                        $stime=microtime(true);
387                        $result=$this->dbconn->query($value);
388                        if (!$result){
389                                die("Error in sql '".$value."' -> ".$this->dbconn->error);
390                        }
391                        $time += microtime(true) - $stime;
392                }
393        }
394        return $time;
395    }
396    function get_extended_data($app){
397        global $swversion;
398
399        $this->times=0;
400        $cache = new Cache;
401        $use_memtable=true;
402        $use_views=false;
403        $split_tables=false;
404         // CLIENT UPDATES
405        $sql_compat_tables=array();
406        $table = 'Client_Versions';
407        if ($use_views){
408                $split_tables=true;
409                $sql_compat_tables[]="create or replace view cv as (select Client_uid,date,Releases_name,Flavours_name,string_release from $table)";
410                $sql_compat_tables[]="create or replace view cv_a as (select Client_uid,date,Releases_name,Flavours_name,arch from $table)";
411                $sql_compat_tables[]="create or replace view cv_m as (select Client_uid,date,Releases_name,Flavours_name,mem from $table)";     
412                $sql_compat_tables[]="create or replace view cv_c as (select Client_uid,date,Releases_name,Flavours_name,ncpu from $table)";
413                $sql_compat_tables[]="create or replace view cv_l as (select Client_uid,date,Releases_name,Flavours_name,ltsp,mode from $table)";
414                $table = 'cv';
415        }
416        if ($use_memtable){
417                if (! $split_tables){
418                        $sql_compat_tables[]="create temporary table if not exists cv engine=memory as (select Client_uid,date,Releases_name,Flavours_name,string_release,arch,mem,ncpu,ltsp,mode from $table)";
419                //      $sql_compat_tables[]="alter table cv add primary key(Client_uid,date,Releases_name,Flavours_name,arch,mem,ncpu,uuid)"; 
420                //      $sql_compat_tables[]="create index a on cv(Client_uid,date) using btree";
421                //      $sql_compat_tables[]="create index b on cv(arch,date,) using btree";
422                //      $sql_compat_tables[]="create index c on cv(date,mem) using btree";
423                //      $sql_compat_tables[]="create index d on cv(date,ncpu) using btree";
424                }else{
425                        $sql_compat_tables[]="create temporary table if not exists cv engine=memory as (select Client_uid,date,Releases_name,Flavours_name,string_release from $table)";
426                        $sql_compat_tables[]="create temporary table if not exists cv_a engine=memory as (select Client_uid,date,Releases_name,Flavours_name,arch from $table)";
427                        $sql_compat_tables[]="create temporary table if not exists cv_m engine=memory as (select Client_uid,date,Releases_name,Flavours_name,mem from $table)"; 
428                        $sql_compat_tables[]="create temporary table if not exists cv_c engine=memory as (select Client_uid,date,Releases_name,Flavours_name,ncpu from $table)";
429                        $sql_compat_tables[]="create temporary table if not exists cv_l engine=memory as (select Client_uid,date,Releases_name,Flavours_name,ltsp,mode from $table)";
430                }
431        }
432        if ($use_memtable or $use_views){
433                $table='cv';
434        }
435        if($split_tables){
436                $table_a=$table.'_a';
437                $table_m=$table.'_m';
438                $table_c=$table.'_c';
439                $table_l=$table.'_l';
440        }else{
441                $table_a=$table;
442                $table_m=$table;
443                $table_c=$table;
444                $table_l=$table;
445        }
446        $sql_compat_tables[]="create temporary table if not exists dates engine=memory as (select * from (select year,month from (select year,month from (select year,month from (select year(now()) as year union all select year(date_sub(now(),interval 1 year)))years inner join (select 1 as month union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 union all select 10 union all select 11 union all select 12)months)dates where str_to_date(concat(year,'-',month,'-01'),'%Y-%m-%d') >= date_sub(now(),interval 1 year) and str_to_date(concat(year,'-',month,'-01'),'%Y-%m-%d') < now())compat)dates order by year, month)";
447        $sql_compat_tables[]="create temporary table if not exists compat_rf engine=memory as (select * from dates join (select name as rel from Releases where Releases.name != 'other')rels join (select name as fla from Flavours)flas)";
448        $sql_compat_tables[]="create temporary table if not exists compat_rfa engine=memory as (select * from compat_rf join (select 'x86_64' as arch union all select 'i686' union all select 'UNKN')arches)";
449        $sql_compat_tables[]="create temporary table if not exists compat_t engine=memory as (select * from dates join(select 0 as type union all select 1 union all select 'UNKN') types)";
450        $sql_compat_tables[]="create temporary table if not exists compat_m engine=memory as (select * from dates join (select 'THIN' as mode union all select 'SEMI' union all select 'FAT' union all select 'UNKN') types)";
451       
452        $sql_nhosts=array();
453        $sql_nhosts[]="/*Num total hosts detailed*/ create temporary table if not exists nhosts_detail engine=memory as (select * from compat_rf left join (select year,month,rel,fla,ifnull(count(*),0) as total_hosts from (select year(date) as year,month(date) as month,Releases_name as rel,Flavours_name as fla,Client_uid from (select Client_uid,Releases_name,Flavours_name,date from $table order by date desc)t group by year(date),month(date),Releases_name,Flavours_name,Client_uid)unique_last_clients group by year,month,rel,fla)detailed using (year,month,rel,fla));";
454        $sql_nhosts[]="/*Num total hosts*/ create temporary table if not exists nhosts engine=memory as (select year,month,sum(total_hosts) as total_hosts from nhosts_detail group by year,month);";
455        $sql_upd=array();
456        $sql_upd[]="/*Num host single entry*/ create temporary table if not exists single_entry engine=memory as (select year,month,ifnull(single_entry,0) as single_entry from dates left join (select year,month,count(*) as single_entry from (select year(date) as year, month(date) as month from $table group by year(date),month(date),Client_uid having count(*) = 1)a group by year,month)singles using(year,month));";
457        $sql_upd[]="/*A+B*/ create temporary table if not exists ab engine=memory as (select distinct year,month,Client_uid from ( select Distinct Client_uid,Releases_name,year(date) as year,month(date) as month from $table)t group by year,month,Client_uid having count(*) > 1);";
458        $sql_upd[]="create index a on ab (Client_uid,year,month) using btree;";
459        $sql_upd[]="/*B+C+D*/ create temporary table if not exists bcd engine=memory as (select distinct year,month,Client_uid from ( select Distinct Client_uid,Flavours_name,year(date) as year,month(date) as month from $table)t group by year,month,Client_uid having count(*) > 1);";
460        $sql_upd[]="create index a on bcd (Client_uid,year,month) using btree;";       
461        $sql_upd[]="/* B */ create temporary table if not exists b engine=memory as (select * from ab join bcd using(year,month,Client_uid));";
462        $sql_upd[]="/* A */ create temporary table if not exists a engine=memory as (select * from ab left join bcd using(year,month,Client_uid) where bcd.Client_uid is null); ";
463        $sql_upd[]="/* A+B+C */ create temporary table if not exists abc_plus_part_e engine=memory as (select distinct year,month,Client_uid from ( select Distinct Client_uid,string_release,year(date) as year,month(date) as month from $table)t group by year,month,Client_uid having count(*) > 1);";
464        $sql_upd[]="create index a on abc_plus_part_e (Client_uid,year,month) using btree;";
465        $sql_upd[]="/* C+D */ create temporary table if not exists cd engine=memory as (select * from ab right join bcd using(year,month,Client_uid) where ab.Client_uid is null);";
466        $sql_upd[]="create index a on cd (Client_uid,year,month) using btree;";
467        $sql_upd[]="/* D */ create temporary table if not exists d engine=memory as (select * from cd left join abc_plus_part_e using(year,month,Client_uid) where abc_plus_part_e.Client_uid is null);";
468        $sql_upd[]="create index a on d (Client_uid,year,month) using btree;";
469        $sql_upd[]="/* C */ create temporary table if not exists c engine=memory as (select * from cd left join d using(year,month,Client_uid) where d.Client_uid is null );";
470        $sql_upd[]="create temporary table if not exists na engine=memory as (select year,month,ifnull(a,0) as a from dates left join (select year,month,count(*) as a from a group by year,month)t using(year,month));";
471        $sql_upd[]="create temporary table if not exists nb engine=memory as (select year,month,ifnull(b,0) as b from dates left join (select year,month,count(*) as b from b group by year,month)t using(year,month));";
472        $sql_upd[]="create temporary table if not exists nc engine=memory as (select year,month,ifnull(c,0) as c from dates left join (select year,month,count(*) as c from c group by year,month)t using(year,month));";
473        $sql_upd[]="create temporary table if not exists nd engine=memory as (select year,month,ifnull(d,0) as d from dates left join (select year,month,count(*) as d from d group by year,month)t using(year,month));";
474        $sql_upd[]="/* temp */ create temporary table tmp_resume engine=memory as (select * from dates left join nhosts using(year,month) join single_entry using(year,month) join na using(year,month) join nb using(year,month) join nc using(year,month) join nd using(year,month));";
475        $sql_upd[]="/* resume */ create temporary table resume engine=memory as (select year,month,total_hosts,single_entry,total_hosts-single_entry as target_hosts,a,b,c,d, total_hosts-single_entry-a-b-c-d as e from tmp_resume);";
476       
477        $sql_targets=array();
478        $sql_targets['arch']="create temporary table if not exists target_arch engine=memory as (select year(date) as year,month(date) as month,Releases_name as rel,Flavours_name as fla,ifnull(if( arch like 'NULL',NULL,arch),'UNKN') as arch,count(distinct Client_uid) as total from $table_a group by year,month,Releases_name,Flavours_name,arch)";
479        $sql_targets['memnull']="create temporary table if not exists target_memnull engine=memory as (select year(date) as year,month(date) as month,Releases_name as rel,Flavours_name as fla,count(distinct Client_uid) as total from $table_m where mem is null and date >= DATE_SUB(NOW(),interval 1 year) group by year,month,rel,fla)";
480        $sql_targets['mem2G']="create temporary table if not exists target_mem2G engine=memory as (select year(date) as year,month(date) as month,Releases_name as rel,Flavours_name as fla,count(distinct Client_uid) as total from $table_m where mem < 2048000 and date >= DATE_SUB(NOW(),interval 1 year) group by year,month,rel,fla)";
481        $sql_targets['mem4G']="create temporary table if not exists target_mem4G engine=memory as (select year(date) as year,month(date) as month,Releases_name as rel,Flavours_name as fla,count(distinct Client_uid) as total from $table_m where mem > 2048000 and mem < 4096000 and date >= DATE_SUB(NOW(),interval 1 year) group by year,month,rel,fla)";
482        $sql_targets['mem8G']="create temporary table if not exists target_mem8G engine=memory as (select year(date) as year,month(date) as month,Releases_name as rel,Flavours_name as fla,count(distinct Client_uid) as total from $table_m where mem > 4096000 and date >= DATE_SUB(NOW(),interval 1 year) group by year,month,rel,fla)";
483        $sql_targets['cpunull']="create temporary table if not exists target_cpunull engine=memory as (select year(date) as year,month(date) as month,Releases_name as rel,Flavours_name as fla,count(distinct Client_uid) as total from $table_c where ncpu is null and date >= DATE_SUB(NOW(),interval 1 year) group by year,month,rel,fla)";
484        $sql_targets['cpu_mono']="create temporary table if not exists target_cpu_mono engine=memory as (select year(date) as year,month(date) as month,Releases_name as rel,Flavours_name as fla,count(distinct Client_uid) as total from $table_c where ncpu < 2 and date >= DATE_SUB(NOW(),interval 1 year) group by year,month,rel,fla)";
485        $sql_targets['cpu_dual']="create temporary table if not exists target_cpu_dual engine=memory as (select year(date) as year,month(date) as month,Releases_name as rel,Flavours_name as fla,count(distinct Client_uid) as total from $table_c where ncpu > 1 and ncpu < 5 and date >= DATE_SUB(NOW(),interval 1 year) group by year,month,rel,fla)";
486        $sql_targets['cpu_more']="create temporary table if not exists target_cpu_more engine=memory as (select year(date) as year,month(date) as month,Releases_name as rel,Flavours_name as fla,count(distinct Client_uid) as total from $table_c where ncpu  > 4 and date >= DATE_SUB(NOW(),interval 1 year) group by year,month,rel,fla)";
487        $sql_targets['ltsp_type']="create temporary table if not exists target_type engine=memory as(select year(date) as year,month(date) as month,ifnull(ltsp,'UNKN') as type,count(distinct Client_uid) as total from $table_l where Flavours_name = 'client' and date >= DATE_SUB(NOW(),interval 1 year) group by year,month,ltsp)";
488        $sql_targets['ltsp_mode']="create temporary table if not exists target_mode engine=memory as (select year(date) as year,month(date) as month,ifnull(mode,'UNKN') as mode,count(distinct Client_uid) as total from $table_l where Flavours_name = 'client' and date >= DATE_SUB(NOW(),interval 1 year) group by year,month,mode)";
489       
490
491        $exec_time=$this->execute_sql_array($sql_compat_tables);
492        if ($exec_time){
493                $this->times+=$exec_time;
494        }
495
496        $sql_upd_show="select * from resume order by year desc, month desc";
497        $cache_key='updates';
498        $data = $cache->get($cache_key);
499        $updated_nhosts=false;
500        $stime=microtime(true);
501        if ($data != false){
502                $num_updates_month=$data['num_updates_month'];
503                $machines_month=$data['machines_month'];
504                $change_releases=$data['change_releases'];
505                $change_flavour=$data['change_flavour'];
506        }else{
507                if($this->execute_sql_array($sql_nhosts)){
508                        $updated_nhosts=true;
509                }
510                $this->execute_sql_array($sql_upd);
511                $result=$this->dbconn->query($sql_upd_show);
512                if ($result){
513                        $machines_month=[0,0,0,0,0,0,0,0,0,0,0,0];
514                        $num_updates_month=[0,0,0,0,0,0,0,0,0,0,0,0];
515                        $change_releases=[0,0,0,0,0,0,0,0,0,0,0,0];
516                        $change_flavour=[0,0,0,0,0,0,0,0,0,0,0,0];
517                        $num_updates_month=array();
518                        $this->times+=microtime(true)-$stime;
519                        $i=0;
520                        $tmp=[];
521                        while($row=$result->fetch_array(MYSQLI_ASSOC)){
522                                $machines_month[$i]=intval($row['total_hosts']);
523                                $change_releases[$i]=intval($row['a'])+intval($row['b']);
524                                $change_flavour[$i]=intval($row['c'])+intval($row['d']);
525                                $num_updates_month[$i]=intval($row['e']);
526                                $i++;
527                        }
528                        $cache->store(array('num_updates_month'=>$num_updates_month,'machines_month'=>$machines_month,'change_releases'=>$change_releases,'change_flavour'=>$change_flavour),$cache_key);
529                }else{
530                        $num_updates_month=$this->dbconn->error;
531                        $machines_month=$this->dbconn->error;
532                        $change_releases=$this->dbconn->error;
533                        $change_flavour=$this->dbconn->error;
534                }
535        }
536        $sql="select * from nhosts_detail order by year desc, month desc;";
537        $cache_key='nhosts_detail';
538        $data = $cache->get($cache_key);
539        $stime=microtime(true);
540        if ($data != false){
541            $clients_month=$data;
542        }else{
543            if (!$updated_nhosts){
544                $this->execute_sql_array($sql_nhosts);
545            }
546            $result=$this->dbconn->query($sql);
547            if ($result){
548                $this->times+=microtime(true)-$stime;
549                $clients_month=[];
550                $tmp=[];
551                while($row=$result->fetch_array(MYSQLI_ASSOC)){
552                    $date=$row['year'].'_'.$row['month'];
553                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['total_hosts']);
554                }
555                foreach($tmp as $date_value){
556                        $clients_month[]=$date_value;
557                }
558                $cache->store($clients_month,$cache_key);
559            }else{
560                $clients_month=$this->dbconn->error;
561            }
562        }
563        // architecture
564        $sql_arch="select compat_rfa.year,compat_rfa.month,compat_rfa.rel,compat_rfa.fla,compat_rfa.arch,ifnull(target_arch.total,0) as total from compat_rfa left join target_arch using(year,month,rel,fla,arch) order by year desc,month desc,rel asc,fla asc, arch asc";
565        $cache_key='extended_arch';
566        $data = $cache->get($cache_key);
567        $stime=microtime(true);
568        if ($data != false){
569            $clients_arch=$data;
570        }else{
571            $this->execute_sql_array($sql_targets,'arch');
572            $result=$this->dbconn->query($sql_arch);
573            if ($result){
574                $this->times+=microtime(true)-$stime;
575                $clients_arch=[];
576                $tmp=[];
577                while($row=$result->fetch_array(MYSQLI_ASSOC)){
578                        $date=$row['year'].'_'.$row['month'];
579                        $tmp[$date][$row['rel']][$row['fla']][strtolower($row['arch'])]=intval($row['total']);
580                }
581                foreach($tmp as $d){
582                        $clients_arch[]=$d;
583                }
584                $cache->store($clients_arch,$cache_key);
585            }else{
586                $clients_arch=$this->dbconn->error;
587            }
588        }
589        // memory
590        $sql_memnull="select compat_rf.year,compat_rf.month,compat_rf.rel,compat_rf.fla,ifnull(target_memnull.total,0) as total from compat_rf left join target_memnull using(year,month,rel,fla) order by year desc,month desc,compat_rf.rel asc,compat_rf.fla asc";
591        $cache_key='extended_memory_null';
592        $data = $cache->get($cache_key);
593        $stime=microtime(true);
594        if ($data != false){
595            $clients_memnull=$data;
596        }else{
597            $this->execute_sql_array($sql_targets,'memnull');
598            $result=$this->dbconn->query($sql_memnull);
599            if ($result){
600                $this->times+=microtime(true)-$stime;
601                $clients_memnull=[];
602                $tmp=[];
603                while($row=$result->fetch_array(MYSQLI_ASSOC)){
604                    $date=$row['year'].'_'.$row['month'];
605                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['total']);
606                }
607                foreach($tmp as $d){
608                        $clients_memnull[]=$d;
609                }
610                $cache->store($clients_memnull,$cache_key);
611            }else{
612                $clients_memnull=$this->dbconn->error;
613            }
614        }
615        $sql_mem2G="select compat_rf.year,compat_rf.month,compat_rf.rel,compat_rf.fla,ifnull(target_mem2G.total,0) as total from compat_rf left join target_mem2G using(year,month,rel,fla) order by year desc,month desc,compat_rf.rel asc,compat_rf.fla asc";
616        $cache_key='extended_memory_2G';
617        $data = $cache->get($cache_key);
618        $stime=microtime(true);
619        if ($data != false){
620            $clients_2G=$data;
621        }else{
622            $this->execute_sql_array($sql_targets,'mem2G');
623            $result=$this->dbconn->query($sql_mem2G);
624            if ($result){
625                $this->times+=microtime(true)-$stime;
626                $clients_2G=[];
627                $tmp=[];
628                while($row=$result->fetch_array(MYSQLI_ASSOC)){
629                    $date=$row['year'].'_'.$row['month'];
630                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['total']);
631                }
632                foreach($tmp as $d){
633                        $clients_2G[]=$d;
634                }
635                $cache->store($clients_2G,$cache_key);
636            }else{
637                $clients_2G=$this->dbconn->error;
638            }
639        }
640        $sql_mem4G="select compat_rf.year,compat_rf.month,compat_rf.rel,compat_rf.fla,ifnull(target_mem4G.total,0) as total from compat_rf left join target_mem4G using(year,month,rel,fla) order by year desc,month desc,compat_rf.rel asc,compat_rf.fla asc";
641        $cache_key='extended_memory_4G';
642        $data = $cache->get($cache_key);
643        $stime=microtime(true);
644        if ($data != false){
645            $clients_4G=$data;
646        }else{
647            $this->execute_sql_array($sql_targets,'mem4G');
648            $result=$this->dbconn->query($sql_mem4G);
649            if ($result){
650                $this->times+=microtime(true)-$stime;
651                $clients_4G=[];
652                $tmp=[];
653                while($row=$result->fetch_array(MYSQLI_ASSOC)){
654                    $date=$row['year'].'_'.$row['month'];
655                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['total']);
656                }
657                foreach($tmp as $d){
658                        $clients_4G[]=$d;
659                }
660                $cache->store($clients_4G,$cache_key);
661            }else{
662                $clients_4G=$this->dbconn->error;
663            }
664        }
665        $sql_mem8G="select compat_rf.year,compat_rf.month,compat_rf.rel,compat_rf.fla,ifnull(target_mem8G.total,0) as total from compat_rf left join target_mem8G using(year,month,rel,fla) order by year desc,month desc,compat_rf.rel asc,compat_rf.fla asc";
666        $cache_key='extended_memory_8G';
667        $data = $cache->get($cache_key);
668        $stime=microtime(true);
669        if ($data != false){
670            $clients_8G=$data;
671        }else{
672            $this->execute_sql_array($sql_targets,'mem8G');
673            $result=$this->dbconn->query($sql_mem8G);
674            if ($result){
675                $this->times+=microtime(true)-$stime;
676                $clients_8G=[];
677                $tmp=[];
678                while($row=$result->fetch_array(MYSQLI_ASSOC)){
679                    $date=$row['year'].'_'.$row['month'];
680                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['total']);
681                }
682                foreach($tmp as $d){
683                        $clients_8G[]=$d;
684                }
685                $cache->store($clients_8G,$cache_key);
686            }else{
687                $clients_8G=$this->dbconn->error;
688            }
689        }
690        // cpu
691        $sql_cpunull="select compat_rf.year,compat_rf.month,compat_rf.rel,compat_rf.fla,ifnull(target_cpunull.total,0) as total from compat_rf left join target_cpunull using(year,month,rel,fla) order by year desc,month desc,compat_rf.rel asc,compat_rf.fla asc";
692        $cache_key='extended_memory_cpunull';
693        $data = $cache->get($cache_key);
694        $stime=microtime(true);
695        if ($data != false){
696            $clients_cpunull=$data;
697        }else{
698            $this->execute_sql_array($sql_targets,'cpunull');
699            $result=$this->dbconn->query($sql_cpunull);
700            if ($result){
701                $this->times+=microtime(true)-$stime;
702                $clients_cpunull=[];
703                $tmp=[];
704                while($row=$result->fetch_array(MYSQLI_ASSOC)){
705                    $date=$row['year'].'_'.$row['month'];
706                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['total']);
707                }
708                foreach($tmp as $d){
709                        $clients_cpunull[]=$d;
710                }
711                $cache->store($clients_cpunull,$cache_key);
712            }else{
713                $clients_mono=$this->dbconn->error;
714            }
715        }
716        $sql_cpu_mono="select compat_rf.year,compat_rf.month,compat_rf.rel,compat_rf.fla,ifnull(target_cpu_mono.total,0) as total from compat_rf left join target_cpu_mono using(year,month,rel,fla) order by year desc,month desc,compat_rf.rel asc,compat_rf.fla asc";
717        $cache_key='extended_memory_cpu_mono';
718        $data = $cache->get($cache_key);
719        $stime=microtime(true);
720        if ($data != false){
721            $clients_mono=$data;
722        }else{
723            $this->execute_sql_array($sql_targets,'cpu_mono');
724            $result=$this->dbconn->query($sql_cpu_mono);
725            if ($result){
726                $this->times+=microtime(true)-$stime;
727                $clients_mono=[];
728                $tmp=[];
729                while($row=$result->fetch_array(MYSQLI_ASSOC)){
730                    $date=$row['year'].'_'.$row['month'];
731                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['total']);
732                }
733                foreach($tmp as $d){
734                        $clients_mono[]=$d;
735                }
736                $cache->store($clients_mono,$cache_key);
737            }else{
738                $clients_mono=$this->dbconn->error;
739            }
740        }
741        $sql_cpu_dual="select compat_rf.year,compat_rf.month,compat_rf.rel,compat_rf.fla,ifnull(target_cpu_dual.total,0) as total from compat_rf left join target_cpu_dual using(year,month,rel,fla) order by year desc,month desc,compat_rf.rel asc,compat_rf.fla asc";
742        $cache_key='extended_memory_cpu_dualquad';
743        $data = $cache->get($cache_key);
744        $stime=microtime(true);
745        if ($data != false){
746            $clients_dualquad=$data;
747        }else{
748            $this->execute_sql_array($sql_targets,'cpu_dual');
749            $result=$this->dbconn->query($sql_cpu_dual);
750            if ($result){
751                $this->times+=microtime(true)-$stime;
752                $clients_dualquad=[];
753                $tmp=[];
754                while($row=$result->fetch_array(MYSQLI_ASSOC)){
755                    $date=$row['year'].'_'.$row['month'];
756                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['total']);
757                }
758                foreach($tmp as $d){
759                        $clients_dualquad[]=$d;
760                }
761                $cache->store($clients_dualquad,$cache_key);
762            }else{
763                $clients_dualquad=$this->dbconn->error;
764            }
765        }
766        $sql_cpu_other="select compat_rf.year,compat_rf.month,compat_rf.rel,compat_rf.fla,ifnull(target_cpu_more.total,0) as total from compat_rf left join target_cpu_more using(year,month,rel,fla) order by year desc,month desc,compat_rf.rel asc,compat_rf.fla asc";
767        $cache_key='extended_memory_cpu_other';
768        $data = $cache->get($cache_key);
769        $stime=microtime(true);
770        if ($data != false){
771            $clients_more=$data;
772        }else{
773            $this->execute_sql_array($sql_targets,'cpu_more');
774            $result=$this->dbconn->query($sql_cpu_other);
775            if ($result){
776                $this->times+=microtime(true)-$stime;
777                $clients_more=[];
778                $tmp=[];
779                while($row=$result->fetch_array(MYSQLI_ASSOC)){
780                    $date=$row['year'].'_'.$row['month'];
781                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['total']);
782                }
783                foreach($tmp as $d){
784                        $clients_more[]=$d;
785                }
786                $cache->store($clients_more,$cache_key);
787            }else{
788                $clients_more=$this->dbconn->error;
789            }
790        }
791
792        //ltsp
793        $sql_ltsp_types="select compat_t.year,compat_t.month,compat_t.type,ifnull(target_type.total,0) as total from compat_t left join target_type using(year,month,type) order by year desc,month desc,compat_t.type asc";
794        $count_ltsp=array();
795        $cache_key='ltsp_types';
796        $data=$cache->get($cache_key);
797        $stime=microtime(true);
798        if ($data != false){
799            $count_ltsp=$data;
800        }else{
801            $this->execute_sql_array($sql_targets,'ltsp_type');
802            $result=$this->dbconn->query($sql_ltsp_types);
803            if ($result){
804                $this->times+=microtime(true)-$stime;
805                while($row=$result->fetch_array(MYSQLI_ASSOC)){
806                    if (isset($row['type']) and $row['type'] != NULL){
807                        $count_ltsp[]=array(strtolower($row['type']),$row['total']);
808                    }
809                }
810                $cache->store($count_ltsp,$cache_key);
811            }else{
812                $count_ltsp=$this->dbconn->error;
813            }
814        }
815        $cache_key='ltsp_modes';
816        $sql_ltsp_modes="select compat_m.year,compat_m.month,compat_m.mode,ifnull(target_mode.total,0) as total from compat_m left join target_mode using(year,month,mode) order by year desc,month desc,compat_m.mode asc";
817        $data= $cache->get($cache_key);
818        $stime=microtime(true);
819        $count_mode=array();
820        if ($data != false){
821            $count_mode=$data;
822        }else{
823            $this->execute_sql_array($sql_targets,'ltsp_mode');
824            $result=$this->dbconn->query($sql_ltsp_modes);
825            if ($result){
826                $this->times+=microtime(true)-$stime;
827                while($row=$result->fetch_array(MYSQLI_ASSOC)){
828                    if (isset($row['mode']) and $row['mode'] != NULL){
829                        $count_mode[]=array(strtolower($row['mode']),$row['total']);
830                    }
831                }
832                $cache->store($count_mode,$cache_key);
833            }else{
834                $count_mode=$this->dbconn->error;
835            }
836        }
837
838         //sanitize input
839        if ($app != NULL){
840             $app=preg_grep('/^[a-zA-Z0-9\-_]+$/',array($app));
841             if ($app != NULL and isset($app[0])){
842                 $app=$this->dbconn->real_escape_string($app[0]);
843                 $stats['apps']=[];
844                 $sql="select year,month,rel,fla,string,ifnull(count,0) as count from compat_rf join (select distinct string from RecvPackages where string like '$app%')compat_rfapp left join (select year(date) as year,month(date) as month,string,Releases_name as rel,Flavours_name as fla,sum(count) as count from RecvPackages where string like '$app%' and date >= date_sub(now(),interval 1 year) group by year,month,string,Releases_name,Flavours_name)a using(year,month,rel,fla,string) order by compat_rfapp.string,year desc,month desc";
845                    $cache_key="extended_app_$app";
846                    $data = $cache->get($cache_key);
847                    $stime=microtime(true);
848                    if ($data != false){
849                        $stats['apps']=$data;
850                    }else{
851                        $result=$this->dbconn->query($sql);
852                        if ($result){
853                         $this->times+=microtime(true)-$stime;
854                         $tmp=[];
855                         while($row=$result->fetch_array(MYSQLI_ASSOC)){
856                             $date=$row['year'].'_'.$row['month'];
857                             $tmp[$row['string']][$date][$row['rel']][$row['fla']]=intval($row['count']);
858                         }
859                    foreach ($tmp as $app_string => $values){
860                   
861                        $app_use=[];
862                        foreach($values as $date => $reldata){
863                            $app_use[]=$reldata;
864                        }
865                        $stats['apps'][]=array('app'=>$app_string, 'app_use'=> $app_use);
866                    }
867                       
868                        //    $cache->store($tmp2,$cache_key);
869                         
870                     }else{
871                         $app_use=$this->dbconn->error;
872                     }
873                 }
874             }
875         }
876         // FINALIZATION & WRITE STRUCTURE
877         if (isset($clients_month)){
878             $stats['clients']['clients_per_month']=$clients_month;
879         }
880         if (isset($machines_month)){
881            $stats['clients']['machines_per_month']=$machines_month;
882         }
883         if (isset($num_updates_month)){
884             $stats['clients']['freq_updates_per_month']=$num_updates_month;
885         }
886         if (isset($change_releases)){
887             $stats['clients']['change_releases']=$change_releases;
888         }
889         if (isset($change_flavour)){
890             $stats['clients']['change_flavours']=$change_flavour;
891         }
892         if (isset($clients_arch)){
893             $stats['clients']['architectures']=$clients_arch;
894         }
895        if (isset($clients_memnull)){
896             $stats['clients']['mem']['unkn']=$clients_memnull;
897         }
898         if (isset($clients_2G)){
899             $stats['clients']['mem']['2G']=$clients_2G;
900         }
901         if (isset($clients_4G)){
902             $stats['clients']['mem']['4G']=$clients_4G;
903         }
904         if (isset($clients_8G)){
905             $stats['clients']['mem']['8G']=$clients_8G;
906         }
907         if (isset($clients_cpunull)){
908             $stats['clients']['cpu']['unkn']=$clients_cpunull;
909         }
910         if (isset($clients_mono)){
911             $stats['clients']['cpu']['mono']=$clients_mono;
912         }
913         if (isset($clients_dualquad)){
914             $stats['clients']['cpu']['dualquad']=$clients_dualquad;
915         }
916         if (isset($clients_more)){
917             $stats['clients']['cpu']['more']=$clients_more;
918         }
919         if (isset($count_ltsp)){
920             $stats['clients']['count_ltsp']=$count_ltsp;
921         }
922         if (isset($count_mode)){
923             $stats['clients']['count_mode']=$count_mode;
924         }
925         $stats['debug_query_time']=strval(number_format($this->times,5));
926         if (file_exists($this->ka_file)){
927             $stats['debug_keep_alive']=date('Y-m-d H:i',file_get_contents($this->ka_file));
928         }
929         if (isset($this->swversion)){
930            $stats['debug_swversion']=$this->swversion;
931         }
932         return json_encode($stats);
933     }
934
935     function get_historic_data($typechart='',$param=NULL){
936         $this->load_alias();
937         $obj=[];
938         $this->times=0;
939         foreach ($this->info_distro['distros'] as $distro){
940             $dname=$distro['name'];
941             $dlike=$distro['like'];
942             $obj[$dname]=array();
943             foreach ($distro['sabor'] as $sabor){
944                 $sname=$sabor['name'];
945                 $slike=$sabor['like'];
946                 $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'current',$typechart,$param);
947                 if ($param == NULL){
948                     $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'old',$typechart);
949                     $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'very_old',$typechart);
950                }
951             }
952         }
953         $obj['debug_query_time']=strval(number_format($this->times,3));
954         if (array_key_exists('init_range',$this->dates)){
955            $obj['debug_init_range']=strval($this->dates['init_range']);
956         }
957         if (array_key_exists('end_range',$this->dates)){
958            $obj['debug_end_range']=strval($this->dates['end_range']);
959         }
960         if (file_exists($this->ka_file)){
961             $obj['debug_keep_alive']=date('Y-m-d H:i',file_get_contents($this->ka_file));
962         }
963         if (isset($this->swversion)){
964            $obj['debug_swversion']=$this->swversion;
965         }
966         return json_encode($obj);
967     }
968
969    function get_chart($version='',$sabor='',$type='current',$typechart='',$param=NULL){
970        if ($typechart == ''){
971            $cache_key="$version"."_"."$sabor"."_"."$type";
972            $limit = "limit 10";
973            $sql_limit=10;
974            $and = "";
975        }else{
976            $cache_key="$version"."_"."$sabor"."_"."$type"."_"."$typechart";
977            $limit = "";
978            $sql_limit=1000;
979            $and = "and string in ( select `name` from `PackagesWhitelist` where status = '1' )";
980        }
981        if ($version != ''){
982            $version = " and Releases_name = '$version' ";
983        }
984        if ($sabor != ''){
985            $sabor = " and Flavours_name = '$sabor' ";
986        }
987        $order=" order by count desc $limit ";
988        $group=" group by app ";
989
990        if ($param == NULL){
991            $where=$this->dates['date_'.$type]." $version $sabor ";
992            $where_clients=$this->dates['date_'.$type]." $version $sabor ";
993        }else{
994            $this->init_dates($param);
995            $cache_key.='_'.$this->dates['init_range'].'_'.$this->dates['end_range'];
996            $where=$this->dates['custom_range']." $version $sabor ";
997            $where_clients=$this->dates['custom_range']." $version $sabor ";
998        }
999
1000        $sql="SELECT string as app,sum(count) as count from RecvPackages where $where $and $group $order";
1001        $sql_clients = "select count(distinct Client_uid) as count from Client_Versions where $where_clients $order";
1002        $cache = new Cache;
1003        $data = $cache->get($cache_key);
1004        if ($data != false){
1005            return $data;
1006        }else{
1007            $data=array($this->get_result_from_sql($sql,$sql_limit),$this->get_clients_from_sql($sql_clients));
1008            $cache->store($data,$cache_key);
1009            return $data;
1010        }
1011     }
1012     function get_clients_from_sql($sql){
1013             $stime=microtime(true);
1014         if ($result=$this->dbconn->query($sql)){
1015                 $etime=microtime(true);
1016                 $this->times+=($etime-$stime);
1017             while($row=$result->fetch_array(MYSQLI_ASSOC)){
1018                 if (isset($row['count'])){
1019                     return array('nclients'=>$row['count']);
1020                 }
1021             }
1022             return array('nclients'=>'not available');
1023         }else{
1024             return array('nclients'=>$this->dbconn->error);
1025         }
1026
1027     }
1028     function get_result_from_sql($sql,$limit){
1029             $stime=microtime(true);
1030         if ($result=$this->dbconn->query($sql)){
1031                 $etime=microtime(true);
1032                 $this->times+=($etime-$stime);
1033             $obj2=[];
1034             $nobj=0;
1035             while($row=$result->fetch_array(MYSQLI_ASSOC)){
1036                 if (array_key_exists($row['app'],$this->alias)){
1037                     if (! empty($this->alias[$row['app']])){
1038                         if ($nobj < $limit)
1039                             $obj2[$this->alias[$row['app']]]=$row['count'];
1040                         $nobj++;
1041                     }
1042                 }else{
1043                     if ($nobj < $limit)
1044                         $obj2[$row['app']]=$row['count'];
1045                     $nobj++;
1046                 }
1047             }
1048             return $obj2;
1049         }else{
1050             return $this->dbconn->error;
1051         }
1052     }
1053     function purge_whitelist($data){
1054        $purged = array();
1055        if (count($data) == 0){
1056            return $purged;
1057        }
1058        $mode = NULL;
1059        if (array_key_exists('string',$data[0])){
1060            $mode = 'string';
1061
1062        }
1063        if (array_key_exists('name',$data[0])){
1064            $mode = 'name';
1065        }
1066        if ($mode == NULL){
1067            return $purged;
1068        }
1069        foreach ($data as $item){
1070            $i = strtolower($item[$mode]);
1071            if (preg_match('/^[a-z0-9][a-z0-9_.+\-]+$/',$i)){
1072                if (preg_match('/[.](png|zip|jpg|php|txt|desktop|sql|sb2|ts|bz2|docbook|mo|iso|json|swf|xcf|md|egg-info|skm|js|html|bmp|svg|install|zero|dll|so|app|exe|gif|doc|cpp|h|css|java|xsl|xml|ui|ko|notebook|ogg|mp3|mp4|avi|mpg|c|pdf|o|ps|a|gz|bz|ini)$/',$i)){
1073                    $i = NULL;
1074                }else{
1075                    if (preg_match('/^(smart_|xvf|drivelist|geany_run)/',$i)){
1076                        $i = NULL;
1077                    }
1078                }
1079            }else{
1080                $i = NULL;
1081            }
1082            if ($i != NULL){
1083                if ($mode == 'string'){
1084                    $purged[]=array($mode=>$i);
1085                }else{
1086                    $purged[]=array($mode=>$i,'status'=>$item['status']);
1087                }
1088            }
1089        }
1090        return $purged;
1091     }
1092    function get_whitelist_form(){
1093        $cache = new Cache();
1094        $cache_key = 'whitelist';
1095        $data = $cache->get($cache_key);
1096        if ($data != false){
1097            return $data;
1098        }
1099        $sql = "select distinct `string` from `RecvPackages` order by `string` asc";
1100        $sql2 = "select `name`,`status` from `PackagesWhitelist`";
1101        $result=$this->dbconn->query($sql);
1102        $all_items=array();
1103        if ($result){
1104            while($row=$result->fetch_array(MYSQLI_ASSOC)){
1105                $all_items[]=$row;
1106            }
1107            if (count($all_items) > 10000){
1108                $all_items = $this->purge_whitelist($all_items);
1109            }
1110        }
1111        $whitelist=array();
1112        $result = $this->dbconn->query($sql2);
1113        if ($result){
1114            while($row=$result->fetch_array(MYSQLI_ASSOC)){
1115                $whitelist[] = $row;
1116            }
1117            if (count($whitelist) > 10000){
1118                $whitelist = $this->purge_whitelist($whitelist);
1119            }
1120        }
1121        if (count($all_items) == 0){
1122            return false;
1123        }
1124        $classify = ['in'=> array(), 'out'=>array(), 'unk' => array()];
1125        $clasified = array();
1126        foreach ($whitelist as $tmp){
1127            if ($tmp['status'] == '0'){
1128                $classify['out'][]=$tmp['name'];
1129                $clasified[] = $tmp['name'];
1130            }else if($tmp['status'] == '1'){
1131                $classify['in'][]=$tmp['name'];
1132                $clasified[] = $tmp['name'];
1133            }
1134        }
1135        foreach ($all_items as $tmp){
1136            if (! in_array($tmp['string'],$clasified)){
1137                $classify['unk'][] = $tmp['string']; 
1138            }
1139        }
1140        $cache->store($classify,$cache_key);
1141        return $classify;
1142    }
1143} 
1144
1145?>
Note: See TracBrowser for help on using the repository browser.