wkhtmltopdf über php exec aufrufen

Ich arbeite schon lange mit wkhtmltopdf unter Windows und jetzt musste ich das ganze auf einem Opensuse Linux Server zum fliegen bringen. Ich muss gestehen, dass ich etwas aus der Übung mit Linux bin, aber nach ein bisschen probieren hat es mit diesen Schritten funktioniert.

Zunächst musste ich wkhtmltopdf erst über Zypper installieren:

zypper install wkhtmltopdf

Da der Linux Server kein Display hat, sprich keine GUI, musste man noch zusätzlich xvfb-run installieren. Damit wird ein Buffer auf der Server für das Programm geschaffen, um die Ausgaben zu einer GUI abzufangen;

zypper install xvfb-run

Um jetzt die exec() Funktion nutzen zu können, muss man noch den Pfad zu den wkhtmltopdf Binaries finden, das kann man mit whereis machen:

whereis wkhtmltopdf

So jetzt hat man alles und kann mal einen Test machen, hier drucke ich heise.de in eine Test PDF Datei:

exec("xvfb-run -a /usr/bin/wkhtmltopdf https://heise.de test.pdf 2>&1")

Und nachdem Aufruf liegt die test.pdf Datei im gleichen Verzeichnis wie mein Testscript.

http://www.agile-coding.net/wkhtmltopdf-ueber-php-exec-aufrufen/

Linux Docker Container und physikalische Netzwerk

Wenn man Linux Docker Container im Netzwerk für andere erreichbar machen möchte, muss man im Grunde nur ein paar Schritte durchführen. In meinem Setup hängt ein Linux Server (OpenSuse Leap 15.1, im eigenen Blech) direkt an meinem Router. Und mein Rechner von dem ich per SSH den Docker Host auf dem Linux Server verwalte.

Im ersten Schritt sollte man überprüfen ob das Netzwerk-Device auf dem Linux Server mehrere MAC-Adressen unterstützt. Das wird Promiscuous mode genannt und man kann das einfach in der Konfigurationsdatei (/etc/sysconfig/network/ifcfg-eth0) eingerichtet. Einfach den Parameter PROMISC=yes hinzugfügen und das Netzwerk-Device durchstarten.

Nächster Schritt ist es ein Netzwerk in Docker einrichten, welches Pakete nach außen „überbrückt“. Standardmäßig hat Docker ein „bridge“ Netzwerk vorkonfiguriert, dieses überbrückt aber nur die Verbindungen zwischen den Containern und nicht nach außen. In meinem Beispiel erzeuge ich ein macvlan Netzwerk mit diesem Befehl:

docker network create -d macvlan \
--subnet=192.168.2.1/24 \
--gateway=192.168.2.1 \
-o parent=eth0 \
macvlan

Alle Container die man nun mit diesem Docker Netzwerk verbindet, erhalten von dieser Netzwerk Konfiguration eine IP Adresse zugewiesen. Achtung hier wird nicht der DHCP Server von meinem Netzwerk. Ich habe leider noch keine funktionierende Variante für DHCP gefunden. Wenn ich jetzt hergehe und einen Container vom MYSQL Image mit diesem Netzwerk starte

docker run -p 3306:3306 --network=macvlan --name mysql -h mysql -e MYSQL_ROOT_PASSWORD=MyPassword -d mysql

-p ist der Port des Containers
–network ist das Name des gerade erzeugten Docker Netzwerk
–name ist der Name des Containers
-e MYSQL_ROOT_PASSWORD ist das root Passwort der Instanz

Erhält der Container die IP 192.168.2.2 und ich kann die Instanz von meinem Lokalen Rechner aus ansprechen.

Bei Docker für Windows läuft die Netzwerk Einrichtung etwas anders, hierzu werde ich aber in den kommenden Tagen auch noch einen Post schreiben. Sonst vergesse ich das bestimmt auch wieder 🙂

http://www.agile-coding.net/linux-docker-container-und-physikalische-netzwerk/

Tabellen kopieren mit SQL

Es gibt immer mal wieder die notwendigkeit eine Tabelle in einer Datenbank zu kopieren. Zum Testen oder auch mal ein Backup machen. Hierbei kann man eine sehr kurze Notation verwenden, in dem man einfach im Create-Statement der Tabelle gleichzeitig die Quelle der Daten angibt:

create table NAME_DER_ZIEL_TABLLE as select * from NAME_DER_QUELL_TABLLE;

und so einfach werden alle Daten aus der Quelltabelle in die Zieltabelle dupliziert.

http://www.agile-coding.net/tabellen-kopieren-mit-sql/

MailKit mit Powershell nutzen um Emails abzufragen via IMAP

Ich habe ja bereits in der Vergangenheit über IMAP mit IMAPX geschrieben. Leider wird IMAPX nicht mehr weiterentickelt, aber es gibt MailKit als alternative.

Daher noch ein kleines Skript zum Abfragen vom Posteingang:

#add libs
Add-Type -Path "c:\temp\imap\BouncyCastle.Crypto.dll"
Add-Type -Path "c:\temp\imap\MimeKit.dll"
Add-Type -Path "c:\temp\imap\MailKit.dll"

#init
$cnn = New-Object MailKit.Net.Imap.ImapClient

#connect
$cnn.Connect($mailserver, $port)
$cnn.Authenticate($username,$password)
$cnn.Inbox.Open([MailKit.FolderAccess]::ReadWrite)

#set up and query for all emails
$query = [MailKit.Search.SearchQuery]::NotDeleted        
$uids = $cnn.Inbox.Search($query) 

#each mail at the inbox
foreach($uid in $uids.GetEnumerator()){

	#pull email from server
	$m = $cnn.Inbox.GetMessage($uid)

	#each attachment of the current mail
	foreach($a in $m.Attachments){
		$a.fileName
	}

	$m.Subject
	$m.from.address
	$m.from.name
	$m.TextBody

}

$cnn.Disconnect($true)

http://www.agile-coding.net/mailkit-mit-powershell-nutzen-um-emails-abzufragen-via-imap/

Powershell Script Metric

Es kommt ja immer wieder vor, dass man die Laufzeiten eines gesamten oder eben bestimmter Abschnitte innerhalb eines Skriptes messen will. Wenn man z.B. wissen will wie lange es dauert eine Datei zu durchsuchen oder Kopiervorgängen oder etc. In Powershell gibt es ein paar Möglichkeiten, um die Laufzeit Metric zu messen.

Man nimmt zwei Datumsobjekte, jeweils eins für den Start und eins für das Ende der Aktion und berechnet die Differenz zwischen beiden.

#snap the start time
$start=(GET-DATE)
 
#do something
sleep 5
 
#snap the finishing time
$end=(GET-DATE)
 
#calculate the difference
$duration = NEW-TIMESPAN –Start $startEnd $end
 
write-host "It took:$($duration.Seconds) sec"

Oder man nimmt das Stopwatch Objekt von System/Diagnostics

#create a new stop watch and start it immediatly
$stop_watch = [system.diagnostics.stopwatch]::startNew()
 
#do something
sleep 5
 
#look at the watch but continue
write-host "Script runtime: $($stop_watch.Elapsed.Hours):$($stop_watch.Elapsed.Minutes):$($stop_watch.Elapsed.Seconds):$($stop_watch.Elapsed.Milliseconds)"
 
#do something more
sleep 2
 
#stop the watch and look again
$stop_watch.stop()
write-host "Script final runtime: 
$($stop_watch.Elapsed.Hours):$($stop_watch.Elapsed.Minutes):$($stop_watch.Elapsed.Seconds):$($stop_watch.Elapsed.Milliseconds)"
http://www.agile-coding.net/powershell-script-metric/