#!/usr/bin/perl

use strict;

use constant SLEEP          => 15; # in seconds
use constant MAX_MEM        => 40; # in percent
use constant MAX_DSLOGD_MEM => 20; # in percent
use constant MAX_ACPID_CONN => 99; # quantity

my $PATH2DS = '/opt/ds';
my $LOGPATH = '/var/ds/log';
my $LOGFILE = "$LOGPATH/ds.log";
my $DSLOGD  = "$LOGPATH/dslogd.log";
my $LOGMTIME = -1;                 # LOG modification time

#system("$PATH2DS/bin/check_upgrade >>/var/ds/log/ds_upgrade.log 2>&1");
unlink glob "/var/ds/vnc*";   # remove VNC temporary files

for(;;sleep SLEEP) {
    foreach (`ps -eo pmem,pid,pcpu,rss,etime,cmd | grep "$PATH2DS/bin/ds" | grep -v grep`) {
	if($_ =~ /^\s*(\d+\.\d+)\s+(\d+)\s+(\d+\.\d+)\s+(\d+)\s+([-:\d]+)/ && $1 > MAX_MEM) {
	    my $msg = "\nINFO: PATROL have to RESTART DS due to high memory utilization, mem=$1% (pid=$2, pcpu=$3, rss=$4, etime=$5)\n";
	    `kill -9 $2 1>/dev/null 2>/dev/null && echo "$msg" >> $LOGFILE`; # && echo "$msg" >> $DSLOGD`;
#	} else {
#	    my $tmp = (stat($LOGPATH))[9];
#	    if($LOGMTIME == $tmp) {
#		$tmp -= $LOGMTIME;
#		my $msg = "\nINFO: PATROL have to RESTART DS, because $LOGPATH not updated within $tmp seconds\n";
#		`initctl stop ds 1>/dev/null 2>/dev/null && echo "$msg" >> $LOGPATH && echo "$msg" >> $PATH2DS/var/log/dslogd.log`;
#	    } else {
#		$LOGMTIME = $tmp
#	    }
	}
    }
#    foreach (`ps -eo pmem,pid,pcpu,rss,etime,cmd | grep "$PATH2DS/bin/dslogd.pl" | grep -v grep`) {
#	if($_ =~ /^\s*(\d+\.\d+)\s+(\d+)\s+(\d+\.\d+)\s+(\d+)\s+([-:\d]+)/ && $1 > MAX_DSLOGD_MEM) {
#	    my $msg = "\nINFO: PATROL have to RESTART dslogd.pl due to high memory utilization, mem=$1% (pcpu=$3, rss=$4, etime=$5)\n";
#	    `systemctl restart dslogd.service 2>/dev/null && echo "$msg" >> $LOGFILE && echo "$msg" >> $DSLOGD`;
#	}
#    }
    foreach (`ipcs -mp | awk 'NR > 3 && $1 ~ /^[0-9]+$/ {print $1, $3}'`) { # `ipcs -mp | cut -c "1-11 23-28"`) {
	`ipcrm -m $1 1>/dev/null 2>/dev/null` if $_ =~ /^\s*(\d+)\s+(\d+)/ and !`ps p $2|grep $2`;
    }
    my $acpid_conn = `netstat | grep acpid | wc -l`;
    if(MAX_ACPID_CONN < $acpid_conn) {
	my $msg = "\nINFO: PATROL have to RESTART DS due to high number of acpid socket connections (acpid bug). Current connections: $acpid_conn\n";
	`systemctl restart acpid.service 1>/dev/null 2>/dev/null && echo "$msg" >> $LOGFILE && echo "$msg" >> $DSLOGD`;
#	`initctl stop ds 1>/dev/null 2>/dev/null && /sbin/service acpid restart 1>/dev/null 2>/dev/null && echo "$msg" >> $LOGPATH && echo "$msg" >> $PATH2DS/var/log/dslogd.log`;
    }
#    `initctl start ds 1>/dev/null 2>/dev/null` if `initctl status ds` =~ /^ds\s\(stop\)/;
#    `initctl start dslogd 1>/dev/null 2>/dev/null` if `initctl status dslogd` =~ /^dslogd\s\(stop\)/;
}
