[Java] individuare server Postgresql in lan DHCP

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

[Java] individuare server Postgresql in lan DHCP

Messaggioda nuzzopippo » venerdì 12 luglio 2019, 12:15

Salute a Voi :)

Dopo una "Eternità" che non mi interesso più di java, mi trovo costretto a metter mano ad alcuni programmi fatti molti anni fa e tutt'ora in uso.

Tali applicazioni si connettono, in lan locale, ad un paio di server Postgresql dedicati ad alcune cose e sino a poco fa ben individuati in una lan ad indirizzi statici, se non che è stata ristrutturata la rete ed ora è fuori dal controllo locale ed a indirizzi DHCP, con impossibilità di dedicare degli indirizzi a qualche macchina.

Mi trovo, pertanto, in condizione di dover individuare le macchine in lan locale su cui "possono" risiedere dei server Postgresql e poi, in base alla applicazione in uso, cercare di connettermi al database di interesse.
Da un test veloce, posso farlo con un codice del genere :
Codice: Seleziona tutto
import java.io.IOException;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author ngiuseppe
 */
public class Trovapg {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            Enumeration<NetworkInterface> schede = NetworkInterface.getNetworkInterfaces();
            if (schede != null) {
                for (NetworkInterface scheda : Collections.list(schede)) {
                    cerca_ip_v4(scheda);
                }
            } else {
                System.out.println("Nessuna scheda di rete trovata");
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
        for (String ind : ind_ip) {
            cerca_5432(ind);
        }
    }
   
    static void cerca_ip_v4(NetworkInterface scheda) throws SocketException {
        if (scheda.getHardwareAddress() != null) {
            Enumeration<InetAddress> inetAddresses = scheda.getInetAddresses();
            for (InetAddress inetAddress : Collections.list(inetAddresses)) {
                if (inetAddress instanceof Inet4Address) {
                    ind_ip.add(inetAddress.toString().substring(1));
                }
            }
        }
    }
   
    static void cerca_5432(String ip) {
        String[] elem;
        elem = ip.split("\\.");
        String base = elem[0] + "." + elem[1] + "." + elem[2] + ".";
        System.out.println(base);
        System.out.println("Cerco nell'intervallo " + base + "*");
        for(int i=1; i<255; i++) {
                if (i == 41) {
                    boolean connesso = connetti(base + "41", 5432);
                    if (connesso == true) {
                        System.out.println("Postgresql trovato");
                    } else {
                        System.out.println("Nessun server trovato");
                    }
                }
        }
    }
    // funzione per connettersi al server
    static boolean connetti(String ip, int port) {
        boolean result = false;
        try {
            Socket s = new Socket(ip, port);
            result = true;
            s.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
   
    static ArrayList<String> ind_ip = new ArrayList<>();
}

... che però non mi convince molto, farsi una scansione della porta 5432 di tutto il range 1-254 e, quindi, tentare di connettersi ad uno specifico database non mi sembra un granché come metodo ma non mi sta riuscendo di trovare/immaginare modalità migliori.

Qualcuno di Voi ha suggerimenti in merito?
(Preciso che non è proprio possibile riservarsi degli IP)

Grazie per l'attenzione
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1257
Iscrizione: ottobre 2006

Re: [Java] individuare server Postgresql in lan DHCP

Messaggioda DoctorStrange » venerdì 12 luglio 2019, 16:28

Dipende dal tipo di connessione che tenti. Di solito, nei server si può inviare un pping di tipo "Keep alive", che ha l'unico scopo di dirti se quel particolare nodo è incluso nel cluster. Potresti quindi inviare una serie di ping keep-alive per vedere quali dei tuoi server siano attivi e connessi.

In questa maniera con una scansione abbastanza rapida di ping, puoi sapere abbastanza rapidamente quali sono i tuoi nodi
Avatar utente
DoctorStrange
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1572
Iscrizione: ottobre 2015
Località: Roma, Italia
Desktop: Unity
Distribuzione: Ubuntu 16.04.03 Xenial Xerus
Sesso: Maschile

Re: [Java] individuare server Postgresql in lan DHCP

Messaggioda nuzzopippo » sabato 13 luglio 2019, 8:43

Grazie della risposta @Doctor :)

Tecnica che non avevo presente, interessante, dovrò documentarmi un po' e fare qualche prova ma mi sembra promettente.

Riguardo al "tipo di connessione" utilizzato, ovviamente, dovrà essere ridefinito, al momento niente di sofisticato, a livello applicativo una connessione ssh con url costruita da parametri letti in file di proprieta + login.
Ovviamente controllata a livello di pg_hba (combinazione host + user + db e pwd) e grant concesse ai gruppi di appartenenza, anche questo aspetto è da ridefinirsi.

Grazie ancora :birra:
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1257
Iscrizione: ottobre 2006


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 4 ospiti