NEWS
Ports auf Online Verfügbarkeit prüfen wie ?
-
@pmunz
Ping überwacht nicht Port 80.Du kannst doch einfach mit einem socket Verbinden. Also aus dem Kopf so ein Skript:
const net = require('net'); const ip = 192.168.0.1; const port = 443; const connection = net.createConnection({host: ip, port: port, timeout: 10000}, (err) => { if (err) { if (err.code === 'ECONNREFUSED') { //port ist zu } else if (err.code === 'ETIMEDOUT') { //gerät offline (oder firewall doof konfiguriert, dass sie nicht antwortet) } } else { //port ist offen } connection .destroy(); //wieder zu machen :-) });
-
@Garfonso
Hallo, sorry hab ich mich falsch ausgedrückt, ich meinte der " ping Adapter " kann nur port 80 pingen und prüfen ob verfügbar.
vielen dank für deine info , ich werd des mal testen.
Danke -
@Garfonso sagte in Ports auf Online Verfügbarkeit prüfen wie ?:
onst net = require('net');
hmm irgendwie bekomm ich da immer einen script fehler den ich aber mangels unwissenheil nicht finden kann:
22:50:07.870 error javascript.0 (1203) script.js.Javascript.ping compile failed:
at script.js.Javascript.ping:5 -
@pmunz
Ja, sorry, war, wie gesagt, "aus dem Kopf". Die IP muss natürlich in Anführungszeichen, alsoconst ip = "192.168.0.1";
-
@Garfonso
Hallo Garfonso,
Danke ist ja kein problem ich bin dankbar für deine hilfe.
Ja das mit den Anführungszeichen hätte ich auch als anfänger checken können , sorry.Jetzt tritt das problem auf das alle 10 sekunden auch andere Javascripts mitgezogen werden und einen reload machen und ich zb Telegram meldungen aus einem anderen script bekomme.
das wird aber der fall sein wenn:
solange ein Port Online ist zb.: 80 ist alles ok , ist dieser aber offline bricht die Instanz komplett ab und wird deaktiviert.Wo ist es mir den ersichtlich ob Online oder Offline ? ( true bei Online - false bei Offline ) unter Pbjekte / Javascript.
Aber ich denke mal das "false" nicht kommt weil sich ja das Script / die Instanz beendet.
Den Port 8090 hab ich nur eingetragen um zu sehen was passiert wenn der port nicht anspricht.Fehlermeldungen aus dem log :
instance system.adapter.javascript.0 terminated with code 1 (JS_CONTROLLER_STOPPED)
Caught by controller[0]: at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1141:16)
Caught by controller[0]: Error: connect ECONNREFUSED 10.10.80.25:8090
(25987) uncaught exception: connect ECONNREFUSED 10.10.80.25:8090 -
@pmunz unter Linux in der Konsole macht man das normal mit nmap ...
-
komisch... das Problem hatte ich hier nicht.Also der Port war nie online?
//Edit: Ok, auf der Konsole hatte ich das Problem nicht, da ging das mit dem Fehler abfangen so. Im Adapter hab ich dasselbe Problem. Spanned. Mal untersuchen.Eigentlich sollte das auch nicht passieren. Kannst du mir sagen, welche Version von js-controller und javascript Adapter du hast?
-
@pmunz
Ok, nachdem ich den Fehler auch sehen konnte, geht es nun so (mein ursprüngliches Skript war falsch):const net = require('net'); const ip = "192.168.0.1"; const port = 80; const connection = net.createConnection({host: ip, port: port, timeout: 10000}); connection.on('ready', () => { log("Port offen"); connection .destroy(); //wieder zu machen :-) }); connection.on('error', (e) => { log("Error: " + e.code); if (e.code === 'ECONNREFUSED') { log("Port zu"); } if (e.code === 'EHOSTUNREACH') { log("Gerät offline 2"); } else { log("Anderer Fehler, vermutlich Gerät nicht da?"); } connection .destroy(); //wieder zu machen :-) }); connection.on('timeout', () => { log("Gerät offline"); connection .destroy(); //wieder zu machen :-) });
Den "timout" Fall hatte ich bisher nicht. Könnte aber theoretisch auftreten. Ich hatte im Fall, dass es an der IP gar kein Gerät gab den "EHOSTUNREACH" fall. Am besten wäre für den Fall, dass das Gerät gar nicht da ist eine Funktion zu definieren und die aufzurufen (falls der Fall für dich überhaupt relevant ist).
//Edit:
achja, damit das sinnvoll ist, also ein Status überwacht wird oder so, müsstest du den ganzen "connection" Block noch regelmäßig aufrufen also mit setTimeout oder schedule oder sowas (keine Ahnung, was du genau vorhast.. ggf. kannst du auch aus einem anderen Skript heraus das Skript aktivieren und am Ende des Skripts es sich selber deaktivieren lassen, das mache ich hin und wieder). -
@Garfonso
Hallo,
Ich habe mir vor Jahren ein PHP Scrip geschrieben das nichts anderes macht als Ports zu Pingen um zu sehen ob der Service läuft oder nicht, ich weis das ist nicht die perfekte lösung nur für die kleinen Devices extra einen snmp zu installiren ( am zu überwachenden Device ) macht keinen sinn.
Ich bin Jahrelang mit dem php script durch gekommen wollte es halt jetzt einfach in den iobroker übernehmen.
Vielen dank für deine Hilfe -
@pmunz
Gerne.
Du könntest auch mit exec das PHP Skript aus ioBroker raus aufrufen. Aber das ist ein gewisses Sicherheitsrisiko (weil man das Skript theoretisch austauschen könnte, je nach Berechtigungen).Wenn du noch weitere Hilfe brauchst, frag ruhig.
-
@garfonso sagte in Ports auf Online Verfügbarkeit prüfen wie ?:
@pmunz
Ok, nachdem ich den Fehler auch sehen konnte, geht es nun so (mein ursprüngliches Skript war falsch):const net = require('net'); const ip = "192.168.0.1"; const port = 80; const connection = net.createConnection({host: ip, port: port, timeout: 10000}); connection.on('ready', () => { log("Port offen"); connection .destroy(); //wieder zu machen :-) }); connection.on('error', (e) => { log("Error: " + e.code); if (e.code === 'ECONNREFUSED') { log("Port zu"); } if (e.code === 'EHOSTUNREACH') { log("Gerät offline 2"); } else { log("Anderer Fehler, vermutlich Gerät nicht da?"); } connection .destroy(); //wieder zu machen :-) }); connection.on('timeout', () => { log("Gerät offline"); connection .destroy(); //wieder zu machen :-) });
Den "timout" Fall hatte ich bisher nicht. Könnte aber theoretisch auftreten. Ich hatte im Fall, dass es an der IP gar kein Gerät gab den "EHOSTUNREACH" fall. Am besten wäre für den Fall, dass das Gerät gar nicht da ist eine Funktion zu definieren und die aufzurufen (falls der Fall für dich überhaupt relevant ist).
//Edit:
achja, damit das sinnvoll ist, also ein Status überwacht wird oder so, müsstest du den ganzen "connection" Block noch regelmäßig aufrufen also mit setTimeout oder schedule oder sowas (keine Ahnung, was du genau vorhast.. ggf. kannst du auch aus einem anderen Skript heraus das Skript aktivieren und am Ende des Skripts es sich selber deaktivieren lassen, das mache ich hin und wieder).Hallo, ich möchte gerne wisssen, wie ich permanent die Port prüfen kann. Das Script oben läuft offenbar nur einmal, oder? Ich habe das mal mit Schedule gemacht.
schedule("*/1 * * * *", function () {
Gruß Michael