Ignore:
Timestamp:
Feb 14, 2018, 6:21:53 PM (19 months ago)
Author:
mabarracus
Message:

Fix test suite
Consolidation daemon ported to python3
Avoid daemon running with multiple instances
Fixes indent,sizes in fonts and graphics
System stats visualization page
Minimized javascript files
New cache for visualization graphs minimizing overloading and DoS attacks
Improved scheduler with clients sending 10+ results
Support to provide blacklist
Support to platform data

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lliurex-analytics-server/trunk/fuentes/lliurex-analytics-server/usr/lib/analytics-server/analytics/db.php

    r6767 r6819  
    144144     }
    145145
    146         function send_data($user,$version,$sabor,$apps,$date=''){
     146    function send_data($user,$version,$sabor,$apps,$specs,$date=''){
     147        $spec_sql_names = '';
     148        $spec_sql_values = '';
     149        if ($specs != false){
     150            try{
     151                $arch = $specs['arch'];
     152                $mem = $specs['mem'];
     153                if (is_numeric($mem)){
     154                    $mem=(int)$mem;
     155                }
     156                $vga = $specs['vga'];
     157                $cpu = $specs['cpu']['model'];
     158                $ncpu = $specs['cpu']['ncpus'];
     159                if (is_numeric($ncpu)){
     160                    $ncpu=(int)$ncpu;
     161                }
     162                $spec_sql_names = ',arch,mem,vga,cpu,ncpu';
     163                $spec_sql_values = ",'$arch',$mem,'$vga','$cpu',$ncpu";
     164            }catch(Exception $e){
     165                $spec_sql_names = '';
     166                $spec_sql_values = '';
     167            }
     168        }
     169        if ($date == ''){
     170            $sql="INSERT INTO tmp_clients(user,version,sabor,status $spec_sql_names) values ('$user','$version','$sabor',0 $spec_sql_values)";
     171        }else{
     172            $sql="INSERT INTO tmp_clients(user,version,sabor,status,date $spec_sql_names) values ('$user','$version','$sabor',0,'$date' $spec_sql_values)";
     173        }
     174        $retry=1;
     175        $done=false;
     176        $cli_id=false;
     177        while (! $done and $retry < 4){
     178            $res=$this->dbconn->query($sql);
     179            if ($res){
     180                $cli_id=$this->dbconn->insert_id;
     181                $done=true;
     182            }else{
     183                $retry+=1;
     184                sleep($retry);
     185            }
     186        }
     187        if ($retry == 4 or $cli_id == false)
     188            throw new Exception('Error sending client data: '.$this->dbconn->error);
     189
     190        $err_apps=false;
     191        $err_exception=false;
     192        if (count($apps) != 0){
    147193            if ($date == ''){
    148                 $sql="INSERT INTO tmp_clients(user,version,sabor,status) values ('$user','$version','$sabor',0)";
    149             }else{
    150                 $sql="INSERT INTO tmp_clients(user,version,sabor,status,date) values ('$user','$version','$sabor',0,'$date')";
    151             }
    152             $retry=1;
    153             $done=false;
    154             $cli_id=false;
    155             while (! $done and $retry < 4){
    156                 $res=$this->dbconn->query($sql);
    157                 if ($res){
    158                     $cli_id=$this->dbconn->insert_id;
    159                     $done=true;
     194                $sql="insert into tmp_packages(client,app,value) values";
     195            }else{
     196                $sql="insert into tmp_packages(client,app,value,date) values";
     197            }
     198            $values=array();
     199            // Prevent DoS attack
     200            $i = 1000;
     201            foreach ($apps as $app => $value){
     202                // Max 1000 apps
     203                if ( $i > 0 ){
     204                    $i = $i - 1;
    160205                }else{
    161                     $retry+=1;
    162                     sleep($retry);
    163                 }
    164             }
    165             if ($retry == 4 or $cli_id == false)
    166                     throw new Exception('Error sending client data: '.$this->dbconn->error);
    167             $err_apps=false;
    168             $err_exception=false;
    169             if (count($apps) != 0){
     206                    throw new Exception('*** DoS detected, aborting more processing on this request ***');
     207                }
     208
     209                if (trim($app) == '' or trim($value) == ''){
     210                    $err_apps=true;
     211                    $err_exception=new Exception('Wrong application values');
     212                    continue;
     213                }
    170214                if ($date == ''){
    171                     $sql="insert into tmp_packages(client,app,value) values";
     215                    $values[]="($cli_id,'$app',$value)";
    172216                }else{
    173                     $sql="insert into tmp_packages(client,app,value,date) values";
    174                 }
    175                 $values=array();
    176                 foreach ($apps as $app => $value){
    177                     if (trim($app) == '' or trim($value) == ''){
    178                         $err_apps=true;
    179                         $err_exception=new Exception('Wrong application values');
    180                         continue;
     217                    $values[]="($cli_id,'$app',$value,'$date')";
     218                }
     219            }
     220            if (count($values) > 0){
     221                $sql.=implode(',',$values);
     222                $done=false;
     223                $retry=1;
     224                while (! $done and $retry < 4){
     225                    $res=$this->dbconn->query($sql);
     226                    if ($res){
     227                        $done=true;
     228                    }else{
     229                        $retry += 1;
     230                        sleep($retry);
    181231                    }
    182                     if ($date == ''){
    183                         $values[]="($cli_id,'$app',$value)";
    184                     }else{
    185                         $values[]="($cli_id,'$app',$value,'$date')";
    186                     }
    187                 }
    188                 if (count($values) > 0){
    189                     $sql.=implode(',',$values);
    190                     $done=false;
    191                     $retry=1;
    192                     while (! $done and $retry < 4){
    193                         $res=$this->dbconn->query($sql);
    194                         if ($res){
    195                             $done=true;
    196                         }else{
    197                             $retry += 1;
    198                             sleep($retry);
    199                         }
    200                     }
    201                     if ($retry == 4 or ! $done){
    202                         $err_apps=true;
    203                         $err_exception=new Exception('Error sending client app data: '.$this->dbconn->error.' QUERY='.$sql);
    204                     }
    205                 }
    206             }
    207             //End operations
    208             $sql = "Update tmp_clients set status=1 where id = $cli_id and status=0";
    209             $retry=1;
    210             $done=false;
    211             while (! $done and $retry < 4){
    212                 $res=$this->dbconn->query($sql);
    213                 if ($res){
    214                     $done=true;
    215                 }else{
    216                     $retry+=1;
    217                     sleep($retry);
    218                 }
    219             }
    220             if ($retry == 4 or $cli_id == false){
    221                 throw new Exception('Error commiting client data: '.$this->dbconn->error);
    222             }
    223             if ($err_apps){
    224                 throw $err_exception;
    225             }
    226         }
     232                }
     233                if ($retry == 4 or ! $done){
     234                    $err_apps=true;
     235                    $err_exception=new Exception('Error sending client app data: '.$this->dbconn->error.' QUERY='.$sql);
     236                }
     237            }
     238        }
     239        //End operations
     240        $sql = "Update tmp_clients set status=1 where id = $cli_id and status=0";
     241        $retry=1;
     242        $done=false;
     243        while (! $done and $retry < 4){
     244            $res=$this->dbconn->query($sql);
     245            if ($res){
     246                $done=true;
     247            }else{
     248                $retry+=1;
     249                sleep($retry);
     250            }
     251        }
     252        if ($retry == 4 or $cli_id == false){
     253            throw new Exception('Error commiting client data: '.$this->dbconn->error);
     254        }
     255        if ($err_apps){
     256            throw $err_exception;
     257        }
     258    }
    227259
    228260     private function load_alias(){
Note: See TracChangeset for help on using the changeset viewer.