MastodonHelp/web/clitools/mustool.php

229 lines
8.1 KiB
PHP
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/php
<?php
/*
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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] <azione[ azione...]>
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 <http://www.gnu.org/licenses/> 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('Lopzione «'.$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 è unazione 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));
}
?>