--- mon	Thu Mar  7 11:06:29 2002
+++ mon.sev	Thu Mar  7 11:31:42 2002
@@ -4,6 +4,8 @@
 #
 # Jim Trocki, trockij@transmeta.com
 #
+# Severity level support added by Dan Urist <durist@world.std.com>
+#
 # $Id: mon 1.27 Sat, 08 Sep 2001 09:42:05 -0400 trockij $
 #
 # Copyright (C) 1998 Jim Trocki
@@ -676,20 +678,13 @@
 
 	my $called = 0;
 
+	my $parsed;
 	for (my $i=0;$i<@alerts;$i++)
 	{
-	    my ($range, $fac, $args);
 
-	    if ($alerts[$i] =~ /^exit\s*=\s*((\d+|\d+-\d+))\s/i)
-	    {
-		$range=$1;
-		next if (!inRange($retval, $range));
-		($fac, $args) = (split (/\s+/, $alerts[$i], 3))[1,2];
-	    }
-	    else
-	    {
-		($fac, $args) = split (/\s+/, $alerts[$i], 2);
-	    }
+	    $parsed = &parse_alert_line($alerts[$i]);
+
+	    next if defined $parsed->{exit} && !inRange($retval, $parsed->{exit});
 
 	    $called++ if (call_alert (
 		    group	=> $group,
@@ -699,8 +694,11 @@
 		    flags	=> $flags,
 
 		    pref	=> $pref,
-		    alert	=> $fac,
-		    args	=> $args,
+		    alert	=> $parsed->{fac},
+		    args	=> $parsed->{args},
+
+		    severity    => $parsed->{severity},
+
 		)
 	    );
 	}
@@ -1974,11 +1972,8 @@
 		}
 
 		for (@{$a}) {
-		    my ($alert, $args) = split (/\s+/, $_, 2);
 
-		    if ($args =~ /^exit=/) {
-		    	$args =~ s/^exit=\S+ \s+//x;
-		    }
+		    my $parsed = &parse_alert_line($_);
 
 		    call_alert (
 			group	=> $group,
@@ -1986,8 +1981,8 @@
 			output	=> "test\ntest detail\n",
 			retval	=> $retval,
 			flags	=> $f | $FL_TEST,
-			alert	=> $alert,
-			args	=> $args,
+			alert	=> $parsed->{fac},
+			args	=> $parsed->{args},
 		    );
 		}
 
@@ -2624,13 +2619,16 @@
 	if ($sref->{"randskew"});
 
     my $l = 0;
+    my $last_alert_severity;
     foreach my $p (keys %{$sref->{"periods"}})
     {
-	$l = $sref->{"periods"}->{$p}->{"_last_alert"}
-	    if ($sref->{"periods"}->{$p}->{"_last_alert"} > $l);
+	if ($sref->{"periods"}->{$p}->{"_last_alert"} > $l){
+	  $l = $sref->{"periods"}->{$p}->{"_last_alert"};
+	  $last_alert_severity = $sref->{"periods"}->{$p}->{"_last_alert_severity"};
+	}
     }
 
-    $buf .= " last_alert=$l"
+    $buf .= " last_alert=$l last_alert_severity=$last_alert_severity"
 	if ($l);
 
     if ($sref->{"_first_failure"})
@@ -4490,6 +4488,7 @@
 # 	flags		=> "flags, as in $FL_*",
 #	retval		=> "return value of monitor",
 #	output		=> "output of monitor",
+#       severity        => "from mon config file"
 # )
 #
 sub call_alert {
@@ -4497,7 +4496,7 @@
 
     foreach my $mandatory_arg (qw(
 		group service flags
-		retval alert output
+		retval alert output severity
 	    )) {
     	return (undef) if (!defined $args{$mandatory_arg});
     }
@@ -4583,6 +4582,7 @@
 	$ENV{"MON_ALERTTYPE"}		= $alert_type;
 	$ENV{"MON_STATEDIR"}		= $CF{"STATEDIR"};
 	$ENV{"MON_LOGDIR"}		= $CF{"LOGDIR"};
+	$ENV{"MON_SEVERITY"}            = $args{"severity"};
 
         if( defined($sref->{"_intended"}) )
 	{
@@ -4639,6 +4639,7 @@
     #
     if (defined $args{"pref"}) {
 	$pref->{"_last_alert"} = $tmnow;
+	$pref->{"_last_alert_severity"} = $args{severity};
     }
     $sref->{"_alert_count"}++;
 
@@ -4647,7 +4648,8 @@
     #
     shift @last_alerts if (@last_alerts > $CF{"MAX_KEEP"});
 
-    my $alertline = "$alerttype $args{group} $args{service}" .
+    # It would be really nice if we had an alert object...
+    my $alertline = "$alerttype $args{group} $args{service} $args{severity}" .
 	" $tmnow $alert ($args{args}) $summary";
     push @last_alerts, $alertline;
 
@@ -4920,3 +4922,24 @@
 	close(DTLOG);
     }
 }
+
+
+#
+# Parse out the alert line
+#
+sub parse_alert_line
+{
+  my($line) = @_;
+  $line =~ s/\s*=\s*/=/g; # Remove whitespace around "="
+  my @words = split(/\s+/, $line);
+  my $word;
+  my $result = {};
+  while( ($word = shift(@words)) =~ /([^=]+)=([^=]+)/  ){ # While we have something with an "="
+    $result->{lc $1} = $2;
+  }
+  $result->{severity} = 1 unless defined $result->{severity}; # default severity is 1
+  $result->{fac} = $word;
+  $result->{args} = join(" ", @words);
+
+  return $result;
+}
