#!/usr/bin/tclsh8.5
#
# $Id: ce44b6b15b1a11fc9b6df24c45cef736cb97db96 $
#

## The common defaults
set filters_init_file "/usr/local/libexec/nbsp/filters.init";
if {[file exists $filters_init_file] == 0} {
    puts "panfilter disabled: $filters_init_file not found.";
    return 1;
}
source $filters_init_file;
unset filters_init_file;

if {$filters_init_status == 1} {
    return 1;
}
unset filters_init_status;

# default configuration
set panfilter(conf)	[file join $common(confdir) "panfilter.conf"];
set panfilter(rc)	[file join $common(confdir) "panfilter.rc"];
set panfilter(rcdir)	[file join $common(rcdir) "pan"];
set panfilter(lib)	[file join $common(libdir) "panfilter.lib"];
set panfilter(rcfiles) [list];
set panfilter(localconfdirs) $common(localconfdirs);
set panfilter(prerc)  [file join $common(confdir) "panfilterpre.rc"];
set panfilter(postrc)  [file join $common(confdir) "panfilterpost.rc"];
#
# Variables
#
set panfilter(condition)	[list];
set panfilter(action)		[list];

#
# Read the optional configuration file
#
if {[file exists $panfilter(conf)] == 1} {
    source $panfilter(conf);
}

# The main rc file is required
if {[file exists $panfilter(rc)] == 0} {
    log_msg "Filter disabled: $panfilter(rc) not found.";
    return 1;
}

# Build the list of rc files
set panfilter(rcfiles) [filterlib_get_rcfiles [file tail $panfilter(rc)] \
        $panfilter(localconfdirs) $panfilter(rcdir) \
	$panfilter(prerc) $panfilter(postrc)];

# Load the rules sets
source $panfilter(rc);

proc main {argc argv} {

    global errorInfo;

    # gets returns -1 on eof. In addition the server explicitly
    # signals the filters to quit by sending a blankline
    # (gets returns 0 in this case, and finfo is "").

    while {[gets stdin finfo] >= 0} {
	if {$finfo == ""} {
	    log_msg "Received request to quit.";
	    break;
	}

	set status [catch {process $finfo} errmsg];
	if {$status == 1} {
	    log_msg "Error processing $finfo";
	    log_msg $errmsg;
	    log_msg $errorInfo;
	}
    }
}

proc process {finfo} {

    global panfilter;

    filterlib_get_rcvars rc $finfo;

    # Initialize the global variables
    set udp(status) 1;
    set udp(host) [list];

    # Evaluate the condition/action pairs, from all sets.
    set i 0;		# counts the sets
    foreach condlist $panfilter(condition) {
        set actionlist [lindex $panfilter(action) $i];
	set j 0;	# counts the rules with each set
	foreach c $condlist {
	    set a [lindex $actionlist $j];
            if {[expr $c]} {
                eval $a;
            }
	    incr j;
        }
        incr i;
    }

    if {$udp(status) == 0} {
	panfilter_udp rc $udp(host);
    }    
}

proc panfilter_udp {rc_var udphost} {

    upvar $rc_var rc;

    if {$rc(awips) ne ""} {
        set str [join [list $rc(wmoid) $rc(station) $rc(wmotime) \
	    $rc(awips) $rc(fbasename)]];
    } else {
        set str [join [list $rc(wmoid) $rc(station) $rc(wmotime) \
	    $rc(fbasename)]];
    }

    foreach _hostport $udphost {
	set _hostport_parts [split ${_hostport} :];
	set host [lindex ${_hostport_parts} 0]
	set port [lindex ${_hostport_parts} 1];
	
	set status [catch {
	    exec nbspudpsend -e $str $host $port;
	} errmsg];
	if {$status != 0} {
	    log_msg $errmsg;
	}
    }
} 

filterlib_init;		# open the cpool if enabled
main $argc $argv;
filterlib_end;		# close the cpool if enabled
