<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>PM Code Works</title><link href="https://www.pm-codeworks.de/" rel="alternate"/><link href="https://www.pm-codeworks.de/feeds/all.atom.xml" rel="self"/><id>https://www.pm-codeworks.de/</id><updated>2020-01-22T10:33:00+01:00</updated><subtitle>Open Source Software</subtitle><entry><title>RandTune</title><link href="https://www.pm-codeworks.de/randtune.html" rel="alternate"/><published>2020-01-22T10:33:00+01:00</published><updated>2020-01-22T10:33:00+01:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2020-01-22:/randtune.html</id><summary type="html">&lt;p&gt;Organise and practise your tunes!&lt;/p&gt;
&lt;p&gt;You like to play Irish Traditional Folk and attend trad sessions? RandTune can be your handy assistant. You can create Tunebooklets that contain all of your tunes and RandTune rolls the dice for you to generate random sets of three tunes of the same type …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Organise and practise your tunes!&lt;/p&gt;
&lt;p&gt;You like to play Irish Traditional Folk and attend trad sessions? RandTune can be your handy assistant. You can create Tunebooklets that contain all of your tunes and RandTune rolls the dice for you to generate random sets of three tunes of the same type (e.g. reel). With this method, RandTune is able to support you in practising tunes and start sets. It is possible to save custom sets as well as to sort the tunes by name, type or key.&lt;/p&gt;
&lt;p&gt;&lt;a href='https://play.google.com/store/apps/details?id=de.pmcw.randomtune&amp;pcampaignid=pcampaignidMKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'&gt;&lt;img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png' width='300px'/&gt;&lt;/a&gt;&lt;/p&gt;</content><category term="Projects"/><category term="Android"/></entry><entry><title>Clearas</title><link href="https://www.pm-codeworks.de/clearas.html" rel="alternate"/><published>2019-09-22T23:00:00+02:00</published><updated>2019-09-22T23:00:00+02:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2019-09-22:/clearas.html</id><summary type="html">&lt;p&gt;Clearas ist ein Reinigungsprogramm zum Editieren von Autostart-Programmen, Kontextmenüeinträgen, Diensten sowie geplanter Aufgaben unter Windows. Es begann als Neuimplementierung des msconfig Programms mit Inspirationen von CCleaner. Jetzt ist es ein Open-Source Reinigungsprogramm für fortgeschrittene Benutzer, die die Möglichkeit haben möchten, Autostart, Kontextmenü, Dienste und geplante Aufgaben flexibler und mit erweiterten …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Clearas ist ein Reinigungsprogramm zum Editieren von Autostart-Programmen, Kontextmenüeinträgen, Diensten sowie geplanter Aufgaben unter Windows. Es begann als Neuimplementierung des msconfig Programms mit Inspirationen von CCleaner. Jetzt ist es ein Open-Source Reinigungsprogramm für fortgeschrittene Benutzer, die die Möglichkeit haben möchten, Autostart, Kontextmenü, Dienste und geplante Aufgaben flexibler und mit erweiterten Möglichkeiten zu bearbeiten.&lt;/p&gt;
&lt;h2&gt;Autostart&lt;/h2&gt;
&lt;p&gt;Unter dem Reiter Autostart werden alle Programme aufgelistet, die beim Start von Windows ausgeführt werden. Jedes dieser Programme kann prinzipiell deaktiviert werden, um den Startvorgang von Windows zu beschleunigen. Jedoch sollten nicht alle Programme deaktiviert, da es auch wichtige Hintergrund-Programme gibt, die bei jedem Windows-Start ausgeführt werden müssen. Meistens hilft es den Dateipfad zur Anwendung zu betrachten. Enthält dieser einen bekannten Hardware-Hersteller, wird davon abgeraten, diesen Eintrag zu deaktivieren.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Autostart Einträge mit Clearas bearbeiten" src="https://www.pm-codeworks.de/media/Clearas/clearas_autostart.png"&gt;&lt;/p&gt;
&lt;p&gt;Das Löschen von Autostart-Programmen ist auch möglich, jedoch wird davon dringend abgeraten, da es unwiderruflich ist. Stattdessen sollte Deaktivieren bevorzugt verwendet werden. Zur Sicherheit wird die Möglichkeit beim Löschen geboten, den Eintrag als Registrierungsdatei zu exportieren, die später wieder importiert werden kann. Der komplette Autostart kann übrigens auch als Registrierungsdatei über den Menüpunkt "Einträge exportieren" unterhalb des Menüs "Datei" exportiert werden. Über den Menüpunkt "Hinzufügen" können Programme sogar dem Autostart hinzugefügt werden. Weitere Funktionen, wie z.B. den Speicherort eines Eintrags herauszufinden, können über das Kontextmenü, dass durch einen Rechtsklick angezeigt wird, aufgerufen werden.&lt;/p&gt;
&lt;h2&gt;Kontextmenü&lt;/h2&gt;
&lt;p&gt;Unter dem Reiter Kontextmenü ist es möglich Kontextmenüeinträge im Windows Explorer, die sich in den Jahren angesammelt haben, mit wenigen Klicks zu entfernen. Standardmäßig werden nur häufig genutzte Kontextmenüeinträge angezeigt. Um z.B. speziellen Dateitypen zugeordnete Kontextmenüs zu finden, wurde ein Expertenmodus hinzugefügt. Mit ihm werden tiefe Strukturen der Registry nach diesen Einträgen durchsucht. Da dabei meist eine große Anzahl gefunden wird, wurde eine Schnellsuche hinzugefügt, mit der nach bestimmten Einträgen gesucht werden kann.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Kontextmenüeinträge mit Clearas bearbeiten" src="https://www.pm-codeworks.de/media/Clearas/clearas_kontext.png"&gt;&lt;/p&gt;
&lt;p&gt;Über den Menüpunkt "Hinzufügen" können eigene Kontextmenüeinträge hinzugefügt werden.&lt;/p&gt;
&lt;h3&gt;ShellNew-Einträge&lt;/h3&gt;
&lt;p&gt;Clearas bietet die Möglichkeit, sog. ShellNew-Einträge zu bearbeiten, die im Hintergrund Kontextmenü des Windows Explorers unter "Neu" zu finden sind.&lt;/p&gt;
&lt;p&gt;&lt;img alt="ShellNew-Einträge" src="https://www.pm-codeworks.de/media/Clearas/shellnew_aktiviert.png"&gt;&lt;/p&gt;
&lt;p&gt;Falls beispielsweise der Eintrag "Kontakt" unerwünscht ist, kann dieser durch einen Klick auf "Deaktivieren" aus dem Menü entfernt werden:&lt;/p&gt;
&lt;p&gt;&lt;img alt="ShellNew-Eintrag &amp;quot;Kontakt&amp;quot; deaktivieren" src="https://www.pm-codeworks.de/media/Clearas/clearas_kontext_shellnew_deaktiviert.png"&gt;&lt;/p&gt;
&lt;p&gt;Anschließend ist dieser Eintrag nicht mehr unter "Neu" zu finden:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Kontextmenüeintrag &amp;quot;Neuer Kontakt&amp;quot; entfernt" src="https://www.pm-codeworks.de/media/Clearas/shellnew_deaktiviert.png"&gt;&lt;/p&gt;
&lt;h2&gt;Dienste&lt;/h2&gt;
&lt;p&gt;Auf dem Reiter Dienste ist es möglich, Windows-Dienste zu bearbeiten. Dieses wurde in Anlehnung an das msconfig Feature "Dienste" mit verbesserter Benutzbarkeit und mehr Funktionalität entwickelt. Standardmäßig werden nur automatisch gestartete Dienste mit geringer Priorität angezeigt. Wie auch unter dem Reiter Kontextmenü wurde ein Expertenmodus hinzugefügt, der alle Dienste (außer Treiber- oder Betriebssystem-Dienste) findet. Eine Schnellsuche bietet das Filtern von bestimmten Diensten.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Windows Dienste mit Clearas bearbeiten" src="https://www.pm-codeworks.de/media/Clearas/clearas_dienste.png"&gt;&lt;/p&gt;
&lt;h2&gt;Aufgaben&lt;/h2&gt;
&lt;p&gt;Unter dem Reiter Aufgaben ist es möglich, geplante Aufgaben (ab Windows Vista) zu bearbeiten. Der Expertenmodus findet versteckte Aufgaben. Eine Schnellsuche vereinfacht das Suchen nach bestimmten Aufgaben.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Geplante Aufgaben mit Clearas bearbeiten" src="https://www.pm-codeworks.de/media/Clearas/clearas_aufgaben.png"&gt;&lt;/p&gt;
&lt;p&gt;Clearas unterstützt mehrere Sprachen.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Clearas wird als Setup zum Download angeboten.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=clearas_setup.exe"&gt;Clearas Setup herunterladen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Neben dem Setup kann Clearas auch als Portable Version (ohne Installation) heruntergeladen werden.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=clearas64.exe"&gt;Clearas Portable 64-bit herunterladen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=clearas.exe"&gt;Clearas Portable 32-bit herunterladen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Clearas wurde digital signiert. Um diese Signatur zu verifizieren, wird das &lt;a href="https://www.pm-codeworks.de/pages/zertifikat.html"&gt;Zertifikat&lt;/a&gt; von PM Code Works benötigt.&lt;/p&gt;</content><category term="Projects"/><category term="Windows"/></entry><entry><title>Clearas</title><link href="https://www.pm-codeworks.de/clearas-en.html" rel="alternate"/><published>2019-09-22T23:00:00+02:00</published><updated>2019-09-22T23:00:00+02:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2019-09-22:/clearas-en.html</id><summary type="html">&lt;p&gt;Clearas is a cleansing program to edit autostart, context menu, service and scheduled task items. It started as reimplementation of the msconfig tool with inspirations from CCleaner. Now it is an open-source cleansing program for advanced users who want the ability to manage autostart, context menu, service and scheduled task …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Clearas is a cleansing program to edit autostart, context menu, service and scheduled task items. It started as reimplementation of the msconfig tool with inspirations from CCleaner. Now it is an open-source cleansing program for advanced users who want the ability to manage autostart, context menu, service and scheduled task items in a more flexible way with enhanced possibilities.&lt;/p&gt;
&lt;h2&gt;Autostart&lt;/h2&gt;
&lt;p&gt;The Autostart tab lists all the programs that are executed when Windows is started. Each of these programs can be disabled in principle to speed up the boot process of Windows. However, not all programs should be disabled, as there are also important background programs that need to be run every time Windows is started. Usually it helps to take a look at the file path to the application. If this contains a well-known hardware manufacturer, it is not recommended to disable this entry.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Edit autostart programs using Clearas" src="https://www.pm-codeworks.de/media/Clearas/clearas_autostart.png"&gt;&lt;/p&gt;
&lt;p&gt;The deletion of startup programs is also possible, but it is strongly discouraged because it is irrevocable. Instead, deactivation should preferably be used. For safety reasons, the option to export the entry as a registration file, which can later be imported again, is offered when deleting. Incidentally, the complete autostart can also be exported as a registration file via the menu item "Export entries" below the "File" menu. Using the menu item "Add" programs can even be added to the autostart. Other functions can be accessed via the context menu that is displayed by a right-click.&lt;/p&gt;
&lt;h2&gt;Context menu&lt;/h2&gt;
&lt;p&gt;The context menu tab lists context menu entries seen in the Windows Explorer context menu, which have accumulated over the years. With a few clicks they can be hidden. By default, only frequently used context menu items are displayed. An expert mode was introduced to find special pop-up menus in deep structures of the registry. A quick search is provided to search for specific entries.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Edit context menu items using Clearas" src="https://www.pm-codeworks.de/media/Clearas/clearas_kontext.png"&gt;&lt;/p&gt;
&lt;p&gt;Custom context menu entries can be added via the menu item "Add".&lt;/p&gt;
&lt;h3&gt;ShellNew items&lt;/h3&gt;
&lt;p&gt;Clearas provides the possibility to edit so-called ShellNew entries which can be found under "New" in Windows Explorer background context menu.&lt;/p&gt;
&lt;p&gt;&lt;img alt="ShellNew entries" src="https://www.pm-codeworks.de/media/Clearas/shellnew_aktiviert.png"&gt;&lt;/p&gt;
&lt;p&gt;If the entry "Contact" is e.g. unwanted, it can be removed from the menu by clicking on "Disable":&lt;/p&gt;
&lt;p&gt;&lt;img alt="Disable ShellNew &amp;quot;Contact&amp;quot; entry" src="https://www.pm-codeworks.de/media/Clearas/clearas_kontext_shellnew_deaktiviert.png"&gt;&lt;/p&gt;
&lt;p&gt;Finally this entry cannot be found anymore:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Removed &amp;quot;New contact&amp;quot;" src="https://www.pm-codeworks.de/media/Clearas/shellnew_deaktiviert.png"&gt;&lt;/p&gt;
&lt;h2&gt;Services&lt;/h2&gt;
&lt;p&gt;On the Services tab it is possible to edit Windows services. This is comparable with the msconfig "services" feature but with improved usability and more functionality. Per default, only automatically started services with low priority are displayed. An expert mode has been added to find all services (except driver or operating system services). A quick search provides filtering of certain services.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Edit Windows services with Clearas" src="https://www.pm-codeworks.de/media/Clearas/clearas_dienste.png"&gt;&lt;/p&gt;
&lt;h2&gt;Scheduled tasks&lt;/h2&gt;
&lt;p&gt;The Scheduled Tasks tab makes it possible to edit scheduled tasks of Windows (since Vista). The expert mode finds hidden tasks and the quick search makes it easy to search for specific tasks.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Edit scheduled tasks using Clearas" src="https://www.pm-codeworks.de/media/Clearas/clearas_aufgaben.png"&gt;&lt;/p&gt;
&lt;p&gt;Clearas supports multiple languages.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Clearas is primary distributed as setup.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=clearas_setup.exe"&gt;Download Clearas Setup&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In addition to the setup, Clearas can also be downloaded as a portable version (without installation).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=clearas64.exe"&gt;Download Clearas Portable 64-bit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=clearas.exe"&gt;Download Clearas Portable 32-bit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Clearas has been digitally signed. To verify the signature the &lt;a href="https://www.pm-codeworks.de/pages/zertifikat-en.html"&gt;certificate&lt;/a&gt; of PM Code Works must be installed.&lt;/p&gt;</content><category term="Projects"/><category term="Windows"/></entry><entry><title>PAM RFID</title><link href="https://www.pm-codeworks.de/pamrfid.html" rel="alternate"/><published>2019-05-25T13:09:00+02:00</published><updated>2019-05-25T13:09:00+02:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2019-05-25:/pamrfid.html</id><summary type="html">&lt;p&gt;PAM RFID ist ein Linux PAM Modul, womit sich ein Benutzer mit einer RFID Karte an seinem Rechner anmelden kann. PAM RFID benutzt dazu einen EM4100 kompatiblen RFID-Leser (z.B. RDM6300), der mittels USB-TTL Adapter an den Rechner angeschlossen wird. Mit ein wenig handwerklichem Geschick, kann der Sensor in einem …&lt;/p&gt;</summary><content type="html">&lt;p&gt;PAM RFID ist ein Linux PAM Modul, womit sich ein Benutzer mit einer RFID Karte an seinem Rechner anmelden kann. PAM RFID benutzt dazu einen EM4100 kompatiblen RFID-Leser (z.B. RDM6300), der mittels USB-TTL Adapter an den Rechner angeschlossen wird. Mit ein wenig handwerklichem Geschick, kann der Sensor in einem kleinen Universalgehäuse untergebracht werden:&lt;/p&gt;
&lt;p&gt;&lt;img alt="PAM RFID" src="https://www.pm-codeworks.de/media/PamRfid/DSC_5817.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Für die Steuerung des RFID-Lesers wird die Python Bibliothek &lt;a href="https://www.pm-codeworks.de/pyrfid.html"&gt;PyRfid&lt;/a&gt; verwendet. Falls kein RFID-Leser angeschlossen ist, wird die Standard-Passwortauthentisierung benutzt. Das Einrichten einer Zwei-Faktor-Authentifizierung ist zudem möglich. PAM RFID wird mit dem Programm &lt;code&gt;pamrfid-conf&lt;/code&gt; konfiguriert.&lt;/p&gt;
&lt;h2&gt;Hardware&lt;/h2&gt;
&lt;p&gt;PAM RFID benötigt folgende Hardware:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EM4100 kompatibler 125kHz RFID-Leser (z.B. RDM6300)&lt;/li&gt;
&lt;li&gt;Mindestens eine 125kHz RFID-Karte (sog. RFID-Tag)&lt;/li&gt;
&lt;li&gt;USB-TTL Adapter&lt;/li&gt;
&lt;li&gt;(optional) Universalgehäuse (75x55x25mm)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Anschluss der Hardware&lt;/h3&gt;
&lt;p&gt;Der RFID-Sensor wird wie folgt mit dem USB-TTL Adapter verbunden:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Anschluss von Sensor und USB-TTL Adapter" src="https://www.pm-codeworks.de/media/PamRfid/DSC_5824.jpg"&gt;&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Nachdem das PM Code Works &lt;a href="https://www.pm-codeworks.de/pages/apt-repository.html"&gt;APT-Repository&lt;/a&gt; hinzugefügt wurde, kann das Paket einfach mit folgendem Befehl installiert werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;libpam-rfid
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Anschließend fehlende Pakete installieren:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Einrichtung&lt;/h2&gt;
&lt;p&gt;Da PAM RFID über USB kommuniziert und dies standardmäßig nur "root" vorbehalten ist, muss jedem Benutzer, der PAM RFID benutzen will, dies zuerst erlaubt werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;usermod&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;-G&lt;span class="w"&gt; &lt;/span&gt;dialout&lt;span class="w"&gt; &lt;/span&gt;username
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ein Neustart ist anschließend erforderlich. Danach können Benutzer zu PAM RFID hinzugefügt werden.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;PAM RFID besteht zum einen aus dem Linux PAM Modul selbst und einem konsolenbasierten Konfigurationsprogramm, um Benutzer hinzuzufügen. Die Authentisierung mittels RFID-Tag wird beispielsweise mit folgendem Befehl für einen Benutzer aktiviert:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pamrfid-conf&lt;span class="w"&gt; &lt;/span&gt;--add-user&lt;span class="w"&gt; &lt;/span&gt;username
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Um zu überprüfen, ob sich der gerade hinzufügte Benutzer mit dem RFID-Tag anmelden kann, wird der folgende Befehl benutzt:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;pamrfid-conf&lt;span class="w"&gt; &lt;/span&gt;--check-user&lt;span class="w"&gt; &lt;/span&gt;username
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Hier sollte das eben eingelesene RFID-Tag wieder benutzt werden. Währendessen werden einige Informationen in der Konsole ausgegeben. Steht am Ende "successful", war der Test erfolgreich und der Benutzer kann sich in Zukunft mit seinem RFID-Tag anmelden.&lt;/p&gt;
&lt;p&gt;Die Anmeldedaten von PAM RFID werden in der Datei &lt;code&gt;/etc/pamrfid.conf&lt;/code&gt; unterhalb der Sektion &lt;code&gt;[users]&lt;/code&gt; gespeichert. Der Aufbau eines Eintrags ist dabei:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Benutzername = Salt, Salted-SHA256(RFID-Tag)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In der anderen Sektion &lt;code&gt;[PyRfid]&lt;/code&gt; können Einstellungen des RFID-Lesers geändert werden.&lt;/p&gt;
&lt;p&gt;Da PAM RFID komplett in Python implementiert wurde, ist es auf jeder Architektur verwendbar, für die eine Python Implementierung vorhanden ist. Somit kann auch der Raspberry Pi mit der ARM-HF Architektur unter Verwendung von beispielsweise Raspbian mit PAM RFID betrieben werden.&lt;/p&gt;
&lt;h2&gt;Eigenes PAM Modul&lt;/h2&gt;
&lt;p&gt;Wie genau PAM funktioniert und wie eigene PAM Module implementiert und in Linux integriert werden können, gibt es eine Anleitung unter &lt;a href="https://www.pm-codeworks.de/linux-pam.html"&gt;Linux PAM&lt;/a&gt;.&lt;/p&gt;</content><category term="Projects"/><category term="Python"/><category term="Debian"/></entry><entry><title>PAM RFID</title><link href="https://www.pm-codeworks.de/pamrfid-en.html" rel="alternate"/><published>2019-05-25T13:09:00+02:00</published><updated>2019-05-25T13:09:00+02:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2019-05-25:/pamrfid-en.html</id><summary type="html">&lt;p&gt;PAM RFID is a Linux Pluggable Authentication Module (PAM) for RFID authentication. It uses an EM4100 compatible RFID reader (e.g. RDM6300) in conjunction with the &lt;a href="https://www.pm-codeworks.de/pyrfid.html"&gt;PyRfid&lt;/a&gt; library. With a little manual skill, the reader can be build in a small universal housing:&lt;/p&gt;
&lt;p&gt;&lt;img alt="PAM RFID" src="https://www.pm-codeworks.de/media/PamRfid/DSC_5817.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Per default the password authentication is set …&lt;/p&gt;</summary><content type="html">&lt;p&gt;PAM RFID is a Linux Pluggable Authentication Module (PAM) for RFID authentication. It uses an EM4100 compatible RFID reader (e.g. RDM6300) in conjunction with the &lt;a href="https://www.pm-codeworks.de/pyrfid.html"&gt;PyRfid&lt;/a&gt; library. With a little manual skill, the reader can be build in a small universal housing:&lt;/p&gt;
&lt;p&gt;&lt;img alt="PAM RFID" src="https://www.pm-codeworks.de/media/PamRfid/DSC_5817.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Per default the password authentication is set as fallback in case no RFID reader is connected. Two-factor authentication is also possible. The module has to be configured by the &lt;code&gt;pamrfid-conf&lt;/code&gt; program.&lt;/p&gt;
&lt;h2&gt;Hardware&lt;/h2&gt;
&lt;p&gt;PAM RFID requires some hardware:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EM4100 compatible 125kHz RFID reader (e.g. RDM6300)&lt;/li&gt;
&lt;li&gt;At least one 125kHz RFID tag&lt;/li&gt;
&lt;li&gt;USB-TTL converter&lt;/li&gt;
&lt;li&gt;(optional) universal housing (75x55x25)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Connection of the RFID reader&lt;/h3&gt;
&lt;p&gt;RFID reader and the USB-TTL converter are connected like in the following image:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Connection of the reader" src="https://www.pm-codeworks.de/media/PamRfid/DSC_5824.jpg"&gt;&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;After adding the PM Code Works &lt;a href="https://www.pm-codeworks.de/pages/apt-repository-en.html"&gt;APT repository&lt;/a&gt; to the system package sources, the package can be installed using following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;libpam-rfid
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Install missing dependencies:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Setup&lt;/h2&gt;
&lt;p&gt;Since PAM RFID communicates via USB and only root is allowed to do this, every user that wants to use PAM RFID must be granted access for using USB:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;usermod&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;-G&lt;span class="w"&gt; &lt;/span&gt;dialout&lt;span class="w"&gt; &lt;/span&gt;username
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A reboot is now required. After that users can be added to PAM RFID.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;PAM RFID consists of the Linux PAM module itself and a console-based configuration utility to add users. To enable RFID authentication for a user use e.g. the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pamrfid-conf&lt;span class="w"&gt; &lt;/span&gt;--add-user&lt;span class="w"&gt; &lt;/span&gt;username
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Remind to replace &lt;code&gt;username&lt;/code&gt; by a real user. Using this command a RFID tag is enrolled twice. To test if added user can login with the tag use e.g. the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;pamrfid-conf&lt;span class="w"&gt; &lt;/span&gt;--check-user&lt;span class="w"&gt; &lt;/span&gt;username
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;During the test some information are printed on the console. If output in last line is "successful" everything works as it should and user is able to use RFID authentication in the future.&lt;/p&gt;
&lt;p&gt;Credendentials of PAM RFID are stored in the file &lt;code&gt;/etc/pamrfid.conf&lt;/code&gt; inside the section &lt;code&gt;[users]&lt;/code&gt;. The structure of an entry is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;username = salt, salted-SHA256(RFID tag)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The other section &lt;code&gt;[PyRfid]&lt;/code&gt; contains settings of the RFID reader.&lt;/p&gt;
&lt;p&gt;Since PAM RFID is purely written in Python it can also be run on ARM-HF based Raspberry Pi.&lt;/p&gt;
&lt;h2&gt;How to write your own PAM module&lt;/h2&gt;
&lt;p&gt;How PAM works and how PAM modules are written and added to Linux see &lt;a href="https://www.pm-codeworks.de/linux-pam.html"&gt;Linux PAM&lt;/a&gt;.&lt;/p&gt;</content><category term="Projects"/><category term="Python"/><category term="Debian"/></entry><entry><title>PAM Fingerprint</title><link href="https://www.pm-codeworks.de/pamfingerprint.html" rel="alternate"/><published>2019-05-25T13:00:00+02:00</published><updated>2019-05-25T13:00:00+02:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2019-05-25:/pamfingerprint.html</id><summary type="html">&lt;p&gt;PAM Fingerprint ist ein Linux PAM Modul, womit sich ein Benutzer mit seinem Fingerabdruck an seinem Rechner anmelden kann. PAM Fingerprint benutzt dazu Hardware-seitig den ZFM-20 von Zhaintec (auch bekannt als "Arduino Fingerprint Sensor"), der mittels USB-TTL Adapter an den Rechner angeschlossen wird.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fingerabdrucksensor" src="https://www.pm-codeworks.de/media/Pamfingerprint/fingerprint-sensor.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Für die Steuerung des Fingerabdrucksensors wird die …&lt;/p&gt;</summary><content type="html">&lt;p&gt;PAM Fingerprint ist ein Linux PAM Modul, womit sich ein Benutzer mit seinem Fingerabdruck an seinem Rechner anmelden kann. PAM Fingerprint benutzt dazu Hardware-seitig den ZFM-20 von Zhaintec (auch bekannt als "Arduino Fingerprint Sensor"), der mittels USB-TTL Adapter an den Rechner angeschlossen wird.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fingerabdrucksensor" src="https://www.pm-codeworks.de/media/Pamfingerprint/fingerprint-sensor.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Für die Steuerung des Fingerabdrucksensors wird die Python Bibliothek &lt;a href="https://github.com/bastianraschke/pyfingerprint" target="_blank"&gt;PyFingerprint&lt;/a&gt; verwendet. Mit ein wenig handwerklichem Geschick, kann der Sensor in einem kleinen Universalgehäuse untergebracht werden:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fingerabdrucksensor in Gehäuse" src="https://www.pm-codeworks.de/media/Pamfingerprint/fingerprint-einheit.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Falls kein Fingerabdrucksensor angeschlossen ist, wird die Standard-Passwortauthentisierung benutzt. Das Einrichten einer Zwei-Faktor-Authentifizierung ist zudem möglich. PAM Fingerprint wird mit dem Programm &lt;code&gt;pamfingerprint-conf&lt;/code&gt; konfiguriert.&lt;/p&gt;
&lt;h2&gt;Hardware&lt;/h2&gt;
&lt;p&gt;PAM Fingerprint benötigt folgende Hardware:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zhaintec ZFM-20 (auch bekannt als "Arduino Fingerprint Sensor")&lt;/li&gt;
&lt;li&gt;USB-TTL Adapter&lt;/li&gt;
&lt;li&gt;(optional) Universalgehäuse (75x55x25)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Anschluss des Sensors&lt;/h3&gt;
&lt;p&gt;Der Fingerabdrucksensor wird wie folgt mit dem USB-TTL Adapter verbunden:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Anschluss der Sensors" src="https://sicherheitskritisch.de/images/verbindung-fingerprint-sensor-konverter.png"&gt;&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Nachdem das PM Code Works &lt;a href="https://www.pm-codeworks.de/pages/apt-repository.html"&gt;APT-Repository&lt;/a&gt; hinzugefügt wurde, kann das Paket einfach mit folgendem Befehl installiert werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;libpam-fingerprint
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Anschließend fehlende Pakete installieren:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Einrichtung&lt;/h2&gt;
&lt;p&gt;Da PAM Fingerprint über USB kommuniziert und dies standardmäßig nur "root" vorbehalten ist, muss jedem Benutzer, der PAM Fingerprint benutzen will, dies zuerst erlaubt werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;usermod&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;-G&lt;span class="w"&gt; &lt;/span&gt;dialout&lt;span class="w"&gt; &lt;/span&gt;username
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ein Neustart ist anschließend erforderlich. Danach können Benutzer zu PAM Fingerprint hinzugefügt werden.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;PAM Fingerprint besteht zum einen aus dem Linux PAM Modul selbst und einem konsolenbasierten Konfigurationsprogramm, um Benutzer hinzuzufügen. Die Fingerabdruckauthentisierung wird beispielsweise mit folgendem Befehl für einen Benutzer aktiviert:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pamfingerprint-conf&lt;span class="w"&gt; &lt;/span&gt;--add-user&lt;span class="w"&gt; &lt;/span&gt;username
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Dabei wird ein beliebiger Finger zweimal eingelesen. Um zu überprüfen, ob sich der gerade hinzufügte Benutzer mit seinem Fingerabdruck anmelden kann, wird der folgende Befehl benutzt:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;pamfingerprint-conf&lt;span class="w"&gt; &lt;/span&gt;--check-user&lt;span class="w"&gt; &lt;/span&gt;username
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Die LED des Sensors sollte anfangen zu leuchten und der eben eingelesene Finger sollte wieder benutzt werden. Währendessen werden einige Informationen in der Konsole ausgegeben. Steht am Ende "successful", war der Test erfolgreich und der Benutzer kann sich in Zukunft mit seinem Finger anmelden.&lt;/p&gt;
&lt;p&gt;Die Anmeldedaten von PAM Fingerprint werden in der Datei &lt;code&gt;/etc/pamfingerprint.conf&lt;/code&gt; unterhalb der Sektion &lt;code&gt;[users]&lt;/code&gt; gespeichert. Der Aufbau eines Eintrags ist dabei:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Benutzername = Fingerabdruck-ID, SHA256(Fingerabdruck)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In der anderen Sektion &lt;code&gt;[PyFingerprint]&lt;/code&gt; können Einstellungen des Fingerabdrucksensors geändert werden.&lt;/p&gt;
&lt;p&gt;Da PAM Fingerprint komplett in Python implementiert wurde, ist es auf jeder Architektur verwendbar, für die eine Python Implementierung vorhanden ist. Somit kann auch der Raspberry Pi mit der ARM-HF Architektur unter Verwendung von Raspbian, mit PAM Fingerprint betrieben werden.&lt;/p&gt;
&lt;h2&gt;Eigenes PAM Modul&lt;/h2&gt;
&lt;p&gt;Wie genau PAM funktioniert und wie eigene PAM Module implementiert und in Linux integriert werden können, gibt es eine Anleitung unter &lt;a href="https://www.pm-codeworks.de/linux-pam.html"&gt;Linux PAM&lt;/a&gt;.&lt;/p&gt;</content><category term="Projects"/><category term="Python"/><category term="Debian"/></entry><entry><title>PAM Fingerprint</title><link href="https://www.pm-codeworks.de/pamfingerprint-en.html" rel="alternate"/><published>2019-05-25T13:00:00+02:00</published><updated>2019-05-25T13:00:00+02:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2019-05-25:/pamfingerprint-en.html</id><summary type="html">&lt;p&gt;PAM Fingerprint is a Linux Pluggable Authentication Module (PAM) for password-less fingerprint authentication. It uses the ZhianTec ZFM-20 fingerprint sensor (a.k.a. "Arduino fingerprint sensor")&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fingerprint sensor" src="https://www.pm-codeworks.de/media/Pamfingerprint/fingerprint-sensor.jpg"&gt;&lt;/p&gt;
&lt;p&gt;in conjunction with the &lt;a href="https://github.com/bastianraschke/pyfingerprint" target="_blank"&gt;PyFingerprint&lt;/a&gt; library. With a little manual skill, the sensor can be build in a small universal housing:&lt;/p&gt;
&lt;p&gt;&lt;img alt="PAM Fingerprint" src="https://www.pm-codeworks.de/media/Pamfingerprint/fingerprint-einheit.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Per default the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;PAM Fingerprint is a Linux Pluggable Authentication Module (PAM) for password-less fingerprint authentication. It uses the ZhianTec ZFM-20 fingerprint sensor (a.k.a. "Arduino fingerprint sensor")&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fingerprint sensor" src="https://www.pm-codeworks.de/media/Pamfingerprint/fingerprint-sensor.jpg"&gt;&lt;/p&gt;
&lt;p&gt;in conjunction with the &lt;a href="https://github.com/bastianraschke/pyfingerprint" target="_blank"&gt;PyFingerprint&lt;/a&gt; library. With a little manual skill, the sensor can be build in a small universal housing:&lt;/p&gt;
&lt;p&gt;&lt;img alt="PAM Fingerprint" src="https://www.pm-codeworks.de/media/Pamfingerprint/fingerprint-einheit.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Per default the password authentication is set as fallback in case no fingerprint sensor is connected. Two-factor authentication is also possible. The module has to be configured by the &lt;code&gt;pamfingerprint-conf&lt;/code&gt; program.&lt;/p&gt;
&lt;h2&gt;Hardware&lt;/h2&gt;
&lt;p&gt;PAM Fingerprint requires some hardware:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zhaintec ZFM-20 (a.k.a. "Arduino fingerprint sensor")&lt;/li&gt;
&lt;li&gt;USB-TTL converter&lt;/li&gt;
&lt;li&gt;(optional) universal housing (75x55x25)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Connection of the sensor&lt;/h3&gt;
&lt;p&gt;The sensor and the USB-TTL converter are connected like in the following image:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Connection of the sensor" src="https://sicherheitskritisch.de/images/verbindung-fingerprint-sensor-konverter.png"&gt;&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;After adding the PM Code Works &lt;a href="https://www.pm-codeworks.de/pages/apt-repository-en.html"&gt;APT repository&lt;/a&gt; to the system package sources, the package can be installed using following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;libpam-fingerprint
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Install missing dependencies:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Setup&lt;/h2&gt;
&lt;p&gt;Since PAM Fingerprint communicates via USB and only root is allowed to do this, every user that wants to use PAM Fingerprint must be granted access for using USB:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;usermod&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;-G&lt;span class="w"&gt; &lt;/span&gt;dialout&lt;span class="w"&gt; &lt;/span&gt;username
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A reboot is now required. After that users can be added to PAM Fingerprint.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;PAM Fingerprint consists of the Linux PAM module itself and a console-based configuration utility to add users. To enable fingerprint authentication for a user use e.g. the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pamfingerprint-conf&lt;span class="w"&gt; &lt;/span&gt;--add-user&lt;span class="w"&gt; &lt;/span&gt;username
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Remind to replace &lt;code&gt;username&lt;/code&gt; by a real user. Using this command a finger is enrolled twice. To test if added user can login with the finger use e.g. the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;pamfingerprint-conf&lt;span class="w"&gt; &lt;/span&gt;--check-user&lt;span class="w"&gt; &lt;/span&gt;username
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The sensor LED should light up and the enrolled finger should be used. During the test some information are printed on the console. If output in last line is "successful" everything works as it should and user is able to use fingerprint authentication in the future.&lt;/p&gt;
&lt;p&gt;Credendentials of PAM Fingerprint are stored in the file &lt;code&gt;/etc/pamfingerprint.conf&lt;/code&gt; inside the section &lt;code&gt;[users]&lt;/code&gt;. The structure of an entry is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;username = Template-ID, SHA256(Fingerprint)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The other section &lt;code&gt;[PyFingerprint]&lt;/code&gt; contains settings of the fingerprint sensor.&lt;/p&gt;
&lt;p&gt;Since PAM Fingerprint is purely written in Python it can also be run on ARM-HF based Raspberry Pi.&lt;/p&gt;
&lt;h2&gt;How to write your own PAM module&lt;/h2&gt;
&lt;p&gt;How PAM works and how PAM modules are written and added to Linux see &lt;a href="https://www.pm-codeworks.de/linux-pam.html"&gt;Linux PAM&lt;/a&gt;.&lt;/p&gt;</content><category term="Projects"/><category term="Python"/><category term="Debian"/></entry><entry><title>Game Wake</title><link href="https://www.pm-codeworks.de/gamewake.html" rel="alternate"/><published>2018-03-11T18:15:00+01:00</published><updated>2018-03-11T18:15:00+01:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2018-03-11:/gamewake.html</id><summary type="html">&lt;p&gt;Game Wake ist ein virtueller Wecker, den man sich stellen kann, um nicht, z.B. während des exzessiven Gamings, die Pizza im Ofen zu vergessen. Aber auch sonst eignet sich Game Wake zum Erinnern an alle möglichen Dinge. Es gibt 4 verschiedene Alarm-Sounds zur Auswahl und eine "Herunterfahren"-Funktion. Neben …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Game Wake ist ein virtueller Wecker, den man sich stellen kann, um nicht, z.B. während des exzessiven Gamings, die Pizza im Ofen zu vergessen. Aber auch sonst eignet sich Game Wake zum Erinnern an alle möglichen Dinge. Es gibt 4 verschiedene Alarm-Sounds zur Auswahl und eine "Herunterfahren"-Funktion. Neben den Audiosignalen kann Game Wake visuell in einer festgelegten Farbe blinken und zusätzlich eine textbasierte Erinnerung angezeigen. Game Wake verfügt über zwei verschiedene Betriebs-Modi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;"Timer Modus": Standard-Wecker-Funktion, d.h. es kann der Zeitpunkt eingestellt werden, an dem der Alarm ertönen soll&lt;/li&gt;
&lt;li&gt;"Counter Modus": Es können Stunden und Minuten eingestellt werden, die vergehen sollen, bis der Alarm ertönt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sobald der Alarm gestellt ist, wird Game Wake durch Klicken des "Schließen-Knopfs" nicht beendet, sondern in den Tray (Bereich neben der Uhr) minimiert. Diese Funktion wurde eingebaut, um versehendliches Beenden während der Alarm noch gestellt ist, zu verhindern. Soll Game Wake trotzdem beenden werden, muss lediglich ein Rechtsklick auf das Tray-Symbol ausgeführt und dort die Aktion "Beenden" gewählt werden.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Game Wake" src="https://www.pm-codeworks.de/media/GameWake/gamewake.png"&gt;&lt;/p&gt;
&lt;p&gt;Game Wake speichert die Einstellungen in einer INI-Datei. Über den Menüpunkt "Optionen" kann ausgewählt werden, was gespeichert werden soll. Es werden mehrere Sprachen unterstützt.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Game Wake ist für Debian und Windows verfügbar.&lt;/p&gt;
&lt;h3&gt;Linux&lt;/h3&gt;
&lt;p&gt;Nachdem das PM Code Works &lt;a href="https://www.pm-codeworks.de/pages/apt-repository.html"&gt;APT-Repository&lt;/a&gt; hinzugefügt wurde, kann das Paket einfach mit folgendem Befehl installiert werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;gamewake
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Anschließend fehlende Pakete installieren:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Windows&lt;/h3&gt;
&lt;p&gt;Game Wake wird als Setup zum Download angeboten.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=game_wake_setup.exe"&gt;Game Wake Setup herunterladen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.softpedia.com/get/Desktop-Enhancements/Clocks-Time-Management/Game-Wake.shtml"&gt;&lt;img alt="Softpedia Zertifizierung" src="https://s1.softpedia-static.com/_img/sp100clean.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Neben dem Setup kann Game Wake auch als Portable Version (ohne Installation) heruntergeladen werden.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=gamewake64.exe"&gt;Game Wake Portable 64-bit herunterladen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=gamewake.exe"&gt;Game Wake Portable 32-bit herunterladen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Game Wake wurde digital signiert. Um diese Signatur zu verifizieren, wird das &lt;a href="https://www.pm-codeworks.de/pages/zertifikat.html"&gt;Zertifikat&lt;/a&gt; von PM Code Works benötigt.&lt;/p&gt;</content><category term="Projects"/><category term="Windows"/><category term="Debian"/></entry><entry><title>Game Wake</title><link href="https://www.pm-codeworks.de/gamewake-en.html" rel="alternate"/><published>2018-03-11T18:15:00+01:00</published><updated>2018-03-11T18:15:00+01:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2018-03-11:/gamewake-en.html</id><summary type="html">&lt;p&gt;Game Wake is a simple to configure virtual alarm clock application. It provides multiple types of alerts and features both a timer and counter mode. Four different sounds can be played. The sounds can be combined with a text message and a blinking effect. Instead of using notifications a shutdown …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Game Wake is a simple to configure virtual alarm clock application. It provides multiple types of alerts and features both a timer and counter mode. Four different sounds can be played. The sounds can be combined with a text message and a blinking effect. Instead of using notifications a shutdown can be initiated. Game Wake supports two operation modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;"Timer Mode": Default alarm function where the time can be set at which the alarm should start&lt;/li&gt;
&lt;li&gt;"Counter Mode": Hours and minutes that should elapse before the alarm starts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once the alarm has been set, clicking on the "Close" button will not terminate Game Wake, but minimize it to the tray icon area. This feature has been incorporated to prevent accidental termination while the alarm is still set. If you want to terminate Game Wake anyway, simply right-click on the tray icon and select "Exit".&lt;/p&gt;
&lt;p&gt;&lt;img alt="Game Wake" src="https://www.pm-codeworks.de/media/GameWake/gamewake.png"&gt;&lt;/p&gt;
&lt;p&gt;Game Wake stores its settings in an INI based configuration file. The menu item "Options" can be used to select what should be saved. Multiple languages are supported.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Game Wake is available for Debian and Windows.&lt;/p&gt;
&lt;h3&gt;Linux&lt;/h3&gt;
&lt;p&gt;After adding the PM Code Works &lt;a href="https://www.pm-codeworks.de/pages/apt-repository-en.html"&gt;APT repository&lt;/a&gt; to the system package sources, the package can be installed using following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;libpam-fingerprint
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Install missing dependencies:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Windows&lt;/h3&gt;
&lt;p&gt;Game Wake is primary distributed as setup.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=game_wake_setup.exe"&gt;Download Game Wake Setup&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.softpedia.com/get/Desktop-Enhancements/Clocks-Time-Management/Game-Wake.shtml"&gt;&lt;img alt="Softpedia certification" src="https://s1.softpedia-static.com/_img/sp100clean.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In addition to the setup, Game Wake can also be downloaded as a portable version (without installation).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=gamewake64.exe"&gt;Download Game Wake Portable 64-bit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=gamewake.exe"&gt;Download Game Wake Portable 32-bit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Game Wake has been digitally signed. To verify the signature the &lt;a href="https://www.pm-codeworks.de/pages/zertifikat-en.html"&gt;certificate&lt;/a&gt; of PM Code Works must be installed.&lt;/p&gt;</content><category term="Projects"/><category term="Windows"/><category term="Debian"/></entry><entry><title>Android Studio Package</title><link href="https://www.pm-codeworks.de/android-studio-package.html" rel="alternate"/><published>2017-12-21T15:45:00+01:00</published><updated>2017-12-21T15:45:00+01:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2017-12-21:/android-studio-package.html</id><summary type="html">&lt;p&gt;Android Studio Package ist ein Programm zum einfachen Erstellen von Debian Paketen von heruntergeladenen Android Studio ZIP-Archiven. Zuerst muss ein Android Studio Archiv von &lt;a href="https://developer.android.com/studio/index.html#linux-bundle"&gt;https://developer.android.com/studio/index.html#linux-bundle&lt;/a&gt; heruntergeladen werden. Anschließend kann das Debian Paket mittels folgendem Befehls erstellt werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;make-aspkg&lt;span class="w"&gt; &lt;/span&gt;android-studio.zip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Das Debian Paket …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Android Studio Package ist ein Programm zum einfachen Erstellen von Debian Paketen von heruntergeladenen Android Studio ZIP-Archiven. Zuerst muss ein Android Studio Archiv von &lt;a href="https://developer.android.com/studio/index.html#linux-bundle"&gt;https://developer.android.com/studio/index.html#linux-bundle&lt;/a&gt; heruntergeladen werden. Anschließend kann das Debian Paket mittels folgendem Befehls erstellt werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;make-aspkg&lt;span class="w"&gt; &lt;/span&gt;android-studio.zip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Das Debian Paket wird im aktuellen Verzeichnis gepeichert.&lt;/p&gt;
&lt;h2&gt;Probleme beim erstellen des Debian Pakets auf einem 32-bit Debian&lt;/h2&gt;
&lt;p&gt;Um ein Android Studio Debian Paket auf einem 32-bit Debian zu erstellen, muss die 64-bit Version des Pakets &lt;code&gt;libc6&lt;/code&gt; installiert sein. Andernfalls wird folgender Fehler auftreten &lt;code&gt;dpkg-shlibdeps: error: couldn't find library libc.so.6&lt;/code&gt;. Debian bietet &lt;a href="https://wiki.debian.org/Multiarch/HOWTO" target="_blank"&gt;Multiarch&lt;/a&gt;, um Pakete anderer Architekturen zu installieren:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dpkg&lt;span class="w"&gt; &lt;/span&gt;--add-architecture&lt;span class="w"&gt; &lt;/span&gt;amd64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Dadurch kann die 64-bit Version des Pakets &lt;code&gt;libc6&lt;/code&gt; installiert werden&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;libc6:amd64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Anschließend sollten Android Studio Debian Pakete auf einem 32-bit Debian ohne Probleme erstellt werden können.&lt;/p&gt;
&lt;h2&gt;Installation von Android Studio&lt;/h2&gt;
&lt;p&gt;Damit Android Studio auf einem 64-bit Debian installiert werden kann, müssen einige 32-bit Pakete installiert sein. Dafür wird wieder Debian &lt;a href="https://wiki.debian.org/Multiarch/HOWTO" target="_blank"&gt;Multiarch&lt;/a&gt; verwendet:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dpkg&lt;span class="w"&gt; &lt;/span&gt;--add-architecture&lt;span class="w"&gt; &lt;/span&gt;i386
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Android Studio mittels folgendem Befehl installieren&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dpkg&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;android-studio_*.deb
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Abschließend fehlende Pakete installieren&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Hinweis:&lt;/strong&gt; Android Studio benötigt mindestens Java 8.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Nachdem das PM Code Works &lt;a href="https://www.pm-codeworks.de/pages/apt-repository.html"&gt;APT-Repository&lt;/a&gt; hinzugefügt wurde, kann das Paket einfach mit folgendem Befehl installiert werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;android-studio-package
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Anschließend fehlende Pakete installieren:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Projects"/><category term="Debian"/></entry><entry><title>Android Studio Package</title><link href="https://www.pm-codeworks.de/android-studio-package-en.html" rel="alternate"/><published>2017-12-21T15:45:00+01:00</published><updated>2017-12-21T15:45:00+01:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2017-12-21:/android-studio-package-en.html</id><summary type="html">&lt;p&gt;Android Studio Package is an utility to build Debian package from an Android Studio binary distribution archive. First such an Android Studio IDE archive file must be downloaded from &lt;a href="https://developer.android.com/studio/index.html"&gt;https://developer.android.com/studio/index.html&lt;/a&gt;. After that the Debian package can be built with the following command&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;make-aspkg&lt;span class="w"&gt; &lt;/span&gt;android-studio …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;Android Studio Package is an utility to build Debian package from an Android Studio binary distribution archive. First such an Android Studio IDE archive file must be downloaded from &lt;a href="https://developer.android.com/studio/index.html"&gt;https://developer.android.com/studio/index.html&lt;/a&gt;. After that the Debian package can be built with the following command&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;make-aspkg&lt;span class="w"&gt; &lt;/span&gt;android-studio.zip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The Debian package is stored in the current directory.&lt;/p&gt;
&lt;h2&gt;Problems when building on 32-bit Debian&lt;/h2&gt;
&lt;p&gt;To build Android Studio on 32-bit Debian the 64-bit version of &lt;code&gt;libc6&lt;/code&gt; library is required. Otherwise following error will occur &lt;code&gt;dpkg-shlibdeps: error: couldn't find library libc.so.6&lt;/code&gt;. Use &lt;a href="https://wiki.debian.org/Multiarch/HOWTO" target="_blank"&gt;Multiarch&lt;/a&gt; capabilities of Debian and enable installation of 64-bit packages:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dpkg&lt;span class="w"&gt; &lt;/span&gt;--add-architecture&lt;span class="w"&gt; &lt;/span&gt;amd64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Install 64-bit version of &lt;code&gt;libc6&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;libc6:amd64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then building will succeed on 32-bit Debian.&lt;/p&gt;
&lt;h2&gt;Installation of Android Studio&lt;/h2&gt;
&lt;p&gt;If Android Studio should be installed on 64-bit Debian some 32-bit libraries are required. It is recommended to use &lt;a href="https://wiki.debian.org/Multiarch/HOWTO" target="_blank"&gt;Multiarch&lt;/a&gt; capabilities of Debian and enable installation of 32-bit packages:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dpkg&lt;span class="w"&gt; &lt;/span&gt;--add-architecture&lt;span class="w"&gt; &lt;/span&gt;i386
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then install Android Studio&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dpkg&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;android-studio_*.deb
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Finally install missing dependencies&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Please remind that Android Studio requires at least Java 8.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;After adding the PM Code Works &lt;a href="https://www.pm-codeworks.de/pages/apt-repository-en.html"&gt;APT repository&lt;/a&gt; to the system package sources, the package can be installed using following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;android-studio-package
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Install missing dependencies:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Projects"/><category term="Debian"/></entry><entry><title>Eclipse Package</title><link href="https://www.pm-codeworks.de/eclipse-package.html" rel="alternate"/><published>2017-10-02T10:20:00+02:00</published><updated>2017-10-02T10:20:00+02:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2017-10-02:/eclipse-package.html</id><summary type="html">&lt;p&gt;Eclipse Package ist ein Programm zum einfachen Erstellen von Debian Paketen von heruntergeladenen Eclipse IDE Archiven. Zuerst muss ein Eclipse Archiv Paket von &lt;a href="https://www.eclipse.org/downloads/packages"&gt;https://www.eclipse.org/downloads/packages&lt;/a&gt; heruntergeladen werden. Anschließend kann das Debian Paket mittels folgendem Befehl automatisch erstellt werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;make-eclipsepkg&lt;span class="w"&gt; &lt;/span&gt;eclipse-edition.tar.gz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Das Debian Paket wird …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Eclipse Package ist ein Programm zum einfachen Erstellen von Debian Paketen von heruntergeladenen Eclipse IDE Archiven. Zuerst muss ein Eclipse Archiv Paket von &lt;a href="https://www.eclipse.org/downloads/packages"&gt;https://www.eclipse.org/downloads/packages&lt;/a&gt; heruntergeladen werden. Anschließend kann das Debian Paket mittels folgendem Befehl automatisch erstellt werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;make-eclipsepkg&lt;span class="w"&gt; &lt;/span&gt;eclipse-edition.tar.gz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Das Debian Paket wird im aktuellen Verzeichnis gespeichert und kann mit folgendem Befehl installiert werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dpkg&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;eclipse-*.deb
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Abschließend fehlende Pakete installieren&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Nachdem das PM Code Works &lt;a href="https://www.pm-codeworks.de/pages/apt-repository.html"&gt;APT-Repository&lt;/a&gt; hinzugefügt wurde, kann das Paket einfach mit folgendem Befehl installiert werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;eclipse-package
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Anschließend fehlende Pakete installieren:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Projects"/><category term="Debian"/></entry><entry><title>Eclipse Package</title><link href="https://www.pm-codeworks.de/eclipse-package-en.html" rel="alternate"/><published>2017-10-02T10:20:00+02:00</published><updated>2017-10-02T10:20:00+02:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2017-10-02:/eclipse-package-en.html</id><summary type="html">&lt;p&gt;Eclipse Package is an utility to build Debian packages from an Eclipse binary distribution archive. First such an Eclipse IDE archive file must be downloaded from &lt;a href="https://www.eclipse.org/downloads/eclipse-packages/"&gt;https://www.eclipse.org/downloads/eclipse-packages/&lt;/a&gt;. After that the Debian package can be built with the following command&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;make-eclipsepkg&lt;span class="w"&gt; &lt;/span&gt;eclipse-edition.tar.gz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The Debian …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Eclipse Package is an utility to build Debian packages from an Eclipse binary distribution archive. First such an Eclipse IDE archive file must be downloaded from &lt;a href="https://www.eclipse.org/downloads/eclipse-packages/"&gt;https://www.eclipse.org/downloads/eclipse-packages/&lt;/a&gt;. After that the Debian package can be built with the following command&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;make-eclipsepkg&lt;span class="w"&gt; &lt;/span&gt;eclipse-edition.tar.gz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The Debian package is stored in the current directory and can be installed using&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dpkg&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;eclipse-*.deb
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Finally install missing dependencies&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;After adding the PM Code Works &lt;a href="https://www.pm-codeworks.de/pages/apt-repository-en.html"&gt;APT repository&lt;/a&gt; to the system package sources, the package can be installed using following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;eclipse-package
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Install missing dependencies:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Projects"/><category term="Debian"/></entry><entry><title>DDNS Updater</title><link href="https://www.pm-codeworks.de/ddns-updater.html" rel="alternate"/><published>2017-07-14T15:20:00+02:00</published><updated>2017-07-14T15:20:00+02:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2017-07-14:/ddns-updater.html</id><summary type="html">&lt;p&gt;DDNS Updater ist ein Python Programm, welches eine dynamische IP-Adresse auf einem DNS Server aktualisert. Wird z.B. ein eigener Web-Server an einem (NAT-)Router betrieben muss die externe IP-Adresse des Routers benutzt werden, um auf diesen Server zugreifen zu können. Da sich IP-Adressen nur bedingt merken lassen, wurde DNS …&lt;/p&gt;</summary><content type="html">&lt;p&gt;DDNS Updater ist ein Python Programm, welches eine dynamische IP-Adresse auf einem DNS Server aktualisert. Wird z.B. ein eigener Web-Server an einem (NAT-)Router betrieben muss die externe IP-Adresse des Routers benutzt werden, um auf diesen Server zugreifen zu können. Da sich IP-Adressen nur bedingt merken lassen, wurde DNS (&lt;a href="https://de.wikipedia.org/wiki/Domain_Name_System" target="_blank"&gt;Domain Name System&lt;/a&gt;) entwickelt. DNS löst Domain Namen in (statische) IP-Adressen auf. Da sich IP-Adressen von Routern sporadisch (alle paar Wochen) ändern, liefert DNS, nach solch einer Änderung, immernoch die alte IP-Adresse. Eine Aktualisierung der IP-Adresse auf dem DNS Server ist also notwendig, um weiterhin Zugriff auf seinen (internen) Web-Server zu bekommen. Dieser Vorgang der Aktualisierung wird durch eine Variante von DNS dem &lt;a href="https://de.wikipedia.org/wiki/Dynamisches_DNS" target="_blank"&gt;Dynamischen DNS übernommen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Um immer die aktuellste IP-Adresse auf dem DNS-Server zu hinterlegen, wurde DDNS Updater entwickelt. Es gibt zwar bereits einige solcher Programme. Meist bieten diese unnütze Funktionen, sind kompliziert zu konfigurieren und funktionieren teilweise nicht korrekt. DDNS Updater ist sehr schlank, einfach zu konfigurieren und bietet E-Mail Benachrichtigungen bei Fehlern und erfolgreicher Aktualisierung.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Nachdem das PM Code Works &lt;a href="https://www.pm-codeworks.de/pages/apt-repository.html"&gt;APT-Repository&lt;/a&gt; hinzugefügt wurde, kann das Paket einfach mit folgendem Befehl installiert werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;ddns-updater
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Anschließend fehlende Pakete installieren:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Konfiguration&lt;/h2&gt;
&lt;p&gt;Konfiguriert wird DDNS Updater über die Konfigurationsdatei &lt;code&gt;/etc/ddns-updater/ddns.conf&lt;/code&gt;, welche den Aufbau einer INI-Datei hat. Darin gibt es Konfigurationsmöglichkeiten, die im Folgenden erläutert werden:&lt;/p&gt;
&lt;h3&gt;Sektion [DDNS]&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;server&lt;/code&gt;: Diese Variable muss den Domain-Namen des DNS-Server Providers (ohne &lt;em&gt;http://&lt;/em&gt;), z.B. &lt;em&gt;dyndns.strato.com&lt;/em&gt;, beinhalten.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;server_path&lt;/code&gt;: Diese Variable muss den URL-Pfad zum DNS-Server Verzeichnis beinhalten. Bei Strato ist dieser beispielsweise &lt;em&gt;/nic/update&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;username&lt;/code&gt;: Benutzername des Kontos bei dem DNS-Server Provider.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;password&lt;/code&gt;: Das zugehörige Passwort zum Benutzernamen.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hostname&lt;/code&gt;: Der Domain-Name, der zur Verfügung gestellt werden soll.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ip&lt;/code&gt;: Diese Variable sollte nicht verändert werden. Darin speichert DDNS Updater die aktuelle IP-Adresse ab. Falls sich diese ändert, aktualisiert das Programm sofort die IP-Adresse auf dem DNS Server.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;external_ip_server&lt;/code&gt;: Diese Variable muss einen externen Web Server beinhalten, der die Fähigkeit besitzt, die externe IP-Adresse des Routers zurück zu liefern. checkip.dyndns.com ist beispielsweise ein bekannter Server. Eigene (externe) Web Server können auch dazu benutzt werden. Ein simples PHP-Skript (&lt;em&gt;checkip.php&lt;/em&gt;) befindet sich in &lt;code&gt;/usr/share/doc/ddns-updater/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;external_ip_server_path&lt;/code&gt;: URL-Pfad zum PHP Skript auf einem externen Web Server. Falls der checkip.dyndns.com Server benutzt wird ist hier lediglich ein &lt;em&gt;/&lt;/em&gt; einzutragen.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;use_regex&lt;/code&gt;: Diese Variable aktiviert bzw. deaktiviert die Nutzung eines regulären Ausdrucks (RegEx), um die IP-Adresse aus einer HTTP-Antwort im HTML-Format auszulesen. Falls &lt;em&gt;checkip.dyndns.com&lt;/em&gt; benutzt wird, muss diese Variable auf &lt;code&gt;True&lt;/code&gt; gesetzt werden und andernfalls auf &lt;code&gt;False&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Sektion [Mail]&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;notify&lt;/code&gt;: Durch diese Variable werden E-Mail Benachrichtigungen aktiviert bzw. deaktiviert. Falls aktiviert (True) werden Mails bei Fehlern und nach erfolgreicher Aktualisierung der IP-Adresse verschickt.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;smtp_server&lt;/code&gt;: SMTP Postausgangsserver von dem die E-Mail Benachrichtigungen verschickt werden.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;port&lt;/code&gt;: Port des Postausgangsservers (587 oder 465).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;username&lt;/code&gt;: Benutzername des E-Mail Kontos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;password&lt;/code&gt;: Das zugehörige Passwort zum Benutzernamen des E-Mail-Kontos. &lt;strong&gt;Hinweis:&lt;/strong&gt; Das Passwort sowie der Benutzername werden mit TLS verschlüsselt übertragen.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;recipient&lt;/code&gt;: E-Mail-Adresse des Empfängers an den die E-Mail Benachrichtigungen versandt werden.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Intervall&lt;/h3&gt;
&lt;p&gt;DDNS Updater überprüft standardmäßig alle 10 Minuten, ob sich die IP-Adresse geändert hat. Falls ja wird diese automatisch aktualisiert. Somit wird eine Aktualisierung nicht unnötig vorgenommen. Das Interval kann in der Datei &lt;code&gt;/etc/cron.d/ddns-updater&lt;/code&gt; geändert werden.&lt;/p&gt;
&lt;h2&gt;Weitere Befehle&lt;/h2&gt;
&lt;p&gt;Standardmäßig wird die Konfigurationsdatei &lt;code&gt;/etc/ddns-updater/ddns.conf&lt;/code&gt; beim Starten geladen. Mit folgendem Befehl kann eine andere Datei geladen werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;ddns-updater&lt;span class="w"&gt; &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;/Pfad/zu/einer/anderen/Konfigurationsdatei
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;DDNS Updater unterstützt mehrere DDNS Profile. Jede Sektion innerhalb der Konfigurationsdatei bildet ein solches Profil. Standardmäßig wird das Profil "DDNS" geladen. Durch folgenden Befehl kann auch ein anderes Profil geladen werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;ddns-updater&lt;span class="w"&gt; &lt;/span&gt;--profile&lt;span class="w"&gt; &lt;/span&gt;PROFILNAME
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Projects"/><category term="Python"/><category term="Debian"/></entry><entry><title>DDNS Updater</title><link href="https://www.pm-codeworks.de/ddns-updater-en.html" rel="alternate"/><published>2017-07-14T15:20:00+02:00</published><updated>2017-07-14T15:20:00+02:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2017-07-14:/ddns-updater-en.html</id><summary type="html">&lt;p&gt;DDNS Updater is a Python program to update a dynamic IP address on a DNS server using the NIC V2.0 protocol. If hosting a private webserver connected to a NAT router the external IP address
of the router must be used to get access this webserver. Since IP addresses …&lt;/p&gt;</summary><content type="html">&lt;p&gt;DDNS Updater is a Python program to update a dynamic IP address on a DNS server using the NIC V2.0 protocol. If hosting a private webserver connected to a NAT router the external IP address
of the router must be used to get access this webserver. Since IP addresses are not made for human memory the DNS (&lt;a href="https://de.wikipedia.org/wiki/Domain_Name_System" target="_blank"&gt;Domain Name System&lt;/a&gt;) was invented. DNS resolves domain names into (static) IP addresses. IP addresses of routers change after a few weeks but DNS will not notice anything about it and returns the old IP address. The IP address needs to be updated. This update process is done by a variant of DNS the &lt;a href="https://de.wikipedia.org/wiki/Dynamisches_DNS" target="_blank"&gt;Dynamic DNS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In order to always store the most recent IP address on the DNS server, DDNS Updater was developed. There are already some such programs elsewhere. Most of them provide useless functions, are complicated to configure and sometimes do not work properly. DDNS Updater is very slim, easy to configure and provides optional email alerts for errors and successful updates.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;After adding the PM Code Works &lt;a href="https://www.pm-codeworks.de/pages/apt-repository-en.html"&gt;APT repository&lt;/a&gt; to the system package sources, the package can be installed using following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;ddns-updater
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Install missing dependencies:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Setup&lt;/h2&gt;
&lt;p&gt;Edit the file &lt;code&gt;/etc/ddns-updater/ddns.conf&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Section [DDNS]&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;server&lt;/code&gt;: The domain name of DNS server providers (without &lt;em&gt;http://&lt;/em&gt;) e.g. &lt;em&gt;dyndns.strato.com&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;server_path&lt;/code&gt;: The URL path to the DNS server directory e.g. &lt;em&gt;/nic/update&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;username&lt;/code&gt;: Account name at DNS server provider.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;password&lt;/code&gt;: Password for account at DNS server provider.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hostname&lt;/code&gt;: The domain that should be provided.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ip&lt;/code&gt;: Do not edit this. It is maintained by DDNS Updater and contains the current IP address.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;external_ip_server&lt;/code&gt;: An public available webserver that sends the current IP, e.g. &lt;em&gt;checkip.dyndns.com&lt;/em&gt;. Self-hosted servers are also possible by using the simple PHP script &lt;em&gt;checkip.php&lt;/em&gt; located in &lt;code&gt;/usr/share/doc/ddns-updater/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;external_ip_server_path&lt;/code&gt;: URL path to the directory where the PHP script is located e.g. &lt;em&gt;/&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;use_regex&lt;/code&gt;: (Optional) Set to &lt;code&gt;True&lt;/code&gt; to extract the IP address out of HTML formatted HTTP response e.g. when using &lt;em&gt;checkip.dyndns.com&lt;/em&gt; in &lt;code&gt;external_ip_server&lt;/code&gt;. When using self-hosted server with &lt;em&gt;checkip.php&lt;/em&gt; script set to &lt;code&gt;False&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Section [Mail]&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;notify&lt;/code&gt;: (Optional) Set to &lt;code&gt;True&lt;/code&gt; to enable e-mail notifications like successful IP address updates or errors. Please configure following value or set to &lt;code&gt;False&lt;/code&gt; to disable notifications. Then the following configuration is not necessary.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;smtp_server&lt;/code&gt;: SMTP Server to send the e-mails from.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;port&lt;/code&gt;: Port of the SMTP server e.g. 587 or 465.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;username&lt;/code&gt;: E-mail account name.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;password&lt;/code&gt;: E-mail account password. &lt;strong&gt;Don't worry:&lt;/strong&gt; TLS is used during exchange!&lt;/li&gt;
&lt;li&gt;&lt;code&gt;recipient&lt;/code&gt;: E-mail account that should receive the notifications.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Interval&lt;/h3&gt;
&lt;p&gt;Every 10 minutes DDNS Updater verifies if the IP address has changed and performs an update if necessary. The interval can be changed by editing file &lt;code&gt;/etc/cron.d/ddns-updater&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Additional commands&lt;/h2&gt;
&lt;p&gt;The configuration file &lt;code&gt;/etc/ddns-updater/ddns.conf&lt;/code&gt; is loaded per default during execution. It is possible to load another configuration file by using following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;ddns-updater&lt;span class="w"&gt; &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;/path/to/another/file.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;DDNS Updater supports multiple DDNS profiles. Every section inside the configuration file specifies a profile. Per default the profile &lt;em&gt;DDNS&lt;/em&gt; is loaded. To load another profile use the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;ddns-updater&lt;span class="w"&gt; &lt;/span&gt;--profile&lt;span class="w"&gt; &lt;/span&gt;PROFILENAME
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Projects"/><category term="Python"/><category term="Debian"/></entry><entry><title>PyRFID</title><link href="https://www.pm-codeworks.de/pyrfid.html" rel="alternate"/><published>2017-05-08T12:21:00+02:00</published><updated>2017-05-08T12:21:00+02:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2017-05-08:/pyrfid.html</id><summary type="html">&lt;p&gt;PyRFID ist eine Python Bibliothek zur Ansteuerung eines 125kHz UART RFID-Lesers unter Verwendung des &lt;a href="http://www.priority1design.com.au/em4100_protocol.html" target="_blank"&gt;EM4100 Protokolls&lt;/a&gt;. Entwickelt wurde mit dem günstigen RDM6300 RFID-Modul. PyRFID kommt auch bei &lt;a href="https://www.pm-codeworks.de/pamrfid.html"&gt;PAM RFID&lt;/a&gt; zum Einsatz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wichtig:&lt;/strong&gt; Zur Verwendung von PyRFID muss der RFID-Leser das EM4100 Protokoll unterstützen!&lt;/p&gt;
&lt;p&gt;Der Leser wird mittels USB-TTL Adapter an …&lt;/p&gt;</summary><content type="html">&lt;p&gt;PyRFID ist eine Python Bibliothek zur Ansteuerung eines 125kHz UART RFID-Lesers unter Verwendung des &lt;a href="http://www.priority1design.com.au/em4100_protocol.html" target="_blank"&gt;EM4100 Protokolls&lt;/a&gt;. Entwickelt wurde mit dem günstigen RDM6300 RFID-Modul. PyRFID kommt auch bei &lt;a href="https://www.pm-codeworks.de/pamrfid.html"&gt;PAM RFID&lt;/a&gt; zum Einsatz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wichtig:&lt;/strong&gt; Zur Verwendung von PyRFID muss der RFID-Leser das EM4100 Protokoll unterstützen!&lt;/p&gt;
&lt;p&gt;Der Leser wird mittels USB-TTL Adapter an den Rechner angeschlossen (siehe &lt;a href="https://www.pm-codeworks.de/pamrfid.html"&gt;PAM RFID&lt;/a&gt;). Die Kommunikation zwischen Leser und Rechner übernimmt &lt;a href="http://pyserial.sourceforge.net/" target="_blank"&gt;PySerial&lt;/a&gt;. Pro Lesevorgang wird ein Datenpaket ausgetauscht, was die erforderlichen Daten des RFID-Tags enthält. Im Folgenden wird der Aufbau eines solchen Pakets erklärt.&lt;/p&gt;
&lt;h2&gt;Datenpaket&lt;/h2&gt;
&lt;p&gt;Ein Datenpaket besteht aus 10 Byte Nutzdaten und einer 2-Byte Prüfsumme. Anfang und Ende eines solchen Pakets wird durch zwei einzelne Bytes markiert. Das Format eines Datenpakets sieht demnach wie folgt aus:&lt;/p&gt;
&lt;table style="width: 100%" border="1"&gt;
&lt;tbody&gt;
  &lt;tr&gt;
    &lt;td align="center"&gt;0x02&lt;/td&gt;
    &lt;td align="center"&gt;5 Hex-data&lt;/td&gt;
    &lt;td align="center"&gt;Checksum&lt;/td&gt;
    &lt;td align="center"&gt;0x03&lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0x02&lt;/code&gt;: Markiert den Anfang des Datenpakets (Länge 1 Byte)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;5 Hex-data&lt;/code&gt;: RFID-Tag Nummer als Hexa-Dezimal kodiert (Länge 10 Byte; 1 Hex = 2 Byte)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Checksum&lt;/code&gt;: Prüfsumme des Datenpakets (Länge 2 Byte)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0x03&lt;/code&gt;: Markiert das Ende des Datenpakets (Länge 1 Byte)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Um zu überprüfen, ob die RFID-Tag Nummer korrekt übertragen wurde, wird eine Prüfsumme berechnet.&lt;/p&gt;
&lt;h3&gt;Prüfsumme&lt;/h3&gt;
&lt;p&gt;Die Prüfsumme wird nach jedem vollständigen Empfang eines Datenpakets berechnet, indem die 5 hexadezimal kodierten Zahlen durch eine XOR-Operation verbunden werden:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(1. Hex-Zahl) XOR (2. Hex-Zahl) XOR (3. Hex-Zahl) XOR (4. Hex-Zahl) XOR (5. Hex-Zahl)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Das Ergebnis dieser Operation wird dann mit der mitgesendeten Prüfsumme verglichen. Stimmt die berechnete mit der gesendeten Prüfsumme überein, wurde das Datenpaket korrekt übertragen und kann weiterverarbeitet werden. Der Zugriff auf die Nutzdaten durch PyRFID kann nun erfolgen. Um die Prüfsumme auszulesen bietet PyRFID die Methode &lt;code&gt;tagChecksum()&lt;/code&gt; an.&lt;/p&gt;
&lt;h2&gt;Tag-Typen&lt;/h2&gt;
&lt;p&gt;Die Nutzdaten enthalten neben der eigentlichen RFID-Tag Nummer ein Flag zur Bestimmung des Tag-Typs. Dieses Typ-Flag wird von Herstellern von RFID-Tags unterschiedlich genutzt und befindet sich am Anfang der Nutzdaten. PyRFID bietet zum Auslesen des Typs die Python Properties &lt;code&gt;tagType&lt;/code&gt; und &lt;code&gt;tagTypeFloat&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Darstellung&lt;/h2&gt;
&lt;p&gt;Die RFID-Tag Nummer kann unterschiedlich dargestellt werden:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hexadezimal: Hierbei werden die Bytes 0 bis 9 des Tags abgegriffen und "roh" zur Verfügung gestellt. PyRFID bietet dazu die Methode &lt;code&gt;rawTag()&lt;/code&gt;. Beispiel: &lt;code&gt;0F00789A62&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Fließkomma: Hierbei werden die Bytes 2 bis 5 als Vorkommazahl und die Bytes 6 bis 9 als Nachkommazahl benutzt. PyRFID bietet dazu die Methode &lt;code&gt;tagIdFloat()&lt;/code&gt;. Beispiel: &lt;code&gt;120.39522&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Dezimal: Hierbei werden die Bytes 4 bis 9 benutzt und mit Nullen von links auf die Länge 10 aufgefüllt. PyRFID bietet dazu die Methode &lt;code&gt;tagId()&lt;/code&gt;. Beispiel: &lt;code&gt;0007903842&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Auslesen&lt;/h2&gt;
&lt;p&gt;Ein Lesevorgang wird mittels der Methode &lt;code&gt;readTag()&lt;/code&gt; ausgelöst. Diese blockiert solange, bis ein RFID-Tag eingelesen wurde. Im Verzeichnis &lt;code&gt;/usr/share/doc/python-rfid/examples/&lt;/code&gt; befindet sich ein Beispiel, wie PyRFID benutzt wird.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Nachdem das PM Code Works &lt;a href="https://www.pm-codeworks.de/pages/apt-repository.html"&gt;APT-Repository&lt;/a&gt; hinzugefügt wurde, kann das Paket einfach mit folgendem Befehl für Python 2 installiert werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;python-rfid
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Für Python 3 folgenden Befehl verwenden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;python3-rfid
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Anschließend fehlende Pakete installieren:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Alternativ gibt es PyRFID als &lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=pyrfid.zip"&gt;ZIP-Archiv&lt;/a&gt;.&lt;/p&gt;</content><category term="Projects"/><category term="Python"/></entry><entry><title>PyRFID</title><link href="https://www.pm-codeworks.de/pyrfid-en.html" rel="alternate"/><published>2017-05-08T12:21:00+02:00</published><updated>2017-05-08T12:21:00+02:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2017-05-08:/pyrfid-en.html</id><summary type="html">&lt;p&gt;PyRFID is a Python library for using a 125kHz UART RFID reader that uses the &lt;a href="http://www.priority1design.com.au/em4100_protocol.html" target="_blank"&gt;EM4100 protocol&lt;/a&gt;. The cheap RDM6300 RFID reader was used during development. PyRFID is also used in &lt;a href="https://www.pm-codeworks.de/pamrfid.html"&gt;PAM RFID&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; The RFID reader must support the EM4100 protocol to use PyRFID!&lt;/p&gt;
&lt;p&gt;The reader is connected to …&lt;/p&gt;</summary><content type="html">&lt;p&gt;PyRFID is a Python library for using a 125kHz UART RFID reader that uses the &lt;a href="http://www.priority1design.com.au/em4100_protocol.html" target="_blank"&gt;EM4100 protocol&lt;/a&gt;. The cheap RDM6300 RFID reader was used during development. PyRFID is also used in &lt;a href="https://www.pm-codeworks.de/pamrfid.html"&gt;PAM RFID&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; The RFID reader must support the EM4100 protocol to use PyRFID!&lt;/p&gt;
&lt;p&gt;The reader is connected to host computer using an USB-TTL converter (see also &lt;a href="https://www.pm-codeworks.de/pamrfid.html"&gt;PAM RFID&lt;/a&gt;). &lt;a href="http://pyserial.sourceforge.net/" target="_blank"&gt;PySerial&lt;/a&gt; is used for the serial communication.&lt;/p&gt;
&lt;p&gt;Each read process results in an exchange of a data packet which contains the RFID tag information.&lt;/p&gt;
&lt;h2&gt;Data packet&lt;/h2&gt;
&lt;p&gt;A data packet consists of 10 bytes of user data and a 2-byte checksum. The beginning and end of such a packet is marked by two single bytes. The format of a single data packet looks like this:&lt;/p&gt;
&lt;table style="width: 100%" border="1"&gt;
&lt;tbody&gt;
  &lt;tr&gt;
    &lt;td align="center"&gt;0x02&lt;/td&gt;
    &lt;td align="center"&gt;5 Hex-data&lt;/td&gt;
    &lt;td align="center"&gt;Checksum&lt;/td&gt;
    &lt;td align="center"&gt;0x03&lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0x02&lt;/code&gt;: Marks the beginning (length is 1 byte)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;5 Hex-data&lt;/code&gt;: RFID tag number in hexadecimal encoding (length is 10 byte; 1 hex = 2 byte)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Checksum&lt;/code&gt;: Checksum of the data packet (length is 2 byte)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0x03&lt;/code&gt;: Marks the end (length 1 byte)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A checksum is calculated to check whether the RFID tag number has been transmitted correctly.&lt;/p&gt;
&lt;h3&gt;Checksum&lt;/h3&gt;
&lt;p&gt;After each data packet has been fully received the checksum is calculated using an XOR operation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(1. hex number) XOR (2. hex number) XOR (3. hex number) XOR (4. hex number) XOR (5. hex number)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The result of this operation is compared against the received checksum. If the calculated checksum matches the received checksum the data packet was successfully transmitted and can be further processed. To read out the checksum PyRFID provides the method &lt;code&gt;tagChecksum()&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Tag types&lt;/h2&gt;
&lt;p&gt;An RFID tag also contains a flag for determining the type. This flag is used differently by manufacturers of RFID tags and is located at the beginning of the tag number. To read the type flag PyRFID provides the Python properties &lt;code&gt;tagType&lt;/code&gt; and &lt;code&gt;tagTypeFloat&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Formats&lt;/h2&gt;
&lt;p&gt;There are more possibilities to format a RFID tag number:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hexadecimal: Bytes 0 to 9 are used raw e.g. &lt;code&gt;0F00789A62&lt;/code&gt;. To get the data in raw format use the method &lt;code&gt;rawTag()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Floating point: Bytes 2 to 5 are used as number before comma and bytes 6 to 9 are used number after comma e.g. &lt;code&gt;120.39522&lt;/code&gt;. To get data as float use the method &lt;code&gt;tagIdFloat()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Decimal: Bytes 4 to 9 are used and padded with zeros from left side to fit length 10 e.g. &lt;code&gt;0007903842&lt;/code&gt;. To get the data in this format use the methode &lt;code&gt;tagId()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How to read a tag&lt;/h2&gt;
&lt;p&gt;To read a tag PyRFID provides the method &lt;code&gt;readTag()&lt;/code&gt;. This method blocks until a tag has been read. An example can be found in &lt;code&gt;/usr/share/doc/python-rfid/examples/&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;After adding the PM Code Works &lt;a href="https://www.pm-codeworks.de/pages/apt-repository-en.html"&gt;APT repository&lt;/a&gt; to the system package sources, the package can be installed for Python 2 using following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;python-rfid
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For Python 3 use following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;python3-rfid
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Install missing dependencies:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;As an alternative PyRFID is offered as &lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=pyrfid.zip"&gt;ZIP archive&lt;/a&gt;.&lt;/p&gt;</content><category term="Projects"/><category term="Python"/></entry><entry><title>SIT</title><link href="https://www.pm-codeworks.de/sit.html" rel="alternate"/><published>2016-07-08T16:32:00+02:00</published><updated>2016-07-08T16:32:00+02:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2016-07-08:/sit.html</id><summary type="html">&lt;p&gt;SIT alias "Support-Information-Tool" ist ein Programm zum einfachen Eintragen von Herstellerinformationen in die Systemeigenschaften von Windows. IT-Firmen können so mit wenigen Klicks ihren (virtuellen) Firmenstempel auf dem Kunden PC hinterlassen. Logos können ganz einfach per Dialog hinzugefügt werden. Die restlichen Informationen müssen per Hand eingetragen werden. Unter "Datei"--&amp;gt;"Eingaben exportieren …&lt;/p&gt;</summary><content type="html">&lt;p&gt;SIT alias "Support-Information-Tool" ist ein Programm zum einfachen Eintragen von Herstellerinformationen in die Systemeigenschaften von Windows. IT-Firmen können so mit wenigen Klicks ihren (virtuellen) Firmenstempel auf dem Kunden PC hinterlassen. Logos können ganz einfach per Dialog hinzugefügt werden. Die restlichen Informationen müssen per Hand eingetragen werden. Unter "Datei"--&amp;gt;"Eingaben exportieren" können die eingetragenen Informationen aus SIT und unter "Datei"--&amp;gt;"Einträge exportieren" die bestehenden, die in Windows zu finden sind, exportiert werden. Später können diese auch wieder importiert werden.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Herstellerinformationen mit SIT bearbeiten" src="https://www.pm-codeworks.de/media/SIT/sit.png"&gt;&lt;/p&gt;
&lt;p&gt;Ein Klick auf "Übernehmen" und die Informationen werden in den Systemeigenschaften von Windows gespeichert:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Windows Systemeigenschaften" src="https://www.pm-codeworks.de/media/SIT/system.PNG"&gt;&lt;/p&gt;
&lt;p&gt;Die Funktion "Logo kopieren" kopiert ein Logo vom "Logo Pfad" in ein beliebiges Verzeichnis, sodass dieses zentral gespeichert wird und somit immer in den Systemeigenschaften angezeigt werden kann. Falls SIT z.B. von einem USB-Stick ausgeführt wird und das Logo sich auch dort befindet, würde beim Klick auf "Übernehmen" nur der Pfad zum Logo in Windows geschrieben werden und nicht das Logo selbst. Um auch dieses zu Kopieren, kann die Checkbox "Logo kopieren" ausgewählt werden, womit beim "Übernehmen" ein Dialog zur Verzeichnisauswahl angezeigt wird.&lt;/p&gt;
&lt;p&gt;Die Eingaben, sowie die Einträge in Windows, können unter "Bearbeiten" direkt gelöscht werden. Diese und alle anderen Funktionen sind alternativ per Shortcuts ausführbar! SIT unterstützt mehrere Sprachen.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;SIT benötigt keine Installation und ist ab Windows 2000 mit jeder Windows Version kompatibel.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=sit64.exe"&gt;SIT 64-Bit herunterladen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=sit.exe"&gt;SIT 32-Bit herunterladen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;SIT wurde digital signiert. Um diese Signatur zu verifizieren, wird das &lt;a href="https://www.pm-codeworks.de/pages/zertifikat.html"&gt;Zertifikat&lt;/a&gt; von PM Code Works benötigt.&lt;/p&gt;</content><category term="Projects"/><category term="Windows"/></entry><entry><title>SIT</title><link href="https://www.pm-codeworks.de/sit-en.html" rel="alternate"/><published>2016-07-08T16:32:00+02:00</published><updated>2016-07-08T16:32:00+02:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2016-07-08:/sit-en.html</id><summary type="html">&lt;p&gt;SIT a.k.a. "Support Information Tool" is a program to edit the support information in Windows. IT companies can leave their (virtual) company stamp on the customer PC with just a few single clicks.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Edit support information using SIT" src="https://www.pm-codeworks.de/media/SIT/sit.png"&gt;&lt;/p&gt;
&lt;p&gt;Just click apply and support information are stored.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Windows system properties" src="https://www.pm-codeworks.de/media/SIT/system.PNG"&gt;&lt;/p&gt;
&lt;p&gt;The function "Copy Logo" copies a logo …&lt;/p&gt;</summary><content type="html">&lt;p&gt;SIT a.k.a. "Support Information Tool" is a program to edit the support information in Windows. IT companies can leave their (virtual) company stamp on the customer PC with just a few single clicks.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Edit support information using SIT" src="https://www.pm-codeworks.de/media/SIT/sit.png"&gt;&lt;/p&gt;
&lt;p&gt;Just click apply and support information are stored.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Windows system properties" src="https://www.pm-codeworks.de/media/SIT/system.PNG"&gt;&lt;/p&gt;
&lt;p&gt;The function "Copy Logo" copies a logo from the "Logo path" to any directory, so that it is stored centrally and can therefore always be displayed in the system properties. If the logo loaded from an USB stick clicking on "Apply" would write the USB stick path. When removing the USB stick the image is not displayed in the system properties anymore. If selecting the checkbox "Copy logo" a dialog will be displayed when clicking "Apply" to store the logo in a regular filesystem path. SIT supports multiple languages.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;SIT does not need to be installed and is compatible with Windows 2000 and later.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=sit64.exe"&gt;Download SIT 64-bit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=sit.exe"&gt;Download SIT 32-bit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;SIT has been digitally signed. To verify the signature the &lt;a href="https://www.pm-codeworks.de/pages/zertifikat-en.html"&gt;certificate&lt;/a&gt; of PM Code Works must be installed.&lt;/p&gt;</content><category term="Projects"/><category term="Windows"/></entry><entry><title>EasyWinHash</title><link href="https://www.pm-codeworks.de/easywinhash.html" rel="alternate"/><published>2016-05-11T22:45:00+02:00</published><updated>2016-05-11T22:45:00+02:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2016-05-11:/easywinhash.html</id><summary type="html">&lt;p&gt;EasyWinHash ist ein Programm zum einfachen Erzeugen und Überprüfen von kryptografischen Prüfsummen (Hashes) von heruntergeladenen Dateien. Meist bieten Download-Portale solche Prüfsummen neben den eigentlichen Dateien an. Mit EasyWinHash können diese überprüft werden, um sicher zu gehen, dass die Datei nicht verändert bzw. manipuliert wurde. Nutzer haben so die Gewissheit, dass …&lt;/p&gt;</summary><content type="html">&lt;p&gt;EasyWinHash ist ein Programm zum einfachen Erzeugen und Überprüfen von kryptografischen Prüfsummen (Hashes) von heruntergeladenen Dateien. Meist bieten Download-Portale solche Prüfsummen neben den eigentlichen Dateien an. Mit EasyWinHash können diese überprüft werden, um sicher zu gehen, dass die Datei nicht verändert bzw. manipuliert wurde. Nutzer haben so die Gewissheit, dass die heruntergeladene Datei die gleiche ist, die sich im Download-Portal befindet. Schließlich besteht die Möglichkeit, dass diese Datei manipuliert wurde.&lt;/p&gt;
&lt;p&gt;&lt;img alt="EasyWinHash" src="https://www.pm-codeworks.de/media/EasyWinHash/easywinhash.png"&gt;&lt;/p&gt;
&lt;p&gt;Zur Überprüfung der Signatur einer heruntergeladenen Datei muss die Datei zuerst entweder per Drag-and-Drop in das Fenster gezogen werden oder über einen Klick auf das Lupensymbol ausgewählt werden. Anschließend muss die Signatur von der Website kopiert und in das untere Eingabefeld eingefügt werden. Vor einem Klick auf "Überprüfen" muss zudem der richtige Signaturalgorithmus in der linken unteren Ecke ausgewählt werden. Dieser steht meist neben der Signatur der Datei auf der Website. Stimmt die Signatur überein, wird das Feedback von EasyWinHash wie folgt aussehen:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hash stimmt überein" src="https://www.pm-codeworks.de/media/EasyWinHash/easywinhash_success.png"&gt;&lt;/p&gt;
&lt;p&gt;Stimmt die Signatur nicht überein, würde das Feedback von EasyWinHash wie folgt aussehen:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hash stimmt nicht überein" src="https://www.pm-codeworks.de/media/EasyWinHash/easywinhash_failed.png"&gt;&lt;/p&gt;
&lt;p&gt;In diesem Fall sollte die Signatur der Datei erneut mit der auf der Website angegebenen auf Gleichheit überprüft werden. Der verwendete Algorithmus zur Erzeugung der Signatur muss unbedingt auch übereinstimmen. Stimmt die Signatur samt Algorithmus sie überein, sollte die Datei erneut heruntergeladen und überprüft werden.&lt;/p&gt;
&lt;p&gt;EasyWinHash bietet neben einer einfach zu benutzenden grafischen Oberfläche, die Integration in den Windows Explorer.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Explorer Integration von EasyWinHash" src="https://www.pm-codeworks.de/media/EasyWinHash/easywinhash_explorer.png"&gt;&lt;/p&gt;
&lt;p&gt;EasyWinHash unterstützt mehrere Sprachen.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;EasyWinHash ist ab Windows XP mit jeder Windows Version kompatibel und wird als Setup zum Download angeboten.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=easywinhash_setup.exe"&gt;EasyWinHash herunterladen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;EasyWinHash wurde digital signiert. Um diese Signatur zu verifizieren, wird das &lt;a href="https://www.pm-codeworks.de/pages/zertifikat.html"&gt;Zertifikat&lt;/a&gt; von PM Code Works benötigt.&lt;/p&gt;</content><category term="Projects"/><category term="Windows"/></entry><entry><title>EasyWinHash</title><link href="https://www.pm-codeworks.de/easywinhash-en.html" rel="alternate"/><published>2016-05-11T22:45:00+02:00</published><updated>2016-05-11T22:45:00+02:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2016-05-11:/easywinhash-en.html</id><summary type="html">&lt;p&gt;EasyWinHash is a program for easily creating and verifying cryptographic checksums (hashes) of downloaded files. Usually, download portals offer such checksums beside the actual files. Using EasyWinHash these can be checked to make sure that the file has not been altered or tampered. Users can be sure that the downloaded …&lt;/p&gt;</summary><content type="html">&lt;p&gt;EasyWinHash is a program for easily creating and verifying cryptographic checksums (hashes) of downloaded files. Usually, download portals offer such checksums beside the actual files. Using EasyWinHash these can be checked to make sure that the file has not been altered or tampered. Users can be sure that the downloaded file is exactly the same as in the download portal. After all there is the possibility that this file has been tampered.&lt;/p&gt;
&lt;p&gt;&lt;img alt="EasyWinHash" src="https://www.pm-codeworks.de/media/EasyWinHash/easywinhash.png"&gt;&lt;/p&gt;
&lt;p&gt;To verify the signature of a downloaded file, the file must be either dragged and dropped into the window or selected by clicking on the magnifying glass icon. After that the signature has to be copied from the website and pasted into the lower input field. Before clicking on "Verify", the correct signature algorithm must also be selected in the lower left corner. Usually the algorithm is shown next to the signature of the file on the website. If the signature matches, EasyWinHash will look like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hash matches" src="https://www.pm-codeworks.de/media/EasyWinHash/easywinhash_success.png"&gt;&lt;/p&gt;
&lt;p&gt;If the signature does not match EasyWinHash will look like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hash does not match" src="https://www.pm-codeworks.de/media/EasyWinHash/easywinhash_failed.png"&gt;&lt;/p&gt;
&lt;p&gt;In this case, the signature of the file should be checked against the one on the website. The used algorithm must strictly match, too. If the signature and the algorithm match the ones on the website, something is gone wrong and the file should be downloaded and checked again.&lt;/p&gt;
&lt;p&gt;EasyWinHash offers an easy-to-use graphical interface and integrates into Windows Explorer context menu.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Integration in Explorer" src="https://www.pm-codeworks.de/media/EasyWinHash/easywinhash_explorer.png"&gt;&lt;/p&gt;
&lt;p&gt;EasyWinHash supports multiple languages.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;EasyWinHash is distributed as setup and is compatible with Windows XP and later.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pm-codeworks.de/media/downloader.php?file=easywinhash_setup.exe"&gt;Download EasyWinHash&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;EasyWinHash has been digitally signed. To verify the signature the &lt;a href="https://www.pm-codeworks.de/pages/zertifikat-en.html"&gt;certificate&lt;/a&gt; of PM Code Works must be installed.&lt;/p&gt;</content><category term="Projects"/><category term="Windows"/></entry><entry><title>Linux PAM</title><link href="https://www.pm-codeworks.de/linux-pam.html" rel="alternate"/><published>2015-03-02T13:31:00+01:00</published><updated>2015-03-02T13:31:00+01:00</updated><author><name>Philipp Meisberger</name></author><id>tag:www.pm-codeworks.de,2015-03-02:/linux-pam.html</id><summary type="html">&lt;p&gt;PAM, die sog. &lt;a href="https://de.wikipedia.org/wiki/Pluggable_Authentication_Modules" target="_blank"&gt;Pluggable Authentication Modules&lt;/a&gt;, bieten eine Schnittstelle in unixoiden Betriebssystemen für die Authentisierung von z.B. Benutzern. Bekanntestes Beispiel für ein PAM Modul ist wohl die standardmäßige Passwort-Eingabe nach dem Boot des Betriebssystems. Der Benutzer authentisiert sich dabei gegenüber PAM mit seinem Passwort und PAM authentifizert diesen bei …&lt;/p&gt;</summary><content type="html">&lt;p&gt;PAM, die sog. &lt;a href="https://de.wikipedia.org/wiki/Pluggable_Authentication_Modules" target="_blank"&gt;Pluggable Authentication Modules&lt;/a&gt;, bieten eine Schnittstelle in unixoiden Betriebssystemen für die Authentisierung von z.B. Benutzern. Bekanntestes Beispiel für ein PAM Modul ist wohl die standardmäßige Passwort-Eingabe nach dem Boot des Betriebssystems. Der Benutzer authentisiert sich dabei gegenüber PAM mit seinem Passwort und PAM authentifizert diesen bei korrekter Passwort-Eingabe, sodass er sich in sein Benutzer-Konto einloggen kann. Der Vorteil bei PAM: Es kann anstatt einer Passwort-Eingabe jedes beliebige Authentisierungs-Verfahren verwendet werden. Das Erstellen eigener Module und das Anmelden darüber am System ist somit möglich. Da der Einstieg in die PAM Programmierung nicht ganz so einfach ist, wird im Folgenden die Erstellung eines sehr einfachen PAM Moduls und dessen Integration in Linux erklärt.&lt;/p&gt;
&lt;h2&gt;Beispiel für ein Linux PAM Modul mit PAM Python&lt;/h2&gt;
&lt;p&gt;Ein PAM Modul kann sehr schnell sehr komplex werden. Schließlich findet die komplette Authentisierung eines Benutzers oder Dienstes dort statt. Ein einfaches PAM Modul, um die Funktion von PAM zu erklären und zu verstehen, ist daher generell ein guter Einstieg. Die Programmiersprache für PAM ist C. Da diese Sprache ihre Eigenheiten hat und nicht sehr leicht zu lesen ist, gibt es zum Glück eine Möglichkeit, PAM Module auch in Python zu implementieren. Das Projekt, das dieses bietet, nennt sich &lt;a href="http://pam-python.sourceforge.net/" target="_blank"&gt;PAM Python&lt;/a&gt;. Dieses wird für folgendes Beispiel benötigt. Folgender Befehl installiert das Paket:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;libpam-python
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;PAM Module befinden sich in dem Ordner &lt;code&gt;/lib/security/&lt;/code&gt; und beginnen mit "pam_" gefolgt von einem Namen. Bei &lt;a href="https://www.pm-codeworks.de/pamfingerprint.html"&gt;PAM Fingerprint&lt;/a&gt; heißt das PAM Modul beispielsweise &lt;code&gt;pam_fingerprint.py&lt;/code&gt;. Der Aufbau des PAM Moduls ergibt sich stark vereinfacht wie folgt:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pam_sm_authenticate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pamh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pamh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PAM_SUCCESS&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pam_sm_setcred&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pamh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pamh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PAM_SUCCESS&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In der Methode pam_sm_authenticate findet die eigentliche Authentisierung eines Benutzers statt. Dort sollte über &lt;code&gt;return pamh.PAM_SUCCESS&lt;/code&gt; bei Erfolg und &lt;code&gt;pamh.PAM_AUTH_ERR&lt;/code&gt; bei Misserfolg zurückgegeben werden. Um die Rückgabewerte kümmert sich die interne PAM Verwaltung. Wie in dem Beispiel zu sehen ist, wird immer Erfolg zurückgeliefert. Dadurch wird jeder Benutzer sofort authentifiziert und es wird ihm möglich, sogar Root-Rechte ohne Passwortabfrage oder ähnliches zu erlangen. &lt;strong&gt;Deswegen nochmal:&lt;/strong&gt; Dies ist nur ein sehr einfaches Beispiel!&lt;/p&gt;
&lt;h2&gt;PAM Module verwalten&lt;/h2&gt;
&lt;p&gt;Unter Debian Linux gibt es einen sehr praktischen Befehl, um PAM Module zu verwalten:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pam-auth-update
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Mit diesem Befehl öffnet sich eine halbgrafische Oberfläche mit einer Liste, in der alle PAM Module des Systems aufgelistet werden:&lt;/p&gt;
&lt;p&gt;&lt;img alt="pam-auth-update" src="https://www.pm-codeworks.de/media/PamRfid/pam-auth-update.png"&gt;&lt;/p&gt;
&lt;p&gt;Mit der Leertaste können Module aktiviert (*) oder deaktiviert werden. Das Programm hält sich dabei an die sog. &lt;em&gt;PAM Profile&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;PAM Profile&lt;/h2&gt;
&lt;p&gt;PAM Profile bieten die Möglichkeit, PAM Module einfach zu aktivieren oder deaktivieren und beliebig zu verschachteln. Dadurch sind die Module erst modular. Die Profile befinden sich im Ordner &lt;code&gt;/usr/lib/share/pam-configs/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Als Beispiel wurde ein PAM Modul erstellt, welches jedoch dem System noch unbekannt ist und demnach noch nicht verwendet wird. Deswegen muss ein eigenes PAM Profil im Ordner &lt;code&gt;/usr/lib/share/pam-configs/&lt;/code&gt; erstellt werden. Der Name des Profils ist konventionsgemäß der des Projekts. Diese Profile werden nach dem Stack-Prinzip abgearbeitet. Ein PAM Profil sieht z.B. bei &lt;a href="https://www.pm-codeworks.de/pamfingerprint.html"&gt;PAM Fingerprint&lt;/a&gt; wie folgt aus:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Fingerprint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;authentication&lt;/span&gt;
&lt;span class="n"&gt;Default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;yes&lt;/span&gt;
&lt;span class="n"&gt;Priority&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;257&lt;/span&gt;
&lt;span class="n"&gt;Auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Primary&lt;/span&gt;
&lt;span class="n"&gt;Auth&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;sufficient&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;pam_python&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;so&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pam_fingerprint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;py&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Hinter &lt;code&gt;Name&lt;/code&gt; steht dabei der angezeigte Name, der in der Liste von pam-auth-update enthalten ist. &lt;code&gt;sufficient&lt;/code&gt; bewirkt, dass falls &lt;a href="https://www.pm-codeworks.de/pamfingerprint.html"&gt;PAM Fingerprint&lt;/a&gt; nach der Benutzung Erfolg zurückliefert, keine weiteren PAM Module ausgeführt werden. Liefert &lt;a href="https://www.pm-codeworks.de/pamfingerprint.html"&gt;PAM Fingerprint&lt;/a&gt; jedoch Misserfolg zurück, greift nach dem Stack-Prinzip das nächste PAM Modul. Nach der Liste von &lt;code&gt;pam-auth-update&lt;/code&gt; ist dies "Unix authentication", also die Standard Passwort-Authentisierung. Dieses Prinzip geht so lange weiter, bis der Stack abgearbeitet wurde bzw. ein PAM Modul Erfolg zurückliefert. Erreicht der Stack jedoch den Boden ohne Erfolg, wird die Authentisierung abgebrochen und der Stack beginnt von vorne.&lt;/p&gt;
&lt;p&gt;Außer &lt;code&gt;sufficient&lt;/code&gt; gibt es natürlich noch weitere &lt;a href="http://linux.die.net/man/5/pam.d" target="_blank"&gt;Flags&lt;/a&gt; wie z.B. &lt;code&gt;required&lt;/code&gt;. Dieses Flag bewirkt, dass das Modul Erfolg zurückliefern muss. Falls nicht, wird die Authentisierung abgebrochen und der Stack beginnt von vorne.&lt;/p&gt;
&lt;h2&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Wie zu sehen ist, ist die Erstellung und Integration von PAM Modulen kein Hexenwerk. Die Verwendung von Python als Programmiersprache durch &lt;a href="http://pam-python.sourceforge.net/" target="_blank"&gt;PAM Python&lt;/a&gt; bietet zudem einen syntaktischen Luxus. &lt;a href="https://www.pm-codeworks.de/pamfingerprint.html"&gt;PAM Fingerprint&lt;/a&gt; und &lt;a href="https://www.pm-codeworks.de/pamrfid.html"&gt;PAM RFID&lt;/a&gt; sind auch mit Hilfe von &lt;a href="http://pam-python.sourceforge.net/"&gt;PAM Python&lt;/a&gt; in Python implementiert worden. Beide wurden als Open-Source veröffentlicht und bieten somit weiterführende Source-Code Beispiele für die Entwicklung eigener PAM Module.&lt;/p&gt;</content><category term="misc"/><category term="Python"/><category term="Debian"/></entry></feed>