#!/usr/bin/perl -w ##=====================================================================## ## Copyright (C) 2001-2002 Stephen Zarkos. All rights reserved. ## Obsid@Sentry.net ## ## Please see file: COPYRIGHT for further copyright information and ## disclaimer. Or online at http://www.SentryFirewall.com/files/COPYRIGHT ##=====================================================================## ## File: process_conf.pl ## &process_conf: Takes global "@conf", parses it, and shoves it into %prefs. ## &do_include: Retrieve "include" directives from %prefs($prefs{'include'} ## and calls process_conf() to utilize any new values. $ENV{PATH} = "/bin:/sbin"; umask 022; ##-------------------------------------------------------------------------## ## This function simply takes the global variable @conf, parses it, ## and shoves it into the global %prefs hash. It will also parse and ## utilize the "=>" and "|=" directives sub process_conf { my($src,$dst,$var,$value) = ''; foreach (@conf) { next if ("$_" eq ''); chomp($_); $_ =~ s/#.*//; $_ =~ s/\"+//g; $_ =~ s/\'+//g; $_ =~ s/\`+//g; $_ =~ s/\*+//g; $_ =~ s/[\s\t]+//g; if ($_ =~ /=>/) { ($src,$dst) = split(/=>/, $_, 2); if (($src ne '') && ($dst ne '')) { symlink("$dst", "$src"); } } elsif ($_ =~ /\|=/) { ($src,$dst) = split(/\|=/, $_, 2); if (($src ne '') && ($dst ne '')) { if (!(-f "$src")) { if (-f "${m_point}/${src}") { $src = "${m_point}/${src}"; } else { next; } } system("cp -p $src $dst 1>/dev/null 2>/dev/null"); } } elsif ($_ =~ /=/) { ($var,$value) = split(/=/, $_, 2); if ($var ne '') { ## $value can be blank in some cases(%services). $prefs{$var} = "$value"; } } elsif (($_ ne '') && ($_ =~ /\:/)) { ## Likely a service or daemon, defined in %services. $var = "$_"; $value = ''; $prefs{$var} = "$value"; } } ## End foreach loop if (!(-e '/etc/localtime')) { if (-f '/usr/share/zoneinfo/GMT') { symlink('/etc/localtime', '/usr/share/zoneinfo/GMT'); } } @conf = (); ## Empty @conf, no more use for it. return 1; } ## End sub process_conf() ##-------------------------------------------------------------------------## ##-------------------------------------------------------------------------## ## Retrieved an "include" config files and calls process_conf() to utilize ## new values. Because main config directives are contained in a hash, any ## directives contained in new included config file will clobber the old ## values. sub do_include { my($status) = ''; (return 0) if (!(exists($prefs{'include'}))); &do_log("Processing \'include\' directive..."); if ($prefs{'include'} eq '') { delete($prefs{'include'}); return 0; } if (($prefs{'include'} =~ /^[hH]{1}[tT]{2}[pP]{1}[sS]?:\/\//) || ($prefs{'include'} =~ /^[sS]?[fF]{1}[tT]{1}[pP]{1}:\/\//) || ($prefs{'include'} =~ /^[sS]{1}[cC]{1}[pP]{1}:\/\//)) { if ($net > "0") { $status = ''; $status = &retr_file('include',$prefs{'include'}); if ((($status ne '0') || ($status ne '2')) && (-f "$status")) { $prefs{'include'} = "$status"; } elsif ($status eq '2') { &do_log("ERROR: Unable to retrieve configuration file, request timed out."); delete($prefs{'include'}); return 0; } else { &do_log("ERROR: Unable to retrieve configuration file."); delete($prefs{'include'}); return 0; } } else { &do_log("ERROR: Unable to retrieve $prefs{include}"); delete($prefs{'include'}); return 0; } } ## Check to see if $prefs{'include'} is a valid file. if (!(-f "$prefs{'include'}")) { if (-f "${m_point}/$prefs{'include'}") { $prefs{'include'} =~ s/^\/+//; &do_log("WARNING: Using \"${m_point}/$prefs{include}\" instead of \"$prefs{include}\""); $prefs{'include'} = "${m_point}/$prefs{'include'}"; $prefs{'include'} =~ s/\/{2,}/\//g; } else { &do_log("ERROR: \"$prefs{'include'}\" does not exist."); delete($prefs{'include'}); return 0; } } if (open(FH,"<$prefs{'include'}")) { flock(FH,1); @conf = ; close(FH); if ($prefs{'include'} =~ /^\/tmp\//) { system("rm -f $prefs{include} 1>/dev/null 2>/dev/null"); } delete($prefs{'include'}); &process_conf; ## Process global @conf info global %prefs. } else { ## $prefs{'include'} may be incorrect or just garbage &do_log("ERROR: $prefs{include} does not exist."); delete($prefs{'include'}); return 0; } ## Set up networking. if ($status eq "1") { $net += (&networking('NET_UP')); } if (exists($prefs{'include'})) { &do_include; } return 1; } ## End sub do_include() ##-------------------------------------------------------------------------## return 1; ## _EOF_ ##