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

## The common defaults
set filters_init_file "/usr/local/libexec/nbsp/filters.init";
if {[file exists $filters_init_file] == 0} {
    puts "arcfilter 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 arcfilter(conf)	[file join $common(confdir) "arcfilter.conf"];
set arcfilter(rc)	[file join $common(confdir) "arcfilter.rc"];
set arcfilter(rcdir)	[file join $common(rcdir) "arc"];
set arcfilter(lib)	[file join $common(libdir) "arcfilter.lib"];
set arcfilter(rcfiles) [list];
set arcfilter(localconfdirs) $common(localconfdirs);
set arcfilter(prerc)  [file join $common(confdir) "arcfilterpre.rc"];
set arcfilter(postrc)  [file join $common(confdir) "arcfilterpost.rc"];
#
set arcfilter(datadir) $common(archivedatadir);
set arcfilter(invdir)  $common(archiveinvdir);

# Parameters
set arcfilter(tarfext) ".tar";
set arcfilter(invfext) ".inv";

#
# Variables
#
set arcfilter(condition)	[list];
set arcfilter(action)		[list];

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

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

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

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

#
# arcfilter library
#
proc arcfilterlib_tar {rc_array archivepath invpath} {

    upvar $rc_array rc;
    global arcfilter;

    set _pwd [pwd];
    cd $arcfilter(datadir);

    set status [catch {
        file mkdir [file dirname $archivepath];
	exec tar -r -f $archivepath -C [file dirname $rc(fpath)] \
	    [file tail $rc(fpath)];
    } errmsg];

    cd $_pwd;

    if {$status != 0} {
	log_msg $errmsg;
	return;
    }

    set invdata [list];
    foreach key [list station wmoid awips wmotime seconds fbasename] {
	lappend invdata $rc($key);
    }
    lappend invdata $archivepath;

    cd $arcfilter(invdir);

    set status [catch {
	file mkdir [file dirname $invpath];
	filterlib_file_append $invpath [join $invdata ","];
    } errmsg];

    cd $_pwd;

   if {$status != 0} {
	log_msg $errmsg;
    }
}

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 != 0} {
	    log_msg "Error processing $finfo";
	    log_msg $errmsg;
	    log_msg $errorInfo;
	}
    }
}

proc process {finfo} {

    global arcfilter;

    filterlib_get_rcvars rc $finfo;

    set rc_status 1;

    # Evaluate the condition/action pairs, from all sets.
    set i 0;		# counts the sets
    foreach condlist $arcfilter(condition) {
        set actionlist [lindex $arcfilter(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;
    }
}

main $argc $argv;
