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 />.
*/
2022-12-01 05:43:21 +01:00
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 ,
2022-12-01 05:43:21 +01:00
// 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 ,
2022-11-09 14:44:21 +01:00
'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
2022-12-01 05:43:21 +01:00
dalla tabella Notifications .
2022-11-09 14:44:21 +01:00
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 ( 'L’ opzione «' . $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 ;
2022-11-09 14:44:21 +01:00
} elseif ( $argv [ $i ] == 'optimize' ) {
$dosome = true ;
$opts [ 'optimize' ] = true ;
2020-10-13 08:21:26 +02:00
} 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 );
}
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 );
2022-12-01 05:43:21 +01:00
/* 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 );
2022-12-01 05:43:21 +01:00
} */
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'
);
2022-11-23 18:57:05 +01:00
$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 ;
2022-11-23 18:57:05 +01:00
$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 );
2022-12-01 05:43:21 +01:00
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
}
2022-11-09 14:44:21 +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 );
2022-11-09 14:44:21 +01:00
function kimplode ( & $arr ) {
$buf = [];
foreach ( $arr as $key => $val )
$buf [] = $key . ': ' . $val ;
return ( implode ( '; ' , $buf ));
}
2020-10-13 08:21:26 +02:00
?>