diff --git a/fhem/contrib/PRESENCE/presenced b/fhem/contrib/PRESENCE/presenced index acd73e222..cb15e2e70 100755 --- a/fhem/contrib/PRESENCE/presenced +++ b/fhem/contrib/PRESENCE/presenced @@ -63,15 +63,17 @@ my $opt_v = 0; my $opt_p = 5111; my $opt_P = "/var/run/".basename($0).".pid"; my $opt_l; +my $opt_n; Getopt::Long::Configure('bundling'); GetOptions( - "d" => \$opt_d, "daemon" => \$opt_d, - "v+" => \$opt_v, "verbose+" => \$opt_v, - "l=s" => \$opt_l, "logfile=s" => \$opt_l, - "p=i" => \$opt_p, "port=i" => \$opt_p, - "P=s" => \$opt_P, "pid-file=s" => \$opt_P, - "h" => \$opt_h, "help" => \$opt_h + "d" => \$opt_d, "daemon" => \$opt_d, + "n" => \$opt_n, "no-timestamps" => \$opt_n, + "v+" => \$opt_v, "verbose+" => \$opt_v, + "l=s" => \$opt_l, "logfile=s" => \$opt_l, + "p=i" => \$opt_p, "port=i" => \$opt_p, + "P=s" => \$opt_P, "pid-file=s" => \$opt_P, + "h" => \$opt_h, "help" => \$opt_h ); @@ -80,8 +82,8 @@ Log 1, "started with PID $$"; if(-e "$opt_P") { - print timestamp()." another process already running (PID file found at $opt_P)\n"; - print timestamp()." aborted...\n"; + print timestamp()."another process already running (PID file found at $opt_P)\n"; + print timestamp()."aborted...\n"; exit 1; } @@ -97,6 +99,8 @@ sub print_usage () print " PID file for storing the local process id (Default: /var/run/".basename($0).".pid)\n"; print " -d, --daemon\n"; print " detach from terminal and run as background daemon\n"; + print " -n, --no-timestamps\n"; + print " do not output timestamps in log messages\n"; print " -v, --verbose\n"; print " Print detailed log output\n"; print " -h, --help\n"; @@ -172,6 +176,8 @@ while(1) { $new_client = $server->accept(); + setsockopt($new_client, SOL_SOCKET, SO_KEEPALIVE, 1); # activate keep-alive + $listener->add($new_client); Log 1, "new connection from ".$new_client->peerhost().":".$new_client->peerport(); } @@ -184,7 +190,7 @@ while(1) { $buf =~ s/(^\s*|\s*$)//g; - if($buf =~ /^\s*([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}\s*\|\s*\d+\s*$/) + if($buf =~ /^\s*(?:[0-9a-f]{2}:){5}[0-9a-f]{2}\s*\|\s*\d+\s*$/i) { $client->send("command accepted\n"); Log 2, "received new command from ".$client->peerhost().":".$client->peerport()." - $buf"; @@ -244,6 +250,18 @@ while(1) $client->send("no command running\n"); } } + elsif(lc($buf) =~ /^\s*ping\s*$/) + { + Log 2, "received ping command from client ".$client->peerhost().":".$client->peerport(); + $client->send("pong\n"); + + Log 1, "closed connection from ".$client->peerhost().":".$client->peerport(); + $listener->remove($client); + + shutdown($client, 2); + close $client; + $client = undef; + } else { $client->send("command rejected\n"); @@ -396,7 +414,8 @@ sub doQuery($$) sub timestamp() { - return POSIX::strftime("%Y-%m-%d %H:%M:%S",localtime); + return POSIX::strftime("%Y-%m-%d %H:%M:%S - ",localtime) unless($opt_n); + return ""; } @@ -421,7 +440,7 @@ sub Log($$) open (LOGFILE, ">&STDOUT") or die("cannot open STDOUT"); } - print LOGFILE "\r".timestamp()." - ".($opt_v >= 2 ? ($thread > 0 ? "(Thread $thread)" : "(Main Thread)")." - ":"").$message."\n"; + print LOGFILE ($opt_l?"":"\r").timestamp().($opt_v >= 2 ? ($thread > 0 ? "(Thread $thread)" : "(Main Thread)")." - ":"").$message."\n"; close(LOGFILE); }