#!/usr/bin/php
<?php
// prüfe, ob pdftk überhaupt installiert
openlog("pdftkd", LOG_ODELAY, LOG_DAEMON);
exec("which pdftk", $out, $ret);
if ($ret > 0) {
    fwrite(STDERR, "pdftk not installed" . PHP_EOL);
    exit(5);
}

// set some variables
$sock_file = "/var/mlohn/pdftkd.sock";
// don't timeout!
set_time_limit(0);
// create socket
if (!$socket = socket_create(AF_UNIX, SOCK_STREAM, 0)) {
    fwrite(STDERR, "Could not create socket" . PHP_EOL);
    exit(10);
}
// check if socket free
if (file_exists($sock_file)) unlink($sock_file);
// bind socket to port
if (!socket_bind($socket, $sock_file)) {
    fwrite(STDERR, "Could not bind to socket" . PHP_EOL);
    exit(20);
}
chmod($sock_file, 0777);
syslog(LOG_DAEMON | LOG_INFO, "pdftkd started.");

// start listening for connections
while (socket_listen($socket, 3)) {

    // accept incoming connections
    // spawn another socket to handle communication
    $spawn = socket_accept($socket);
    // read client input
    $input = socket_read($spawn, 1024);
    
    // eval up input string
    $input = trim($input);
    syslog(LOG_DAEMON | LOG_DEBUG, "data received: $input");
    $request_data = explode(";", $input); // expected data: "LETTER;PDF_PATH;TMP_DIR"
    $letter   = $request_data[0];
    $pdf_path = $request_data[1];
    $tmp      = $request_data[2];

    $rc = 0;
    // prüfe, ob Briefpapier vorhanden
    if (!file_exists($letter)) {
        syslog(LOG_DAEMON | LOG_ERR, "Letter $letter not existing");
        $rc = 1;
    }
    if (!$rc) {
        exec("pdftk $pdf_path background $letter output $tmp/tmp.pdf", $out, $ret);
        if ($ret > 0) {
            syslog(LOG_DAEMON | LOG_ERR, "PDF overlay failed:\n". implode("\n", $out));
            $rc = 2;
        }
    }
    if (!$rc) {
        if (!rename("$tmp/tmp.pdf", "$pdf_path")) {
            syslog(LOG_DAEMON | LOG_ERR, "PDF rename failed: ". implode("\n", $out));
            $rc = 3;
        }
    }
    syslog(LOG_DAEMON | LOG_DEBUG, "data processed: $rc");
    if (! socket_write($spawn, $rc, strlen ($rc))) syslog(LOG_DAEMON | LOG_ERR, "Could not write rc");

    // close sockets
    socket_close($spawn);
}
//socket_close($socket);


/*
 * Quelle: https://www.codeproject.com/tips/418814/socket-programming-in-php
 */
/*
// set some variables
$host = "127.0.0.1";
$port = 25003;
// don't timeout!
set_time_limit(0);
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
// bind socket to port
if (!socket_bind($socket, $host, $port)) {
    socket_close($socket);
    $result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
}
// start listening for connections
//$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");
while ($result = socket_listen($socket, 3)) {

    // accept incoming connections
    // spawn another socket to handle communication
    $spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
    // read client input
    $input = socket_read($spawn, 1024) or die("Could not read input\n");
    // clean up input string
    $input = trim($input);
    echo "Client Message : ".$input."\n";
    // reverse client input and send back
    $output = strrev($input) . "\n";
    socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");
    // close sockets
    socket_close($spawn);
}
socket_close($socket);
*/