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, 12 months ago

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

File size: 51.7 KB
RevLine 
[350]1<?php
[6876]2$USE_CACHE = true;
[6767]3class Cache{
4    private $cache_file;
5    private $cache_dir;
6    private $data_file;
7    private $data;
[6933]8    private $cache_timeout=3600;
[6767]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){
[6876]64        global $USE_CACHE;
65        if (! $USE_CACHE){
66            return false;
67        }
[6767]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    }
[7869]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    }
[6767]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
[350]120class DB{
121
[6767]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;
[350]129
[6767]130     function DB(){
131         require_once('config.php');
[8233]132         global $dbhost,$dbname,$dbpass,$dbuser,$distros,$swversion;
[747]133
[6767]134         $this->dbhost=$dbhost;
135         $this->dbname=$dbname;
136         $this->dbpass=$dbpass;
137         $this->dbuser=$dbuser;
[8233]138         $this->swversion=$swversion;
[6767]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     }
[7820]147     function init_dates($range=NULL){
[6767]148         $this->dates=array();
149         $this->dates['today']=date("Y-m-d");
[7869]150         $this->dates['first_current']=date("Y-m-01");
[6767]151         $this->dates['last_old']=date("Y-m-d",strtotime($this->dates['first_current']." -1 days"));
[7869]152         $this->dates['first_old']=date("Y-m-01",strtotime($this->dates['last_old']));
[6767]153         $this->dates['last_very_old']=date("Y-m-d",strtotime($this->dates['first_old']." -1 days"));
[7869]154         $this->dates['first_very_old']=date("Y-m-01",strtotime($this->dates['last_very_old']));
[6767]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']."')";
[7820]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         }
[6767]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     }
[5560]186
[6819]187    function send_data($user,$version,$sabor,$apps,$specs,$date=''){
188        $spec_sql_names = '';
189        $spec_sql_values = '';
[7111]190
191        $ltsp_sql_names = '';
192        $ltsp_sql_values = '';
193
194        $use_data=array();
195        $use_name=array();
[6819]196        if ($specs != false){
[7111]197            if (array_key_exists('arch',$specs)){
[6819]198                $arch = $specs['arch'];
[7111]199                $use_data[]="'$arch'";
200                $use_name[]='arch';
201            }
202            if (array_key_exists('mem',$specs)){
[6819]203                $mem = $specs['mem'];
204                if (is_numeric($mem)){
205                    $mem=(int)$mem;
206                }
[7111]207                $use_data[]=$mem;
208                $use_name[]='mem';
209            }
210            if (array_key_exists('vga',$specs)){
[6850]211                $vga = substr($specs['vga'],0,80);
[7111]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'";
[6819]220                }
[7111]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{
[6819]236                $spec_sql_names = '';
237                $spec_sql_values = '';
238            }
[7111]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);
[7150]255                    if (strtolower($ltsp_mode) != 'null'){
256                        $use_name[]='mode';
257                        $use_data[]="'$ltsp_mode'";
258                    }
[7111]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            }
[6819]270        }
271        if ($date == ''){
[7111]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)";
[6819]273        }else{
[7111]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)";
[6819]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){
[5560]294            if ($date == ''){
[6819]295                $sql="insert into tmp_packages(client,app,value) values";
[5560]296            }else{
[6819]297                $sql="insert into tmp_packages(client,app,value,date) values";
[5560]298            }
[6819]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;
[5560]306                }else{
[6819]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;
[5560]314                }
315                if ($date == ''){
[6819]316                    $values[]="($cli_id,'$app',$value)";
[5560]317                }else{
[6819]318                    $values[]="($cli_id,'$app',$value,'$date')";
[5560]319                }
[6819]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;
[5560]329                    }else{
[6819]330                        $retry += 1;
331                        sleep($retry);
[5560]332                    }
333                }
[6819]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);
[5560]337                }
338            }
[6819]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);
[5560]351            }
352        }
[6819]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    }
[5560]360
[6767]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=[];
[6933]373                while ($row=$result->fetch_array(MYSQLI_ASSOC)){
374                    $tmp[$row['name']]=$row['value'];
[6767]375                }
376                return json_encode($tmp);
377            }
378        }
[7577]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    }
[7204]396    function get_extended_data($app){
[8233]397        global $swversion;
398
[7204]399        $this->times=0;
[7577]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();
[7613]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));";
[7577]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';
[7204]538        $data = $cache->get($cache_key);
539        $stime=microtime(true);
540        if ($data != false){
541            $clients_month=$data;
542        }else{
[7577]543            if (!$updated_nhosts){
544                $this->execute_sql_array($sql_nhosts);
545            }
[7204]546            $result=$this->dbconn->query($sql);
547            if ($result){
548                $this->times+=microtime(true)-$stime;
549                $clients_month=[];
[7577]550                $tmp=[];
[7204]551                while($row=$result->fetch_array(MYSQLI_ASSOC)){
[7577]552                    $date=$row['year'].'_'.$row['month'];
553                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['total_hosts']);
[7204]554                }
[7577]555                foreach($tmp as $date_value){
556                        $clients_month[]=$date_value;
557                }
[7204]558                $cache->store($clients_month,$cache_key);
[6767]559            }else{
[7204]560                $clients_month=$this->dbconn->error;
[6767]561            }
[7204]562        }
[7577]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';
[7204]566        $data = $cache->get($cache_key);
567        $stime=microtime(true);
568        if ($data != false){
[7577]569            $clients_arch=$data;
[7204]570        }else{
[7577]571            $this->execute_sql_array($sql_targets,'arch');
572            $result=$this->dbconn->query($sql_arch);
[7204]573            if ($result){
574                $this->times+=microtime(true)-$stime;
[7577]575                $clients_arch=[];
576                $tmp=[];
[7204]577                while($row=$result->fetch_array(MYSQLI_ASSOC)){
[8107]578                        $date=$row['year'].'_'.$row['month'];
[7577]579                        $tmp[$date][$row['rel']][$row['fla']][strtolower($row['arch'])]=intval($row['total']);
[7204]580                }
[7577]581                foreach($tmp as $d){
582                        $clients_arch[]=$d;
583                }
584                $cache->store($clients_arch,$cache_key);
[7204]585            }else{
[7577]586                $clients_arch=$this->dbconn->error;
[7204]587            }
[7577]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';
[6884]592        $data = $cache->get($cache_key);
593        $stime=microtime(true);
594        if ($data != false){
[7577]595            $clients_memnull=$data;
[6884]596        }else{
[7577]597            $this->execute_sql_array($sql_targets,'memnull');
598            $result=$this->dbconn->query($sql_memnull);
[6884]599            if ($result){
600                $this->times+=microtime(true)-$stime;
[7577]601                $clients_memnull=[];
602                $tmp=[];
[6884]603                while($row=$result->fetch_array(MYSQLI_ASSOC)){
[8107]604                    $date=$row['year'].'_'.$row['month'];
[7577]605                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['total']);
[6884]606                }
[7577]607                foreach($tmp as $d){
608                        $clients_memnull[]=$d;
609                }
610                $cache->store($clients_memnull,$cache_key);
[6884]611            }else{
[7577]612                $clients_memnull=$this->dbconn->error;
[6884]613            }
614        }
[7577]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";
[6884]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{
[7577]622            $this->execute_sql_array($sql_targets,'mem2G');
623            $result=$this->dbconn->query($sql_mem2G);
[6884]624            if ($result){
625                $this->times+=microtime(true)-$stime;
626                $clients_2G=[];
[7577]627                $tmp=[];
[6884]628                while($row=$result->fetch_array(MYSQLI_ASSOC)){
[8107]629                    $date=$row['year'].'_'.$row['month'];
[7180]630                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['total']);
[6884]631                }
[7577]632                foreach($tmp as $d){
633                        $clients_2G[]=$d;
634                }
[6884]635                $cache->store($clients_2G,$cache_key);
636            }else{
637                $clients_2G=$this->dbconn->error;
638            }
639        }
[7577]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";
[6884]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{
[7577]647            $this->execute_sql_array($sql_targets,'mem4G');
648            $result=$this->dbconn->query($sql_mem4G);
[6884]649            if ($result){
650                $this->times+=microtime(true)-$stime;
651                $clients_4G=[];
[7577]652                $tmp=[];
[6884]653                while($row=$result->fetch_array(MYSQLI_ASSOC)){
[8107]654                    $date=$row['year'].'_'.$row['month'];
[7180]655                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['total']);
[6884]656                }
[7577]657                foreach($tmp as $d){
658                        $clients_4G[]=$d;
659                }
[6884]660                $cache->store($clients_4G,$cache_key);
661            }else{
662                $clients_4G=$this->dbconn->error;
663            }
664        }
[7577]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";
[6884]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{
[7577]672            $this->execute_sql_array($sql_targets,'mem8G');
673            $result=$this->dbconn->query($sql_mem8G);
[6884]674            if ($result){
675                $this->times+=microtime(true)-$stime;
676                $clients_8G=[];
[7577]677                $tmp=[];
[6884]678                while($row=$result->fetch_array(MYSQLI_ASSOC)){
[8107]679                    $date=$row['year'].'_'.$row['month'];
[7180]680                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['total']);
[6884]681                }
[7577]682                foreach($tmp as $d){
683                        $clients_8G[]=$d;
684                }
[6884]685                $cache->store($clients_8G,$cache_key);
686            }else{
687                $clients_8G=$this->dbconn->error;
688            }
689        }
690        // cpu
[7577]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)){
[8107]705                    $date=$row['year'].'_'.$row['month'];
[7577]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";
[6884]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{
[7577]723            $this->execute_sql_array($sql_targets,'cpu_mono');
724            $result=$this->dbconn->query($sql_cpu_mono);
[6884]725            if ($result){
726                $this->times+=microtime(true)-$stime;
727                $clients_mono=[];
[7577]728                $tmp=[];
[6884]729                while($row=$result->fetch_array(MYSQLI_ASSOC)){
[8107]730                    $date=$row['year'].'_'.$row['month'];
[7180]731                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['total']);
[6884]732                }
[7577]733                foreach($tmp as $d){
734                        $clients_mono[]=$d;
735                }
[6884]736                $cache->store($clients_mono,$cache_key);
737            }else{
738                $clients_mono=$this->dbconn->error;
739            }
740        }
[7577]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";
[6884]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{
[7577]748            $this->execute_sql_array($sql_targets,'cpu_dual');
749            $result=$this->dbconn->query($sql_cpu_dual);
[6884]750            if ($result){
751                $this->times+=microtime(true)-$stime;
752                $clients_dualquad=[];
[7577]753                $tmp=[];
[6884]754                while($row=$result->fetch_array(MYSQLI_ASSOC)){
[8107]755                    $date=$row['year'].'_'.$row['month'];
[7180]756                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['total']);
[6884]757                }
[7577]758                foreach($tmp as $d){
759                        $clients_dualquad[]=$d;
760                }
[6884]761                $cache->store($clients_dualquad,$cache_key);
762            }else{
763                $clients_dualquad=$this->dbconn->error;
764            }
765        }
[7577]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";
[6884]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{
[7577]773            $this->execute_sql_array($sql_targets,'cpu_more');
774            $result=$this->dbconn->query($sql_cpu_other);
[6884]775            if ($result){
776                $this->times+=microtime(true)-$stime;
777                $clients_more=[];
[7577]778                $tmp=[];
[6884]779                while($row=$result->fetch_array(MYSQLI_ASSOC)){
[8107]780                    $date=$row['year'].'_'.$row['month'];
[7180]781                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['total']);
[6884]782                }
[7577]783                foreach($tmp as $d){
784                        $clients_more[]=$d;
785                }
[6884]786                $cache->store($clients_more,$cache_key);
787            }else{
788                $clients_more=$this->dbconn->error;
789            }
790        }
[4854]791
[7577]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){
[7111]799            $count_ltsp=$data;
[7577]800        }else{
801            $this->execute_sql_array($sql_targets,'ltsp_type');
802            $result=$this->dbconn->query($sql_ltsp_types);
[7111]803            if ($result){
804                $this->times+=microtime(true)-$stime;
805                while($row=$result->fetch_array(MYSQLI_ASSOC)){
[7150]806                    if (isset($row['type']) and $row['type'] != NULL){
[7577]807                        $count_ltsp[]=array(strtolower($row['type']),$row['total']);
[7111]808                    }
809                }
810                $cache->store($count_ltsp,$cache_key);
811            }else{
812                $count_ltsp=$this->dbconn->error;
813            }
[7577]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){
[7111]821            $count_mode=$data;
[7577]822        }else{
823            $this->execute_sql_array($sql_targets,'ltsp_mode');
824            $result=$this->dbconn->query($sql_ltsp_modes);
[7111]825            if ($result){
826                $this->times+=microtime(true)-$stime;
827                while($row=$result->fetch_array(MYSQLI_ASSOC)){
[7150]828                    if (isset($row['mode']) and $row['mode'] != NULL){
829                        $count_mode[]=array(strtolower($row['mode']),$row['total']);
[7111]830                    }
831                }
832                $cache->store($count_mode,$cache_key);
833            }else{
834                $count_mode=$this->dbconn->error;
835            }
[7577]836        }
[7111]837
[6767]838         //sanitize input
[7577]839        if ($app != NULL){
[6767]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']=[];
[7577]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";
[6767]845                    $cache_key="extended_app_$app";
846                    $data = $cache->get($cache_key);
847                    $stime=microtime(true);
848                    if ($data != false){
[7577]849                        $stats['apps']=$data;
[6767]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'];
[7577]857                             $tmp[$row['string']][$date][$row['rel']][$row['fla']]=intval($row['count']);
[6767]858                         }
[7577]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                         
[6767]870                     }else{
871                         $app_use=$this->dbconn->error;
872                     }
[7577]873                 }
[6767]874             }
875         }
876         // FINALIZATION & WRITE STRUCTURE
877         if (isset($clients_month)){
878             $stats['clients']['clients_per_month']=$clients_month;
879         }
[7204]880         if (isset($machines_month)){
881            $stats['clients']['machines_per_month']=$machines_month;
882         }
[6767]883         if (isset($num_updates_month)){
884             $stats['clients']['freq_updates_per_month']=$num_updates_month;
885         }
[7577]886         if (isset($change_releases)){
[6767]887             $stats['clients']['change_releases']=$change_releases;
888         }
889         if (isset($change_flavour)){
890             $stats['clients']['change_flavours']=$change_flavour;
[7577]891         }
[6884]892         if (isset($clients_arch)){
893             $stats['clients']['architectures']=$clients_arch;
894         }
[7577]895        if (isset($clients_memnull)){
896             $stats['clients']['mem']['unkn']=$clients_memnull;
897         }
[6884]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         }
[7577]907         if (isset($clients_cpunull)){
908             $stats['clients']['cpu']['unkn']=$clients_cpunull;
909         }
[6884]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         }
[7111]919         if (isset($count_ltsp)){
[7150]920             $stats['clients']['count_ltsp']=$count_ltsp;
[7111]921         }
[7156]922         if (isset($count_mode)){
[7150]923             $stats['clients']['count_mode']=$count_mode;
[7111]924         }
[6767]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         }
[8233]929         if (isset($this->swversion)){
930            $stats['debug_swversion']=$this->swversion;
931         }
[6767]932         return json_encode($stats);
933     }
934
[7820]935     function get_historic_data($typechart='',$param=NULL){
[6767]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'];
[7820]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                }
[6767]951             }
952         }
953         $obj['debug_query_time']=strval(number_format($this->times,3));
[7820]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         }
[6767]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         }
[8233]963         if (isset($this->swversion)){
964            $obj['debug_swversion']=$this->swversion;
965         }
[6767]966         return json_encode($obj);
967     }
[7820]968
969    function get_chart($version='',$sabor='',$type='current',$typechart='',$param=NULL){
[6876]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        }
[6767]981        if ($version != ''){
982            $version = " and Releases_name = '$version' ";
983        }
984        if ($sabor != ''){
985            $sabor = " and Flavours_name = '$sabor' ";
986        }
[6876]987        $order=" order by count desc $limit ";
[6767]988        $group=" group by app ";
989
[7820]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        }
[6767]999
[6876]1000        $sql="SELECT string as app,sum(count) as count from RecvPackages where $where $and $group $order";
[6767]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{
[6876]1007            $data=array($this->get_result_from_sql($sql,$sql_limit),$this->get_clients_from_sql($sql_clients));
[6767]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     }
[6876]1028     function get_result_from_sql($sql,$limit){
[6767]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']])){
[6876]1038                         if ($nobj < $limit)
[6767]1039                             $obj2[$this->alias[$row['app']]]=$row['count'];
1040                         $nobj++;
1041                     }
1042                 }else{
[6876]1043                     if ($nobj < $limit)
[6767]1044                         $obj2[$row['app']]=$row['count'];
1045                     $nobj++;
1046                 }
1047             }
1048             return $obj2;
1049         }else{
1050             return $this->dbconn->error;
1051         }
1052     }
[7869]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     }
[6868]1092    function get_whitelist_form(){
[7869]1093        $cache = new Cache();
1094        $cache_key = 'whitelist';
1095        $data = $cache->get($cache_key);
1096        if ($data != false){
1097            return $data;
1098        }
[6876]1099        $sql = "select distinct `string` from `RecvPackages` order by `string` asc";
[6868]1100        $sql2 = "select `name`,`status` from `PackagesWhitelist`";
1101        $result=$this->dbconn->query($sql);
[6933]1102        $all_items=array();
[6868]1103        if ($result){
[6933]1104            while($row=$result->fetch_array(MYSQLI_ASSOC)){
1105                $all_items[]=$row;
1106            }
[7869]1107            if (count($all_items) > 10000){
1108                $all_items = $this->purge_whitelist($all_items);
1109            }
[6868]1110        }
[6933]1111        $whitelist=array();
[6868]1112        $result = $this->dbconn->query($sql2);
1113        if ($result){
[6933]1114            while($row=$result->fetch_array(MYSQLI_ASSOC)){
1115                $whitelist[] = $row;
1116            }
[7869]1117            if (count($whitelist) > 10000){
1118                $whitelist = $this->purge_whitelist($whitelist);
1119            }
[6868]1120        }
[6933]1121        if (count($all_items) == 0){
[6868]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        }
[7869]1140        $cache->store($classify,$cache_key);
[6868]1141        return $classify;
1142    }
[350]1143} 
1144
1145?>
Note: See TracBrowser for help on using the repository browser.