Wednesday, September 16, 2020

Fotos anhand der GeoTags auf einer Weltkarte (Google Earth) anordnen

Das Perl Modul und Programm ExitfTool von Phil Harvey, bietet die Möglichkeit, Metadaten in einer beliebigen Anzahl von Formaten auszugegeben. Z.B. auch als eine GPS-Trackdatei, die nach Google Earth importiert werden kann. Super fürs Fotoalbum mit all den Urlaubsfotos (Wenn Sie immer schön GPS an hatten).
Das Google Earth installiert ist, setze ich voraus.

PS: ExifTool kam hier mit 20000 Dateien klar!

ExifTool installieren

Das Programm exiftool(1p) ist in Debian GNU/Linux enthalten und kann über die Paketverwaltung wie folgt installiert werden:

apt install libimage-exiftool-perl

Ansonsten von CPAN installieren:

cpan Image::ExifTool # installiert nach /usr/local

GPX- und KML-Datei für eine Reihe von Fotos mit GeoTags erstellen

Um aus einer Reihe von Fotos mit GeoTags eine GPX- und KML-Datei zu erstellen, müssen entsprechende Schablonen mit der Option -p an exiftool(1p) übergebenen werden:

# Creating a GPX track log
exiftool -p ~/Downloads/gpx.fmt -ee -r Bilder/ Videos/ >out.gpx
# Creating a Google Earth KML file
exiftool -p ~/Downloads/kml.fmt -ee -r Bilder/ Videos/ >out.kml

Die zwei Beispiele arbeiten die Verzeichnisse Bilder/ und Videos/ rekursiv ab. Aber es können stattdessen auch einzelne Dateien, oder Verzeichnisse und Dateien gemischt angegeben werden.

Die Schablonen finden Sie für GPX hier und für KML hier. Speichern Sie diese beiden Dateien am besten unter ~/Downloads/kml.fmt und ~/Downloads/gpx.fmt ab und führen Sie dann die obigen Kommandos aus.

Es sollten die Dateien out.gpk bzw. out.kml erzeugt werden.
Letztere können Sie mit Google Earth öffnen:

google-earth-pro path/to/out.kml

Wobei beachtet werden muss, dass das Arbeitsverzeichnis in dem Google Earth mit der out.kml geöffnet wird, immer relativ zu den Fotos sein muss!

In diesem Beispiel habe ich ausschließlich im Home-Verzeichnis gearbeitet. So sollte die out.kml, auch korrekt über das Kontextmenü, mit Google Earth, aus dem Dateimanager heraus geöffnet werden können.

map-2020-09-16-19-38-06.png

Fotos nach Datum in eine Verzeichnisstruktur sortieren

Zusätzlich könnten Sie sich, die Dateien im aktuellen Arbeitsverzeichnis, vorher auch nach Datum in eine Verzeichnisstruktur sortieren lassen. Beachten Sie aber, dass eine vorherige Sortierung und Dateinamen verloren gehen!

cd Bilder
exiftool -fileOrder datetimeoriginal '-FileName<${DateTimeOriginal}%-c.%le' -d '%Y/%m/%Y-%m-%d-%H-%M-%S' -r -P ./
find -empty -delete # leere Verz. und Dat. löschen

Quellen und Weiterführendes

Sunday, August 16, 2020

NetworkManager als WLAN-Sniffer: Liste der benachbarten Access Points erhalten

Um eine Liste der benachbarten Funknetzwerke (Access Points), mit den Werten für WLAN-Name (SSID), Kanal (Channel), Signalstärke, Verschlüsselungsart usw. zu erhalten, kann man folgendes Kommando nutzen:

nmcli device wifi list --rescan yes

Anders als z.B. iwlist(8) muss nmcli(1) nicht explizit als root ausgeführt werden, um einen Rescan durchzuführen.

Für Skripte kennt nmcli(1) den Schalter -g, --get-values. Dieser soll verwendet werden, um die Werte bestimmter Felder zu erhalten. Es ist im Grunde eine Kombination aus --mode tabular, --terse und --fields und eine bequeme Möglichkeit, Werte für bestimmte Felder abzurufen.

nmcli --get-values IN-USE,BSSID,SSID,CHAN,SIGNAL,SECURITY device wifi list --rescan yes

Friday, March 20, 2020

Selenium: Automatisierung von Webanwendungen

Einstieg in die Automatisierung von Webanwendungen mit Selenium, Perl und Firefox.

Selenium ist ein Framework zur Automatisierung von Webanwendungen im Browser (hier Firefox). Es können damit viele Webseiten-und Blog-Engines automatisiert werden.

Der primäre Einsatzzweck von Selenium ist die Automatisierung von Web-Anwendungen zu Testzwecken. Es kann vor allem Entwicklern von Web-Anwendungen sehr viel Tipparbeit abnehmen – beispielsweise beim Ausfüllen von Webformularen – und macht das Testen von Webanwendungen dadurch schneller, flexibler und verlässlicher.
Aber Selenium ist nicht nur auf Tests beschränkt, auch webbasierte Administrationsaufgaben können (und sollten) damit automatisiert werden.

Selenium automatisiert Web-Browser. Das ist es! Was du mit dieser Kraft machst, liegt ganz bei dir.

Selenium WebDriver installieren

Selenium WebDriver ist der Nachfolger der offiziell abgelehnten Selenium Remote Control. Der Selenium Server (der sowohl von WebDriver als auch von Remote Control verwendet wird) akzeptiert Befehle als Selenese-Kommandos, oder über das Client-API, und leitet sie an den Browser weiter.
Dazu startet Selenium WebDriver den Browser Firefox, installiert die Erweitung webdriver.xpi für WebDriver support und warten am Socket localhost:4444/TCP auf Kommandos.

Eine Anbindung für Perl an das Client-API, ist mit dem CPAN-Modul Selenium::Remote::Driver verfügbar.

Unter Debian ist das Modul (noch) nicht vorhanden und es muss von CPAN installiert werden:

cpan -T -f -i Selenium::Remote::Driver

Wer möchte kann sich auch ein Debianpaket aus dem Modul bauen und dies über die Paketverwaltung installieren (Dazu muss das Paket pkg-perl-tools installiert sein).

env -i DEB_BUILD_OPTIONS="nocheck" cpan2deb Selenium::Remote::Driver

Firefox statt Selenium Standalone-Server verwenden

Sie können das Modul Selenium::Remote::Driver direkt verwenden, um Selenium WebDriver zu starten, es muss nur der entsprechenden Treiber installiert sein. Diese Methode erfordert weder die Installation des
JRE/JDK noch den Selenium Standalone-Server. Es muss nur die entsprechende Klasse für die Treiberkonstruktion verwenden: Selenium::Firefox.

Für Firefox muss der Proxy geckodriver zu installieren. Dieser stellt die vom WebDriver-Protokoll beschriebene HTTP-API für die Kommunikation mit Gecko-Browsern wie Firefox bereit.

Unter Debian kann das Paket firefoxdriver installiert werden:

apt install firefoxdriver firefox-esr

Ansonsten kopiert man das geckodriver Binary auch direkt inPATH und macht es ausführbar.

Ein Beispiel

use Data::Dumper;
use Selenium::Firefox;

my $driver = Selenium::Firefox->new(
  binary => '~/Downloads/geckodirver'
);
$driver->get('http://www.google.com');
print Dumper($driver->get_title);

my $query = $driver->find_element('q', 'name');
$query->send_keys('CPAN Selenium Remote Driver');

my $send_search = $driver->find_element('btnG', 'name');
$send_search->click;

# make the find_element blocking for a second
# to allow the title to change
$driver->set_implicit_wait_timeout(2000);

my $results = $driver->find_element('search', 'id');

print Dumper($driver->get_title);

END {
	$driver->quit;
}

Welche Funktionen das Modul bietet, zeigt die (englischsprachige) Dokumentation: http://search.cpan.org/dist/Selenium-Remote-Driver/

$driver->get

Navigiert zu einer bestimmten URL.

Usage:

$driver->get('http://www.example.net');

$driver->find_element

Sucht nach einem Element (XML/HTML) auf der Seite, ausgehend vom Wurzelelement im DOM-Baum.

Das Element wird als WebElement-Objekt zurückgegeben: http://search.cpan.org/dist/Selenium-Remote-Driver/lib/Selenium/Remote/WebElement.pm

Die Funktion erwartet zwei Argumente:

  1. Das Suchziel: Bezeichner unter dem das Element im Dokument gefunden werden kann
  2. Schema: Dieses Argument istoptional und hat den Standardwert xpath. Es kann eines der folgenden sein: class, class_name, css, id, link, link_text, partial_link_text, tag_name, name oder xpath

Usage:

$driver->find_element("//input[@name='name string']");

Wird kein Element gefunden, bricht das Skript mit einer Fehlermeldung ab. Soll stattdessen nur eine Warnung ausgegeben werden, muss eine der folgenden Funktionen benutzt werden:

  • find_element_by_class
  • find_element_by_class_name
  • find_element_by_css
  • find_element_by_id
  • find_element_by_link
  • find_element_by_link_text
  • find_element_by_name
  • find_element_by_partial_link_text
  • find_element_by_tag_name
  • find_element_by_xpath

Daneben gibt es noch die Funktion $driver->find_child_element. Diese sucht nach einem Element beginnend, ab einem anderen Element als Startpunkt im DOM-Baum. Die Funktion erwartet zwei Argumente:

  1. WebElement-Objekt: Startpunkt der Suche im DOM-Baum.
  2. Das Suchziel: Bezeichner unter dem das Element gefunden werden kann.

In einer XPath-Angabe darf keine absolute Angabe verwendet werden, um nach Kind-Elementen zu suchen. Verwenden Sie stattdessen die relative Angabe.

Usage:

my $start_element = $driver->find_element("//select[@name='ned']");
# note the usage of ./ when searching for a child element instead of //
my $child = $driver->find_child_element($start_element, "./option[@value='es_ar']");

Statt nur nach einem Element (dem ersten) zu suchen, kann auch nach allen Elementen, die auf das Suchmuster passen, gesucht werden. Dazu bietet das Modul die folgenden zwei Funktionen:

  • find_elements
  • find_child_elements

Diese funktionieren analog zu den oben genannten Funktionen, geben aber eine Liste der gefundenen Elemente zurück.

$element->send_keys

Sendet eine Sequenz von Tastendrücken an das Element.

Usage:

$element->send_keys('A', 'B', 'C', "Text");

Um spezielle Tastatur-Ereignisse zu senden, muss das Modul WDKeys benutzt werden:

use Selenium::Remote::WDKeys; # include the WDKeys module
$element->send_keys(KEYS->{'space'}, KEYS->{'enter'});

Alle verfügbaren Tastatur-Ereignisse sind unter https://github.com/teodesian/Selenium-Remote-Driver/blob/master/lib/Selenium/Remote/WDKeys.pm#L17 definiert.

$element->click

Klickt auf das Element.

Usage:

$element->click();

$element->get_attribute

Gibt den Wert eines Attributs zurück.

Die Funktion erwartet als Argument, den Namen des Attributs.

Usage:

my $attribute = $element->get_attribute('attribute name');

$element->get_text

Gibt den Wert von innerText/textContent zurück.

Usage:

my $text = $element->get_text;

XML Path Language (XPath)

XPath wird verwendet, um durch die Elemente und Attribute - dem sog. Document Object Model (DOM) - eines XML-Dokument zu navigieren. Es ist ein Teil des W3C XSLT-Standards. Siehe auch:

Zum untersuchen des DOM und erstellen von XPath-Angaben, eigenen sich die Firefox Erweiterungen/Add-ons FireXPath und Firebug.

Neuere Versionen von Firefox vereinen vieles im Add-on Web Developer und dann unter dem Menüpunkt Element untersuchen des Kontext-Menüs.

Formulardetails anzeigen lassen

Um die Bezeichner von Formularfeldern herauszufinden, eignet sich ebenfalls das Firefox Add-on Web Developer.

Headless browsing (Xvfb)

Mit dem Paket xvfb, können die Skripts auch headless ausgeführt werden. Xvfb stellt dazu einen X-Server zur Verfügung, welcher auf einem Computer ohne Anzeige usw. läuft.

Das Skript muss dann über den Wrapper xvfb-run gestartet werden:

xvfb-run --auto-servernum <script.pl> [OPTIONS…]

In Skripten kann auch folgender Shebang genutzt werden:

#!/usr/bin/env -S xvfb-run --auto-servernum perl

Und für Cronjob empfiehlt sich der Shebang:

#!/usr/bin/env -S lckdo -q filename.lock chronic xvfb-run -a sh

Dies legt die Lockdatei ~/filename.lock an und sperrt so das Skript um eine doppelte Ausführung zu unterbinden. Außerdem erfolgt eine Ausgabe nur im Fehlerfehl.

Cookies speichern und wieder setzen

use Storable qw(store retrieve);
use Fcntl 'O_RDONLY', 'O_RDWR', 'O_CREAT';
my $cookies_path = "./cookies";
# Cookies öffnen
my $cookies = ( -r $cookies_path ) ? retrieve($cookies_path) : [];
for ( @{$cookies} ) {
    eval {
        $_->{secure}   = 0;    # overwrite
        $_->{httponly} = 0;    # overwrite

        $driver->add_cookie(
            $_->{name},   $_->{value},  $_->{path},
            $_->{domain}, $_->{secure}, $_->{httponly}
        );
    };
    @_ && warn @_;
}

# Cookies speichern
store( $driver->get_all_cookies, $cookies_path );

Weblinks

Friday, February 14, 2020

Pi Network invitation code

Pi is a new digital currency being developed by a group of Stanford PhDs. For a limited time, you can join the beta to earn Pi and help grow the network. To join Pi, follow this link https://minepi.com/eber501 and use my username (eber501) as your invitation code.

Friday, August 9, 2019

NAS mit Samba: Verzeichnis im Netzwerk freigeben

Ein Verzeichnis mit dem Windows AD und SMB/CIFS Dateiserver für UNIX über das Netzwerk freigeben und Benutzern sowie Gästen Lese- und Schreibzugriff gewähren.

Dieses Setup für ein NAS mit Samba erlaubt neben Benutzern, auch Gästen Lese- und Schreibzugriff. So kann jeder auf das Netzlaufwerk zugreifen! Durch das Stiky-Bit ist jedoch sichergestellt, das niemand die Dateien eines anderen löschen oder überschreiben kann.

Verzeichnis anlegen und Samba konfigurieren

Das Verzeichnis für das NAS legt man am besten unterhalb von /srv an. Dieses Verzeichnis enthält betriebsspezifische Daten, die vom System bereitgestellt werden und folgt dem FHS.

mkdir -p /srv/nas     # neues Verzeichnis erstellen
chmod a+rwXt /srv/nas # Dateirechte und StickyBit setzen

Im Verzeichnis /srv/nas können nun alle Benutzer unter ihrer UID Dateien erstellen, ändern und löschen. Die Dateien anderer Benutzer können nur geöffnet, nicht aber geändert oder gelöscht werden. Will man dies erlauben, muss man mit Benutzergruppen (GID) arbeiten.

Um das Verzeichnis freizugeben, muss die Konfiguration smb.conf(5) um folgende Sektion erweitert werden:

cat <<! >>/etc/samba/smb.conf
[NAS]
	comment=NAS
	path=/srv/nas
	public = yes
	writeable = yes
	guest ok = yes
	guest account = nobody
	create mask = 0665
	directory mask = 0775
!

Mit testparm(1) kann die Konfigurationsdatei auf Syntaktische Korrektheit überprüft werden.

testparm

Benutzern den Zugriff erlauben

Damit Benutzer unter ihrer ID Dateien im NAS und auch im Benutzerverzeichnis ablegen können, muss für jeden ein Passwort in der Benutzerdatenbank von Samba einrichten sein. Ohne Passwort können Benutzer weder lesend noch schreibend auf ihr Benutzerverzeichnis zugreifen. Es besteht allerdings auch die Möglichkeit, Benutzer ohne Passwort zu aktiveren. Linux und Samba verwenden unterschiedliche Passwörter.

Zum Erstellen des Passworts in der Samba-Benutzerdatenbank smbpasswd(5) kann entweder pdbedit(8) oder smbpasswd(8) verwendet werden.

Hinweis: Will man $HOME nicht freigeben, empfiehlt es sich die Sektion [homes] in der smb.conf(5) auszukommentieren.

Passwort anlegen

Das Passwort für einen Benutzer wird mit smbpasswd -a <username> angelegt.

Wird smbpasswd(8) ohne Parameter aufgerufen, kann das Passwort des aktuellen Benutzers geändert werden.

Das anlegen des Passwords kann für neue Benutzerkonten auch während der Einrichtung passieren. Dazu legt man die Datei /usr/local/sbin/adduser.local an. Wenn die Datei existiert, wird sie nach der Einrichtung des Benutzerkontos ausgeführt, um lokale Einstellungen vorzunehmen.

cat <<! >/usr/local/sbin/adduser.local
#!/bin/sh
# An adduser.local werden die folgenden Argumente übergeben:
# Benutzername, UID, GID und Home-Verzeichnis.

user="$1"
uid="$2"
gid="$3"
home="$4"

smbpasswd -a "$user" # add new users to the local smbpasswd(5) file

# Make sure that the script will "exit 0"
exit 0
!
chmod -x /usr/local/sbin/adduser.local

Passwort entfernen

Um ein Benutzerkonto beim entfernen auch aus der Samba-Benutzerdatenbank auszutragen, kann die /usr/local/sbin/deluser.local analog zu adduser.local angelegt werden.

cat <<! >/usr/local/sbin/deluser.local 
#!/bin/sh
# An deluser.local werden die folgenden Argumente übergeben:
# Benutzername, UID, GID und Home-Verzeichnis.

user="$1"
uid="$2"
gid="$3"
home="$4"

smbpasswd -x "$user" # delete user from the local smbpasswd(5) file

# Make sure that the script will "exit 0"
exit 0
!
chmod -x /usr/local/sbin/deluser.local

Zur Verwaltung der Samba-Benutzerdatenbank bietet sich pdbedit(8) an. Damit kann u.a. abgefragt werden, für welche Benutzer in der Samba-Benutzerdatenbank ein Passwort vergeben wurde.

pdbedit -L

Netzlaufwerke einbinden

Unter Linux (GNOME), Microsoft Windows usw. sollte das NAS als Netzwerkfreigabe gefunden werden.

Für einen Datentransfer über Samba, wird eine Pfadangabe bzw. URI der folgenden Form benutzt:

smb://{hostname|ip}/NAS

Mailingliste abonnieren

Um Ankündigungen, wie z.B. Benachrichtigungen über neue Versionen und Bugs zu erfahren, sollte man zusätzlich die Samba Mailingliste abonnieren. Die Adresse ist unter https://lists.samba.org zu finden und es sollte mindestens samba-announce abonniert werden.

NAS mit SFTP

Ist SSH bzw. das Paket openssh-sftp-server installiert, kann auch via SSH auf das Benutzerverzeichnis zugegriffen werden. Und viele Dateimanager unterstützen das SSH-Protokoll SFTP.

Für einen Datentransfer über SSH an einem entfernten Rechner, benutzt man eine URI der Form:

sftp://[username@]{hostname|IP}[:port]/path/to/share

Alternativ können statt des Authority-Teil, auch die Aliasnamen aus ssh_config(5) verwendet werden.