MastodonHelp/web/clitools/mustool.php

223 lines
7.8 KiB
PHP
Raw Normal View History

2020-10-13 08:21:26 +02:00
#!/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/>.
*/
const N="\n";
2020-10-13 08:21:26 +02:00
$opts=array(
2020-10-20 22:06:00 +02:00
'shuffle'=>false,
2020-10-26 16:05:59 +01:00
'updstats'=>false,
// Warning reminder: don't "clean" InstChecks table because its data is necessary to determine if an instance is dead
2022-11-29 08:54:41 +01:00
'clean'=>false,
'clean_before_weeks'=>24,
'optimize'=>false,
2020-10-13 08:21:26 +02:00
);
$help='mustool.php
DESCRIZIONE
mustool.php fa tante cose sul database delle istanze di Mastodon Help.
SINOSSI
mustool.php [opzioni] <azione[ azione...]>
AZIONI
2020-10-20 22:06:00 +02:00
shuffle
2020-10-26 16:05:59 +01:00
Randomizza la lista delle istanze (i valori della colonna RPos).
updstats
Aggiorna le statistiche sul sito.
2022-11-29 08:54:41 +01:00
clean
2022-11-29 09:05:57 +01:00
Cancella i record più vecchi di '.$opts['clean_before_weeks'].' settimane
dalla tabella Notifications.
optimize
Ottimizza le tabelle del database.
2020-10-13 08:21:26 +02:00
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;
}
2020-10-20 22:06:00 +02:00
} elseif ($argv[$i]=='shuffle') {
$dosome=true;
$opts['shuffle']=true;
2020-10-26 16:05:59 +01:00
} elseif ($argv[$i]=='updstats') {
$dosome=true;
$opts['updstats']=true;
2022-11-29 08:54:41 +01:00
} elseif ($argv[$i]=='clean') {
$dosome=true;
$opts['clean']=true;
} elseif ($argv[$i]=='optimize') {
$dosome=true;
$opts['optimize']=true;
2020-10-13 08:21:26 +02:00
} 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);
}
2020-10-18 06:53:27 +02:00
$inifp=__DIR__.'/../conf/mustard.ini';
2020-10-13 08:21:26 +02:00
$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']) {
2020-10-13 08:21:26 +02:00
echo('Setto New=0 per le istanze non più nuove ... ');
2022-11-29 08:54:41 +01:00
mysqli_query($link,'UPDATE Instances SET New=0 WHERE '.time().'-FirstSeen > '.$opts['setold_new_period']) or mexit(__LINE__.': '.mysqli_error($link).N,2);
2020-10-13 08:21:26 +02:00
echo('fatto! Righe coinvolte: '.mysqli_affected_rows($link).N);
}*/
2020-10-13 08:21:26 +02:00
2020-10-20 22:06:00 +02:00
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);
}
2020-10-26 16:05:59 +01:00
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
2020-11-01 09:05:03 +01:00
if (1==0) {
2020-10-26 16:05:59 +01:00
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','gl','it','uk');
2020-10-31 07:21:59 +01:00
$urls=array('home','instances','about','stats','contribute','404');
2020-10-26 16:05:59 +01:00
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)
2020-10-31 06:57:34 +01:00
$hits=0;
$hitslang=array('ca'=>0, 'en'=>0, 'es'=>0, 'fr'=>0, 'gl'=>0, 'it'=>0, 'uk'=>0);
2020-10-31 07:21:59 +01:00
$hitspage=array('home'=>0, 'instances'=>0, 'about'=>0, 'stats'=>0, 'contribute'=>0, '404'=>0);
2020-10-26 16:05:59 +01:00
$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);
2020-10-31 06:57:34 +01:00
$hits++;
$hitslang[$row['Lang']]++;
$hitspage[$row['URL']]++;
2020-10-26 16:05:59 +01:00
if (!in_array($row['UID'],$buf)) {
$buf[]=$row['UID'];
$visits++;
}
}
2020-10-31 06:57:34 +01:00
$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);
2020-10-26 16:05:59 +01:00
$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);
}
2022-11-29 08:54:41 +01:00
if ($opts['clean']) {
$affrows=0;
$ago=time()-($opts['clean_before_weeks']*7*24*60*60);
echo('Cancello i record più vecchi di '.$opts['clean_before_weeks'].' settimane dalla tabella Notifications...'.N);
$res=mysqli_query($link,'DELETE FROM Notifications WHERE Microtime < '.$ago) or mexit(__LINE__.': '.mysqli_error($link).N,2);
echo('Fatto! Righe cancellate: '.mysqli_affected_rows($link).'.'.N);
2022-11-29 08:54:41 +01:00
}
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);
}
2020-10-13 08:21:26 +02:00
mysqli_close($link);
exit(0);
function kimplode(&$arr) {
$buf=[];
foreach ($arr as $key=>$val)
$buf[]=$key.': '.$val;
return(implode('; ',$buf));
}
2020-10-13 08:21:26 +02:00
?>