#!/usr/bin/perl -w use IO::Socket; ##use IO::Socket::Timeout; my $DEBUG = 0; my $pid; my @pid_list; my $out = 0; my $pid_file="/var/run/echo_port_loop_q.pid"; my $FRONTEND=$ARGV[0]; my $ARGV0=$0; my $TIMEOUT = 2; my $echo_port = 13011; # run netcat on port if all defined @backends are down my $echo_port_if_backends_down = 30000; # backend hosts #@backend = ( "sqoac0001ap", "sqoac0002ap" ); @backend = ( "10.40.192.139", "10.40.192.138", "10.40.192.134", "10.40.192.133", "10.40.192.135" ); #my ($ARGV0, $FRONTEND) = @ARGV; #my $FRONTEND="FEP_SA_IFSF"; my $haproxy_sock="/var/lib/haproxy/haproxy.sock"; printf $ARGV0; ### check if argument arg1 #### if ( not defined $FRONTEND ) { die "Argument 1 missing example $ARGV0 FRONTEND_NAME\n"; } ### check if already running #### if( -e ${pid_file} ) { $pid = qx( cat ${pid_file} ); chomp( $pid ); #$out = qx( ps -ef | grep ${pid} | grep -v grep | wc -l ); $out = qx( ps -ef | grep " ${pid} " | grep -v grep | wc -l ); printf "variable \$out: $out\n"; ## if( $out > 0 ) { ## exit; ## } else { ## if( $DEBUG > 2 ) { print "PID found, but no process, deleting the PID file\n" }; qx( logger -i -p syslog.info "$0: PID found, but no process, updating the PID file" ); qx( rm ${pid_file} ); qx( echo $$ > ${pid_file} ); qx( logger -i -p syslog.info "$0: started" ); } else { #print "pidfile not exists\n"; qx( logger -i -p syslog.info "$0: creating the PID file" ); qx( echo $$ > ${pid_file} ); qx( logger -i -p syslog.info "$0: started" ); } ### check if already running end #### my ($active, $count, $sock, $server); # definition of destination IPs in txn-LAn to check # # Prod ##@backend = ( "sqoac0002ap" ); # first check, if any destination is active my $FRONTEND_STAT_ENABLED=0; $active = 0; $count = 0; foreach $server ( @backend ) { printf "\nbackend foreach\n"; if( check_port( $server, $echo_port ) ) { print "in check_port function\n\n"; $active = 1; $count++; ##printf "\$count num: $count \n"; } else { ##printf "blaaah"; printf "\$count: $count\n"; } printf "Foreach loop\n"; printf "$server "; ##printf "$0 "; printf "$count "; } qx( logger -i -p syslog.info "$0: found $count active destination" ); $FRONTEND_STAT_DISABLED=`echo "show stat" | socat stdio $haproxy_sock |grep -i $FRONTEND|grep -i STOP|wc -l`; printf "FRONTEND_STAT_DISABLED: $FRONTEND_STAT_DISABLED"; printf "\nEnter loop\n"; while ( 1 ) { $count = 0; ##printf "after \$count counter\n"; foreach $server ( @backend ) { printf "Check backendserver $server $echo_port \n"; #$count++; if( check_port( $server, $echo_port ) ) { printf "Conected to server $server on $echo_port \n"; ##printf "Count increase\n"; $count++; $FRONTEND_UNREACHABLE=0; } else { $FRONTEND_UNREACHABLE=1; #break; } } ##$FRONTEND_STAT_DISABLED=`echo "show stat" | socat stdio $haproxy_sock |grep -i $FRONTEND|grep -i STOP|wc -l`; ##printf "FRONTEND_STAT_DISABLED: $FRONTEND_STAT_DISABLED"; ##printf "before disable frontend if\n count $count active $active\n"; # If all @backend unreachable if( $count == 0 && $active == 0 ) { ##printf "count==0 Active==1 case\n"; qx( logger -i -p syslog.info "$0: no backend server available" ); qx( logger -i -p syslog.info "$0: count: $count active: $active" ); qx( logger -i -p syslog.info "$0: disable frontend $FRONTEND" ); printf "disable frontend chunk\n"; system( "echo \"disable frontend $FRONTEND \" | socat stdio $haproxy_sock" ); #if (! `ps -ef |grep -i "nc -l -v" |grep -v grep`) { if (! `pidof socat`) { #my $cmd_nc_run=("/usr/bin/nc -l -v -k $echo_port_if_backends_down -e "echo &"); my $cmd_socat_run=("/usr/bin/socat TCP4-LISTEN:$echo_port_if_backends_down,fork EXEC:cat &"); printf "Running $cmd_socat_run\n"; system($cmd_socat_run); #$FRONTEND_STAT_DISABLED=1; sleep 20; printf "Sleep 20 secs\n"; $active = 0; $FRONTEND_STAT_DISABLED=0; } else { #printf "nc -l -v -k $echo_port_if_backend_down & already running. Nothing to do"; printf "/usr/bin/socat TCP4-LISTEN:$echo_port_if_backends_down,fork EXEC:cat already running. Nothing to do"; } } printf "COUNT $count ACTIVE $active\n"; if( $count != 0 && $active == 1 ) { printf "Enable frontend"; qx( logger -i -p syslog.info "$0: count: $count active: $active" ); qx( logger -i -p syslog.info "$0: enable frontend $FRONTEND" ); system( "echo \"enable frontend $FRONTEND \" | socat stdio $haproxy_sock" ); #$socat_pid=`ps -ef |grep "socat TCP4-LISTEN:$echo_port_if_backends_down,fork EXEC:cat"|grep -v grep | awk '{ print \$2 }'`; $socat_pid=`pidof socat`; printf "SOCAT_PID: $socat_pid"; if($socat_pid) { printf "kill SOCAT_PID: $socat_pid\n"; my $cmd_kill=("kill -9 $socat_pid"); system($cmd_kill); } $FRONTEND_STAT_DISABLED=1; $active = 1; } sleep 15; if( $count == 1 && $active == 1 or $count == 1 && $active == 0 ) { printf "Enable frontend"; qx( logger -i -p syslog.info "$0: count: $count active: $active" ); qx( logger -i -p syslog.info "$0: enable frontend $FRONTEND" ); system( "echo \"enable frontend $FRONTEND \" | socat stdio $haproxy_sock" ); #$socat_pid=`/usr/sbin/pidof socat`; #$socat_pid=`ps -ef |grep "socat TCP4-LISTEN:30000,fork EXEC:cat"|grep -v grep | awk '{ print \$2 }'`; $socat_pid=`pidof socat`; if($socat_pid) { printf "kill SOCAT_PID: $socat_pid\n"; my $cmd_kill=("kill -9 $socat_pid"); system($cmd_kill); } } # remove empty line from var $FRONTEND_STAT_DISABLED =~ s/\s+/ /gs; if ( $FRONTEND_STAT_DISABLED == 1) { printf "Frontend $FRONTEND disabled.\n" ; # qx( rm ${pid_file} ); # exit 0; } if ( $FRONTEND_STAT_DISABLED == 0) { printf "Frontend $FRONTEND enabled.\n"; # qx( rm ${pid_file} ); # exit 0; } sleep 15; } sub check_port { $sock = IO::Socket::INET->new(PeerAddr => $_[0], PeerPort => $_[1], Proto => 'tcp', Timeout => $TIMEOUT); #print ($sock) ##alarm 0; # nc -lvd 10000 & # echo port trigger run in background forever # system('while [ 1 ]; do nc -lvd 10000; done'); } exit;