Posts Tagged ‘xinetd’
xinetd: info script
Ich wollte von unterwegs aus den Status meines Heimservers abrufen können. Dabei ging es mir vorallem um die Temperatur von CPU, Mainboard und den Festplatten. Der auf sixserv.org laufende rbot(im Freenode idled der in #sixserv) soll auf Kommando den Status anzeigen. Soweit so gut. Ein kleines Ruby-Skript das auf dem Server zuhause läuft erfasst die Temperaturen per “sensors” und “hddtemp”. Der xinetd-Daemon konfigurierte ich daraufhin so das auf einen Port das Skript gebunden wird. Es erwartet bevor es die Daten übermittelt ein Passwort, einfach zum zusätzlichen Schutz auch wenn das vielleicht gar nicht nötig ist. Jemand der einen Portscan durchführt könnte eben so informationen zum System gelangen, die Passwortabfrage verhindert dies.
Zunächst zu dem Ruby-Script(z.B. /opt/botinfo.rb):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #!/usr/bin/ruby i = Kernel.gets if i.chomp != 'DASGEHEIMEPASSWORT' then # puts 'Wrong Password' exit end puts `uptime`.lstrip # HDD Temps: matches = `cat /proc/partitions`.scan /([s|h]d[a-z])/ matches.uniq! matches.each do |disk| print "#{disk}: #{`hddtemp -n /dev/#{disk}`.chomp}.0*C (#{$1}GB) " end puts systemp = `sensors` temp1 = systemp.scan /CPU Temp: \+([0-9]+)\.0.C/ temp2 = systemp.scan /M\/B Temp: \+([0-9]+)\.0.C/ puts "System: #{temp2[0]}.0*C #{temp2[1]}.0*C | CPUs: #{temp1[0]}.0*C #{temp1[1]}.0*C" |
Hier muss natürlich sensors und hddtemp installiert sein, aber dieses Script kann praktisch alles mögliche an Informationen sammeln und ausgeben.
Die Konfiguration von xinetd gestaltet sich sehr einfach, in dem Verzeichnis /etc/xinetd.d einfach eine neue Datei für das Script erstellen(z.B. “botinfo”):
1 2 3 4 5 6 7 8 9 10 11 | service botinfo { disable = no port = 8888 socket_type = stream protocol = tcp wait = no user = apoc server = /opt/botinfo.rb type = unlisted } |
Den Port, User und den Skript Pfad entsprechend anpassen und xinetd neu starten. Mit netcat kann es man danach testen:
1 2 3 4 5 | $ nc localhost 8888 DASGEHEIMEPASSWORT 18:40:35 up 3 days, 41 min, 4 users, load average: 0.00, 0.02, 0.20 sda: 30.0*C (10GB) sdb: 29.0*C (10GB) System: 39.0*C 38.0*C | CPUs: 37.0*C 36.0*C |
Der Port muss ggf. vom Router geforwarded werden damit ein Entfernter Server darauf zugreifen kann. Auch ein dyndns ist hilfreich, sofern man über keine statische IP verfügt. Ein einfaches rbot-Plugin um diese Daten vom irc aus abzufragen sieht z.B. so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | require 'socket' class BotinfoPlugin < Plugin def help(plugin, topic="") 'info => return system information' end def info(m, params) sock = TCPSocket.new('heimserver.dyndns.org', 8888) sock.puts('DASGEHEIMEPASSWORT') m.reply sock.recv(1024) sock.close end end plugin = BotinfoPlugin.new plugin.map 'info' |
Die Daten können ebenfalls von einem PHP-Script aus abgefragt werden. Keines Beispiel:
1 2 3 4 5 6 7 8 9 | <?php $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_connect($socket, "heimserver.dyndns.org", "8888"); $pass = "DASGEHEIMEPASSWORT\n\n"; socket_write($socket, $pass, strlen($pass)); echo socket_read($socket, 2048); ?> |
Vielleicht findet das ja irgendjemand interessant
Tagged: hddtemp, irc, Linux, Networking, PHP, plugin, RBot, Ruby, sensors, xinetd