#!/usr/bin/php . */ define('N',"\n"); $opts=array( 'setold'=>false, 'setblack'=>false, 'shuffle'=>false, 'updstats'=>false, 'optimize'=>false, 'deadline'=>60*24*60*60,// se un'istanza non risponde da 60 giorni dichiararla morta 'newline'=>30*24*60*60,// se un'istanza è nuova, dopo 30 giorni non lo è più ); $help='mustool.php DESCRIZIONE mustool.php fa tante cose sul database delle istanze di Mastodon Help. SINOSSI mustool.php [opzioni] AZIONI setold setta New=0 per le istanze che non sono più nuove. setblack Setta Blacklisted=1 per le istanze presenti nella blacklist, Blacklisted=0 per quelle che non lo sono. shuffle Randomizza la lista delle istanze (i valori della colonna RPos). updstats Aggiorna le statistiche sul sito. optimize Ottimizza le tabelle del database. OPZIONI -h, --help Mostra questo aiuto ed esce. This program comes with ABSOLUTELY NO WARRANTY; for details see the source. This is free software, and you are welcome to redistribute it under certain conditions; see for details.'.N; $dosome=false; for ($i=1; $i<$argc; $i++) { if (substr($argv[$i],0,1)=='-') { switch($argv[$i]) { case '-h': case '--help': mexit($help,0); break; default: mexit('L’opzione «'.$argv[$i].'» è sconosciuta (usa «-h» per vedere la guida).'.N,1); break; } } elseif ($argv[$i]=='setold') { $dosome=true; $opts['setold']=true; } elseif ($argv[$i]=='setblack') { $dosome=true; $opts['setblack']=true; } elseif ($argv[$i]=='shuffle') { $dosome=true; $opts['shuffle']=true; } elseif ($argv[$i]=='updstats') { $dosome=true; $opts['updstats']=true; } elseif ($argv[$i]=='optimize') { $dosome=true; $opts['optimize']=true; } else { mexit('«'.$argv[$i].'» non è un’azione conosciuta (usa «-h» per vedere la guida).'.N,1); } } if (!$dosome) mexit('Nessuna azione specificata (usa «-h» per vedere la guida).'.N,1); use function mysqli_real_escape_string as myesc; function mexit($msg,$code) { global $link; echo($msg); if ($link) mysqli_close($link); exit($code); } $inifp=__DIR__.'/../conf/mustard.ini'; $iniarr=@parse_ini_file($inifp) or mexit('Impossibile aprire il file di configurazione «'.$inifp.'»'.N,1); $link=@mysqli_connect($iniarr['db_host'],$iniarr['db_admin_name'],$iniarr['db_admin_password'],$iniarr['db_name'],$iniarr['db_port'],$iniarr['db_socket']) or mexit('Impossibile connettersi al server MySQL: '.mysqli_connect_error().N,1); mysqli_set_charset($link,'utf8mb4') or mexit(__LINE__.': '.mysqli_error($link).N,1); if ($opts['setold']) { echo('Setto New=0 per le istanze non più nuove ... '); mysqli_query($link,'UPDATE Instances SET New=0 WHERE '.time().'-FirstSeen > '.$opts['newline']) or mexit(__LINE__.': '.mysqli_error($link).N,2); echo('fatto! Righe coinvolte: '.mysqli_affected_rows($link).N); } if ($opts['setblack']) { echo('Setto Blacklisted=1 per le istanze blacklistate ... '); mysqli_query($link,'UPDATE Instances SET Blacklisted=1 WHERE URI IN (SELECT Domain FROM Blacklist)') or mexit(__LINE__.': '.mysqli_error($link).N,2); echo('fatto! Righe coinvolte: '.mysqli_affected_rows($link).N); echo('Setto Blacklisted=0 per le istanze non blacklistate ... '); mysqli_query($link,'UPDATE Instances SET Blacklisted=0 WHERE URI NOT IN (SELECT Domain FROM Blacklist)') or mexit(__LINE__.': '.mysqli_error($link).N,2); echo('fatto! Righe coinvolte: '.mysqli_affected_rows($link).N); } if ($opts['shuffle']) { echo('Randomizzo i valori della colonna RPos ... '); $res=mysqli_query($link,'SELECT ID FROM Instances') or mexit(__LINE__.': '.mysqli_error($link).N,2); $i=0; while ($row=mysqli_fetch_assoc($res)) { $i++; $buf[$row['ID']]=$i; } shuffle($buf); foreach ($buf as $key=>$val) mysqli_query($link,'UPDATE Instances SET RPos='.$val.' WHERE ID='.$key) or mexit(__LINE__.': '.mysqli_error($link).N,2); echo('fatto!'.N); } if ($opts['updstats']) { $day=24*60*60; $now=time(); $tdstart=gmmktime(0,0,0,gmdate('n',$now),gmdate('j',$now),gmdate('Y',$now)); //echo('Oggi è cominciato a '.$tdstart.' ('.gmdate('d M Y H:i:s',$tdstart).').'.N); // questo qui sotto, se abilitato con "0==0", popola DISTRUTTIVAMENTE per test la tabella ZHits if (1==0) { mysqli_query($link,'DELETE FROM ZHits WHERE TS < '.$tdstart); mysqli_query($link,'DELETE FROM ZStats'); $uids=array( 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', 'cccccccccccccccccccccccccccccccc', 'dddddddddddddddddddddddddddddddd', 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', 'ffffffffffffffffffffffffffffffff' ); $langs=array('ca','en','es','fr','it'); $urls=array('home','instances','about','stats','contribute','404'); for ($i=0; $i<1460; $i++) mysqli_query($link,'INSERT INTO ZHits (UID,URL,Lang,TS) VALUES ("'.$uids[rand(0,count($uids)-1)].'","'.$urls[rand(0,count($urls)-1)].'","'.$langs[rand(0,count($langs)-1)].'",'.rand($now-365*24*60*60,$tdstart).')'); } $res=mysqli_query($link,'SELECT * FROM ZHits WHERE TS < '.$tdstart.' ORDER BY TS ASC') or mexit(__LINE__.': '.mysqli_error($link).N,2); if (mysqli_num_rows($res)>0) { $row=mysqli_fetch_assoc($res); $dstart=gmmktime(0,0,0,gmdate('n',$row['TS']),gmdate('j',$row['TS']),gmdate('Y',$row['TS'])); echo('Aggiorno le statistiche ... '); } else { echo('Le statistiche sono già aggiornate :-)'.N); mysqli_close($link); exit(0); } $inserts=0; while ($dstart<$tdstart) { //echo('-------- '.gmdate('d M Y H:i:s',$dstart).' ---------'.N); $inserts++; // questo qui sotto dev'essere sincronizzato con le lingue supportate e le url che serviamo (vedi index.php) $hits=0; $hitslang=array('ca'=>0, 'en'=>0, 'es'=>0, 'fr'=>0, 'it'=>0); $hitspage=array('home'=>0, 'instances'=>0, 'about'=>0, 'stats'=>0, 'contribute'=>0, '404'=>0); $visits=0; $buf=array(); $res=mysqli_query($link,'SELECT * FROM ZHits WHERE TS >= '.$dstart.' AND TS < '.($dstart+$day).' ORDER BY TS ASC') or mexit(__LINE__.': '.mysqli_error($link).N,2); while ($row=mysqli_fetch_assoc($res)) { //echo($row['UID'].' '.$row['URL'].' '.$row['Lang'].' '.$row['TS'].N); $hits++; $hitslang[$row['Lang']]++; $hitspage[$row['URL']]++; if (!in_array($row['UID'],$buf)) { $buf[]=$row['UID']; $visits++; } } $buf=''; foreach ($hitslang as $key=>$val) $buf.=$key.':'.$val.';'; $hitslang=substr($buf,0,-1); $buf=''; foreach ($hitspage as $key=>$val) $buf.=$key.':'.$val.';'; $hitspage=substr($buf,0,-1); //echo('>>> hits: '.$hits.', hitslang: '.$hitslang.', hitspage: '.$hitspage.', visits: '.$visits.' <<<'.N); $query='INSERT INTO ZStats (TS, Hits, HitsLang, HitsPage, Visits) VALUES ('.$dstart.', '.$hits.', "'.$hitslang.'", "'.$hitspage.'", '.$visits.')'; //echo($query.N); mysqli_query($link,$query) or mexit(__LINE__.': '.mysqli_error($link).N,2); $dstart+=$day; } mysqli_query($link,'DELETE FROM ZHits WHERE TS < '.$tdstart) or mexit(__LINE__.': '.mysqli_error($link).N,2); echo('fatto! (righe inserite: '.$inserts.')'.N); } if ($opts['optimize']) { echo('Ottimizzo le tabelle del database...'.N); $res=mysqli_query($link,'SHOW TABLES') or mexit(__LINE__.': '.mysqli_error($link).N,2); while ($row=mysqli_fetch_row($res)) { $rres=mysqli_query($link,'OPTIMIZE TABLE '.$row[0]) or mexit(__LINE__.': '.mysqli_error($link).N,2); $rrow=mysqli_fetch_assoc($rres); if ($rrow['Msg_type']=='error' || $rrow['Msg_type']=='warning') fwrite(STDERR,kimplode($rrow).N); } echo('Fatto!'.N); } mysqli_close($link); exit(0); function kimplode(&$arr) { $buf=[]; foreach ($arr as $key=>$val) $buf[]=$key.': '.$val; return(implode('; ',$buf)); } ?>