Howtos

Step by Step Tutorials and Samples that get you where you want.

 

Postgresql as a backend server for HMG

 

Enjoy!

Mon

06

Jan

2014

Mac OS X 10.9 Kontakte und Davical Probleme

Ich verwende auf dem Server Davical und verbinde meinen Apple Computer damit. Leider geht diese Verbindung hin und wieder auf ganz heintückische Weise kaputt. Erkennbar ist das Problem nur an einem kleinen Warndreieck. Wenn man darauf klickt, sieht man foldende Fehlermeldung:

Bildschirmfoto: Einige Kontakte konnten nicht auf den Server kopiert werden.
Einige Kontakte konnten nicht auf den Server kopiert werden.

Ab diesem Zeitpunkt wird nichts mehr synchronisiert. Abhilfe schafft folgender Trick, der vielleicht etwas brutal klingt: Alle Adressen von diesem Computer löschen, damit sie neu geladen werden können.

Das Adressbuch "Kontakte" beenden.

Im Terminal:

open ~/Library/Application\ Support/AddressBook/Sources/

Ein Finder Fenster wird geöffnet

Darin befinden sich ein oder mehrere Ordner mit einem Hash wert.

Einer davon ist der richtige.

Wenn man ihn öffnet, ist die Configuration.plist die relevante Datei. Ein Blick hinein dürfte Aufschluss über den verwendeten Server geben.

Wenn man den richtigen Ordner gefunden hat, muss man alle Dateien bis auf die Configuration.plist löschen, den Papierkorb entleeren und Kontakte wieder starten.

Die Adressen des Servers werden geladen und das Warndreieck ist verschwunden.

Zu löschende Dateien
Diese Dateien müssen gelöscht werden.

Weil das Löschen im Finder manchmal erst nach einem Neustart geht, kann man auch von der Konsole aus löschen:

 

find . -type f -not -name 'Configuration.plist' -delete 

1 Comments

Wed

26

Dec

2012

PHP Pear HTTP_Session2

When programming web apps, you have to recognize the same user whe he loads a new page or revisists after weeks. PHP can take care of that with sessions. On the client side, you can store a cookie with a session id or transparently embed the id in the get-request. On the server side, you need a to save the id in a file, the memcache or in a database table.

The pear package HTTP_Session2 is supposed to take care of that. Like many pear packages, it is in beta for years und poorly documented. After fiddling with it for hours, I would like to share this with the world:

My main goal was to have a really long session. Visitors of my shop should find the shopping cart still full after weeks. Many examples focus rather on making a session that times out after minutes or hours, so that logged in users log out automatically.

The examples to the package tell you how to set the session's expiration and idle timouts and to set the timeout of the cookie. But that is not enough, if you want a long session. 

After a while, php startet a new sessionfor no apperent reason. HTTP_Session2::isNew() was true, but isExpired() or isIdle() were false() and the cookie was still valid.

Your php.ini has a setting like this.

 

called session.gc_maxlifetime = 1440 

 

It means that the garbage collector will kill your session after 1440 seconds. No matter, what timeout or idle or cookie timeout-times you set.

Fortunately, you can overrule that setting, even if you do not have access to your php.ini

 

ini_set('session.gc_maxlifetime', 6000);

So this is my working example:

 

 

 

require_once 'PEAR.php';
require_once('HTTP/Session2.php');

// Öffnet die Session, in der Produkte und Warenkorb zugeordnet sind
function startSession() {
  global $mdb2;
  $SessionLifetime = 8*7*24*60*60; // 8 Wochen

  session_set_cookie_params(
                            $SessionLifetime, // Verfällt in 8 Wochen
                            '/',          // path
                            '',           // domain
                            false,        // "secure only"
                            true);        // only over http

  ini_set('session.gc_maxlifetime', $SessionLifetime);

  HTTP_Session2::setContainer('MDB2',
                      array('dsn' = --> &$mdb2, 'table' => 'sessiondata'));

  HTTP_Session2::useTransSID(false);
  HTTP_Session2::useCookies(true);

  HTTP_Session2::start();

  HTTP_Session2::setExpire( time() + $SessionLifetime);
  HTTP_Session2::setIdle( $SessionLifetime );
  
  if (HTTP_Session2::isExpired()) {
    echo "Session ist abgelaufen.";
    HTTP_Session2::destroy();
  }
  
  if (HTTP_Session2::isIdle()) {
    // idle
    echo "You've been idle for too long!";
    HTTP_Session2::destroy();
  } else {
    HTTP_Session2::updateIdle();
  } 

  if (HTTP_Session2::isNew()) {
    HTTP_Session2::regenerateId();
  }

  //debug_Session();
}

function debug_Session() {
  if (HTTP_Session2::isNew()) {
    echo 'new session was created with the current request';
  } else {
    HTTP_Session2::set('visits', HTTP_Session2::get('visits',0)+1 );
  }

  echo("Session name: '" . HTTP_Session2::name() . "'
\n"); echo("Session id: '" . HTTP_Session2::id() . "'
\n"); echo("Is new session: '" . (HTTP_Session2::isNew() ? "yes" : "no") . "'
\n"); echo("Is expired: '" . (HTTP_Session2::isExpired() ? "yes" : "no") . "'
\n"); echo("Is idle: '" . (HTTP_Session2::isIdle() ? "yes" : "no") . "'
\n"); echo ("cartid: '" . HTTP_Session2::get('cartid') . "'
\n"); date_default_timezone_set('UTC'); echo("Session valid thru: '" . date('Y-m-d H:i:s', ( HTTP_Session2::sessionValidThru() )) . "'
\n"); }
0 Comments

Wed

13

Jun

2012

Tobit 8 zu Dovecot migrieren

Seit vielen Jahren setzen wir Tobit Software für unsere E-Mails und Faxe ein. Fast genauso lange sind wir damit nicht mehr so zufrieden. Darum haben wir auch schon länger keine Updates gekauft und sind jetzt auf der Version 8 sitzen geblieben, die unter Windows 7 nicht mehr gut läuft. Faxe senden oder Mails ausdrucken funktioniert nicht mehr richtig. Tobit empfiehlt den Betroffenen, ein Upgrade zu erwerben. Weil Faxversand und -empfang im Zeitalter von E-Mails immer unwichtiger wird, brauchen wir eigentlich "nur" einen Mailserver.

Der Tobit Server stellt grundsätzlich IMAP-Funktionen zur Verfügung. Das nennt sich im Tobit-Sprech "Mail Access Server". Im DvISE Administrator kann man dieses System einrichten.

DvISE Administrator Einstellungen des Mail Access Servers
DvISE Administrator Einstellungen des Mail Access Servers

Faxe werden bei der oben dargestellten Einstellung automatisch als GIF-Datei im Anhang einer E-Mail zur Verfügung gestellt. Ordner werden als IMAP-Postfächer übertragen.

Alias Liste

Benutzer, die Zugriff per IMAP bekommen sollen, müssen zuerst in einer Alias-Liste eingetragen werden. Der Alias darf nicht dem Benutzernamen entsprechen.

Benutzer in Alias Liste eintragen
Benutzer in Alias Liste eintragen

Zugang am Client freigeben

Dann können die Benutzer im "Tobit David InfoCenter" über den Menüpunkt Optionen > Einstellungen einen Zugang enrichten. Wichtig: auf den Button "Übernehmen" klicken, damit alle Unterordner freigegeben werden.

Zugang für den Benutzer im InfoCenter einrichten
Zugang für den Benutzer im InfoCenter einrichten
Und nicht vergessen, auf Übernehmen zu klicken!
Und nicht vergessen, auf Übernehmen zu klicken!

Thunderbird einrichten

Nun kann man mit einem Standard-Mail-Client, wie dem Thunderbird den IMAP-Zugang einrichten. Thunderbird will behilflich sein und errät den Mail-Host. In unserem Fall Strato. Das muss man natürlich überstimmen und den Tobit Server eingeben. Der Benutzername ist der soeben vergebene Alias und das am Client eingestellte Passwort. Wenn man alles richtig gemacht hat, lädt Thunderbird die Mails und Ordner.

Leider verhält sich der Mail Access Server nur fast wie ein richtiger IMAP-Server. Mails werden manchmal unterschlagen, nicht gelöscht, etc. Manchmal stürzt der Mail Access Server auch komplett ab. Laut Tobit darf der das. Wem das nicht gefällt, der soll sich ein Update auf die aktuelle Version kaufen.

Dovecot IMAP auf Ubuntu

Weil wir hier sowieso einen Ubuntu Server haben, ist ein stabiler und freier IMAP-Server relativ schnell installiert. Hier gehe ich nicht ins Detail, Installationsanleitungen gibt es zu Hauf.

Migration per Drag-And-Drop

Um die Nachrichten von Tobit auf Dovecot zu übertragen, kann man beide Konten im Thunderbird anlegen und per Drag-And-Drop komplette Ordner von einem Konto ins andere ziehen.

Tobit tendiert dabei aber gern zu kleinen Abstürzen. Schöner wäre ein Skript, mit dem man das machen kann.

Migration per ImapCopy

Ich habe verschiedene Programme ausprobiert, die komplette IMAP-Konten übertragen sollen. Aber erst mit dem von Armin Diehl geschriebenen, freien Tool IMAPCopy ist es mir gelungen, Postfächer effizient zu übertragen.

Nach der Installation schreibt man die wichtigsten Informationen in die ImapCopy.cfg.

Out of the Box hat es leider nicht funktioniert, weil das von Tobit gesendete Datum nicht so formatiert war, wie dovecot es gern hätte. Um genau mitlesen zu können, kann man in der cfg-Datei die Hash-Zeichen vor den Zeilen 

 

DebugSrc

DebugDst

 

entfernen, um verbose die Kommunication mitlesen zu können. Dabei fällt folgender Fehler auf:

 

R:A0006 BAD Invalid internal date.\r\n

 

Das liegt daran, dass Tobit das Datum in folgendem Format abschickt.

 

R:* 1 FETCH (INTERNALDATE "30-Dec-05 15:49:39 UT")\r\n

 

Zuerst hatte ich geglaubt, dass das "UT" der Stein des Anstoßes ist. Eigentlicht heißt es ja "UTC". Weil der Entwickler das schon festgestellt hat, bietet die cfg-Datei sogar die Möglichkeit, den String umschreiben zu lassen, indem man eingibt:

 

converttimezone "UT" "+0100"

 

Das bringt leider auch noch nicht die Lösung. Der String wird zwar geändert, aber nicht wirklich repariert.

 

APPEND tobitimport.INBOX.old (\Seen) "30-Dec-05 15:49:39 U +0100" {1228}\r\n

 

Also habe ich mir den Quellcode geladen und mal reingeguckt. Da steht in Zeile 1364 der imaptools.pas:

 

OrgMsgDateTime := copy(OrgMsgDateTime,1,20)+' '+st;

 

Das Programm geht also davon aus, dass das "U" an Stelle 21 steht. Tatsächlich steht es zwei stellen weiter links, weil das Jahr nur zweistellig übertagen wird. Leider hat der Entwickler auf meine Mail nicht geantwortet. Zum letzten mal hatte ich mit Pascal in Klasse 9 oder 10 zu tun und das ist jetzt gute 20 Jahre her, aber für diese Zeile wird es noch reichen.

 

Um das Programm zu kompilieren benötige ich FreePascal. Das ist das Pakt fpc, das man leicht mit aptitude installieren kann. Das Compilieren scheitert aber wie folgt:

 

~/imapcopy$ ./Mkdistsrc
./Mkdistsrc: 7: ./Mkdistsrc: zip: not found
Compiling for Linux
Free Pascal Compiler version 2.4.4-3.1 [2012/01/04] for x86_64
Copyright (c) 1993-2010 by Florian Klaempfl
Target OS: Linux for x86-64
Compiling imapcopy.pp
Compiling imapcopymain.pas
Compiling imaptools.pas
Compiling inet.pp
Compiling logfile.pas
imaptools.pas(238,8) Warning: Symbol "family" is deprecated
imaptools.pas(239,8) Warning: Symbol "port" is deprecated
imaptools.pas(241,8) Warning: Symbol "addr" is deprecated
imaptools.pas(242,20) Error: Identifier not found "Socket"
imaptools.pas(243,10) Error: Wrong number of parameters specified for call to "Connect"
imaptools.pas(421,24) Error: Identifier not found "Recv"
imaptools.pas(524,48) Error: Identifier not found "send"
imaptools.pas(1671) Fatal: There were 4 errors compiling module, stopping
Fatal: Compilation aborted
Error: /usr/bin/ppcx64 returned an error exitcode (normal if you did not specify a source file to be compiled)

 

Den Fehler haben schlaue Leute schon vor mir entdeckt und repariert. Eine funktionierende Version bekommt man mit:

git clone git://anonscm.debian.org/collab-maint/imapcopy.git

 

Wenn man die Zeile 1364 in imaptools.pas wie folgt ändert:

 

OrgMsgDateTime := copy(OrgMsgDateTime,1,7)+'20'+copy(OrgMsgDateTime,8,18)+' +0100';

 

und anschließend mit ./Mkdistsrc kompiliert, erhält man eine binary, die das Datum mit vierstelligem Jahr umschreibt, so dass dovecot es annimmt. Ich habe keine Mails aus dem vorherigen Jahrhundert im Tobit, also reicht es mir, die 20 einzufügen. (in der ImapCopy.cf muss übrigens ein Eintrag converttimezone "UT" "+0100" stehen bleiben.)

 

Dieser Hack ist viel zu häßlich für ein git-push. Vielleicht hat aber jemand anders Interesse daran, diese Zeile zu verbessern.

Interne Folder ausschließen

Tobit stellt auch Ordner wie "Kalender", "System", oder "Adressen" als IMAP zur Verfügung. Man kann in der ImapCopy.cfg zwar die zu kopierenden mit copyfolder festlegen. Aber das geht nicht rekursiv. Und wenn man jeden Unterordner einzeln auflisten muss, bringt das ganze Tool nichts.

 

Es gibt aber die nicht dokumentierte Einstellung "skipmatch". Der Eintrag 

 

skipmatch System

 

Sorgt dafür, dass Ordner oder Pfade, in denen mit der Name "System" enthalten ist, nicht kopiert werden.

./imapcopy

Jetzt kann man das Skript in aller Ruhe laufen lassen. Wer vorher das Standard-Pakt imapcopy installiert hat, muss aufpassen, dass er seine selbst kompilierte binary-datei startet. Also schön mit explizitem Pfad ./imapcopy aufrufen. Ansonsten wird die Version /usr/bin/imapcopy ausgeführt.

Leidensgenossen gesucht

Wer diesen Artikel bis hierhin gelsen hat, wird meinen Schmerz mit Tobit teilen. Ich würde mich sehr freuen, Leidensgenossen zu finden, die ihre Erfahrung mit Umstieg mit mit teilen und freue mich auf Kommentare.

2 Comments

Fri

01

Jun

2012

Backups mit rsnapshot

Als Apple seine komfortable Datensicherungssoftware am Mac namens Time Machine präsentiert hat, wurde die Einfachheit bestaunt und gepriesen. Man stöpselt eine Festplatte ein, auf die fortan Sicherungskopien der Dateien gesichert werden. Stündliche Backups für die letzten 24 Stunden, Tägliche Backups für den letzten Monat und wöchentliche Backups für die vorherigen Monate. Man muss nichts administrieren, und wenn man mal eine alte Version einer versehentlich gelöschten oder überschriebenen Datei suchen will, gibt es ein buntes Interface mit dem man vor einem Sternenhimmel auf Zeitreise geht.

Zeitreise auch ohne Sternenhimmel

Apple ist es mal wieder gelungen, eine Technologie benutzbar zu machen, die vorher für den normalen Anwender viel zu kompliziert war. Enttäuscht musste Apple allerdings feststellen, dass ein beachtlicher Anteil ihrer Anwender Time Machine ignoriert, weil sie zu faul sind eine Festplatte anzuschließen, aber das sei hier nur am Rande erwähnt.

Die Technologie, die hinter Time Machine steckt, ist aber gar nicht neu. In der Unix-Welt gibt es schon seit langem sogenannte Hardlinks. Das bedeutet, dass eine Datei an mehreren Stellen im Verzeichnisbaum existiert, obwohl sie tatsächlich nur einmal vorhanden ist.

Seit fast 10 Jahren nutze ich ein kleines Tool namens Meep, dass auf einer externen Festplatte viele Versionen meiner Backups in Form von Hardlinks kopiert und anschließend sämliche Änderungen mit dem Befehl rsync auf die neue Version anwendet. So werden Dateien geändert, gelöscht oder hinzugefügt, ohne die alten Verzeichnisse zu tangieren. Weil praktisch nur die Änderungen hinzukommen, kommt man mit relativ wenig Festplattenplatz aus. Meine externe Platte ist ca. doppelt so groß wie meine Serverplatte und enthält schon mehrere hundert vollständige Schnappschüsse. Die Zeitreise hat zwar keine schicke Science-Fiction Klickibunti-Oberfläche wie auf dem Mac, aber es sind normale Dateien. Und die kann man mit Linux-Befehlen wie ls und cp handhaben, oder grafische Dateimanager wie nautilus einsetzen.

rsnapshot

Meep wird aber schon seit Jahren nicht mehr weiterentwickelt. Darum habe ich vor einigen Wochen auf das ausgereiftere und vollständigere rsnapshot in Betrieb genommen.

Rsnapshot bewahrt stündliche, tägliche, wöchentliche und monatliche backups auf. Man kann beliebige Intervalle festlegen und die Anleitung erklärt es ziemlich detailliert.

In /etc/rsnapshot.conf definiert man Backupintervalle mit Namen und legt fest, wie viele Versionen vorgehalten werden sollen. In der Standardconfiguration ist das kleinste Interval hourly und es sollen 24 Stück vorgehalten werden.

Der Befehl "rsnapshot hourly" soll stündlich (am einfachsten per crontab) ausgeführt werden. "hourly.0" ist immer das jüngste Backup. Anschließend wird es in hourly.1, umbenannt während hourly.1 zu hourly.2 wird und so weiter. Das 25. wird dann gelöscht. Achtung: Es wird nicht automatisch zu einem daily-Backup gemacht. Das macht der Befehlt "rsnapshot daily". Er macht auch "hourly.24" dann "daily.0" Dafür sollte man auch einen crontab Eintrag machen.

wenn man keine hourly Backups haben will

Beim einfachen Lesen der Anleitung ist mir nicht klar geworden, dass "rsnapshot daily", "weekly" und "monthly" gar keine Backups macht, sondern nur die vorhandenen Backups rotiert. Weil ich nämlich anfangs nur tägliche Sicherungen anlegen wollte, klappte das gar nicht. Als ich den Befehl rsnapshot daily gegeben habe, konnte ich im logfile /var/log/rsnapshot.log lesen:

 

/mnt/backuphd/hourly.24 not present (yet), nothing to copy

 

Erst nachdem ich die Zeile

 

retain hourly 24

 

in /etc/rsnapshot.conf gelöscht habe und damit daily zum kleinsten Interval wurde, funktionierte der Befehl "rsnapshot daily" wie gewünscht.

sinnvolle Intervalle

Es macht keinen Sinn, "daily 100" einzustellen, um 100 tägliche Backups aufzubewahren, wenn man als nächsten Intervall "weekly" gewählt hat. Würde man "rsnapshot weekly" nach einer Woche aufrufen, würde es versuchen, den 100. daily-snapshot zu einem weekly-snapshot zu machen. Weil es nach einer Woche aber erst 7 tägliche gibt, scheitert das kommando ebenfalls mit der Fehlermeldung "... not present (yet), nothing to copy". In der /etc/rsnapshot.conf müssen also Intervalle stehen, die sich mit mit den crontab-Einträgen decken.

Meine aktuelle Konfiguration sieht vor, dass Montags bis Samstags während der normalen Geschäftszeiten im Abstand von zwei Stunden ein "hourly" Backup gemacht wird. Tägliche Backups wernde 10 Minuten vor Mitternacht auf Basis des letzten stündlichen Backups angelegt. Samstags werden die wöchentlichen und jeweils am ersten des Monats wird das monatliche Backup angelegt. (Weil das Rotieren recht schnell geht, reicht mir ein Abstand von 5 Minuten, so dass selbst wenn der erste des Monats man auf einen Samstag fällt, alle drei Backups sauber durchlaufen.) Das sieht in der crontab so aus:

 

10 8-20/2 * * 1-6 root /usr/bin/rsnapshot hourly
50 23 * * 1-6 root /usr/bin/rsnapshot daily
45 23 * * 6 root /usr/bin/rsnapshot weekly
40 23 1 * * root /usr/bin/rsnapshot monthly

 

Entsprechend muss die rsnapshot.conf folgendermaßen aussehen:

 

retain hourly 7
retain daily 7
retain weekly 4
retain monthly 12

 

Das letzte monthly dürfte natürlich auch größer sein, weil wir ja keine "yearly" Backups aufrufen. Das werde ich zu gegebener Zeit noch einrichten.

Die Tab-Taste

die rsnapshot.conf Datei ist leider total pingelig, was Whitespace angeht. Man muss spalten mit Tabulatoren trennen. Wer also zwischen interval und hourly nur Leerzeichen, aber keinen Tab gesetzt hat, bekommt eine Fehlermeldung.

Fazit

Auch wenn die Konfiguration etwas zeitintensiver als Time Machine ist, kann ich den Einsatz von rsnapshot sehr empfehlen. Das Anlegen der Sicherungen erfolgt mit bewährten Befehlen wie cp, rm, mv und rsync und ist darum sehr stabil. Das Ergebnis ist eine USB-Festplatte, die an beliebigen Linux-Rechnern gemountet werden kann und deren Inhalt ohne Einsatz von Spezialsoftware ausgelesen werden kann. Mit einem regelmäßigen Blick in /var/log/rsnapshot.log kann überprüft werden, ob das Skript seine Dienste verrichtet.

0 Comments

Wed

20

Apr

2011

PDFs mit Briefbogen per Samba erzeugen

E-Mails mit PDF-Anhängen lösen das gute alte Fax ab. Viele Programme erzeugen PDF-Dateien, aber viele Word- und Excel-Vorlagen sind zum Ausdrucken auf Briefpapier gedacht. 

 

Bisher haben wir tatsächlich den Brief auf Papier ausgedruckt, eingescannt und dann per E-Mail verschickt. Das ist nicht nur umständlich, sondern erzeugt auch große, qualitativ minderwertige PDF-Dateien, die keinen echten Text enthalten und darum nicht gescheit durchsuchbar sind.

 

Dabei ist die Lösung doch so einfach, wenn man einen Linux- oder BSD-Server hat. Der Fileserver samba stellt hervorragende Druckdienste zur Verfügung.

 

Unter anderem kann man einen virtuellen PostScript-Drucker zur Verfügung stellen, auf den die Windows-Computer drucken können. So erhält man auf dem Server eine gültige PostScript-Datei, die mit dem Tool ps2pdf einfach in ein PDF umgewandelt werden kann.

 

Das Tool pdftk kann diese PDF-Datei mit einer Briefbogen-PDF-Datei hinterlegen, so dass mit einem Druck-Befehl eine perfekte Geschäfts-E-Mail erhält, die der Server im einfachsten Fall auf dem Server speichert, wo der Benutzer sie abholen kann.

 

Voraussetzung:

Ein laufender Samba-Server sowie die Pakete ghostscript (enthält ps2pdf), pdftk und CUPS.

 

Inspiriert durch die kleine HowTo habe ich das folgende Skript mit dem Namen /usr/sbin/pdfprint.sh geschrieben:

#!/bin/bash                                                                                        
# /usr/sbin/pdfprint.sh
#
#Konvertiert die gedruckte PostScript-Datei in pdf                                                #und unterlegt einen Briefbogen                                                                    
#
#$1 = spool file                                                                                   
#$2 = uid (Username)                                                                               
#$3 = Firma                                                                                        

OUTPUTFILE=pdf-$2-`date +%Y%m%d%H%M%S`.pdf
OUTPUTPATH=/srv/files/

# Hier liegen die Briefbogendateien                                                                
LOGFILE=pdfcreate.log
BRIEFBOGENPATH=/srv/files/briefboegen
# Der Dateiname heißt 'Firma'_briefbogen.pdf                                                       
BRIEFBOGENSUFFIX=_briefbogen.pdf
# Folglich sieht so der Dateiname des leeren Briefbogens aus                                       
BRIEFBOGENFILE=$BRIEFBOGENPATH/$3$BRIEFBOGENSUFFIX
# Gibt es den Briefbogen?                                                                          
if [ -e $BRIEFBOGENFILE ]; then
    echo Konvertierte $1 mit $BRIEFBOGENFILE in $OUTPUTPATH/$OUTPUTFILE >> $OUTPUTPATH/$LOGFILE
    /usr/bin/ps2pdf $1 - | /usr/bin/pdftk - background $BRIEFBOGENFILE output $OUTPUTPATH/$OUTPUTFILE >> $OUTPUTPATH/$LOGFILE
else
    echo Briefbogendatei $BRIEFBOGENFILE nicht gefunden >> $OUTPUTPATH/$LOGFILE
    echo Konvertierte $1 in $OUTPUTPATH/$OUTPUTFILE >> $OUTPUTPATH/$LOGFILE
    /usr/bin/ps2pdf $1 $OUTPUTPATH/$OUTPUTFILE
fi
echo PDF erstellt. Spool-Datei löschen $1 >> $OUTPUTPATH/$LOGFILE
rm $1 >> $OUTPUTPATH/$LOGFILE
echo Fertig. >> $OUTPUTPATH/$LOGFILE
echo >> $OUTPUTPATH/$LOGFILE

Die Variablen BRIEFBOGENPATH, OUTPUTPATH sollte man natürlich an seine Festplattenstruktur anpassen.

 

Das Skript wird aufgerufen mit dem Namen der Spool-Datei (PostScript), dem Benutzernamen (der Bestandteil) des PDF-Dateinamens wird und dem Firmennamen, der zur Auswahl des korrekten Briefpapiers benötigt wird.

 

Wenn kein gültiger Firmenname übergeben wird (wenn keine Briefbogendatei gefunden wird), wird eine PDF-Datei ohne Briefpapier erzeugt.

 

Die wichtigste Zeile ist:

ps2pdf $1 - | pdftk - background $BRIEFBOGENFILE output $OUTPUTFILE

 

Man könnte sie auch direkt in die smb.conf schreiben, aber dieses Skript finde ich etwas ordentlicher. Tipp: Wenn man statt background den Befehl stamp verwendet, wird die Briefbogen-Datei auf den Text gelegt. Das macht natürlich nur dann sinn, wenn diese auch transparente Bereiche hat.

 

Wichtig ist, dass das Skript mit

chmod u+x pdfprint.sh 

ausführbar gemacht wird. Sonst läuft es nicht.

 

Jetzt muss noch die smb.conf um die Drucker erweitert werden:

[global]
   ...
   printing = sysv
   load printers = yes
   ...

[printers]
   comment = All Printers
   path = /var/spool/samba
   public = yes
   guest ok = yes
   writeable = yes
   printable = yes
   browseable = yes

[pdf-acme]
   comment = PDF mit Acme-Briefbogen auf K: erzeugen
   path = /var/tmp
   printable = Yes
   print command = /usr/sbin/pdfprint.sh %s %U acme
   lpq command = /bin/true
   create mask = 0600
   use client driver = yes

Damit das ganze läuft, muss man den Briefbogen der Firma acme dort hinterlegen, wo pdfprint ihn erwartet: 

 

/srv/files/briefboegen/acme_briefbogen.pdf

 

Wichtig ist, dass der Server die Leserechte hat.

 

Das Skript ist modular aufgebaut. Man kann also in der smb.conf noch weitere PDF-Drucker anlegen, wenn man mehrere Firmen im Netzwerk hat.

 

Nachdem der Server mit dem Befehl

killall -HUP smbd 

gezwungen wurde, die smb.conf neu einzulesen, sieht man auf den Windows-Clients schon den pdf-acme-Drucker.

 

Wenn man ihn doppelklickt, wird man von Windows nach dem Druckertreiber gefragt. Entscheident ist, dass man jetzt einen PostScript Drucker auswählt. Ich habe gute Erfahrungen mit "HP LaserJet 5P/5MP" gemacht. Unter Windows 7 mit 64 Bit verwende ich den "HP Color LaserJet 2800 Series PS"

Windows XP: Druckertreiber auswählen
Windows XP: Druckertreiber auswählen

Fertig! Wenn man jetzt auf diesen neuen Drucker druckt, entsteht fast augenblicklich die PDF-Datei im dafür vorgesehenen Ordner.

 

Für die Benutzer ist das also kinderleicht. Sie können mit jedem Windows-Programm auf diesen Drucker drucken. Man sollte ihnen natürlich verraten, wo sich die fertige PDF-Datei befindet.

0 Comments

Fri

12

Nov

2010

Trigger tweets with cron and mysql

Adventskalender are a popular German countdown to christmas. Every morning, you open a little door with a gift or chocolate behind it.

 

Our local Lions Club, sells such a calendar with prizes behind the little doors. Each one has a unique number. The numbers get chosen randomly every day. They are published in the local newspaper and on our website.

 

It is basically a lottery. Lots of people look up the numbers.

 

This year, I wanted to also publish them on twitter, so calendar-owners simply follow @lionswerne and get the numbers every morning. Manually tweeting every morning would not be fun.

 

Here is how I wrote a little script, so my Linux-Computer takes care of this automatically. If you are doing something similar, you can follow my instructions. Let me know, if it was of any help.

Install twidge

First, we need a commandline tool to push twitter updates without all that gui-stuff. Unfortunately, the internet is full of instructions, that do not work any more. Twitter has recently changed its API.

 

But twidge ist a great tool, that works in its most recent version (1.0.6). Ubuntu still provides 1.0.2 which does not work, any more.

 

Get it here: 

twidge-1.0.6-linux-i386-bin

After installing it (I moved it to /usr/bin/twidge and made it executable with chmod u+x twidge), you simply run

 

twidge setup

 

It will give you an url and ask for a numer. Open the url in your browser. If your browser is already logged into twitter, it will give you a number. If not, it will first ask you for username and password. Type the number into your terminal and you are all set.

 

Test it by calling

 

twidge lsrecent

 

You should see your most recent tweets.

 

To learn more, type twidge lscommands

Datasource MySQL

The winning numbers are already in a mysql-database on our webserver, where a php-page takes care of publishing them on our website.

 

I am a PostgreSQL-user, but my webserver only supports mysql.

 

I got the dump from the the webserver, installed mysql-server on my local Ubuntu-machine and used the sql-dump to easily create and poulate the table. The column names are not really important. There is a date, a numer and two colums about the prize (what is it? and who sponsored it)

 

The colums could be different. But we need a column with the date on which to publish the record.

The bash command

Now we need a command that first gets the numbers and the prize of the current day from the MySQL-Table, construct a text-message and call twidge to push it into Twitter.

 

I spare you more than half an hour of tinkering and present you with the working one-liner.

 

echo "SELECT concat('twidge update \"TEST. Kein echter Gewinn:', losnummer, ' ', gewinn, ' von ', spender, '\"') FROM weihnachtskalender WHERE datum = DATE(NOW());" | mysql -u root --password=iamnottellingyou --skip-column-names mysql | iconv -f utf8 -t latin9 -c -- | bash

 

Yes, this is all one line. The SQL-SELECT-statement will result in a twidge command with the correct text. It is piped into the the mysql command-line client which pipes the command into bash.

 

In my example, I had to insert an iconv command, because my Ubuntu-machine uses UTF8 natively. Twitter seems to expect latin9 as its encoding. The -c means that any character that can not be converted into latin9 will simply be removed. It prevents the command from throwing an error. If your Umlauts show up correctly, or you have a language that can do without such fancy letters, you do not need the iconv-command.

 

As alwasy, I have a feeling that there is a more elegant way to do it. Let me know in the comments, if you have a suggestion. But right now, this works and that is what counts, isn't it?

Add it to your crontab

Now, all we have to do is call the above command daily.

 

The unix-tool cron can do that for us.

 

sudo joe /etc/crontab (or use an editor of your choice. I just like joe. It is so much like good old wordstar...)

 

and add the line

 

10 5    * 12 *  jan     echo "SELECT concat('twidge update \"Nr ', losnummer, ': ', gewinn, ' von ', spender, '\"') FROM weihnachtskalender WHERE datum = DATE(NOW());" | mysql -u root --password=iamstillnottellingyou --skip-column-names mysql | iconv -f utf8 -t latin9 -c -- | bash

 

It will call the script every morning at 10 Minutes after 5 in December.

 

Replace jan with your username and be sure to use your mysql-password.

Wait for it...

Now I am waiting for December to come. Then I will see if it really works.

 

So this Howto might get updated, if something does not work as advertised.

0 Comments