This commit is contained in:
pezcurrel 2020-10-14 08:37:41 +02:00
parent 71301acebe
commit d023bc8302
7 changed files with 108 additions and 51 deletions

View file

@ -224,7 +224,8 @@ img {
height: 32px; height: 32px;
} }
.litbut, .litbuta { .litbut, .litbuta {
width: 32.746%; /*width: 32.746%;*/
width: 100%;
padding: 0 4px 0 4px; padding: 0 4px 0 4px;
height: 20px; height: 20px;
font-size: 6.5pt; font-size: 6.5pt;

View file

@ -195,7 +195,7 @@ else
if ($_GET['minki']>100000) $_GET['minki']=100000; if ($_GET['minki']>100000) $_GET['minki']=100000;
$order=array( $order=array(
'rand'=>array('t'=>_('Casuale'),'q'=>'Instances.Priority DESC, rand()'), 'rand'=>array('t'=>_('Casuale, prima le consigliate'),'q'=>'Instances.Priority DESC, rand()'),
// 'feat'=>array('t'=>_('Prima le consigliate'),'q'=>'Instances.Priority DESC'), // 'feat'=>array('t'=>_('Prima le consigliate'),'q'=>'Instances.Priority DESC'),
// partecipazione: totusers/activeusers // partecipazione: totusers/activeusers
// 'part'=>array('t'=>_('Partecipazione (decr.)'),'q'=>'(Instances.UserCount / Instances.ActiveUsersMonth) ASC'), // 'part'=>array('t'=>_('Partecipazione (decr.)'),'q'=>'(Instances.UserCount / Instances.ActiveUsersMonth) ASC'),
@ -215,6 +215,7 @@ $order=array(
); );
if (!(array_key_exists('ord',$_GET) && array_key_exists($_GET['ord'],$order))) if (!(array_key_exists('ord',$_GET) && array_key_exists($_GET['ord'],$order)))
$_GET['ord']='rand'; $_GET['ord']='rand';
if ($_GET['lang']==0) $order['rand']=array('t'=>_('Casuale'),'q'=>'rand()');
$p=1; $p=1;
if (array_key_exists('p',$_GET) && preg_match('#^[0-9]+$#',$_GET['p'])===1) $p=$_GET['p']+0; if (array_key_exists('p',$_GET) && preg_match('#^[0-9]+$#',$_GET['p'])===1) $p=$_GET['p']+0;
@ -301,11 +302,15 @@ echo('</select>
</div> </div>
<div class="sdcrow"> <div class="sdcrow">
<input type="button" class="litbut" value="'._('Resetta la ricerca').'" class="sbutton" onclick="document.location.href=document.location.href.replace(/\\?.*$/,\'\')">
<input type="button" class="litbut" id="mctrlb" value="'._('Criteri avanzati').'" class="sbutton" onclick="shmctrl()"> <input type="button" class="litbut" id="mctrlb" value="'._('Criteri avanzati').'" class="sbutton" onclick="shmctrl()">
<input type="button" class="litbut" id="dbgb" value="'._('Info di debug').'" onclick="shdbg()" style="margin:0">
</div> </div>
<div class="sdcrow">
<input type="button" class="litbut" value="'._('Resetta la ricerca').'" class="sbutton" onclick="document.location.href=document.location.href.replace(/\\?.*$/,\'\')">
</div>
<!-- <input type="button" class="litbut" id="dbgb" value="'._('Info di debug').'" onclick="shdbg()" style="margin:0"> //-->
<div class="sdlrow"> <div class="sdlrow">
<input type="submit" value="'._('Cerca').'" class="ssubmit"> <input type="submit" value="'._('Cerca').'" class="ssubmit">
</div> </div>
@ -348,7 +353,7 @@ $res=mysqli_query($link,$que) or muorimeglio(__LINE__.': '.mysqli_error($link),t
$debug.='MAIN QUERY EXEC TIME: '.(microtime(true)-$qit).' sec.'.N; $debug.='MAIN QUERY EXEC TIME: '.(microtime(true)-$qit).' sec.'.N;
$itot=mysqli_num_rows($res); $itot=mysqli_num_rows($res);
$debug.='RESULTS: '.$itot; $debug.='RESULTS: '.$itot;
echo('<div id="debug"><textarea spellcheck="false">'.$debug.'</textarea></div>'.N); //echo('<div id="debug"><textarea spellcheck="false">'.$debug.'</textarea></div>'.N);
$ipp=25; $ipp=25;
$if=$ipp*($p-1); $if=$ipp*($p-1);
if ($if>=$itot) { if ($if>=$itot) {

View file

@ -3,40 +3,31 @@
- statistiche minime - statistiche minime
- pagina statistiche (totali e di ricerca: numero istanze, numero utenti, partecipazione(?)) - pagina statistiche (totali e di ricerca: numero istanze, numero utenti, partecipazione(?))
- pagina blacklistate - pagina blacklistate
- ordinamento ~ ordinamento
* spostare i flag di esclusione sotto il resto
- se è Blacklisted dire perché interrogando la tabella Blacklisted - se è Blacklisted dire perché interrogando la tabella Blacklisted
- evidenziare espressioni corrispondenti alla ricerca - evidenziare espressioni corrispondenti alla ricerca
- possibilità di cercare per nome-uri istanza - possibilità di cercare per nome-uri istanza
* se InstOurLangs è null cercare e riportare InstLangs - fatto, impostando InstOurLangs come InstLangs in crawler.php se InstOurLangs è NULL e InstLangs no
- possibilità di settare tutti i parametri "senza constraints" con un solo tasto - possibilità di settare tutti i parametri "senza constraints" con un solo tasto
- un ultimo giro di aggiornamento delle traduzioni - un ultimo giro di aggiornamento delle traduzioni
- impostare un po' di scores per le italiane - impostare un po' di scores per le italiane
! possibilità di includere nella ricerca per lingua anche le istanze senza lingua specificata
! un ultimo tentativo prima di dichiararla morta in crawler.php (no perché viene già fatto a monte)
? mettere da qualche parte che usiamo quella libreria per la rilevazione delle lingue ? mettere da qualche parte che usiamo quella libreria per la rilevazione delle lingue
- usare menu.php di mustard, poi modificarlo in modo che da cell si veda menu hamburger - o simili - usare menu.php di mustard, poi modificarlo in modo che da cell si veda menu hamburger - o simili
* blacklistare byoblu
- i pad su cisti con il materiale ancora da tradurre per le varie lingue sono morti, sarebbero da resuscitare su soluzione alternativa non effimera - i pad su cisti con il materiale ancora da tradurre per le varie lingue sono morti, sarebbero da resuscitare su soluzione alternativa non effimera
- crawler.php: mi sa che non trova activity, non checka neanche trends, ma è sbagliato, sono indipendenti. Verificare. - crawl.bash: su errore, mandare mail
- crawler.php e peerscrawl.php: devono creare un lockfile all'esecuzione e cancellarlo quando escono (sia per errore, sia per uscita normale); se esiste, uscire con errore; più un'opzione per forzare l'esecuzione anche già in presenza di lockfile. - crawler.php: per il rilevamento della lingua, se la timeline non è disponibile si possono usare le descrizioni
- crawler.php: fare myreadline e usarlo per chiedere se si vuole proseguire quando instances.job e currinst.job esistono e --restore non è stato specificato. Serve anche unopzione che forzi l'esecuzione senza domanda.
- crawler.php: NON ripristinare sessione interrotta se non viene esplicitato con opzione (da aggiungere)
* crawler.php: togliere "lecho", aggiungere time ed etr, aggiungere controllo memoria
- crawler.php, peerscrawl.php: verificare perché stderr viene indirizzato a stdout, fare in modo che lo sia sempre a livello di script
~ PER FAVORE un metodo valido per verificare che un'istanza sia mastodon - più o meno fatto
- negli script web (non cli), gmdate dappertutto invece di strftime; magari un menu a tendina da cui scegliere timezone? - negli script web (non cli), gmdate dappertutto invece di strftime; magari un menu a tendina da cui scegliere timezone?
* crawler.php: massimo utilizzo di memoria alla fine - o no? tanto già lo dice nell'ultima riga di check - va be' fatto ? crawler.php: rendere opzionale il check su Dead
~ crawler.php: messo all'inizio aggiornamento stato "New" (se non è più new imposta New=0), ma forse sarebbe più bello metterlo in uno script di manutenzione-ottimizzazione a parte
- crawler.php: aggiornamento stato "Blacklisted" (anche questo forse sarebbe più bello metterlo in uno script di manutenzione-ottimizzazione a parte)
* crawler.php: se non viene rilevata nessuna lingua, e se c'è lingua di default, usare quella anche per le nostre
- crawler.php: rendere opzionale il check su Dead
* edinst.php: possibilità di settare Priority
? edinst.php: possibilità di settare Instances.Dead ? edinst.php: possibilità di settare Instances.Dead
- spostare tutta la roba sensibile in una dir "contenitore", tipo fare che la root dir è "/srv/http/mastodon.help/site", e in "/srv/http/mastodon.help" fare dir per logs, per accounts, per ini files, ecc. - spostare tutta la roba sensibile in una dir "contenitore", tipo fare che la root dir è "/srv/http/mastodon.help/site", e in "/srv/http/mastodon.help" fare dir per logs, per accounts, per ini files, ecc.
- rimuovere Instances.Chosen e Instances.Visible dappertutto - rimuovere Instances.Chosen e Instances.Visible dappertutto
~ PER FAVORE un metodo valido per verificare che un'istanza sia mastodon - più o meno fatto
--- fatti ---
* spostare i flag di esclusione sotto il resto
* se InstOurLangs è null cercare e riportare InstLangs - fatto, impostando InstOurLangs come InstLangs in crawler.php se InstOurLangs è NULL e InstLangs no
* blacklistare byoblu
* possibilità di escludere quelle con registrazione soggetta ad approvazione * possibilità di escludere quelle con registrazione soggetta ad approvazione
* possibilità di escludere quelle che non han risposto all'ultimo check, vedi sotto * possibilità di escludere quelle che non han risposto all'ultimo check, vedi sotto
* lastcheck bool in tabella Instances, per poterlo verificare facilmente * lastcheck bool in tabella Instances, per poterlo verificare facilmente
@ -44,4 +35,15 @@
* cambiare password a utente admin e normale su mastodon.help; l'utente normale non deve poter leggere la tabella Admins (e forse altre?) * cambiare password a utente admin e normale su mastodon.help; l'utente normale non deve poter leggere la tabella Admins (e forse altre?)
* trimdom ecc. ... forse che scarta già a monte quelle che sarebbero trimmate? altrimenti sarebbe da fare, e cassare trimdom del tutto * trimdom ecc. ... forse che scarta già a monte quelle che sarebbero trimmate? altrimenti sarebbe da fare, e cassare trimdom del tutto
* info di debug a scomparsa * info di debug a scomparsa
! possibilità di includere nella ricerca per lingua anche le istanze senza lingua specificata
! un ultimo tentativo prima di dichiararla morta in crawler.php (no perché viene già fatto a monte)
* crawler.php, peerscrawl.php: verificare perché stderr viene indirizzato a stdout, fare in modo che lo sia sempre a livello di script - dipende da "display_errors" in php.ini, per default li manda a stdout, bona lè* crawler.php: aggiornamento stato "New" e "Blacklisted" in uno script a parte - fatto, in mustool.php
* crawler.php e peerscrawl.php: devono creare un lockfile all'esecuzione e cancellarlo quando escono (sia per errore, sia per uscita normale); se esiste, uscire con errore; più un'opzione per forzare l'esecuzione anche già in presenza di lockfile.
* crawler.php: quando instances.job e currinst.job esistono, oltre a --restore serve anche unopzione che forzi l'esecuzione.
* crawler.php: NON ripristinare sessione interrotta se non viene esplicitato con opzione (da aggiungere)
* crawler.php: togliere "lecho", aggiungere time ed etr, aggiungere controllo memoria
* crawler.php: massimo utilizzo di memoria alla fine - o no? tanto già lo dice nell'ultima riga di check - va be' fatto
* crawler.php: se non viene rilevata nessuna lingua, e se c'è lingua di default, usare quella anche per le nostre
* edinst.php: possibilità di settare Priority
! crawler.php: mi sa che se non trova activity, non checka neanche trends, ma è sbagliato, sono indipendenti. Verificare. -- No, è ok.

View file

@ -23,6 +23,8 @@ function logcmd {
#logcmd "grep pippo bibi" "grepb.log" #logcmd "grep pippo bibi" "grepb.log"
#exit #exit
logcmd "php mustool.php setold" "mustool.setold.log"
if [ "$1" == "dopeers" ]; then if [ "$1" == "dopeers" ]; then
logcmd "php peerscrawl.php -e peerscrawl.exclude" "peerscrawl.log" logcmd "php peerscrawl.php -e peerscrawl.exclude" "peerscrawl.log"
logcmd "php crawler.php -p peers" "crawler.log" logcmd "php crawler.php -p peers" "crawler.log"
@ -30,4 +32,7 @@ else
logcmd "php crawler.php" "crawler.log" logcmd "php crawler.php" "crawler.log"
fi fi
# tanto per scrupolo
logcmd "php mustool.php setblack" "mustool.setblack.log"
exit 0 exit 0

View file

@ -34,7 +34,7 @@ $jsonf=false;
declare(ticks=1); declare(ticks=1);
if (function_exists('pcntl_signal')) { if (function_exists('pcntl_signal')) {
function signalHandler($signal) { function signalHandler($signal) {
global $link, $jsonf; global $link, $jsonf, $lockfp;
echo(N.'Sono stato interrotto.'.N); echo(N.'Sono stato interrotto.'.N);
if ($link) { if ($link) {
echo('La connessione MySQL è aperta, la chiudo.'.N); echo('La connessione MySQL è aperta, la chiudo.'.N);
@ -46,6 +46,10 @@ if (function_exists('pcntl_signal')) {
//fwrite($jsonf,'"Fine?": true'.N.'}'.N); //fwrite($jsonf,'"Fine?": true'.N.'}'.N);
fclose($jsonf); fclose($jsonf);
} }
if (isset($lockfp) && file_exists($lockfp)) {
echo('Il file di lock esiste, lo elimino.'.N);
unlink($lockfp);
}
exit(2); exit(2);
} }
pcntl_signal(SIGTERM,'signalHandler');// Termination ('kill' was called) pcntl_signal(SIGTERM,'signalHandler');// Termination ('kill' was called)
@ -62,7 +66,9 @@ $opts=array(
'jsonfp'=>__DIR__.'/instances.json', 'jsonfp'=>__DIR__.'/instances.json',
'jsonwrite'=>false, 'jsonwrite'=>false,
'peersfp'=>null, 'peersfp'=>null,
'restore'=>false 'restore'=>false,
'dontrestore'=>false,
'ignorelock'=>false
); );
$help='crawler.php $help='crawler.php
@ -86,10 +92,18 @@ $help='crawler.php
-N, --dontsetnew -N, --dontsetnew
Non marca le istanze come nuove, neanche quando lo sono. Può essere utile Non marca le istanze come nuove, neanche quando lo sono. Può essere utile
per il primo crawl. per il primo crawl.
-I, --ignorelock
Normalmente, se il suo lockfile esiste, il programma esce con un errore.
Questa opzione fa che il lockfile sia ignorato. Attenzione: verifica
che effettivamente il programma non stia già girando prima di usarla.
-r, --restore -r, --restore
Prova a riprendere lesecuzione di una sessione precedente non finita Prova a riprendere lesecuzione di una sessione precedente non completata
(perché funzioni devono essere presenti i file «instances.job» (perché funzioni devono essere presenti i file «instances.job»
e «currinst.job»). e «currinst.job»).
-R, --dontrestore
Se sono presenti i file di una sessione precedente non completata
(«instances.job» e «currinst.job») ignorali e prosegui (verranno
sovrascritti).
-d, --dryrun -d, --dryrun
Non scrive nulla nel database. Non scrive nulla nel database.
-j, --jsonwrite -j, --jsonwrite
@ -125,7 +139,15 @@ for ($i=1; $i<$argc; $i++) {
break; break;
case '-r': case '-r':
case '--restore': case '--restore':
$opts['restore']=false; $opts['restore']=true;
break;
case '-R':
case '--dontrestore':
$opts['dontrestore']=true;
break;
case '-I':
case '--ignorelock':
$opts['ignorelock']=true;
break; break;
case '-d': case '-d':
case '--dryrun': case '--dryrun':
@ -149,15 +171,23 @@ for ($i=1; $i<$argc; $i++) {
use function mysqli_real_escape_string as myesc; use function mysqli_real_escape_string as myesc;
function mexit($msg,$code) { function mexit($msg,$code) {
global $link, $jsonf; global $link, $jsonf, $lockfp;
echo($msg); echo($msg);
if ($link) if ($link)
mysqli_close($link); mysqli_close($link);
if ($jsonf) if ($jsonf)
fclose($jsonf); fclose($jsonf);
if (isset($lockfp) && file_exists($lockfp))
unlink($lockfp);
exit($code); exit($code);
} }
$lockfp=__DIR__.'/crawler.lock';
if (file_exists($lockfp) && !$opts['ignorelock'])
mexit('Il file di lock esiste: pare che sia già in corso una sessione; se sei sicur@ che non è così usa «-I» per forzare lesecuzione.'.N,2);
touch($lockfp);
$riprendi=false;
$instsjfp=__DIR__.'/instances.job'; $instsjfp=__DIR__.'/instances.job';
$currinstjfp=__DIR__.'/currinst.job'; $currinstjfp=__DIR__.'/currinst.job';
if ($opts['restore']) { if ($opts['restore']) {
@ -168,7 +198,8 @@ if ($opts['restore']) {
} }
} else { } else {
if (file_exists($currinstjfp) && file_exists($instsjfp)) { if (file_exists($currinstjfp) && file_exists($instsjfp)) {
mexit('La sessione precedente non è stata conclusa: «instances.job» e «currinst.job» esistono.'.N,2); if (!$opts['dontrestore'])
mexit('La sessione precedente non è stata conclusa: «instances.job» e «currinst.job» esistono; usa «-r» per ripristinarla o «-R» per ignorarla.'.N,2);
} }
} }
@ -745,9 +776,9 @@ while ($i<$cinsts) {
if ($opts['jsonwrite']) if ($opts['jsonwrite'])
fwrite($jsonf,'"'.$dom.'": '.json_encode($info,JSON_PRETTY_PRINT).','.N); fwrite($jsonf,'"'.$dom.'": '.json_encode($info,JSON_PRETTY_PRINT).','.N);
} }
$now=time();
if (!$instans) { if (!$instans) {
// questo è il limbo delle istanze che non rispondono // questo è il limbo delle istanze che non rispondono
$now=time();
$res=mysqli_query($link,'SELECT * FROM Instances WHERE URI=\''.myesc($link,$dom).'\'') $res=mysqli_query($link,'SELECT * FROM Instances WHERE URI=\''.myesc($link,$dom).'\'')
or mexit(__LINE__.': '.mysqli_error($link).N,3); or mexit(__LINE__.': '.mysqli_error($link).N,3);
if (mysqli_num_rows($res)>0) { if (mysqli_num_rows($res)>0) {
@ -980,7 +1011,6 @@ while ($i<$cinsts) {
} else { } else {
echo('«'.$info['uri'].'» non è già presente nel DB, la aggiungo...'.N); echo('«'.$info['uri'].'» non è già presente nel DB, la aggiungo...'.N);
$now=time();
$instrow['FirstSeen']=$now; $instrow['FirstSeen']=$now;
if ($opts['setnew']) if ($opts['setnew'])
$instrow['New']=1; $instrow['New']=1;
@ -1083,13 +1113,9 @@ if ($opts['jsonwrite']) {
} }
unlink($instsjfp); unlink($instsjfp);
unlink($currinstjfp); unlink($currinstjfp);
unlink($lockfp);
exit(0); exit(0);
function myreadline() {
}
?> ?>

View file

@ -19,8 +19,8 @@
define('N',"\n"); define('N',"\n");
$opts=array( $opts=array(
'newnot'=>false, 'setold'=>false,
'blacklisted'=>false, 'setblack'=>false,
'deadline'=>60*24*60*60,// se un'istanza non risponde da 60 giorni dichiararla morta '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ù 'newline'=>30*24*60*60,// se un'istanza è nuova, dopo 30 giorni non lo è più
); );
@ -31,9 +31,9 @@ $help='mustool.php
SINOSSI SINOSSI
mustool.php [opzioni] <azione[ azione...]> mustool.php [opzioni] <azione[ azione...]>
AZIONI AZIONI
newnot setold
setta New=0 per le istanze che non sono più nuove. setta New=0 per le istanze che non sono più nuove.
blacklisted setblack
Setta Blacklisted=1 per le istanze presenti nella blacklist, Setta Blacklisted=1 per le istanze presenti nella blacklist,
Blacklisted=0 per quelle che non lo sono. Blacklisted=0 per quelle che non lo sono.
OPZIONI OPZIONI
@ -57,12 +57,12 @@ for ($i=1; $i<$argc; $i++) {
mexit('Lopzione «'.$argv[$i].'» è sconosciuta (usa «-h» per vedere la guida).'.N,1); mexit('Lopzione «'.$argv[$i].'» è sconosciuta (usa «-h» per vedere la guida).'.N,1);
break; break;
} }
} elseif ($argv[$i]=='newnot') { } elseif ($argv[$i]=='setold') {
$dosome=true; $dosome=true;
$opts['newnot']=true; $opts['setold']=true;
} elseif ($argv[$i]=='blacklisted') { } elseif ($argv[$i]=='setblack') {
$dosome=true; $dosome=true;
$opts['blacklisted']=true; $opts['setblack']=true;
} else { } else {
mexit('«'.$argv[$i].'» non è unazione conosciuta (usa «-h» per vedere la guida).'.N,1); mexit('«'.$argv[$i].'» non è unazione conosciuta (usa «-h» per vedere la guida).'.N,1);
} }
@ -88,13 +88,13 @@ $link=@mysqli_connect($iniarr['db_host'],$iniarr['db_admin_name'],$iniarr['db_ad
mysqli_set_charset($link,'utf8mb4') mysqli_set_charset($link,'utf8mb4')
or mexit(__LINE__.': '.mysqli_error($link).N,1); or mexit(__LINE__.': '.mysqli_error($link).N,1);
if ($opts['newnot']) { if ($opts['setold']) {
echo('Setto New=0 per le istanze non più nuove ... '); 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); 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); echo('fatto! Righe coinvolte: '.mysqli_affected_rows($link).N);
} }
if ($opts['blacklisted']) { if ($opts['setblack']) {
echo('Setto Blacklisted=1 per le istanze blacklistate ... '); 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); 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('fatto! Righe coinvolte: '.mysqli_affected_rows($link).N);

View file

@ -32,7 +32,8 @@ $opts=array(
'timeout'=>5, 'timeout'=>5,
'verbose'=>false, 'verbose'=>false,
'excludedead'=>false, 'excludedead'=>false,
'timezone'=>date_default_timezone_get() 'timezone'=>date_default_timezone_get(),
'ignorelock'=>false
); );
$help='peerscrawl.php $help='peerscrawl.php
@ -53,6 +54,10 @@ $help='peerscrawl.php
Defines the file into which the ordered list of all checked instances Defines the file into which the ordered list of all checked instances
will be saved. will be saved.
DEFAULT: «'.$opts['allpeersfp'].'» DEFAULT: «'.$opts['allpeersfp'].'»
-I, --ignorelock
Normally, if its lockfile exists, the program exits with an error before
doing anything. With this option the lockfile is ignored. Please verify
that the program is not already running before using it.
-r, --restore -r, --restore
If peers file already exists on programs start it will be loaded into If peers file already exists on programs start it will be loaded into
memory and each instance it contains will be considered “already memory and each instance it contains will be considered “already
@ -108,6 +113,10 @@ for ($i=1; $i<$argc; $i++) {
case '--restore': case '--restore':
$opts['restore']=true; $opts['restore']=true;
break; break;
case '-I':
case '--ignorelock':
$opts['ignorelock']=true;
break;
case '-e': case '-e':
case '--excludefp': case '--excludefp':
if ($i+1>=$argc || !file_exists($argv[$i+1]) || !is_file($argv[$i+1]) || !is_readable($argv[$i+1])) if ($i+1>=$argc || !file_exists($argv[$i+1]) || !is_file($argv[$i+1]) || !is_readable($argv[$i+1]))
@ -155,9 +164,16 @@ for ($i=1; $i<$argc; $i++) {
} }
} }
$lockfp=__DIR__.'/peerscrawl.lock';
if (file_exists($lockfp) && !$opts['ignorelock'])
mexit('Lockfile exists: it seems the program is already running; if youre sure its not true, use «-I» to force execution.'.N,2);
touch($lockfp);
function mexit($msg,$code) { function mexit($msg,$code) {
global $link; global $link, $lockfp;
if ($link) mysqli_close($link); if ($link) mysqli_close($link);
if (isset($lockfp) && file_exists($lockfp))
unlink($lockfp);
echo($msg); echo($msg);
exit($code); exit($code);
} }
@ -180,9 +196,10 @@ function sortcheckandsave(&$arr,$arrdesc,&$fp) {
} }
function shutdown($dosort) { function shutdown($dosort) {
global $opts, $peersf, $allpeersf, $insts, $ainsts; global $opts, $peersf, $allpeersf, $insts, $ainsts, $lockfp;
if ($peersf) @fclose($peersf); if ($peersf) @fclose($peersf);
if ($allpeersf) @fclose($allpeersf); if ($allpeersf) @fclose($allpeersf);
if (isset($lockfp) && file_exists($lockfp)) unlink($lockfp);
if ($dosort) { if ($dosort) {
sortcheckandsave($insts,'list of responding instances',$opts['peersfp']); sortcheckandsave($insts,'list of responding instances',$opts['peersfp']);
sortcheckandsave($ainsts,'list of all checked instances',$opts['allpeersfp']); sortcheckandsave($ainsts,'list of all checked instances',$opts['allpeersfp']);
@ -195,7 +212,7 @@ function signalHandler($signal) {
echo(N.'I got interrupted (signal: '.$signal.').'.N); echo(N.'I got interrupted (signal: '.$signal.').'.N);
shutdown(false); shutdown(false);
//touch('KILLED'); //touch('KILLED');
exit(2); exit(3);
} }
//declare(ticks=1); //declare(ticks=1);
pcntl_async_signals(true); pcntl_async_signals(true);
@ -411,6 +428,7 @@ shutdown(true);
$now=time(); $now=time();
echo('Crawl started on '.strftime('%c',$tini).' and ended on '.strftime('%c',$now).'.'.N); echo('Crawl started on '.strftime('%c',$tini).' and ended on '.strftime('%c',$now).'.'.N);
echo(count($ainsts).' URIs checked in '.ght($now-$tini).'; '.count($insts).' responded. Max memory usage: '.ghs(memory_get_peak_usage(true)).N); echo(count($ainsts).' URIs checked in '.ght($now-$tini).'; '.count($insts).' responded. Max memory usage: '.ghs(memory_get_peak_usage(true)).N);
unlink($lockfp);
exit(0); exit(0);
?> ?>