PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i5h-3LL

HOME


5h-3LL 1.0
DIR: /usr/bin
/usr/bin/
Upload File:
Current File : /usr/bin/snmpcheck
#!/usr/bin/perl

use strict 'refs';
require Net::Ping;
require Term::ReadKey;

#defaults
$mibident=".2";
$miberrflag=".100";
$miberrmsg=".101";
$mibfix=".102";
$mibheadall=".1.3.6.1.4.1.2021";
$mibclearcache="$mibheadall.100.VERCLEARCACHE";
$mibrestartagent="$mibheadall.100.VERRESTARTAGENT";
$mibupdateconfig="$mibheadall.100.VERUPDATECONFIG";
%miblist=(    '.2.1' => 'processes',
	      '.8.1' => 'scripts',
	      '.4' => 'swap space',
	      '.9.1' => 'disks',
	      '.10.1' => 'load-average',
	      '.101' => 'snmp-agent-errors');
@fixitlist=('.2.1','.8.1');
%mibchecklist = ('.2.1' => 1,
		 '.8.1' => 1,
		 '.4' => 1,
		 '.9.1' => 1,
		 '.10.1' => 1,
		 '.101' => 1);
$errlog="/net/tyfon/1/OV/log/ece-log";
$default_get_args = "-v 1 %s private";
$default_set_args = "-v 1 %s private";
$andlog=0;
$snmppath="/usr/bin";
$eraseline="                                                                           \r";
$fixit=0;  # this should be 0 not -1, but is necessary till getc(STDIN) works
$rescanWhen = 300;
$display = $ENV{'DISPLAY'};
$hidden = 0;
$pinghost = 0;
$loglevel = 1;
$logwindowatstart = 0;
$numloglevels = 5;
$dontstart = 0;
$raiseonnew = 1;

#
#  Mib Package:  Each mib has a mib number attached and can check/fix itself;
#

package Mib;

# @ISA = qw( Host );

sub new {
    my $tmp = shift;
    my $self = {};
    $self->{'HostId'} = shift;
    $self->{'Host'} = $self->{'HostId'}->{'Name'};
    $_ = shift;
    $self->{'Mib'} = $_;
    print "test: $_\n";
    ($self->{'MibSuffix'}) = /(\.[0-9]+)$/;
    if (!defined($mibchecklist{$self->{'MibSuffix'}})) {
	($self->{'MibSuffix'}) = /(\.[0-9]+\.1)$/;
    }
    print "suff: $self->{'MibSuffix'}\n";
    $self->{'MibDesc'} = shift;
    $self->{'Frame'} = shift;
    bless $self;
}

sub getmibnum {
    my $self = shift;
    return ($self->{'Mib'});
}

sub snmp_walk {
    my $self = shift;
    $self->{'Frame'}->toplevel->Busy() if ($::display);
    my $mib = shift;
    my $cmd = "$::snmppath/snmpwalk " . sprintf($::default_get_args, $self->{'Host'}) . " $mib|";
    ::addToLog("running:  $cmd",5);
    open(OUT,"$cmd");
    my $outcount = 0;
    my @result = [];
    while (<OUT>) {
	$result[$outcount] = $_;
	chop;
	::addToLog("snmpwalk:  $_",5);
	if ($::display) {
	    $self->{'Frame'}->toplevel->update;
	}
	$outcount++;
    }
    close(OUT);
    for($i=0; $i <= $#result; $i++) {
	$result[$i] =~ s/ Hex:.*$//g;
	$result[$i] =~ s/\"//g;
    }
    $self->{'Frame'}->toplevel->Unbusy() if ($::display);
    if ($result[0] =~ /No Response/) {
	$self->{'HostId'}->hostdown;
	splice(@result,0);
    }
    return @result;
}

sub check {
    my $self = shift;
    my $tmp = [];
    if ($::mibchecklist{$self->{'MibSuffix'}} != 1) {
	return @{$tmp};
    }
    if (! $::display) {
	printf "%sChecking %s: %s\r", $::eraseline,$self->{'Host'},
	$self->{'MibDesc'};
    }
    my @walkout = $self->snmp_walk("$self->{'Mib'}$::miberrflag");
    while ($#walkout > -1) {
	$_ = shift @walkout;
	($result) = /= ([0-9]+)/;
	if (defined($result) && $result > 0)
	{
	    ($mibloc) = /\.([0-9]+) /;
	    push(@{$tmp},FixProblem::new("",$self->{'HostId'}, $self->{'Mib'},
					 $self->{'MibDesc'},
					 $mibloc,$self->{'Frame'}));
	    if (! $::display) {
		printf("%s%-8.8s  %-12.12s  %2d -- %-37.37s",$::eraseline,
		       $self->{'Host'},$tmp->[0]->{'ErrName'},
		       $result,$tmp->[0]->{'ErrMsg'});
		if ($tmp->[0]->canfix() && $::fixit == 0) {
		    printf(" / Fix? ");
		    $ans = Term::ReadKey::ReadKey(0);
		    if ("$ans" eq "y" || "$ans" eq "Y") {
			printf("\b\b\b\b\b\b\b\b");
			$tmp->[0]->fix($mibloc);     # fix now if curses
		    } else {
			print $ans;
			printf("\nChecking %s: %s\r",$self->{'Host'}, 
			       $self->{'MibDesc'});
		    }
		} elsif ($::fixit > 0) {
		    $tmp->[0]->fix($mibloc);     # fix now if curses
		}
		shift @{$tmp};
	    }
	}
    }
    return(@{$tmp});
}

#
#  Problem Package: A problem comes into existence when found.  It may
#  or may not know how to fix itself (Problem/FixProblem).
#

package Problem;

@ISA = qw( Mib );

sub snmp_get {
    my $self = shift;
    $self->{'Frame'}->toplevel->Busy() if ($::display);
    my $mib = shift;
    my $args = sprintf($::default_get_args, $self->{'Host'});
    $_ = `$::snmppath/snmpget $args $mib`;
    my ($result) = /= (.*)$/;
    if (!defined($result) || $result =~ /No Response/) {
	$self->{'HostId'}->hostdown;
	$result = "";
    }
    $result =~ s/\"//g;
    $result =~ s/ Hex:.*$//g;
    ::addToLog("snmpget:  $_",5);
    $self->{'Frame'}->toplevel->Unbusy() if ($::display);
    return $result;
}

sub snmp_set {
    my $self = shift;
    $self->{'Frame'}->toplevel->Busy() if ($::display);
    my $mib = shift;
    my $args = sprint($::default_set_args, $self->{'Host'});
    $_ = `$::snmppath/snmpset $args $mib`;
    my ($result) = /= (.*)$/;
    $result = "" if (!defined($result));
    $result =~ s/\"//g;
    ::addToLog("snmpset:  $_",5);
    $self->{'Frame'}->toplevel->Unbusy() if ($::display);
    return $result;
}

sub new{
    my $tmp = shift;
    my $hostId = shift;
    my $mib = shift;
    my $mibname = shift;
    my $self = new Mib ($hostId,$mib,$mibname);
    $self->{'MibLocation'} = shift;
    $tmp = shift;
    if ($::display) {
	$self->{'Frame'} = $tmp->Frame();
    }
    bless $self;
    $self->{'ErrName'} = 
	$self->snmp_get("$self->{'Mib'}$::mibident.$self->{'MibLocation'}");
    $self->{'ErrMsg'} = 
	$self->snmp_get("$self->{'Mib'}$::miberrmsg.$self->{'MibLocation'}");
    if (exists $self->{'HostId'}->{'Down'}) {
	return $self;
    }
    if ($::display) {
	$self->{'Frame'}->pack();
	$self->{'Desc'} = 
	    $self->{'Frame'}->Button(-text => sprintf("%-12.12s %-42.42s",
						     $self->{'ErrName'},
						     $self->{'ErrMsg'}),
				     -font => "6x13",
				     -highlightcolor => "#ffffff",
				     -borderwidth => 0,
				     -relief => "flat",
				     -bd => 0, -padx => 0, -pady => 0,
				     -activeforeground => 'red',
				     -activebackground => '#C9C9C9',
				     -background => '#E0C9C9',
				     -command => [\&selectme,$self]);
	$self->{'Desc'}->pack(-fill => "x",-expand => 1,-side=>"left"); # 
	if ($::raiseonnew) {
	    $tmp->toplevel->deiconify();
	    $tmp->toplevel->raise();
	}
	::addToLog("problem found:  $self->{'Host'}\t$self->{'ErrName'}\t$self->{'ErrMsg'}",2);
    }
    bless $self;
    return $self;
}

sub haveseen {
    my $self = shift;
    $self->{'Desc'}->configure(-background => '#C9C9C9');
}

sub selectme {
    my $self = shift;
    if ($main::hidden) {
      main::makeappear();
	return;
    }
    if (exists $self->{'Selected'}) {
      main::deselectitem($self);
	delete $self->{'Selected'};
    } else {
      main::selectitem($self);
	$self->{'Desc'}->configure(-foreground => "red");
	$self->{'Selected'} = 1;
    }
    $self->haveseen();
}

sub deselectme {
    my $self = shift;
    $self->{'Desc'}->configure(-foreground => "black");
    delete $self->{'Selected'};
}

sub check {
    my $self = shift;
    if ($::display) {
      main::setstatus("Checking $self->{'Host'} -- $self->{'ErrName'}");
    }
    else {
	printf("Checking \b\b\b\b\b\b\b\b\b");
    }
    $result = $self->snmp_get("$self->{'Mib'}$::miberrflag.$self->{'MibLocation'}");
    if (exists $self->{'HostId'}->{'Down'}) {
	return 0;
    }
    if ($result == 0) {
	$self->deleteme();
    }
  main::setstatus("idle");
    return $result;
}

sub fix {
# Don't fix and/or unable to
    my $self = shift;
  main::setmsg("Don't know how to fix $self->{'ErrName'}");
}

sub rsh {
    my $self = shift;
    if ($::display) {
	system "xterm -e rsh $self->{'HostId'}->{'Name'} -l root &";
    }
}

sub deleteme {
    my $self = shift;
    my $host = $self->{'HostId'};
    $host->deleteProb($self);
}

sub deleteself {
    my $self = shift;
    if ($::display) {
	if ($self->{'Selected'}) {
	  main::deselectitem($self);
	}
	$self->{'Desc'}->destroy();
	$self->{'Frame'}->destroy();
    }
}

sub canfix {
    return 0;
}

package FixProblem;

@ISA = qw( Problem );

sub new {
    my $tmp = shift;
    my $hostId = shift;
    my $mib = shift;
    my $mibdesc = shift;
    my $mibloc = shift;
    my $frame = shift;
    my $self = new Problem ($hostId,$mib,$mibdesc,$mibloc,$frame);
    $_ = $mib;
    ($mymib) = /(\.[0-9]+)$/;
    if (grep(/$mymib/,@::fixitlist) && ($::fixit >= 0)) {
	bless $self;		# Make it a FixProblem if fixable
    }
    return $self;               # else just return a Problem
}

sub canfix {
    return 1;
}

sub fix {
    my $self = shift;
    my $mibloc = shift;
    if ($::display) {
      main::setstatus(sprintf("Fixing %s:  %s",
			      $self->{'Host'}, $self->{'ErrName'}));
    } 
    else {
	printf(" / Fixing...\b\b\b\b\b\b\b\b\b");
    }
    $self->snmp_set("$self->{'Mib'}$::mibfix.$self->{'MibLocation'} integer 1");
    $self->snmp_set("$::mibclearcache integer 1");
    if (exists $self->{'HostId'}->{'Down'}) {
	return;
    }
    if ($::display) {
	main::setstatus("Sleeping");
    }
    else {
	printf("Sleeping \b\b\b\b\b\b\b\b\b");
    }
    sleep(2);
    if ($::display) {
	main::setstatus("Checking");
    }
    else {
	printf("Checking\b\b\b\b\b\b\b\b");
    }
    if ($self->check() != 0) {
	if (! $::display) {
	    printf("*failed*  \n");
	} else {
	    main::setmsg("Failed to fix $self->{'ErrName'} on $self->{'Host'}");
	}
    }
    else {
	if ($::display) {
#	    $self->{'HostId'}->deleteProb($self);
	    main::setmsg("Fixed $self->{'ErrName'} on $self->{'Host'}");
	} 
	else {
	    printf("Fixed     \n");
	}
    }
  main::setstatus("Idle");
}

#
#  Host Package:  Each object is a host which can check itself and display
#                 the results
#
package Host;

sub mibsort {
    $_ = $a;
    ($av) = /\.([0-9]+)/;
    $_ = $b;
    ($bv) = /\.([0-9]+)/;
    return $av <=> $bv;
}

sub new {
    my $self = {};
    my $tmp = shift;
    $self->{'Name'} = shift;
    $self->{'Host'} = $self->{'Name'};
    $self->{'Mibs'} = [];
    $self->{'Problems'} = [];
    bless $self;
    if ($::display) {
	$self->{'MainFrame'} = $::HostFrame->Frame();
	if (!$::hidden) {
	    $self->{'MainFrame'}->configure(-relief =>"sunken",-borderwidth=>2);
	}
	$self->{'ProbFrame'} = $self->{'MainFrame'}->Frame();
	$self->{'hostlabel'} = 
	    $self->{'MainFrame'}->Button(-text => sprintf("%-9.9s",
							    $self->{'Name'}),
					 -bd => 0, -padx => 0, -pady => 0,
					 -command =>[\&selectme,$self],
					 -activeforeground => 'red',
					 -activebackground => '#C9C9C9',
					 -width => 9,
					 -anchor => "w",
					 -relief => "flat");
	$self->{'hostlabel'}->pack(-side=>"left",-ipadx=>1,
				   -padx=> 1,-pady =>1);
	$self->{'ProbFrame'}->pack(-side=>"left",-ipadx=>1,
				   -padx=> 1,-pady =>1);
	$self->{'MainFrame'}->pack( #-padx => 2,-pady =>2, 
				   -fill => "x", -expand => 1);
    } 
    foreach $mibx ( sort mibsort keys(%::miblist) ) {
	push(@{$self->{'Mibs'}},
	     new Mib ($self,"$::mibheadall$mibx",$::miblist{$mibx},
		      $self->{'ProbFrame'}));
    }
    return $self;
}

sub rsh {
    my $self = shift;
    if ($::display) {
	system "xterm -e rsh $self->{'Name'} -l root &";
    }
}

sub selectme {
    my $self = shift;
    if ($main::hidden) {
      main::makeappear();
	return;
    }
    if (exists $self->{'Selected'}) {
      main::deselectitem($self);
	delete $self->{'Selected'};
    } else {
      main::selectitem($self);
	$self->{'hostlabel'}->configure(-foreground => "red");
	$self->{'Selected'} = 1;
    }
}

sub deselectme {
    my $self = shift;
    $self->{'hostlabel'}->configure(-foreground => "black");
    delete $self->{'Selected'};
}

sub fix {
    my $self = shift;
    if (! exists $self->{'Down'}) {
	foreach $i (@{$self->{'Problems'}}) {
	    if ($i->canfix() && ref($i) ne Host) {
		$i->fix();
	    }
	}
    }
}

sub seenall {
    my $self = shift;
    foreach $i (@{$self->{'Problems'}}) {
	if (ref($i) ne Host) {
	    $i->haveseen();
	}
    }
}

sub canfix {
    return 1;
}

sub hostdown {
    my $self = shift;
    $self->deleteProbs();
    push(@{$self->{'Problems'}},$self);
    $self->{'Down'} = 1;
    if ($::display) {
	if (!exists $self->{'hostlabel'}) {
	    $self->{'hostlabel'} = 
		$self->{'MainFrame'}->Button(-text => sprintf("%-9.9s",
							      $self->{'Name'}),
					     -bd => 0, -padx => 0, -pady => 0,
					     -command =>[\&selectme,$self],
					     -activeforeground => 'red',
					     -activebackground => '#C9C9C9',
					     -width => 9,
					     -anchor => "w",
					     -relief => "flat");
	}
	::addToLog("$self->{'Name'} is down",2);
	$self->{'hostlabel'}->configure(-text => 
					sprintf("%-9.9s down",$self->{'Name'}),
					-width => 14);
    }
}

sub check {
    my $self = shift;
    $self->{'noDelete'} = 1;
    $self->deleteProbs();
    delete $self->{'noDelete'};
    if ($::display) {
	$self->{'hostlabel'}->configure(-text => $self->{'Name'},-width=>9);
    }
    delete $self->{'Down'};
  main::setstatus("pinging $self->{'Name'}");
    if (!($::pinghost) || Net::Ping::pingecho($self->{'Name'},2)) {
	foreach $i (@{$self->{'Mibs'}}) {
	    if (ref($i) ne Mib) {
		print "$i is a ref($i) not a Mib\n";
	    } else {
	      main::setstatus("Checking $self->{'Name'}:  " . $i->{'MibDesc'});
		push(@{$self->{'Problems'}},$i->check());
	    }
	    if (exists $self->{'Down'}) {
		last;
	    }
	}
    } else {
	$self->hostdown();
    }
  main::setstatus("Idle");
    if ($#{$self->{'Problems'}} == -1) {
	$self->deleteme();
    }
}

sub deleteme {
    my $self = shift;
    if ($self->{'Selected'}) {
      main::deselectitem($self);
    }
    $self->deleteProbs();
    if ($::display) {
	$self->{'hostlabel'}->destroy();
	$self->{'ProbFrame'}->destroy();
	my $top = $self->{'MainFrame'}->toplevel;
	$self->{'MainFrame'}->destroy();
	$top->update;
    }
  main::deletehost($self->{'Name'});
}

sub deleteProbs {
    my $self = shift;
    foreach $i (@{$self->{'Problems'}}) {
	if (ref($i) eq Host) {
	    delete $self->{'Problems'};
	    return;
	}
	if (ref($i) ne Problem && ref($i) ne FixProblem) {
	    print "i:  $i is a ", ref($i), "\n";
	    next;
	}
	$self->deleteProb($i);
    }
}

sub deleteProb {
    my $self = shift;
    my $child = shift;
    for ($k = 0; $k <= $#{$self->{'Problems'}}; $k++) {
	if (ref($self->{'Problems'}->[$k]) eq Problem ||
	    ref($self->{'Problems'}->[$k]) eq FixProblem ) {
	    if ($self->{'Problems'}->[$k]->{'Mib'} eq $child->{'Mib'} && 
	    $self->{'Problems'}->[$k]->{'MibLocation'} eq
	    $child->{'MibLocation'}) {
		splice(@{$self->{'Problems'}},$k,1);
		$child->deleteself();
		if ($#{$self->{'Problems'}} == -1 && 
		    !exists $self->{'noDelete'}) {
		    $self->deleteme();
		}
		last;
	    }
	} else {
	    print "    not: ",$self->{'Problems'}->[$k],"/",
	    ref($self->{'Problems'}->[$k]),"\n";
	}
    }
}

package main;

#
# Read arguments
#

if ($#ARGV != -1) {
    while ($#ARGV >= 0 && $ARGV[0] =~ /^-/) {
	$_ = shift;
	$andlog = 1 if (/^-a/);
	$dontstart = 1 if (/^-d/);
	$fixit = -1 if (/^-n/);
	$fixit = 1 if (/^-y/);
	$display = 0 if (/^-x/);
	$pinghost = 1 if (/^-p/);
	$hidden = 1 if (/^-H/);
	$loglevel = shift if (/^-V/);
	$logwindowatstart = 1 if (/^-L/);
	&display_help() if (/^-h/);
	&setmibchecklist(@fixitlist) if (/^-f/);
    }
}

#
# If necessary check the ece-log file for problems
#

if (($andlog || $#ARGV == -1) && !$dontstart) {
    open(LOG,$errlog);
    while (<LOG>) {
	@fields = split;
	@tmp = grep(/$fields[0]/,@ARGV);
	if ($#tmp == -1) { #  && $fields[1] ne "down") {
	    $ARGV[$#ARGV + 1] = $fields[0];
	}
    }
    close(LOG);
}

#
# Check all the found hosts 
#

if ($display) {
    use Tk;
#    $tk_strictMotif = 1;
    $top = MainWindow->new();
    $top->bind('all',"<Control-q>",[\&quit]);
    $top->bind('all',"<Control-h>",[\&makehidden]);
    $top->bind('all',"<Control-s>",[\&seenall]);
    $top->bind('all',"<Control-f>",[\&fixall]);
     $top->option('add','*highlightThickness','0');        #wish this worked
#     $top->option('add','*highlightbackground','#C9C9C9');
     $top->option('add','*background','#C9C9C9');
     $top->option('add','*font','6x13');
    $HostFrame = $top->Frame();
    $MenuFrame = $top->Frame(-relief => "raised",-borderwidth => 2);
    $MenuFrame->pack(-fill => "x",-expand => 1);
    $statusBar = $top->Frame(-relief => "raised",-borderwidth => 2);
    $status = $statusBar->Label(-text => "initializing",-anchor =>"e");
    $statusl = $statusBar->Label(-text => "Status:  ", -anchor => "w");
    $msgBar = $top->Frame(-relief => "raised",-borderwidth => 2);
    $msg = $msgBar->Label(-text => "",-anchor =>"e");
    $msgl = $msgBar->Label(-text => "Note:  ", -anchor => "w");
    
    $botFrame = $top->Frame();
    $butFrame = $top->Frame();
    $entryhost = "";
    $NewHost = $botFrame->Entry(-textvariable => \$entryhost,-width=>20,
				-relief => "sunken");
    $NewHost->bind("<Return>",sub {newHost("$entryhost");
			       $NewHost->delete(0,length($entryhost));});
    $BotLabel = $botFrame->Label(-text => "Check New Host:  ",
			    -anchor => "w");
    $CmdsMenuBut = $MenuFrame->Menubutton(-text => "Cmds");
    $CmdsMenu = $CmdsMenuBut->Menu(-tearoff => 1);
    $CmdsMenuBut->configure(-menu => $CmdsMenu);
    $CmdsMenuBut->pack(-side => "left");
    $CmdsMenuBut->command(-label => "Check Hosts", -command => [\&rescanhosts]);
    $CmdsMenuBut->command(-label => "Check Log", -command => [\&scanlog]);
    $CmdsMenuBut->command(-label => "Fix All", -command => [\&fixall],
			  -accelerator => "Ctrl-f");
    $CmdsMenuBut->command(-label => "Seen All", -command => [\&seenall],
			  -accelerator => "Ctrl-s");
    $CmdsMenuBut->separator();
    $CmdsMenuBut->command(-label => "Hide", -command => [\&makehidden],
			  -accelerator => "Ctrl-h");
    $CmdsMenuBut->command(-label => "Quit", -command => [\&quit],
			  -accelerator => "Ctrl-q");
    $PrefsMenuBut = $MenuFrame->Menubutton(-text => "Prefs");
    $PrefsMenu = $PrefsMenuBut->Menu(-tearoff => 1);
    $PrefsMenuBut->configure(-menu => $PrefsMenu);
    $PrefsMenuBut->pack(-side => "left");
    $PrefsMenuBut->cascade(-label => "Rescan");
    $RescanPrefsBut = $PrefsMenu->Menu();
    $PrefsMenuBut->entryconfigure("Rescan",-menu => $RescanPrefsBut);
    $AutoRescan = 1;
    if ($AutoRescan) {
      $afterId = Tk::after($rescanWhen*1000,[\&autorescan]);
    }
    $RescanPrefsBut->checkbutton(-label =>"Auto Rescan",
			       -variable =>\$AutoRescan,
			       -command => sub {if ($AutoRescan) {
				   $afterId = 
				     Tk::after($rescanWhen*1000,[\&autorescan])
				   } else {
				     Tk::after("cancel",$afterId);
				   }});
    $AutoCheckLog = 1;
    $RescanPrefsBut->checkbutton(-label =>"Checks Log",
			       -variable =>\$AutoCheckLog);
    $AutoCheckHosts = 0;
    $RescanPrefsBut->checkbutton(-label =>"Checks Hosts",
			       -variable =>\$AutoCheckHosts);
    $RescanWhenHidden = 1;
    $RescanPrefsBut->checkbutton(-label =>"Only When Hidden",
			       -variable =>\$RescanWhenHidden);

    $RescanPrefsBut->checkbutton(-label =>"Pop forward with new",
			       -variable =>\$raiseonnew);

    $PrefsMenuBut->cascade(-label => "Log Verbosity");
    $LogVerbBut = $PrefsMenu->Menu();
    $PrefsMenuBut->entryconfigure("Log Verbosity",
				  -menu => $LogVerbBut);
    for ($i=1; $i <= $numloglevels; $i++) {
	$LogVerbBut->radiobutton(-label => "$i", -variable => \$loglevel, 
				 -value => $i);
    }

    $PrefsMenuBut->cascade(-label => "Check For");
    $CheckForBut = $PrefsMenu->Menu();
    $PrefsMenuBut->entryconfigure("Check For",
				  -menu => $CheckForBut);
    $CheckForBut->command(-label => "Fixable Problems", 
			  -command => [\&setmibchecklist,@fixitlist]);
    $CheckForBut->command(-label => "Everything", 
			  -command => [\&setmibchecklist,keys(%miblist)]);
    $CheckForBut->separator();
    foreach $i ( sort mibsort keys(%::mibchecklist) ) {
	$CheckForBut->checkbutton(-label => $miblist{$i}, 
				  -variable => \$mibchecklist{$i});
    }

    $PrefsMenuBut->checkbutton(-label => "Ping Host First", 
			       -variable => \$pinghost);

    # Agent control

    $agentMenuBut = $MenuFrame->Menubutton(-text => "Agent-Control");
    $agentMenu = $agentMenuBut->Menu(-tearoff => 1);
    $agentMenuBut->configure(-menu => $agentMenu);
    $agentMenuBut->pack(-side => "left");
    $agentMenuBut->command(-label => "Re-read Configuration", 
			   -command => [sub {if ($selected) { $top->Busy(); 
							      my $args = sprint($::default_get_args, $selected->{'Host'});
$_ = `$::snmppath/snmpset $args $mibupdateconfig i 1`; $top->Unbusy();}}]);
    $agentMenuBut->command(-label => "Clear Exec Cache", 
			   -command => [sub {if ($selected) { $top->Busy();
							      my $args = sprint($::default_get_args, $selected->{'Host'});
$_ = `$::snmppath/snmpset $args $mibclearcache i 1`; $top->Unbusy();}}]);
    $agentMenuBut->separator();
    $agentMenuBut->command(-label => "Re-start Agent", 
			   -command => [sub {if ($selected) { $top->Busy(); 
							      my $args = sprint($::default_get_args, $selected->{'Host'});
$_ = `$::snmppath/snmpset $args $mibrestartagent i 1`; $top->Unbusy();} }]);

    # set up remote commands

    $remoteMenuBut = $MenuFrame->Menubutton(-text => "Remote-Info");
    $remoteMenu = $remoteMenuBut->Menu(-tearoff => 1);
    $remoteMenuBut->configure(-menu => $remoteMenu);
    $remoteMenuBut->pack(-side => "left");
    $remoteMenuBut->command(-label => "Load-Av", -command => [\&remote_load]);
    $remoteMenuBut->separator();
    $remoteMenuBut->command(-label => "top", -command => [\&remote_cmd,"top"]);
    $remoteMenuBut->command(-label => "mailq", -command => [\&remote_cmd,"mailq"]);
    $remoteMenuBut->command(-label => "ps", -command => [\&remote_cmd,"ps"]);
    $remoteMenuBut->command(-label => "conf", -command => [\&remote_cmd,"conf"]);

    # set up log file menu
    $logFileMenuBut = $MenuFrame->Menubutton(-text => "Log");
    $logFileMenu = $logFileMenuBut->Menu(-tearoff => 1);
    $logFileMenuBut->configure(-menu => $logFileMenu);
    $logFileMenuBut->pack(-side => "left");
    $logFileMenuBut->command(-label => "show log", -command => [\&displayLog]);
    $logFileMenuBut->command(-label => "clear log", -command => [\&clearLog]);
    $logFileMenuBut->separator();
    $logFileMenuBut->command(-label => "show Tyfon's log", -command => [\&displayTyfon]);


    # set up status bar

    $statusl->pack(-fill => "x", -expand => 1, -side =>"left");
    $status->pack(-fill => "x", -expand => 1, -side =>"left");
    $msgl->pack(-fill => "x", -expand => 1, -side => "left");
    $msg->pack(-fill => "x", -expand => 1, -side => "left");
    $statusBar->pack(-fill => "x", -expand => 1);
    $msgBar->pack(-fill => "x", -expand => 1);
    $HostFrame->pack(-fill => "x",-expand => 1);
    $butFrame->pack(-fill => "x",-expand => 1);
    $botFrame->pack(-fill => "x",-expand => 1);
    $FixBut = $butFrame->Button(-text => "Fix",-command=>[sub{print "hi\n"}],
				-state => "disabled");
    $FixBut->pack(-side => "left",-padx => 4,-pady => 2,-ipadx => 2,
		   -ipady => 2);
    $RshBut = $butFrame->Button(-text => "Rsh",-command=>[sub{print "hi\n"}],
				-state => "disabled");
    $RshBut->pack(-side => "left",-padx => 4,-pady => 2,-ipadx => 2,
		   -ipady => 2);
    $DelBut = $butFrame->Button(-text => "Del",
				 -state => "disabled");
    $DelBut->pack(-side => "left",-padx => 4,-pady => 2,-ipadx => 2,
		   -ipady => 2);
    $ChkBut = $butFrame->Button(-text => "Chk",
				 -state => "disabled");
    $ChkBut->pack(-side => "left",-padx => 4,-pady => 2,-ipadx => 2,
		   -ipady => 2);
    $BotLabel->pack(-fill => "x",-expand => 1,-side=>"left");
    $NewHost->pack(-side=>"left");
    &makehidden() if ($hidden);
    $top->update();

    # generate log window, but tell it not to create display 
    $logwindow = MainWindow->new;
    $logwindow->option('add','*highlightThickness','0');        #wish this worked
#     $logwindow->option('add','*highlightbackground','#C9C9C9');
    $logwindow->option('add','*background','#C9C9C9');
    $logwindow->option('add','*font','6x13');

    $logbuttons = $logwindow->Frame;
    $logbuttons->pack(-side => 'bottom', -expand => 1, -fill => 'x');
    $logclose = $logbuttons->Button(-text => 'Close', 
				 -command => ['withdraw',$logwindow]);
    $logclose->pack(-side => 'left', -expand => 1);

    $logtext = $logwindow->Text(-height => 40, -setgrid => 1);
    $logtext->pack(-side => 'left', -fill => 'both', -expand => 1);
    $logscroll = $logwindow->Scrollbar(-command => ['yview',$logtext]);
    $logscroll->pack(-side => 'right', -fill => 'y');
    $logtext->configure(-yscrollcommand => ['set', $logscroll]);
    $logwindow->title("snmpcheck Action Log file");
    $logwindow->iconname("snmpcheck-log");
    $logtext->delete('1.0','end');
    $logclear = $logbuttons->Button(-text => 'Clear Log', 
				 -command => [\&deleteLog]);
    $logclear->pack(-side => 'right', -expand => 1);
    if (! $logwindowatstart) {
	$logwindow->withdraw;
    }

    $status->configure(-text => "Idle");
    $selected = 0;
    # fill table with hosts
    if (!$dontstart) {
	loadAllHosts(@ARGV);
    }
    MainLoop;
}
else {
    select(STDOUT);
    $| = 1;
    if ($::fixit == 0) {
	Term::ReadKey::ReadMode(3);
    }
    loadAllHosts(@ARGV);
    printf("$eraseline");
}

sub loadAllHosts {
    my @hostlist = @_;
    foreach $host ( @hostlist ) {
	newHost($host);
    }
}    

sub newHost {
    my $name = shift;
    if (!exists $chost{"$name"}) {
	$chost{"$name"} = new Host ($name);
	if ($::display) { $top->update(); }
	$chost{"$name"}->check;
    } else {
	setmsg("$name all ready exists");
    }
}

sub deletehost {
    my $name = shift;
    delete $chost{"$name"};
}

sub setstatus {
    my $arg = shift;
    if ($display) {
	$status->configure(-text => $arg);
	$top->update();
	addToLog($arg,4);
    }
}

sub setmsg {
    my $arg = shift;
    if ($display) {
	$msg->configure(-text => $arg);
	$top->update();
	addToLog($arg);
    }
}

sub addToLog {
    if ($display) {
	my $logmsg = shift;
	my $logaddlevel = shift;
	if (! defined($logaddlevel)) {
	    $logaddlevel = 1;
	}
	if ($logaddlevel <= $loglevel) {
	    $logtext->insert('end'," " x ($logaddlevel-1) . "$logmsg\n");
	}
    }
}

sub displayTyfon {
    remote_cmd_generic("cat /net/tyfon/1/OV/log/ece-log","Tyfon -- ece-log"); 
}

sub displayLog {
    $logwindow->deiconify;
    $logwindow->raise;
}

sub deleteLog {
    $logtext->delete('1.0','end');
}

sub deselectitem {
    $obj = shift;
    $obj->deselectme();
    $FixBut->configure(-state => "disabled");
    $RshBut->configure(-state => "disabled");
    $DelBut->configure(-state => "disabled");
    $ChkBut->configure(-state => "disabled");
    $selected = 0;
}

sub selectitem {
    if ($selected) {
	$selected->deselectme();
    }
    $selected = shift;
    if (ref($selected) ne Host || !(exists $selected->{'Down'})) {
	$RshBut->configure(-state => "normal", -command => ['rsh',$selected]);
    } else {
	$RshBut->configure(-state => "disabled");
    }
    $DelBut->configure(-state => "normal", -command => ['deleteme',$selected]);
    $ChkBut->configure(-state => "normal", -command => ['check',$selected]);
    if ($selected->canfix() && !(exists $selected->{'Down'})) {
	$FixBut->configure(-state => "normal", 
			   -command => ['fix',$selected]);
    } else {
	$FixBut->configure(-state => "disabled");
    }
    if ($hidden == 1) {
	makeappear();
    }
}

sub makehidden {
    $MenuFrame->pack("forget");
    $statusBar->pack("forget");
    $msgBar->pack("forget");
    $butFrame->pack("forget");
    $botFrame->pack("forget");
    flatten();
    $hidden=1;
}

sub makeappear {
    $HostFrame->pack("forget");
    $MenuFrame->pack(-expand => 1, -fill => "x");
    $statusBar->pack(-expand => 1, -fill => "x");
    $msgBar->pack(-expand => 1, -fill => "x");
    $HostFrame->pack(-expand => 1, -fill => "x");
    $butFrame->pack(-expand => 1, -fill => "x"); 
    $botFrame->pack(-expand => 1, -fill => "x");
    reliefen();
    $hidden=0;
}

sub quit {
    $top->destroy();
    exit();
}

sub scanlog {
    my (@fields, @tmp);
    open(LOG,$::errlog);
    while (<LOG>) {
	@fields = split;
	@tmp = grep(/$fields[0]/,@ARGV);
	if ($#tmp == -1 && !exists $::chost->{$fields[0]}) {
	    newHost($fields[0]);
	}
    }
    close(LOG);
}

sub rescanhosts {
    foreach $i (keys(%chost)) {
	$chost{$i}->check();
    }
}

sub autorescan {
    $afterId = Tk::after($rescanWhen*1000,[\&autorescan]);
    if ($RescanWhenHidden && !$hidden) {return;}
    if ($AutoCheckHosts) {
	rescanhosts();
    }
    if ($AutoCheckLog) {
	scanlog();
    }
}

sub flatten {
    foreach $i (keys(%chost)) {
	$chost{$i}->{'MainFrame'}->configure(-relief => "flat",-borderwidth=>0);
    }
}

sub reliefen {
    foreach $i (keys(%chost)) {
	$chost{$i}->{'MainFrame'}->configure(-relief =>"sunken",-borderwidth=>2);
    }
}

sub fixall {
    foreach $i (keys(%chost)) {
	$chost{$i}->fix();
    }
}

sub seenall {
    foreach $i (keys(%chost)) {
	$chost{$i}->seenall();
    }
}

sub remote_cmd {
    my $type = shift;
    if ($selected) {
	remote_cmd_generic("$::snmppath/rsnmp -p $type $selected->{'Host'}",
			   "$selected->{'Host'} -- $type",1);
    } else {
	setmsg("Error:  Nothing selected");
    }
}

sub remote_load {
    if ($selected) {
	remote_cmd_generic("$::snmppath/snmpwalk " . sprintf($::default_get_args,$selected->{'Host'}) . " .1.3.6.1.4.1.2021.10.LOADAVE",
			   "$selected->{'Host'} -- LoadAve");
    } else {
	setmsg("Error:  Nothing selected");
    }
}

sub remote_cmd_generic {
    my $cmd = shift;
    my $title = shift;
    my $insert = shift;
    addToLog("running:  $cmd ... ");
    my $newwin = MainWindow->new;
    $newwin->Busy();

    $newwin->option('add','*highlightThickness','0');        #wish this worked
#     $newwin->option('add','*highlightbackground','#C9C9C9');
    $newwin->option('add','*background','#C9C9C9');
    $newwin->option('add','*font','6x13');

    my $buttons = $newwin->Frame;
    $buttons->pack(-side => 'bottom', -expand => 1, -fill => 'x');
    my $entries = $newwin->Frame;
    $entries->pack(-side => 'bottom', -expand => 1, -fill => 'x');

    my $text = $newwin->Text(-height => 40, -setgrid => 1);
    $text->pack(-side => 'left', -fill => 'both', -expand => 1);
    my $scroll = $newwin->Scrollbar(-command => ['yview',$text]);
    $scroll->pack(-side => 'left', -fill => 'y');
    $text->configure(-yscrollcommand => ['set', $scroll]);

    my $close = $buttons->Button(-text => 'Close', 
				 -command => ['destroy',$newwin]);
    $close->pack(-side => 'left', -expand => 1);
    my $rerun = $buttons->Button(-text => 'Re-Run', 
				 -command=>[\&fill_text,'',$text,
					    \$cmd,$insert]);
    $rerun->pack(-side => 'left', -expand => 1);

    my $cmdlabel = $entries->Label(-text => "Command:  ");
    my $cmdtexte = $entries->Entry(-textvariable => \$cmd, 
				      -relief => "sunken");
    $cmdtexte->bind('<Return>' => [\&fill_text,$text, \$cmd,$insert]);
    $cmdlabel->pack(-side => 'left');
    $cmdtexte->pack(-side => 'left');
    
    my $searchtext = '';
    my $searchlabel = $entries->Label(-text => "Search for:  ");
    my $searchtexte = $entries->Entry(-textvariable => \$searchtext, 
				      -relief => "sunken");

    $searchtexte->pack(-side => 'right');
    $searchlabel->pack(-side => 'right');
    $searchtexte->bind('<Return>' => [sub { $text->tag('remove','search','0.0','end');
					    my($current, $length) = ('1.0', 0);
					    while (1) {
						$current = $text->search(-count => \$length, $searchtext, $current, 'end');
						last if not $current;
						$text->tag('add', 'search', $current, "$current + $length char");
						$current = $text->index("$current + $length char");
						$text->tag('configure','search',
							   -background => 
							   'lightBlue');}}]);

    if (defined($title)) {
	$newwin->title($title);
	$newwin->iconname($title);
    }
    fill_text('',$text,\$cmd,$insert);
}

sub fill_text {
    my $dump = shift;
    my $textw = shift;
    my $cmd = shift;
    my $insert = shift;
    $textw->delete('1.0','end');
    if (defined($insert) && $insert) {
	$textw->insert('end',"running:  $$cmd\n\n");
    }
    $textw->toplevel->update();
    $textw->toplevel->Busy();
    open(OUT,"$$cmd|");
    while (<OUT>) {
	$textw->insert('end',$_);
	$textw->toplevel->update();
	$textw->toplevel->Busy();
    }
    close(OUT);
    if (defined ($insert) && $insert) {
	$textw->insert('end',"\ndone.\n");
    }
    $textw->toplevel->Unbusy();
    $textw->Unbusy();
    addToLog("done:  $$cmd");
}

sub display_help {
    print "
Usage:  snmpcheck [-x] [-n|y] [-h] [-H] [-V NUM] [-L] [-f] [[-a] HOSTS] 

  -h\tDisplay this message.
  -a\tcheck error log file AND hosts specified on command line.
  -p\tDon't try and ping-echo the host first
  -f\tOnly check for things I can fix
  HOSTS\tcheck these hosts for problems.

X Options:
  -x\tforces ascii base if \$DISPLAY set (instead of tk).
  -H\tstart in hidden mode.  (hides user interface)
  -V NUM\tsets the initial verbosity level of the command log (def: 1)
  -L\tShow the log window at startup
  -d\tDon't start by checking anything.  Just bring up the interface.

Ascii Options:
  -n\tDon't ever try and fix the problems found.  Just list.
  -y\tAlways fix problems found.

";
    exit(0);

}

sub option_get {
    my $resource = shift;
    return $top->option('get',$resource);
}

sub option_set {
    my $resource = shift;
    my $value = shift;
    $top->option('add',"*$resource",$value);
}

sub option_save {

}

sub mibsort {
    $_ = $a;
    ($av) = /\.([0-9]+)/;
    $_ = $b;
    ($bv) = /\.([0-9]+)/;
    return $av <=> $bv;
}

sub setmibchecklist {
    my $i;
    foreach $i (keys(%mibchecklist)) {
	$mibchecklist{$i} = 0;
    }
    foreach $i (@_) {
	$mibchecklist{$i} = 1;
    }
}