PDF Dateien von der Kommandozeile oder aus Skripten drucken

Heute war ich lange auf der Suche nach einer Lösung mit der ich unter Windows direkt von der Kommandozeile (Eingabeaufforderung) und aus Skripten heraus PDF-Dateien drucken kann.

Die Anforderung war, dass es möglich sein soll komplett ohne einen Druckerdialog auf einen bestimmten Drucker zu drucken oder den Standarddrucker zu verwenden.

Unter Windows ist die Auswahl eher begrenzt. Es gibt ein paar Lösungen wie zum Beispiel GSPRINT, aber die macht es erforderlich Ghostscript und Ghostview zu installieren.

Es gibt ein paar Kommerzielle Tools, die aber relativ teuer sind. Auf diese gehe ich hier nicht weiter ein.

Letztendlich habe ich eine Lösung gefunden mit der ich der zufrieden bin. Sumatra PDF ist ein freier und schneller PDF-Betrachter, der auch als Portable Version erhältlich ist. Damit ist es möglich PDF-Dateien direkt und ohne Umweg auf jedem installierten Drucker direkt auszugeben.

Benötigt wird nur die Datei SumatraPDF.exe und ein paar Kommandozeilenparameter.

Mit diesem Befehl wird die PDF-Datei auf dem angegebenen Drucker gedruckt:

1
SumatraPDF.exe -silent -exit-on-print -print-to {DRUCKERNAME} {DATEINAME}

Mit diesem Befehl wird die PDF-Datei auf dem Standarddrucker gedruckt:

1
SumatraPDF.exe -silent -exit-on-print -print-to-default {DATEINAME}

Mit diesem Befehl wird zuerst der Druckerauswahldialog angezeigt und die PDF-Datei dann auf dem ausgewählten Drucker gedruckt:

1
SumatraPDF.exe -silent -exit-on-print -print-dialog {DATEINAME}

Über die Abfrage des Errorlevels bekommt man auch noch heraus ob die Datei tatsächlich gedruckt werden konnte und kann mit dem Ergebnis dann in seinen Skripten weiterarbeiten.

Großartig!

MySQL root Benutzer gelöscht

Oh man! Heute habe ich aus versehen den root-Benutzer meines MySQL-Servers gelöscht.

Im folgenden ein paar Befehle mit denen man sich wieder Zugriff auf seinen Datenbankserver verschaffen kann.

/etc/init.d/mysql stop
mysqld_safe --skip-grant-tables --user=root --skip-networking &
mysql -u irgendeinbenutzer
FLUSH PRIVILEGES;
CREATE USER root;
SET PASSWORD FOR root = PASSWORD('NeuesKennwort');
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'NeuesKennwort' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
FLUSH PRIVILEGES;
QUIT
/etc/init.d/mysql restart

Prosody XMPP Server mit Munin überwachen

Vor kurzem habe ich meinen XMPP Server von ejabberd zu prosody migriert.
Die Übernahme der Useraccounts war dank verfügbarer Scripts unproblematisch.

Munin liefert standardmäßig kein Plugin für die Überwachung von prosody mit, aber bei Munin Exchange bin ich fündig geworden.

Leider lieferte mir das Munin Plugin nicht die Informationen die ich gerne gehabt hätte. Die ejabberd-Statistiken waren da deutlich ergiebiger.

Mir fehlte die Anzahl der registrierten User und die Uptime des prosody Servers.
Über das prosody Plugin mod_console kann man diverse Informationen des prosody Servers über telnet am lokalen Host abfragen, so auch die Uptime. Leider aber nicht die Anzahl der registrierten User. Dies ist momentan noch nicht in prosody implementiert.

Wenn man als Storage für prosody jedoch internal gewählt hat – was auch die Standardeinstellung ist – kann man die Anzahl der User über das Dateisystem ermitteln.
Man zählt dazu einfach nur die Anzahl der Dateien im Unterordner accounts des jeweiligen virtuellen Hosts.

Ich habe nun das vorhandene Plugin von Christoph Heer in Version 3 um die Möglichkeiten erweitert die Uptime und die Anzahl der registrierten User auszugeben.

Folgende Änderungen habe ich vorgenommen:

Ab Zeile 37:

37
38
39
40
41
42
43
    if mode == "suggest":
        print "c2s"
        print "s2s"
        print "presence"
        print "uptime"
        print "users"
        sys.exit(0)

Ab Zeile 120:

120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
    elif wildcard == "uptime":
        if mode == "config":
            print "graph_title Prosody Uptime"
            print "graph_args --base 1000 -l 0"
            print "graph_scale no"
            print "graph_vlabel uptime in days"
            print "graph_category Prosody"
            print "graph_order uptime"
            print "uptime.draw AREA"
            print "uptime.min U"
            print "uptime.max U"
            print "uptime.label uptime"
            print "uptime.type GAUGE"
            sys.exit(0)
 
        else:
            uptime_re = re.compile(r"\d+")
            telnet = telnetlib.Telnet(host, port)
            telnet.write("server:uptime()")
            telnet_response = telnet.read_until("minutes (", 5)
            parsed_info = uptime_re.findall(telnet_response)
            uptime_value = float(parsed_info[0]) + float(parsed_info[1])/24 + float(parsed_info[2])/60/24
            print "uptime.value %s" % (uptime_value)
 
    elif wildcard == "users":
        if mode == "config":
            print "graph_title Prosody Registered Users"
            print "graph_vlabel users"
            print "graph_category Prosody"
 
        basedir = "/var/lib/prosody"
        if os.path.exists(basedir):
            vhosts = listdirs(basedir)
            for vhost in vhosts:
                accountdir = basedir + os.sep + vhost + os.sep + "accounts"
                if os.path.exists(accountdir):
                    accounts = listfiles(accountdir)
                    headcount = 0
                    for account in accounts:
                        headcount += 1
                    if mode == "config":
                        print vhost.replace("%2e","_") + ".label %s" % (vhost.replace("%2e","."))
                    else:
                        print vhost.replace("%2e","_") + ".value %s" % (headcount)
 
def listdirs(folder):
    return [d for d in os.listdir(folder) if os.path.isdir(os.path.join(folder, d))]
 
def listfiles(folder):
    return [d for d in os.listdir(folder) if os.path.isfile(os.path.join(folder, d))]

Und so sehen die neuen Munin Graphen dann aus:

Munin prosody plugin (uptime)

Munin prosody plugin (uptime)

Munin prosody plugin (users)

Munin prosody plugin (users)

Die neue Version 4 kann wie gewohnt bei Munin-Exchange heruntergeladen werden.

Nachtrag: Wenn Du auch von ejabberd zu prosody migrieren möchtest, findest Du hier eine gute Anleitung dafür.