home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / sbin / syslog-facility < prev    next >
Text File  |  1999-01-20  |  4KB  |  141 lines

  1. #! /usr/bin/perl -w
  2.  
  3. # Copyright 1998 Hertzog Raphaδl
  4. # You can use this script under the term of the GPL v2 or later.
  5.  
  6. # This program is free software; you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation; either version 2 of the License, or
  9. # (at your option) any later version.
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. # GNU General Public License for more details.
  14. # You should have received a copy of the GNU General Public License
  15. # along with this program; if not, write to the Free Software
  16. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
  17.  
  18. my $conf_file = '/etc/syslog.conf';
  19.  
  20. ## BUGS :
  21. #  . This script doesn't know about multi-lines configuration (ie with '\')
  22. #  . With a line like that "mail,local0.* /anything" 
  23. #    "syslog-facility remove local0" would remove the entire line
  24. #    => should not be a problem since lines installed by this script
  25. #    cannot use such syntax
  26. ##
  27.  
  28. ## Nothing to modify after this line ##
  29.  
  30. my $command = lc(shift);
  31.  
  32. usage() if ($command !~ /^(?:set|remove)$/); 
  33. usage() if (not scalar(@ARGV));
  34.  
  35. if ($command eq "set")
  36. {
  37.     usage() if (int(scalar(@ARGV) / 2) != scalar(@ARGV) / 2);
  38.     # find a free localx facility
  39.     my $facility = get_first_free_facility();
  40.     # if none stop immediately
  41.     if ($facility eq "none") {
  42.     print "none\n";
  43.     exit 1;
  44.     }
  45.     # ok append the lines asked
  46.     open (CONF, ">>$conf_file") || 
  47.         die "Can't open $conf_file in write mode: $!\n";
  48.     my ($pri,$file,$line);
  49.     while (defined($pri = shift)) {
  50.     $file = shift;
  51.     $line = "";
  52.     foreach (split(/;/,$pri)) {
  53.         $_ =~ s/all/*/g;
  54.         $line .= ";" if ($line);
  55.         $line .= "$facility.$_";
  56.     }
  57.     $line .= "\t\t$file\n";
  58.     print CONF $line;
  59.     }
  60.     close CONF;
  61.     print "$facility\n";
  62.     exit 0;
  63.  
  64. } elsif ($command eq "remove") {
  65.  
  66.     my $facility = lc(shift);
  67.     my ($left,$file,$line);
  68.     open (CONF, $conf_file) || die "Can't open $conf_file: $!\n";
  69.     open (CONFNEW, ">$conf_file.new")  || 
  70.     die "Can't open $conf_file.new in write mode: $!\n";
  71.     while (defined($_=<CONF>)) {
  72.     # Write all "simple" lines like empty lines and comments
  73.     if (/^\s*$/ or /^\s*#/ or /\\$/) {
  74.         print CONFNEW $_;
  75.         next;
  76.     }
  77.     # Otherwise look if the facility to remove appears in the line
  78.     if (/^\s*(\S+)\s+(\S+)\s*/) {
  79.         $left = $1; $file = $2; chomp $file;
  80.         # It doesn't appers => write
  81.         if ($left !~ /$facility/i) {
  82.         print CONFNEW $_;
  83.         next;
  84.         }
  85.         # It appears => write a new line without the localx facility
  86.         $line = "";
  87.         foreach (split(/;/,$left)) {
  88.         if (not /$facility/i) {
  89.             $line .= ";" if ($line);
  90.             $line .= $_;
  91.         }
  92.         }
  93.         next if ($line eq "");
  94.         $line .= "\t\t$file\n";
  95.         print CONFNEW $line;
  96.     }
  97.     }
  98.     close CONFNEW;
  99.     close CONF;
  100.     rename ("$conf_file.new", "$conf_file");
  101. }
  102.  
  103. sub get_first_free_facility {
  104.  
  105.     my @facility = (0) x 8;
  106.     my ($left,$fac);
  107.     open(CONF, $conf_file) || die "Can't open $conf_file: $!\n";
  108.     while(defined($_=<CONF>))
  109.     {
  110.     next if (/^\s*$/);
  111.     next if (/^\s*#/);
  112.         next if (/\\$/);
  113.     next if (not /^\s*(\S+)\s+(\S+)\s*$/);
  114.     $left = $1;
  115.     foreach $fac (split(/;/,$left)) {
  116.         $facility[$1]++ if ($fac =~ /local(\d)/i);
  117.     }
  118.     }
  119.     foreach $fac (0..7)    {
  120.     return "local$fac" if ($facility[$fac] == 0);
  121.     }
  122.     return "none";
  123. }
  124.  
  125. sub usage {
  126.  
  127.     die  "syslog-facility - Copyright (c) 1998 Hertzog Raphaδl\n"
  128.     ."Usage : $0 set <set_of_priority> <logfile> ... \n"
  129.     ."        it returns the 'LOCALx' string you have the right to use.\n"
  130.     ."        $0 remove <facility>\n"
  131.     ."Example: $0 set all /var/log/all\n"
  132.     ."         $0 set all\\;\\!=info /var/log/all-without-info\n"
  133.     ."         $0 set =err /var/log/errors =warning /var/log/warn\n"
  134.     ."         $0 remove LOCAL1\n";   
  135. }
  136.  
  137.  
  138.  
  139.