// $gleason: trafficmon/TrafficMon.java,v 1.16 2003/10/14 19:06:46 clash Exp $ // Property of Joseph Gleason // Copyright 2003 package cc.glsn.trafficmon; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; import cc.glsn.Util; import cc.glsn.ConfigFile; public class TrafficMon { public static final String ConfigPath="/etc/trafficmon.conf"; private BWChart BWC; private Converter C; public static final int StateOK=0; public static final int StateWarn=1; public static final int StateCrit=2; public static final int StateUnknown=3; public static final int LimitUpper=30; public static final int LimitLower=40; public static final int DirIn=1; public static final int DirOut=2; public static final int DirTotal=3; //final static int DaysBack=35; //final static int MaxAge=600; //seconds before considered stale int MaxAge; private ConfigFile Settings; public static void main(String Args[]) throws Exception { TrafficMon T=new TrafficMon(Args); } public TrafficMon(String Args[]) throws Exception { Settings=new ConfigFile(ConfigPath); MaxAge=Settings.getInt("MaxAge"); C=new Converter(); String ChartName=Args[0]; BWC=new BWChart(ChartName,Settings); //System.out.println(Path); //path chartname update timestamp in intype out outtype /*if (Args[2].compareTo(new String("update"))==0) { int TimeStamp=new Integer(Args[3]).intValue(); double In=new Double(Args[4]).intValue(); String InType=Args[5]; int Out=new Double(Args[6]).intValue(); String OutType=Args[7]; BWC.Update(TimeStamp,C.Conv(In,InType),C.Conv(Out,OutType)); BWC.PurgeOlder(TimeStamp-(DaysBack*86400)); BWC.Save(); }*/ if (Args[1].compareTo(new String("updatebatch"))==0) { BufferedReader IN=new BufferedReader(new InputStreamReader(System.in)); while (Util.BufferedReaderOk(IN)) { String Line=IN.readLine(); StringTokenizer STOK=new StringTokenizer(Line," "); if (STOK.countTokens()==5) { int TimeStamp=new Integer(STOK.nextToken()).intValue(); double In=new Double(STOK.nextToken()).intValue(); String InType=STOK.nextToken(); int Out=new Double(STOK.nextToken()).intValue(); String OutType=STOK.nextToken(); BWC.Update(TimeStamp,C.Conv(In,InType),C.Conv(Out,OutType)); } else { System.out.println("Bad Line: " + Line); } } } if (Args[1].compareTo(new String("test"))==0) { //limit ll in|out|total w type c type ul in|out|total w type c type if (Args[2].compareTo(new String("limit"))==0) { BWSpot S=BWC.getCurrentBW(); int State=StateOK; int ArgIdx=3; String OutputStr=""; if ((S.TimeStamp + MaxAge < Util.getUnixTime()) || (S.TimeStamp > Util.getUnixTime())) { OutputStr+="stale bw data "; State=StateWarn; } while (ArgIdx < Args.length) { int LimitType=0; if (Args[ArgIdx].compareTo(new String("ul"))==0) LimitType=LimitUpper; if (Args[ArgIdx].compareTo(new String("ll"))==0) LimitType=LimitLower; ArgIdx++; if (LimitType==0) { OutputStr+="syntax error"; State=StateUnknown; Done(State,OutputStr); } int Dir=-1; double TestValue=0.0; if (Args[ArgIdx].compareTo(new String("in"))==0) {Dir=DirIn; TestValue=S.Bin;} if (Args[ArgIdx].compareTo(new String("out"))==0) {Dir=DirOut; TestValue=S.Bout;} if (Args[ArgIdx].compareTo(new String("total"))==0) {Dir=DirTotal; TestValue=S.Btot();} ArgIdx++; if (Dir==-1) { OutputStr+="syntax error"; State=StateUnknown; Done(State,OutputStr); } double WarnValue=new Double(Args[ArgIdx]).doubleValue(); ArgIdx++; WarnValue=C.Conv(WarnValue,Args[ArgIdx]); ArgIdx++; double CritValue=new Double(Args[ArgIdx]).doubleValue(); ArgIdx++; CritValue=C.Conv(CritValue,Args[ArgIdx]); ArgIdx++; if (((LimitType==LimitLower) && (CritValue > TestValue)) || ((LimitType==LimitUpper) && (CritValue < TestValue))) { State=StateCrit; } if (((LimitType==LimitLower) && (WarnValue > TestValue)) || ((LimitType==LimitUpper) && (WarnValue < TestValue))) { if (State < StateWarn) State=StateWarn; } } OutputStr+= S.getLine(C); Done(State,OutputStr); } } if (Args[1].compareTo(new String("get"))==0) { String Type=Args[2]; if (Type.compareTo("perspread")==0) { String Dir=Args[3]; int D=0; if (Dir.compareTo("in")==0) D=DirIn; if (Dir.compareTo("out")==0) D=DirOut; if (Dir.compareTo("total")==0) D=DirTotal; int Year=new Integer(Args[4]).intValue(); int Month=new Integer(Args[5]).intValue()-1; System.out.println("Percentile spread for " + ChartName + " direction " + Dir); BWC.PrintNthSpread(90,100,D,Year,Month); } } if (Args[1].compareTo(new String("extract"))==0) { BWC.Print(); } } private void Done(int State, String Output) { if (State == StateOK) System.out.print("OK - "); if (State == StateWarn) System.out.print("WARNING - "); if (State == StateCrit) System.out.print("CRITICAL - "); if (State == StateUnknown) System.out.print("UNKNOWN - "); System.out.println(Output); java.lang.Runtime.getRuntime().exit(State); } }