[RISOLTO] trasferire ping su una pagina dinamica

di Anonimizzato17918 il
6 risposte
Salve a tutti,
vi spiego cosa mi piacerebbe fare: ho una tabella mysql col la lista degli IP locali; in php la interrogo e hoo delle pagine dinamiche. Adesso vorrei inserire lo stato degli IP (se pingano o no).
Avete qualche idea?

Ho visto cmq il programma fing che crea una pagina html sotto forma di tabella semplice oppure in csv, quindi (ma non so come si fa) si potrebbe leggere questo file e da lì vedere se un certo IP è acceso e pinga oppure no.. e addirittura vedere se ci sono nuovi IP ancora non messi su mysql.

La mia idea come vi sembra? è fattibile? Una mano per provarla a fare?

Grazie

6 Risposte

  • Se ho ben compreso, tu hai una serie di IP che vuoi pingare, e vuoi generare dinamicamente lo stato di questi server.

    Quello che farei io è mischiare questa tua idea con quanto presente , quindi: 1) aggiungere un campo nella tabella mysql "stato" (può essere un tinyint ad esempio), 2) avere uno script che fa il ping ai vari IP ed aggiorna il campo stato nel database, 3) un'altro script che genera la pagina HTML pescando i dati dal database e mostrandoli a chi li deve vedere.
  • Rispondo di qua, perché è meglio evitare di "invadere" i topic altrui (almeno questo è quello che suggerisco di solito dove faccio supporto ).

    c3n2o ha scritto:


    Sto provando a fare uno script di prova per vedere se un IP è raggiungibile.. questo va bene?
    Se intendi quello nel messaggio https://www.iprogrammatori.it/forum-programmazione/php/testare-server-con-curl-t25213.html?sid=2da8f1c9f8898d2eff43484591958a8a#p8541664
    
    $curl = curl_init();
    $timeout = 40;
    curl_setopt ($curl, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt($curl, CURLOPT_PROXY, $ip_server);
    $risultato = curl_exec ($curl);
    curl_close ($curl);
    Dovrebbe andare.

    c3n2o ha scritto:


    Inoltre, ho provato a stampare il $risultato, ma non mi esce nulla..
    echo "Risultato: ".$risultato;
    Come faccio a capire dov'è l'errore? è un valore booleano?
    Come da documentazione: http://php.net/manual/en/function.curl-exec.ph
    curl_exec ritorna un boolean, quindi vero o falso.
    Se non stampa niente è perché probabilmente ritorna falso (quindi errore).
    Magari togli la parte relativa al timeout.
    Poi, per gli errori di cURL, puoi usare:
    http://php.net/manual/en/function.curl-error.ph
    che ti ritorna la stringa dell'errore incontrato.
  • Mi dice che tutti gli IP sono spenti.. il codice che ho modificato è corretto?
    while($cicle=mysql_fetch_array($query)){
        $url=$cicle['Indirizzo_IP'];
        $ch=curl_init();
        $timeout = 5;
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_PROXY, $url);
        $risultato = curl_exec ($ch);
        if(!curl_errno($ch)) {
            echo "<tr><td style=\"background-color:green\">";
        } else {
            echo "<tr><td style=\"background-color:red\">";
    
        }
        curl_close($ch);
    Mi viene il dubbio che non devo cercare l'IP come proxy.. (con l'opzione CURLOPT_PROXY)..

    E poi ho pensato che pingan do uno alla volta, la pagina in php (visto che possono essere anche più di 10 IP) verrebbe caricata troppo lentamente..

    Forse è meglio usare Fing, fargli creare un file e leggere quello con fopen()..

    ..la ricerca continua
  • Come ho scritto da qualche parte (o almeno credo di aver scritto), non sono un grande esperto di cURL, ma leggendo dalla documentazione:
    http://php.net/manual/en/function.curl-init.ph
    l'url (e quindi l'IP nel tuo caso) va in curl_init e non come proxy (che in effetti non ha alcun senso).
  • In rete ho trovato uno script che sembrerebbe funzionare, ma quando faccio un ciclo while, sembrerebbe che l'istruzione curl_errno($ch) venga considerata una sola volta.. cioè: se faccio una paginetta con lo script e gli do io un valore alla volta lo script funziona, se lo metto nella mia pagina con ciclo while ho dei risultati a caso..

    Ecco lo script completo:
    while($cicle=mysql_fetch_array($query)){
        $url=$cicle['Indirizzo_IP'];
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_NOBODY, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_exec($ch);
        if(!curl_errno($ch)) {
            echo "<tr><td style=\"background-color:green\">";
        } else {
            echo "<tr><td style=\"background-color:red\">";
        }
        curl_close($ch);
        echo $url."</td>";
        ... //Chiama i campi della tabella
        echo "<td>".$cicle['Note']."</td></tr>";
    }
    ?>
    Forse il problema potrebbe essere che oltre a pingare IP con server web pingo anche dei comuni PC con windows7 dove non c'è servizio HTTP?
  • Ho quasi risolto, cambiando approccio:
    Prima di tutto uso il programma FING per avere un file csv, e lo converto eliminando delle colonne che non mi servono:
    fing -n 192.168.0.0/16 -d false -o table,csv,test.csv
    awk -F ";" '{print $1, $3}' test.csv >ip.csv
    Poi apro il file con fopen(), lo splitto con explode e cerco ciò che mi interessa:
    while($cicle=mysql_fetch_array($query)){
        $url=$cicle['Indirizzo_IP'];
            $file = "ip.all";
            $output="spento";
            $fr = fopen($file, 'r');
            while (!feof($fr)) {
                // estraggo la riga
                $riga = fgets($fr);
                // separo la riga
                $split = explode(" ", $riga);
                // ricavo il valore
                $ip = $split[0];
               
                if ($ip == $url) {
                    // creo l'output
                    $output = $split[1];
                    break;
                }
            }
            // chiudo il file
            fclose($fr);
    
    
    
        if(strpos($output, "up") === false) {
            echo "<tr><td style=\"background-color:red\">";
        } else {
            echo "<tr><td style=\"background-color:green\">";
        }
        echo $url."</td>";
    Così funziona
    Adesso devo mettere l'esecuzione automatica dei due comandi iniziali..
Devi accedere o registrarti per scrivere nel forum
6 risposte