repats blog Thoughts of a digital native

18Mai/120

Pruefen ob ein Computer online ist mit ping und perl

Ich habe bei der Arbeit ein kleines Perl-Skript geschrieben, welches prüfen sollte, ob bestimmte Computer in bestimmten Räumen(also IP-Ranges) noch online sind oder schon automatisch ausgestellt wurden. Dieses Skript sendet ein Paket über ping und guckt dann, ob es ein packetloss gibt. Im Grunde wäre das in der Bash besser gewesen, aber so kann man das, wenn man es ein bisschen anpasst, auch unter anderen OS verwenden.

Code

# The string containsPacketLoss is searching for
$packetloss = "100% packet loss";
# Init
$returnval = "";

print "\nCheck if Computers are online...\n";

# Scan IP-Range
for (my $i = 1; $i <=255; $i++) {
	# c = one package, w = deadline, q = quiet
        $ipcmd = "ping -c1 -q -w1 169.254.1." . $i;
        # execute and retreive output
        $returnval = `$ipcmd`;
        if (containsPacketLoss() == 0) {
            # output
            print "Computer  with IP 169.254.1." . $i . "is still online.\n";
            # write log file
	    system("echo Computer with IP 169.254.1.". $i . localtime(time) . " ONLINE >> /home/user/log");
        }
}

sub containsPacketLoss(){
	# check by RegEx if the string specified above is in the returnvalue
	# of the ping command
	if ($returnval =~ m/$packetloss/ ){
                return 1;
        }
        return 0;
}

Download

flattr this!

18Mai/120

Arduino Ethernet Shield und LM35DZ Temperatursensor

Das ist ein Projekt was bei mir bestimmt schon 2 Jahre rumliegt. Vielleicht wird es auch noch erweitert.

Hardware
Einen Arduino bekommt man für knapp 25€ bei diversen Shops im Internet, im Laden hab ich sie bis jetzt nur überteuert als Paket bei Conrad gesehen. Das Ethernet Shield bekommt man auch für ~$10 bei ebay. Den LM35DZ Temperatursensor hab ich für ca. 4€ bei Conrad gekauft. Der Rest (Lötsachen, Kabel, Schrumpfschläuche) ist Zubehör, das hier so rumlag.
Gemäss dem Datenblatt habe ich den Temperatursensor über ein paar angelötete Kabel an das Breadboard aufgesteckt. Die Beinchen habe ich mit Schrumpfschläuchen versehen, damit sie nicht aus versehen gegeneinander kommen können. Ich überlege gerade noch es mit Heisskleber abzudichten, so dass der Sensor nach draussen kann.

Software
Ich setze ein bisschen Grundwissen der Programmierung voraus. Vor allem, wer C kann, sollte hier keine Schwierigkeiten haben. Ist auch nicht schwer. Es gibt 2 Funktionen, setup() und loop(), die entsprechend ihrem Namen genau das tun. Für fast alles hat schonmal jemand eine library geschrieben, man muss quasi nur noch den Bastelkasten nehmen und zusammenstecken. Für das Ethernet Shield gibt es natürlich eine library, die das im Grunde recht simpel macht. Man bindet einfach die libraries dafür ein:

#include <Ethernet.h>
#include <SPI.h>

und kann dann global mit

byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte ip[] = {
192,168,1,5 };
byte gateway[] = {
192, 168, 1, 1};
byte dns[] = {
192, 168, 1, 1};
byte subnet[] = {
255, 255, 255, 0 };

die entsprechenden Optionen setzen. Am besten die IP-Adresse so wählen, dass man nicht mit dem DHCP Server korreliert. Dann kommt noch eine kurze Initialisierung:

Server server(80);

Nebenbei habe ich den input pin für die Temperatur gesetzt und eine globale Variabale dafür angelegt:

const int apin = A3;
float temperature;

In setup() wird dann mit folgenden Befehlen der Webserver gestartet:

Ethernet.begin(mac, ip, dns, gateway);
server.begin();

Hier setze ich die serielle Verbindung auf 9600 Baud und definiere den oben spezifierten Pin als INPUT:

Serial.begin(9600);
pinMode(apin,INPUT);

Als nächstes kommt loop(). Hier definier ich eine Variable in die der rohe Input gespeichert wird. Die rechnet man dann gemäß einer Formel um, die ich im Internet gefunden hab. Zum Test habe ich eine Ausgabe auf der seriellen Console eingestellt. Die findest man in der Arduino IDE unter Tools. Jenachdem ob man ihn an 3.3V oder an 5.0V anschliesst, ist die Formel natürlich anders.

int input = analogRead(apin);

temperature = (5.0 * input * 100.0)/1024.0;

Serial.print( "Temperature: ");
Serial.print(temperature);
Serial.print("\n");
delay(1000);

Damit der Code da jetzt ein bisschen übersichtlich bleibt habe ich eine Funktion namens listenForClients() geschrieben. Ich denke aus den Kommentare sollte klar werden, was hier passiert:

void listenForClients() {

  // Initialize client
  Client client = server.available();

  if (client) {
    // Message for debugging
    // Serial.println("Got a client");

    boolean currentLineIsBlank = true;

    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (c == '\n' && currentLineIsBlank) {

          // Tell the client the receiving data is HTML
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          // This is the actual temperature value
	  // $deg; is the little round degree sign
          client.print("Temperature: ");
          client.print(temperature);
          client.print(" °C");

          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }

    // Give the web browser time to receive the data
    delay(1);

    // Close the connection:
    client.stop();
  }

Der Code ist überwiegend Copy-Pasta aus File/Examples/Ethernet/Webserver.

Hier gibts nochmal den Quelltext zum downloaden.

 

Fotos

(click to enlarge)

Foto Arduino Webserver LM35 Temperatursensor
Screenshot Arduino Webserver LM35 Temperatursensor

 

Links

flattr this!

9Mrz/120

Sprachausgabe im Menu beim Kindle ausstellen

Settings hat noch eine zweite Seite, die man mit den Pfeiltasten an der Seite erreicht und auf der man Text to Speech ausstellen kann, also nicht nur TTS für ein Buch sondern auch, dass er das Menü vorliest.

flattr this!

7Mrz/120

Wo stehen die Server von …

Mit dem Firefox Plugin Flagfox(Mozilla Add-On Page) lassen sich von den meisten Websites die Serverstandorte anhand der Nationalflagge sowie die Domainzugehörigkeit herausfinden. Ein Mouse-Over zeigt die Länder nochmal ausgeschrieben an, da man ja nicht unbedingt von allen >190 Ländern die Flagge kennt.

flattr this!

7Mrz/120

MySQL Server absichern

Was bei einem Webhoster der Admin automatisch übernimmt, muss man bei einer Installation z.B. auf dem eigenen Homeserver selbst machen. Ich gehe hier von einem über Paketquellen installierten MySQL Server der Version 5.0.57 auf einem Apache der Version 2.2.10 unter SuSE Linux Enterprise Server(SLES) aus. Wer einigermaßen englisch spricht dem ist auch Kapitel 2.18.2. Securing the Initial MySQL Accounts der offiziellen MySQL Dokumentation empfohlen. Bevor man startet natürlich den MySQL Server starten.

Als allererstes sollte man Passwörter setzen, dazu loggt man sich ein:

mysql -u root

Dann bekommt man so eine shell:

 mysql>

Der Befehl um sich die Benutzer anzugucken ist:

SELECT User,Host,Password FROM mysql.user

Der beliebte SELECT * Befehl ist hier nicht zu empfehlen, da mysql.user wie man schön an

describe mysql.user;

merkt, 37 Spalten hat und somit auf den meisten Bildschirm die Konsole sprengt;-)
Hier sollte jetzt eigentlich nur der root-Benutzer(der alles kann) auftauchen und evtl. einige anonyme Accounts. Die bekommt man mit folgendem Befehl gelöscht:

DELETE FROM mysql.user WHERE User='' AND Password=''

Sollte man einen User hinzugefügt haben kann(Empfohlen! Nie den root User für Anwendungen nehmen), man mit folgendem Befehl die Rechte feststellen.

SHOW GRANTS FOR 'user'@'localhost'

Alternativ gehen die folgenden Befehle:

SELECT User,Select_priv,Insert_priv,Update_priv,Delete_priv FROM mysql.user;

Die entsprechenden Rechte aus DDL, DCL und DML kann man dem oben genannten describe Befehl entnehmen. Der User hatte bei mir standardmässig Rechte um von jedem Host aus zu verbinden. Dies wird durch den Wildcard % vermerkt, der sich bei in der Host Spalte vom User befindet. Möchte man die üblichen Web-Applikationen auf dem Server laufen lassen, z.B. CMS wie WordPress für Blogs oder Drupal für Websites, braucht man keine Verbindung von außerhalb sondern nur von localhost(dort liegen die PHP-Dateien von denen die Abfragen kommen, der User kann auf dem ganzen Internet zugreifen, bzw. das ist Sache des Apaches)

DELETE FROM mysql.user WHERE Host='%';

Jetzt kann es sein, dass der User oder auch root nur für einige Hosts ein Passwort hat. Deswegen sollte man für alle Hosts den folgenden Befehl ausführen:

 SET PASSWORD FOR 'root'@'HOST' = PASSWORD('newpwd');

Wenn man Initialisierungsanleitungen gefolgt ist hat man eventuell eine Datebank namens test. Dies lässt sich ganz einfach feststellen:

SHOW DATABASES;

Mit diesem drop-Befehl löscht man diese unnötige Datenbank:

DROP DATABASE test;

Daneben gibts es noch die eben benutze mysql und die information_schema Datenbank, die man nicht löschen sollte.

Ein weiterer Tweak ist, den Benutzernamen von root zu ändern, um automatisierten brute-force Attacken auf das root Passwort aus dem Weg zu gehen:

UPDATE mysql.user SET User='myNameForRoot' WHERE User='root';

Zum Reload der ganzen Berechtigungen, z.B. nach Anlegen eines neuen Users muss man mit folgendem Befehl die Rechte neu einlesen

FLUSH PRIVILEGES;

Ausserdem gibt es noch die Möglichkeit mysqld in einer chroot Umgebung laufen zu lassen, dazu vielleicht später mehr.
Quellen

  • www.pantz.org/software/mysql/mysqlcommands.html
  • http://dev.mysql.com/doc/refman/5.1/de/delete.html
  • http://dev.mysql.com/doc/refman/4.1/en/adding-users.html
  • http://dev.mysql.com/doc/refman/5.0/en/default-privileges.html

flattr this!

1Mrz/120

UUID von Festplatte herausfinden

Generelles zu UUID: ubuntuusers und nwlinux.com

sudo blkid /dev/sdXY

Oder bei älteren Versionen

sudo vol_id /dev/sdXY

Wobei jeweils X für die Festplatte und Y für die Partition steht, z.B. bei /dev/sda1 ist X=a und Y=1.
Sollte die Festplatte schon in der /etc/fstab stehen, kann man natürlich auch dort nachschauen.

Credits to tauros at ubuntuforums.org and Scott Granneman

flattr this!

29Feb/120

Alle Dateien im Unterordner oeffnen und durchsuchen mit find

Dieser Befehl geht alle Dateien durch, öffnet sie und prüft, ob der gesuchte Begriff drin steht.

find /ordner/unterordner -type f | xargs grep begriff
  • /ordner/unterordner -> Ordnerstruktur zum durchsuchen
  • -type f -> Datei (file)
  • xargs
  • grep

flattr this!

29Feb/120

ext4 Volume mit SliTaz 3.0(stable) mounten

Entweder von pkgs.slitaz.org die Pakete runterladen oder mit tazpkg über die Repositories das Paket linux-ext4 installieren. Dann sollte entweder sofort oder nach modprobe ext4 der mount Befehl funktionieren:

mount -t ext4 /dev/sda1 /mnt/harddisk

Wenn man das permanent haben möchte(z.B. Festplatteninstallation oder eigene Live-CD), natürlich wie gehabt ext4 in /etc/rcS.conf einfügen, bei mir z.B.:

[...]
LOAD_MODULES = "e1000 ext4"
[...]

Credits to mojo at vanilla.slitaz.org

flattr this!

24Feb/120

Standarddrucker abhaengig vom Standort setzen

Auf der Arbeit sind die PCs fortlaufend beschriftet und die letzten 3 Zeichen ist der Raum, also z.B. PC22-123 ist der 22. PC in Raum 123. Die Räume sind dabei IMMER dreistellig, d.h. in Raum 42 wäre der Raum 042. Natürlich könnte man auch über z.B. eine MySQL Datenbank eine Zugehörigkeit abfragen. Eine Abfrage könnte dann so aussehen(mehr oder minder Pseudo-Code):

SELECT RaumNr FROM Computer WHERE IP=$ip OR MAC = $mac;

Mit einem kleinen Perlskript im Autostart bekommt man seinen gewünschten Drucker anhand des Hostnames. Die entsprechende Perl Library für MySQL heisst Mysql(->use Mysql).

use Sys::Hostname;
$host = hostname;
chomp($host);
$raumnr=substr($host,length($host)-3,length($host)-1);
print "Host: " . $host . "\n";
print "RaumNr: " . $raumnr . "\n";

if ($raumnr == 123) {
  system('rundll32 printui.dll,PrintUIEntry /y /n "Drucker_Raum_123"');
}
elsif (...)
else {
   print "Computername nicht im richtigen Format";
}

hostname bekommt man vom System über sys::hostname. chomp() entfernt eventuelle Leerzeichen. Mittels substr() bekommt man einen Teilstring zurück, der von der Länge-3 bis Länge -1 geht, also genau die letzten 3 Buchstaben bzw. Zahlen. Hier hat man dann die Raumnummer. Anhand derer wird mit der rundll ein Standarddrucker gesetzt(/y) der in Anführungszeichen hinter /n steht. Damit sich die Anführungszeichen nicht in die Quere kommen, nimmt man für den system() Befehl die einstelligen Hochkommata.

flattr this!

23Feb/120

Weitere Schluesselworte fuer Thunderbird Anhang-Erinnerung unter Linux

Wenn man bei Thunderbird in einer neuen E-Mail z.B. das Schlüsselwort Anhang erwähnt, es aber keinen Anhang gibt bekommt man beim Abschicken eine Warnung, ob man nicht vergessen hat die Dateien anzufügen. Neulich habe ich eine formelle E-Mail geschrieben, in der ich schrieb "anbei finden Sie Datei xyz". Leider ist anbei keines dieser Schlüsselwörter und so habe ich leider den Anhang vergessen. Damit das nicht nochmal passiert habe ich aus dem Konfigurationseditor* mal die Schlüsselwörter rausgesucht. Der Key heisst mail.compose.attachment_reminder_keywords und die Wörter werden mit Kommata getrennt. Unter Windows findet sich das wohl bequemer unter Extras/Einstellungen/Allgemein/Schlüsselwörter, der Konfigurationseditor funktioniert natürlich trotzdem.

* das, was bei Firefox about:config ist findet man bei Thunderbird unter Bearbeiten(Linux) bzw. Extras(Windows)/Einstellungen/Erweitert/Allgemein/Konfiguration bearbeiten

flattr this!