logtool-1.2.8/0000755000372000017500000000000010321261354012631 5ustar wouterwouterlogtool-1.2.8/CHANGES0000777000372000017500000000000010321261344016061 2dd/changelogustar wouterwouterlogtool-1.2.8/conf/0000755000372000017500000000000010276711540013564 5ustar wouterwouterlogtool-1.2.8/conf/brightblue0000644000372000017500000000017207633714575015654 0ustar wouterwouter# This file takes plain ole POSIX regex's, one per line (just like grep -f) # There should be no blank lines in this file logtool-1.2.8/conf/blue0000644000372000017500000000017207567514061014446 0ustar wouterwouter# This file takes plain ole POSIX regex's, one per line (just like grep -f) # There should be no blank lines in this file logtool-1.2.8/conf/brightmagenta0000644000372000017500000000017207633714615016334 0ustar wouterwouter# This file takes plain ole POSIX regex's, one per line (just like grep -f) # There should be no blank lines in this file logtool-1.2.8/conf/brightcyan0000644000372000017500000000017207567514067015657 0ustar wouterwouter# This file takes plain ole POSIX regex's, one per line (just like grep -f) # There should be no blank lines in this file logtool-1.2.8/conf/brightgreen0000644000372000017500000000017207633714601016013 0ustar wouterwouter# This file takes plain ole POSIX regex's, one per line (just like grep -f) # There should be no blank lines in this file logtool-1.2.8/conf/logtool.conf.in0000644000372000017500000000615010046523662016522 0ustar wouterwouter# logtool config file sample. Read the doc's for more detailed information # # This option determines how to display the timestamp time_format=long # valid values are (long|short) show_source=true # valid values are (true|false) show_program=true # valid values are (true|false) verbose=false # valid values are (true|flase) redbeep=false # valid values are (true|false) (note: this only affects ANSI mode) output_format=ansi # valid values are (ansi|ascii|csv|html|html_table|raw) # do we suppress duplicate messages? supdupes=true # valid values are (true|false) # sys_ng_host=true # do we strip the *@'s from syslog-ng's src field? # do we print host and ip or both on syslog-ng host field hostfmt=ip # valid values are (name|ip|both) # # # # # valid values for the following are [/path/to/some/file/containing/regex_expressions] # you probably want to just leave the defaults, and edit the files accordingly includefile=@sysconfdir@/include excludefile=@sysconfdir@/exclude # greenfile=@sysconfdir@/green brightgreenfile=@sysconfdir@/brightgreen # yellowfile=@sysconfdir@/yellow brightyellowfile=@sysconfdir@/brightyellow # bluefile=@sysconfdir@/blue brightbluefile=@sysconfdir@/brightblue # cyanfile=@sysconfdir@/cyan brightcyanfile=@sysconfdir@/brightcyan # magentafile=@sysconfdir@/magenta brightmagentafile=@sysconfdir@/brightmagenta # whitefile=@sysconfdir@/white brightwhitefile=@sysconfdir@/brightwhite # brightredfile=@sysconfdir@/brightred # # # New for 1.2.0 - module config directives # # mod_syslog directives modsys_use=true # do we parse syslog's? # # mod_snort directives: class and priority display (true/false) modsn_use=true # do we enable this module, or no? modsn_resolvips=true # do we resolve IP addresses? (possibly very slow!) modsn_dispclass=true # Classification display? modsn_dispprior=true # Priority display? modsn_dispproto=true # IP proto display? modsn_dispsids=true # SID display? modsn_dispproc=true # preprocessor display? modsn_2lines=false # 2 line per event display? # # mod_iptables directives modipt_use=true # do we even use this module? modipt_resolvips=true # do we resolve ip's? # # mod_sound directives modsound_use=false # what command will play your soundfiles? modsound_cmd=/usr/bin/play # name each sound file - as of 1.2.8 we do NOT error check - make sure they # really do exist on your own time! :) Should be error checking by 1.2.10 or # 1.3.x if that comes first. modsound_redsnd=@sysconfdir@/sounds/red.wav modsound_brightredsnd=@sysconfdir@/sounds/alert.wav # the events below need to be configured with your own sounds before they # will work #modsound_yellowsnd=@sysconfdir@/sounds/yellow.wav #modsound_brightyellowsnd=@sysconfdir@/sounds/yellow.wav #modsound_bluesnd=@sysconfdir@/sounds/blue.wav #modsound_brightbluesnd=@sysconfdir@/sounds/blue.wav #modsound_cyansnd=@sysconfdir@/sounds/cyan.wav #modsound_brightcyansnd=@sysconfdir@/sounds/cyan.wav #modsound_magentasnd=@sysconfdir@/sounds/magenta.wav #modsound_brightmagentasnd=@sysconfdir@/sounds/magenta.wav #modsound_whitesnd=@sysconfdir@/sounds/white.wav #modsound_whitesnd=@sysconfdir@/sounds/white.wav logtool-1.2.8/conf/brightred0000644000372000017500000000017207633714603015467 0ustar wouterwouter# This file takes plain ole POSIX regex's, one per line (just like grep -f) # There should be no blank lines in this file logtool-1.2.8/conf/brightwhite0000644000372000017500000000017207633714665016045 0ustar wouterwouter# This file takes plain ole POSIX regex's, one per line (just like grep -f) # There should be no blank lines in this file logtool-1.2.8/conf/brightyellow0000644000372000017500000000017207633714606016233 0ustar wouterwouter# This file takes plain ole POSIX regex's, one per line (just like grep -f) # There should be no blank lines in this file logtool-1.2.8/conf/cyan0000644000372000017500000000017207567514063014453 0ustar wouterwouter# This file takes plain ole POSIX regex's, one per line (just like grep -f) # There should be no blank lines in this file logtool-1.2.8/conf/exclude0000644000372000017500000000017207222660021015132 0ustar wouterwouter# This file takes plain ole POSIX regex's, one per line (just like grep -f) # There should be no blank lines in this file logtool-1.2.8/conf/green0000644000372000017500000000022607222660041014603 0ustar wouterwouter# This file takes plain ole POSIX regex's, one per line (just like grep -f) # There should be NO blank lines in this file. # # Examples below NETGEAR logtool-1.2.8/conf/include0000644000372000017500000000024707221710202015123 0ustar wouterwouter# This file takes plain ole POSIX regex's, one per line (just like grep -f) # # the include file is something you probably want to leave blank, as I have # done here. logtool-1.2.8/conf/logtool.conf0000644000372000017500000000615010276711540016114 0ustar wouterwouter# logtool config file sample. Read the doc's for more detailed information # # This option determines how to display the timestamp time_format=long # valid values are (long|short) show_source=true # valid values are (true|false) show_program=true # valid values are (true|false) verbose=false # valid values are (true|flase) redbeep=false # valid values are (true|false) (note: this only affects ANSI mode) output_format=ansi # valid values are (ansi|ascii|csv|html|html_table|raw) # do we suppress duplicate messages? supdupes=true # valid values are (true|false) # sys_ng_host=true # do we strip the *@'s from syslog-ng's src field? # do we print host and ip or both on syslog-ng host field hostfmt=ip # valid values are (name|ip|both) # # # # # valid values for the following are [/path/to/some/file/containing/regex_expressions] # you probably want to just leave the defaults, and edit the files accordingly includefile=/etc/logtool/include excludefile=/etc/logtool/exclude # greenfile=/etc/logtool/green brightgreenfile=/etc/logtool/brightgreen # yellowfile=/etc/logtool/yellow brightyellowfile=/etc/logtool/brightyellow # bluefile=/etc/logtool/blue brightbluefile=/etc/logtool/brightblue # cyanfile=/etc/logtool/cyan brightcyanfile=/etc/logtool/brightcyan # magentafile=/etc/logtool/magenta brightmagentafile=/etc/logtool/brightmagenta # whitefile=/etc/logtool/white brightwhitefile=/etc/logtool/brightwhite # brightredfile=/etc/logtool/brightred # # # New for 1.2.0 - module config directives # # mod_syslog directives modsys_use=true # do we parse syslog's? # # mod_snort directives: class and priority display (true/false) modsn_use=true # do we enable this module, or no? modsn_resolvips=true # do we resolve IP addresses? (possibly very slow!) modsn_dispclass=true # Classification display? modsn_dispprior=true # Priority display? modsn_dispproto=true # IP proto display? modsn_dispsids=true # SID display? modsn_dispproc=true # preprocessor display? modsn_2lines=false # 2 line per event display? # # mod_iptables directives modipt_use=true # do we even use this module? modipt_resolvips=true # do we resolve ip's? # # mod_sound directives modsound_use=false # what command will play your soundfiles? modsound_cmd=/usr/bin/play # name each sound file - as of 1.2.8 we do NOT error check - make sure they # really do exist on your own time! :) Should be error checking by 1.2.10 or # 1.3.x if that comes first. modsound_redsnd=/etc/logtool/sounds/red.wav modsound_brightredsnd=/etc/logtool/sounds/alert.wav # the events below need to be configured with your own sounds before they # will work #modsound_yellowsnd=/etc/logtool/sounds/yellow.wav #modsound_brightyellowsnd=/etc/logtool/sounds/yellow.wav #modsound_bluesnd=/etc/logtool/sounds/blue.wav #modsound_brightbluesnd=/etc/logtool/sounds/blue.wav #modsound_cyansnd=/etc/logtool/sounds/cyan.wav #modsound_brightcyansnd=/etc/logtool/sounds/cyan.wav #modsound_magentasnd=/etc/logtool/sounds/magenta.wav #modsound_brightmagentasnd=/etc/logtool/sounds/magenta.wav #modsound_whitesnd=/etc/logtool/sounds/white.wav #modsound_whitesnd=/etc/logtool/sounds/white.wav logtool-1.2.8/conf/magenta0000644000372000017500000000017207567514073015136 0ustar wouterwouter# This file takes plain ole POSIX regex's, one per line (just like grep -f) # There should be no blank lines in this file logtool-1.2.8/conf/white0000644000372000017500000000017207633714670014641 0ustar wouterwouter# This file takes plain ole POSIX regex's, one per line (just like grep -f) # There should be no blank lines in this file logtool-1.2.8/conf/yellow0000644000372000017500000000023307222660053015017 0ustar wouterwouter# This file takes plain ole POSIX regex's, one per line (just like grep -f) # # Examples below FTP session (opened|closed) \(su\).*session (opened|closed) logtool-1.2.8/conf/sounds/0000755000372000017500000000000010046522424015073 5ustar wouterwouterlogtool-1.2.8/conf/sounds/alert.wav0000644000372000017500000012156010046522240016722 0ustar wouterwouterRIFFhฃWAVEfmt @@dataฃ…‰‰…ˆˆ‡‰ˆ‡ˆˆˆˆ‡ˆˆŠ‹‡„‡†„ˆ„„„ƒƒ……†…‡‡ŠŽˆ‰Œ‰Œˆ‡‡…„ƒ‚‚ƒ‚ƒ†ƒ€‰†‡ˆˆŠ‰ˆŠŽ‰ˆˆ‡…Œˆ€‡ƒƒ‡„……†††ˆˆŠŠŠ„†ˆ‡‚‚~„‚……Ž’‡Ž’“‹Š‡„‚‚€xˆ…ƒŽ‰‰‹Œ‹Ž”Ž‹Œˆˆ“‡‰†ƒƒƒ„…‡‡Š—ˆ„‡‰ƒ~{z~€€Ž…”’’•–ŒŒ‰…†…oz}}~w}€€†‡‹ŽคŸ‘™—“Œˆ†€zz}€|o€‚„„„‰“ŽŠœŠŒ‡‡„ƒ‚€‚‚Šƒ{ˆ”ƒ†€‚ŠŠ‹‹ŠŠ’ކ—‘‡z|vxrqƒ‚‘’‘’’™ข•~‰‹ƒwroinro„’‚šœ›จ—•˜”ƒu„{oklmnsr™‹•ฎฌ œ•‘”‡iy„sklqovx‚ฉœŽฃก›–•ˆ„Œnt†~tqxz‰‹z ‹’š”‹„†‹}tŒ‹‘…y{|w|–}‚”‘’‘™‘–†stskanˆv|’‘——Ÿถง‚”™ppchgo‚u‚’Œ’ฏฃง˜‡›Žoellan†x„˜˜ฎฃ˜ฉšˆekqh`tŠwˆ˜—ซฅ™ขขˆ†’niogb{…vŽ—ขฃ˜จž…˜gothk‡€~•กฅ˜ง‡dpreoŠyƒ—Œ ฌ˜ง˜„š‰djqfe„~|“Ž›ฌ™ค „–“hfsib}„w’žฉ˜ฆž„œŠdorcm‰{‚”–ช››ง‰Ž˜ojtkc†y’—คฃ•ฅ—ƒ—„grmfg†ƒ}—ฅง—šค˜ƒŒ‚opigg„‡z ฒ˜–žš€€ˆwijjn†€ต–“› •yŠ€ksllˆ‡‚ญจ’— •|‡yhmkg‰™ฎž“ง˜˜wcwii…~ƒ’šฌ–ฃ‘‰šn_viuƒ{”ฎฒž‹Žlgfj}u{ŠˆŒฐถ‹ข•v~eyƒtƒ€“’™ฑyƒw‚wu‰{~Ž”„”ญ’…‹~z{|‰|~•z“|ž—‹’wŒƒq†„kz—š“‘˜‡{‹wŒsn{~ฑ›ŠŸŒŠ‡yy†qfrvฆจ™˜™œ…mŒt_lj‡ƒœถŽ˜ง”‚uqmh€†‚ฒœ–ฆ„{[qfi‚yŒ”ดฐŸž”šq\nctsv‰…ฅฝœ‘ฅ–rel}stŠธช‹ค‚}nj†w{ƒ˜•ฑฒ}†…yl†wrŠ„~คฉ„šœ…|‡|uˆo‡ ‡’—•‚v„}„isvฌฎ‡›•‘ˆe…xZhp†˜มฌฏžwcc`v{’ถผœ˜vbe€qzƒ‡™ญบˆ|€~rh‚t€•†”กฆ‰˜„{i€ˆo†|mŠฒœŸ’‰‚{ˆscnxŽฏกˆšข†|~ohv„~’ถข———€Ujuuy††จว˜˜xnj}pux‹…ชฝx‚—‘tz‰t‰~ƒƒž–v•†q€–|Žƒn…ณœ€•Œ~{€ƒtjnwชผ‘‘™›yx„^ft|}ฑฌ‡ขš’glyr€‚}คฤ†‰l`t†y…Œ“ ว–qƒƒpfw…Š’ฑข™Žwjˆuvyl~ปต‰””‹k|r_v‹†ฏภ–•ЁQRux…‹ณัžzj`dwt|•‹ซย‡‰š‚glƒm||kฆร‘˜™qumWs‰‡ธถž›“pHdpj‡ˆŸัต•‰}nblcmŠ€œยž–คpg€anyg–ฬ ˜Ÿ{pvUbƒ~ฌพšฃ™[agu~‚ŸำญœžwZno^oนฤ’Œ–jyhm}wšฅ‡›ค”ƒ}‰ntui Žœ—~†~|rcrฆฑ•— ’r„gSlx‘ภœ ซ’|ddhpt†ฑซ’ฉ™bpƒovvˆป—Šum|„€{’’ทกpƒŽmu~s„€•ฐ‹ŸŒwv‰twyoฅง‹ฆ™‚„s^gƒญž‹ œw†|_v†€ฎค—™k[spuˆ‹มจ’œoe…whw…ดœƒŽ‹u‚qs{{ž˜ˆ…’…|~r’–‰„zˆ~~zj–ด””Œwq\s‚ฆฎ‡ฅ™{xhezz„ซก”ฅ–fq„wvzฑƒ‰ar–|~ŽกธŽ‹„hlww‰กญฃˆ€ypz„xƒกญ„‡ˆ{y‡t}ƒชys‚ƒŽ‡Œขr‹nz„“Œ‰ž–~އtu……}…ค‡”zq…|€~Ÿค~x—z}rvžŒ€’v€š€‡z„ญŽƒ”vy|{uw“ฑ“‘•w€wdn–ฏก–™Œv€aaz‘ฉ•‘ฉwhu‚†ญ‘“{opyƒขด˜‘“s\htxŒฐญ˜—‰Xbytz†ดซœคna‚tlw”ด…lŒ‰rƒ‚ซ ‰‰rhvŠ‘ฐฅŒ~sy|ty‚Ÿบ“}…wtuv€žช‡Žx€zr‚ŒคŒs„}Ž“zŠ™ ˜xyst{‰กซ|wo}zz‚žณฅ…~rwsqz‰ฑŒ‘„x„y|všคxb„•‚„•ดˆ„Yd~t†™ฌซ‹›xYrsuƒ ฒŸ•jgjtyœ “™Ÿ†qs€z–™|’‚yyzŠ‹คซ}’†lxai‰ฎซŠ˜ufay›‹คš|o^v›™€Žœ’‚oyš–x‡|ƒ€zฉฉ}‡…zx{jxตž„™‡‹~|nt ‹“|‘„{r‚›‡…ƒ‚ ƒ‚„‹‹„„utŒƒ“–•ŠŒ‡qx„}{™ŸzŠ•~ƒ‹ Œf“Šsˆ‡‰ฌg‚‹Œ}ขœ€qhm‚”›ท›Š€Xl}tŸถ—Œoiw‡ฅŠ–}ptƒขฅ€ŒŒx“~jฌ‚€ƒw…ƒŠ‡œ›Š‡wxˆ}€™™„‰{…{Ž‹Ÿfz||„‡ตฃ‡{^nˆ€‡Ÿฏˆƒ{_n{Šฉฐ‘›|tr^p”ขž™Ž„„{hwข€‡‚’|‰‹•Œ€ouˆˆ Œvzu{‡’ฌซt€zkvuฆฐˆntk{œฐ~kz„—ค›Œ{nevˆ–งŽ ‹yx`rจฅˆuyrj”ฃ‘„ˆ†q~‡€…ƒ‘ˆ‡‰ l‚~y‰˜ฆฃ‚qu‚vu‰ถ—…Ždj†Œฆ™ก‡‚xbo–”„•‘‹vŠ‚x‚‹ŸŸ{~€r{w‡žฌ‘ws€w‰Ÿค‡—{drw‚ฃ–‹’…˜vf‘˜‰z€Œ”’ˆ‚u~z…“ญ~x|{|Žฃ”iv~‘ก‰Žok”’~†}”†‹š‹}ˆzx€ ฏo{u|Žฉ•†kƒŠ~’‹ˆz‹ol™›Œ•ŠƒŠz‡Ž†zy€‘ˆŸ sƒqz•ขŒ•yp‹|€—‘‰‚„uq‘ฆ–…x€u €~‘€–—z…ƒsx„‘Ÿ †vz‰y}šž„‡{x|Š–—…‹zyƒsค–Ž€†Šx•s‚„rŠœกฃio€q~š—’—‘qq‡™ˆ†…ˆŠƒ“ˆ†…yzƒข™yt}‰{†ฃ„xef}ž›–˜ƒzx€€•กŸ{mn|~Ššข›…„retžœ‰ˆ‰‰‰……„‹yƒ}Ž™’…vŒ}Œ•’‹}zr{‘œŽ‹ƒŠ€‡w|„Œš–’xh„~„Ÿ—’Œ‹oj•‰†”‚„{„{w‘คข‹ur|zฉ’‚ˆnl„–Œ™‡€‚lˆ™…‰‰†ˆ„”{p„‰‰’ง…„sb}‰•š††zk–‡„Š”ŠˆŠu‚—‡‡ƒ‹“†‹~ƒ‰Š’ˆ™u‚ˆz„ƒŽ’‘}x„ˆ…ŒŠ‰~p€‡‡šˆ„lsˆ†–‰–‰‰|n~—‘ŠŒ‰‚‡suŒŒ„†‚‘{t„‰†Š‰”Ž”‹qq~„‡‰ข‘„kv‚„’–š‡…xi{‘Œ”“‘…ˆrv‡‡ˆŒ’™ˆqtˆ†‡“˜›{n‡€ƒˆข‘ˆ†luŒ€‰”˜˜‹‡tr‰Šˆ’—Œws‡Š€†„’ˆŒ~„‚„ƒ–x{„ƒ€“Š…xu†‡€ƒ›—ŠŠw‡ŒŒrvŠŒ†‹Œ‚‡st•™“Ž˜‡ˆ€t~„ƒŽ†qwŠŒˆ‰›—‹’yx‡‘Œ‘€xhvŽ“Œ‹“‘…‰zƒŒŒŒ—ƒŽ‚enƒ„ƒ“™–xs‡‘˜‘˜ˆ„€lt…‹„‡„‹‰y‚”’•”•ŽŒvj{ƒz…Ž‘Œ‚„pq‡’š’˜–„u„ˆz}z€‹w†ŠŠฉ–Žt|ˆƒ‡„‚‹y€vp””ŽŸŸŒ…y‰‚|}…†Žxk}…|‡“ค›œŒxƒ…†}†‚€k‰†‘™™š‘‰†‚…Œ‡„ji‚š›ฃ}x‡ˆ†‡jrˆƒ€‰—ข”}“††‚–„ƒycrˆ€‰œ––™u{˜‹ŒŠ}†pi}}ˆ”กฅคŠz€Œ„‹‚€}mkŠ‰‘Œฉœ‘–}}Œ…}w‚‹{vn‚Œˆ˜žคuƒŽ||‚z„z‰†ox›™œ –xaq~„~“„Š{‹’’’šƒ{hisz–›‘ฆr‰‘‹ƒ‡…‚~fm†‰†Œ‘ฏ”‹}ˆ{zƒ|ˆvtŠˆ”ฃ••–‚xy~~~{‹‡Š~rจŒ’–”Šzbn{{ƒ’މ—‘~‘”’‰wkb|„†ˆ‘ ฆ˜|}’‡|~~qk…Œ„Žฆฆš†|‚ƒx|†††o~ฅ˜‹›˜Ž…kp|x‹•†ž™ޔА†ƒƒvcvˆˆŒ–ฏขŽ˜|v‰}u†|ƒ‚„„vง ‹˜”“Їhky|xƒƒ“Ÿขv~Œ†}~{uft…•ฌš”ข‹Žy`t|~~А†งœz‹•ŽŽ~†‹zek‚ˆฎฆž”~kj{†…}Œ…Š„—•‘–‰sƒ|bn‚Šฒฐ’˜v„t{‡‚‹~†us ‹ข“š†wwgl†…‹œธž‡|ˆzl}„}ˆvt‘ฎ—‘ฃžŽ‚cewwy}Œ“’ฐ‡v•‹{’}qh‚‹“ฌ– –Ž…dl†rv|’Œ•ฏŽ} “‡}…‹vvgf‡ฆฌ”ฆ’‘v[~„s}€•ŒŸฐz•…~rŽy„tmšญž˜จ“‹t[nwu}„‡–ชง‡”‚z‚‰||€jpคฅ‰œ›ž{x~^g~ƒ‰•นชŒ „qjt~ru‰ˆจฉ‚‡sˆˆuxhn€จฏŠ•ฃ‹‚mp}}ƒ„–นคƒ|‚qp„{Š‚†‚„ง—Ž“Ž{x‚`dx}…ฐงš †]n…oy€’‡ฎชm†•†vuŽ|…nyชถ‹”š“wqp^r}ƒฃษ™˜x}t}€t†~~…›‘––†‚‚qhyŒŠฑœ•œ“|Xn‚nz…‘Ÿผ˜}Œ’~k{{xz‚s™ท‘™ž†y‰k`s~‚ฑฆš—…Zn†x|…‰ฆผxzƒzd‡~€ˆ†™งŠ‘–{}ynfqŠฐญ…กข…sorsžฦ‰‘p]r‰}Ž• ษ”k€ƒie}}„‡Žˆฐข†’wq‚xxln†ธดŠ”ƒlqii„†ˆญว˜Š’oQe€y„‰˜ชฯt……c`xxƒ†Š–ปข‘’‰ksqrniyญม›˜คjka[}‡„ณล›’—fKqsqˆ‰žวบ‡„Šu[oju†Žธฏ›œ“svwhces ฤฃ—ฒ›rh_Zu|yจั™—iXutpwŒ™ลณŠ•oeqfv|…ซฒšงœ„lkioaˆพŸ›งจƒz~W[u{ซญ•ซ˜‚ohmyw}ขฟš”Ÿw_zuftzปฅ”‹‰zp|ou…|ฌ{กขz‚ƒ‚qv|Ž‘ˆ••}™~}‚lกจƒ““x€{jjฏฉ“˜Ÿƒp„aYvฉญ‘ฑ›€uhgqu~คฎ–—šnk„uu‡€ณฒŽ’yco|o}ฌน„‚ˆ}s~o‹ฑ—ƒขŠt|qyz~š‘’Ž„–‚xmc–ก€“’‡y…zis—ฎ™คŠyteg~wžณ˜™Ÿ€]s€pzฒฉ‹กƒk††wx†‘ฆlƒ‹~‘…†“…ช‰n†ky„€†•‘—‡”Œty–{z{{ขŸ‘–ƒ‰wukqฅŸ‚—’…‹zlxšข…‹“{t‡ts›ด›‡|rxcm€Žธฃ„rhhn€‚ฉจœงŽulkpz‚ฆข“Œrww{ˆŠฉข•“‰b^ox‹’ญฑ˜–‹a`ux{ซผ—•Œ`gur|ซณ‰žbt„w€€ฑฅm_…‰y‰•ผขˆŒjayqw‹ฅถฃށgr}px†คทค‡~wzuk}Šžญ}€‘ˆ}|}…ฆ•l‡ƒl‚’–ณ|{›xs~~ƒช”x‘mvˆ~|†“’ขกvŠyn|z”‘–“Žy‡vˆ“…‹~v’…‘Š‹ˆ†rˆ‚z}ˆช’‹“vy‚t~w“–‘ชz“{vp€Œ€Ÿ•}‰ƒŒ}„ˆxz…“–‰Ž|u{†™ž–Œuw‚{zŸsœwŒƒv–š`y‰w™”„–กจvnulzy‚˜ฎญ—ˆrg~rw~ทœ“|jst–ด…‘˜n|…Šญƒ|Ža|”„ŠžซŽ€ŠebnŽคช˜›‰ulev€›ฉ“œ‡ƒobyŽ “ƒค‹…{jy“Ÿ…~‘w‡o}ซฅ€‚Šwzye€ต›Š˜„„xbuฅ•‹‹„~zs„ค‰…’‹ƒl„›~„}„žŠ‹‹˜ƒp|Œ~•ฌ‰€˜vw…‚’งz€†z‡~ˆ›ฃ˜sr|‹€ƒ‡ฃกƒ~hl€Š”ตก~ˆg^p~‚ฑต••…sghw‹ค•”˜yŒ{i€จ–‚ƒ‡Š€†wˆ›„†u’•wxoyy‹Ÿภt~sty~ฒ”—‡[~…wŽงค‹…vnjvŠฃค“žw€wkŸง†~x~uŠด’Œ‰n‡}‹’†˜‹|‚‚…”ฅvv|€x†งฉ–‚nq}t†—ฒ‘Žx^s}xดก–ˆv`a|”šŽฌ”~†ed˜™€‹‹’Ё|Œ—ˆˆx€‡€ŒŠ„‡‹‚‚Š„ซŽnŽ‚ryz•ฅ•ˆ~y‹zxฉ†ˆ€t…‡‡ก–Švkr—ฆ•“‰…‚€qzค—‚ƒ|ˆ‚‹œ‡~–…z†Œœ‘wtzƒ„™งЉak~ฆฆ•{m_xฆ›Š‹’~‚‡ƒƒ„ˆ†ž”un“„ƒžฆƒŠtcr‰— –‡v†qeŽฃ”‡Š†~Šƒs†‰~‡‡™ฅ›on…‚~‘ฆ’ˆ‡rm‚‘œ™‰‘zƒ{dดŠŠ‡‚…yŠŠxŠ|”Œก”seu‰x†žค•vhw‹Ž™ˆ‹€|‚tซ—ˆ€ƒy‡Š{•—{„ˆ‹•“sl}Šจฆ‹Œj_ˆ„ž“’‹‰sh‹ฌŒ…€‚{}{’›‰ƒ‡—‡qv‹‚‰ค›€‚jo‡…ก‘•~„riœ’}Šw‘’ƒ Šƒ„x|yฃ•“‹uz‰~”–Œ‰{‰zq˜™ƒŠzŠƒŒ“‚y‚‡ขžŒsds†ก–™~‚gj’Œ€Ž™‡——pu~v€ˆ—ญŠ~dr€”ฃА“ƒ„m~Š‹ƒก”o}Ž€}†š˜‡t|…ŸŽ‘~€~~’„€ƒˆ‹”จ€p{ƒƒ“ง€go“—‘›ˆ…w|„€~’ ns||€“˜˜Šˆx}ŠŽ…ŒŠ‰‡{~Š…‰†††Ž‰†‰‚‚‚ƒ‚™ˆˆ‰~€€ƒ…‹ŠŒ€†ˆ…‹‚…€…„‡Ž‹Š‚ƒƒ†‡Š’‡„‚ˆ—Œˆˆ~€ƒ‚†ŠŽŒ„‡‚‰†‡…„‡…Œ“ŒŠˆ‚ƒ‚†ŠŠ†„€„‚˜Žˆ‡~€ˆŒ‰’‹‚‡ƒˆŒƒ†„‡Š…АЅ‡€‚…‰Œ‡†‡†„ƒ†’†Š„€€‚‹‡‡ƒ†Œ„„„‰‡†Ž‹„…€€ƒˆŽ†…‚‚‡”Ž…‡„~€‰‰‰‹‰…€‹ˆ„Š‹“‹‰•†‰‚‚ˆŒ„ƒ}y„’Œ‹ˆ‰†‡Š†‰‡‚„†„ˆŠ‚…‡ƒŽ‚…†’“‘‡…ƒy„€{ƒŒˆˆ‡ƒƒ…•ˆ”Œ‘Œ‚z~|y‚‰{{ˆƒ†Ž‹Š‡‡‡ƒ˜‘~{€{‚…‰ˆ„Œ‰ƒŽ‡Š‚}Œ†‹Œw{~‚ƒˆ…‚ƒ”ŽŸง’Œ„~||~ƒ…m~€}„€ƒ…‘’“–›ž‰‡‡††}‰‚|€€‡‚†ˆ“‚{ƒŒ‹…‰y†Ž‹‰ˆŠŠ˜•vz‹ƒ}„xrvwuˆ›ˆš“žžš›žˆr|mjqtrxt‚”Š•™ฃœ—™˜xozxtprrutu„™–ซฆž’’‘’‡„gvzqsssz…‹ฆ œš”Œˆˆ„€jxƒzЇ|}…ŸŒ–ˆŒŠ†’{Œ’…w|vw~{†‚Š‹Š“—™™ž‚†ˆ~tpg`niˆ•˜—˜™ฎฉœŸ|x†xe^d\kqw˜‰‹ซฏžกง คšp|‹q`nkhg{ŽŠขŸœกš™––„w‰qjnkkn˜‹ชŸ“—‘†Š‰tŠŒrrrvrซ’‹ก•“€“Œqˆ‹nluw…˜ž‰“š‹‹„œ‚tiss{ฃ›…ž™ˆ‹€Š{Œ„lrun„ฐ”ฅ‘‰‚Œ‰{Œ‚jmqqyฐฃฆ—Š‚„{…‘qmtqqฅง‚ก›Ž‘††•|~oiro~ชšˆก•ŽŠ~‹|„nnro—ฉ‡šฅŒ‚‚Žx€Šttyw‡ฉ•†œ“Š…}’tƒssr‘š—ˆ˜”…|’r‚”vsyŠ‰˜…’–~|•}u’{l‚˜‰š‘‡”ƒr}‰v‡rz‘”™—‘~y‹†pŠ„kx€•ฃŽ–š‹‰{‹‡z‘vkxm‰ฐ‹”คŽ‚rƒ„dout‰จคœŸ˜|no^tkƒƒฑœง™„†ueme€…Žฅง–œ‰—†\lky~y‰Œฎถ‰›vyejozƒƒŒ–ฉž™}ƒ~{~z~w}‰•ƒญณw†‚zŒo|…xƒ‘Œˆจฉ…~†t~€|†‚}“… ˜|กއ‚q‰Ž|x‹wm’›‘”•†wŒŒsxl{‡ญŽขŒˆz€wfptปก•ฉ™”Štwƒibpn‡คฅ•™œ†rtbos‡„ฎŸ‚ฆ ƒ„oihh~€‘ ฒฅš–™Š^evwqz‚€ชมˆŸ›|{j…„yzฆถz{€~~p‘…}—ƒ™ขv”…|qˆŽs~…k‡ช—’š‡ˆ|vcdn‘ฐ™–ฅฉ‡}}dau~’ตฆ˜˜{Xgyksƒ ฤฏŸ‘xlktsnƒ‘ƒทฌxŠ˜Žuw‚†w…y‰ฆ”‘’{s„ymvžปˆ‘–—ƒrˆf`q|ˆทนฏœŽw`fbzz}ฝฏ‡ฅ‘ud}€o„ฃธŸ€zpl~{z‘–‡นฑr~ˆ„lz‚u‰}ˆ…คกƒšŠk‚kŠ}dŒถ‹ƒ•‡‰{’{fy€ถŸ‚›ˆshjlq’”พบ‰Š]Rw~s‚…‘ถผ’„‚€kr…u††‰ ซƒ‰’ƒpy”wƒ€oŽยก‹˜Šz^{g\’•สธ—žˆkH_ro„ˆกัฏ›‰qhetnv‘ˆฆถ‡˜€jwŒrznฉม”šbqhPq’Œบรฅ ›|H`r`t~ศบฃ–‡{jogc‚|”พšŽคys‚pr~j–ย˜“ˆrsq[j“ลฒœญ”qqaSh{zฌภฐฅฆ[qsZsx˜ฟžž‘~|ƒ{uv‡„ซงxˆ’~qs‚…™ฅŠ—˜†t„lslฎชŒŸ–„†|v`c{ซ ‘œจˆƒ‚`i€|ฌ‹ขymit‚}‹ตถ•™^`{jq‚‰ภด“Œswwpuˆƒฒžy–ขzv„yz{•—Œ“y˜~ztqจฌ„ššƒu€bY|–ฎข“ญtrgh}s‘ฐงขคe|~gqyชข‰{rŽ{€‘งq„ˆrzŽˆ›Ÿ’™zv‡†uƒtŒง‘—ˆƒtvduฉ—‹žฃ…€Šfoz™ฃ‹šs}†nsˆ™ณ•›~umcq€บ›•›‰mcvx{†ขฎ–žขki~ysz“ต“ˆ˜if…|Šต‡’k\u}y‘‰ฑฑ‘Žpduzy€†จป–€~ovxv|‡žซ}Ž‚xˆ‚ฐjƒxoŽˆŠ“กต{s‘tk~u‡Šซจ{ˆ—sk}†~‚š—‰ขxz‡}uƒ€–ŒŠ‹‡x|ข~v€ˆƒlžธ‹ŽŽy{pd|ฟง‰›’tvu]j™ฑ•˜ฒ„x€]c{™ค…™˜s|c‚Šคš‰ฃ}tu]u’Šซ˜œ™~yif€{™ต›•yf`szจช˜จ™kpqxs‘ฅ‘‘ux}ˆ‘ซŽ”zglo„•ช”šspdw‚šฎ›ฆ‘v_`w…ฅ••ง“zfv}•˜˜ŽvŽ|tƒกคƒ†—tzbrœฏ‘–€}…ob}ฅ˜˜—‡Ž~sek—ƒœŽ…„qŒŒy†x}Ž‹•ŠŸ“……ztz€‰ฆ’‹—|ˆ€{†“~ˆข€€†wˆ’vy—|”Œšwp‹nvŽ˜™ณ…vŽtws|‡”ท}x•~„‹›ขo€Ž|†ƒข•nzyˆ“ŠฅฆŠtnhƒzz”ธจŒŒkf…rvซช‹’op†|~‹ช™™rh€ƒx”ง‘‰Šs|‡Œง”rzphฎคŽ‘Œs‚qb{ค›ŽŽ‡“~uƒ–~‹‚ކ‡ŽŽƒv‚‹›‡ฎesvoxŽฑณ•„oe{{|†ฌฆ‘˜qq|ƒ›‹‰…‚lo„“ฌ•‡v†j…ญ‚€}~‡ขˆ‹tv‹{‡…›x~„†Ž  qsw‚€’ฒฉ‚dn}x—ต“Šx_u}{˜บค‘Œs_dz„ฃžขœv†j^…จ’†‰…~wขšˆ…s‚|‡ƒŽ”†…{–ฆ~‡”uwu…’ช‰€†€zuœฃ…Žqr–|›คˆ‚lgy—ก•Ÿ€ƒybtž …ˆ|tŽ˜Ž•„†y‹p{…†•…‘ค›phx–ฌฏŒŠnfoxˆฅ˜–‹}‡ml–œ†Ž‡~€ƒ‚}Š…{‘“œข{hmyy~ ณ›‹icp|”–š”„f|–ƒ‚ˆ‰’„“€ƒ„y…ŒžขŠpfq€ƒŽฌฉŒreq|›ฃ‹jp•†‡›ƒ˜ขv†qy‚—Ÿ›ˆmrŠ~šฐ’ƒ†hd‹š–—”‰rjš}„š‰”~„mw}•›ฅŠx~…y|Šฎ•‰ydq„ฃ”ก“|whpŽ…„•—„‰Ž}„†u{ˆ™ฅก‚ry‚rz›จŠŒ}o‡™™‰—ƒ}}dƒ•Š…•˜}›ˆhvwyƒ”ฏข’Œfjzzง˜†wi†”€’€…}Ÿ‘rˆ‚ˆ|ฃ”‚†fw‡ข˜‰‘w~qg‘ข‰‰…‡‹ˆŸ~s‚{…†Šฆ•ƒƒuqv“•‹‘’‚ˆ}†‡|~€…–งฆzvz||„•‘“€prŠ›Œ…Œ“†€…†„‡~}‡–‘ ‚k}ˆƒŸฉ†ˆwcp€™ค“’~~p}‰…Œ‹”ˆ›€jƒ‹ˆ‚ˆž‹ˆ~oƒ”‹…‡‘ˆ…nŒ˜…ƒƒ…‚zŽ’ŠŠ‡„wƒ“Žˆ‰“ކzq†ˆ„†Œ–‰™ƒq‚†ƒŒ‹˜—‘~pw†„ˆŽฅšŠonƒ„’“—“Œ}sz‡Š‡Œ‡sv”…‡„ˆˆsƒŽ‚……ŽŽ…’Š{„Œ~ƒ‚ˆ“Ž{„…†‚ŒŒŽ{o‚†„’–’ˆƒnoƒ‹Ž’‰”ˆ‚mx”Œ‰‹ˆŽ‡}{ƒŽ‹ˆ’ŠŠrv‡†‹‡‰my†‚‘ž™‘Œuu…ˆ‹—Ž”‡†vmŽ†‘•ˆŒnƒ‹„ˆž”Š‘zp…€|‚Š”•|o€‡‚ก”~u‹…’•‡‹yh{‡…†‹–†‡uŠ™‡‡‰˜ˆˆŽ€€|{ˆ‡Šw}Œ‰…–›Š’€zŠ‹†Š—€upŠ‹ˆ†•ˆŒŒyก’ŽŠ{p„ƒ|†‰ˆs|’‹—ฆ–˜Š‡tk}‰€~ŠŠƒ„w„ŒˆŒ‹ฃšŽx}ƒzŠŽ}†usŒ’”Ž—š~Œ‡ˆ|†‚€‰pn‚„‹”งžข‹tˆ~І‰„‰llˆ†Œˆ—Žžกƒˆ”„ˆ†ƒnj~ƒ“š‘”—‘”ƒwnq~xx€Ž˜˜˜‰ŠŽˆ…ˆshuƒ„˜‡‹…} “Œ˜Švfs‚y€…˜”‘ˆsŠŸ‡™ฆ“ˆ€cjƒ€|’‡ˆŠw‰ค•Š•™“ŠŽmi}|z‚ˆ”„ˆ~x”š™Ÿ’œŒy`s}„ƒŠ‘ˆ—ˆŠŽ‘‘’œŠ~yfi}…‰†˜—˜‰Ž’Љ‚Ž}ng{~z„Œš™ซ|…ŽŽ‹}}Œ€}okzƒ„Œ›ฏŸ’˜{u„„w‰‡…ƒ€ls‡žญ––ค‹Œdj…‚€‹†‹w‡งŒ—™Šƒsmwzw‚Ž•Šฅ›|‹“ˆŒ…Œycm€{„‡ขฒœ–}އ|~Ž‹{}op‚‹’ฐžŸ”‘€oz}€ƒz‰~ƒ{n†ถข˜›Š‰x]xŒ{{‡„†’𕖐•ˆ}nny|~˜ฉง|†“Ž…z~–‚rjy…žฌก—‰tvw{„z†ˆ„‰rฌš–‘—„{pox~„…“ฆฃ‚„Œ‡|x€uny‡…žฉžœ•{ut}ƒw„‚ˆ™•˜•Ž‹‡t„tguƒƒ†ฒฆ‘ €t~usy†‡ƒq‡ฌ“”žŽ˜‚yxdr…‡‡ฎ Ž†ˆŒw~ƒ‰}…€n|˜ซ›“ŸŸ‹…a`yzu‡„‘ญšyœ’†x‡†xzkt‡ช‘ก‹’r\y‚w}‡ž–ช…Š‹ƒ}~}rbqŠŠ’ฎซ”›wv~€{s„ƒƒ|›Œ›–‹u€gc„Šจฟ“•…q‚uu‚w†z…|€ฐจ” ‘–{t}ce}}†Šดฑ‹š€v|q‰Ž‰†ก‘’–Š‹wx‚chz…ƒœนง•ฅŒviv|stƒ‹›‘Œฅ——ƒ„|pcrƒŒฒก‹จ’m^vtvŠ“ฉบƒ…‚ƒkv~x€|‡z”ฌ“ Žz‹€]kzzˆฏญ“˜—|clŠ€~‘’ธ‹v™Žƒrz‘w~pg~จทœœช–jefux|‚žย˜Š€†sxxŒ‚†‚ž˜Š“‘‡}w„ofwดญ–™•„[g†nqy…‹ซด~Žก“|nŽƒqyio ดŸšrtlx€|คฦŒ”‹uvpxswŽ…”จฃ…š’‰p{‚ruhlŒทจ†ฉชˆuplo~{z™ห•ˆvrpŠ‹ƒจชy†–‰vopy{f|พณ‰š™‘nzqZv~u”ฝง‰ž˜h_ˆxsˆ„”ธฑyu}xc}††š‹’งขŠˆi{qvlžฬœ˜’qo}[h…—มก““nWv~vˆ†šยดŠ{vs\p|}œŽ”ณช…‘„xby~u~u}พย•˜˜‚`t]XˆŽรฑž™’mUpvn„„ฅลคŽƒxnaqi–‰ฉนŽ™‚atzarmnฒฬขฉ“hnZJsƒทฦฃœ yXwxfz„˜ฝฎƒ†Œritk‰„‡ฐซŸ•}etbvg~ฦฌ˜ฅžswUTr~ซฑ™ฒข‘vhinvv‘บŸ•ข~_v{q~~–ฝฎƒ„yqypt†|ฐฉ{“ž„vy‚pyx€ค‘”ฆŽx’xv\…ซŠ˜‰†„Œrgwœด•กŽlƒgVv พ–ฅฃ‰tfgmw|•บฅšญ€]yzjxyน“„ruŒ„x‡‘ถ‰v‚j|{xŒŠžข„••xw‹‚rqจš˜™ˆ…niazญ‘Žœœ‹ˆ…fn€‘ก‹”™~tkf…€ฌฎ™—‹gb|ux{มŒux~yt~ˆ“ฏ‚}ค‹vŠ€†yƒšy—‡xŠ }‡ˆŒšŠs€†s|z‹ฌ•Œ”‚|„ƒihƒฎ™• ‘{…}Yjƒšข†”™€‘l~‡ง‘{pkp‰‡‰ตง•ˆgav|{†ฌป–Ž^bvwz„ขบŒŸ˜Ylƒtzฃฑ€Vvzฌต…•}Ug}s†”ฑณ“–x\wt~‡ฏฒขyszwsz‰ฅช‘…ˆ†{€Œšฌ~sspŒƒ†˜ฑญq~ˆjrzužนx“€g~w†šชƒ•œv|‚zz}œt—Œ…’„ˆ‰”‡•{p‚ƒŠˆœ˜‘Œzz‡t}o‘ฏŠ’t‚w{trฃ ’จ††ƒwlbฅ€ŒŠžŒzsƒค‡‡~ƒ‚}~|ขข†•„}rj—ต””‘„}rpb{ญ‘‹จ•‹ƒ~lc””z”‡„˜”„qŽŸyˆ‰p~‡‡Ÿ”‹–v†…t€v• •ˆ|Šrz‹…ƒœ“‡‹‘~…˜shˆxw˜š‘ธŒb€ui{w‰ŸบŸv…€v}y{”ง™Š‡t‚ƒvzŒฌ”„w‹Œ~ŠŠซ’~ƒ`i‡Œ”ธค~e[uvxŸทš˜tgs}x˜ŸŽ›Œyqq{‚Ÿ–‰•€Ž~m‚•ž‡†‘sqs จ‹p‚l`}ชง†”š€reง‡ƒš‰~Šueฏ„ŠŒ”‡xt”˜y…s„‹‡–‡”‡q…„xŒ™“…•†€Œ€–˜j€“vƒ‡ฐ™izxŒ†‹ฑข€yef‚‰ขบœ‰„]kwy€ฃซ’ˆyhp„‡ข‡‹–{„tqซ“‡„‚†‰ƒu–—{‚v|€›ญ~ˆqt{{œฌŽ~q|~yžญˆ‰pk~Œ™ฆค‹i`tƒˆฎ™˜zkiŽณ˜’~w{rk—ซ‘•~‚†q‰“‡ƒ‚ƒ…‘‰ฅ˜r{wt€€‘ชก‹n}zt‰ฑคˆ“h_wv‡ฅšงšƒvcm†šŽ‰™’tgˆก„„†‡€ˆ‚{ข›‚„Š{{“’zŽ…u€‘™ z‡†‚s†ก‡yuކ•„€kj’Ÿฅ—{|tavฆฃŠ‘‹~~xŽ‹ŒŽ{„x”Ÿw|‡‰~จ’†rbz‰ˆ•ฆฅ‰uek{“ฌ“•y…ld’†’‘‡„…u…~†‰—€hqƒกข™‡~rdo†จค‰Œ{}m~‘Š’††ŸƒŒpr}|‰Šซ”—`z…’žšŠ~{is‰ค‹‘‰z‡pz’•Š„•‹“lv……ˆ… ฐ’‹mfz††™ •„‡{l~ขŸ„‡‹vxv𛐄€‘|Š–p{‡ƒ‚™ค‘ehƒ„‡™ญ™Œ|kp˜ž€“ƒx„q„ฉ|…†pŒ‡t˜„ƒ‰›–yes€ช›‹…tfm“กŠ“‹†‚wŒŽ||€‡Šจ’wˆˆ}ƒ•†w€~Œก“‡‘{‚€w˜‰„ˆ†ƒจˆp|ƒŠ‡จ˜‡dmr‡—˜Šw‚{~ž–ข†np}|‚กœ‘„qk|—’•‡Š‹€‡zˆŠ‚€„•”}t|“ƒ”˜Œ‰~{kwข˜Š‚Œ€‚ƒxˆ‚‘ก‘—{g‚}ค’“xf~”ƒ‰…’‡•‡m~y„‹ฉ™‘‡qy‚Š‘‹‹‰{{…ˆ†‚†‡|€‹…„†…Š‘ˆ…~ƒ„‚„†‚ƒŠ††…†‡…ŒŽ†„~……„’†‰…ƒƒƒŠ•ŽˆŠ~‚“‹„„|…ŒŒ†‡‰††ˆ†‡…€…†…ސ‰‡„ƒ†’އ‹ƒ‚‡‹„…‚‚Œˆ…‡‰ƒƒ‰Œ„ƒ„€ƒ†ŠŠ’Ž…„„‚€‹“††‡„ˆƒ‹’Ž„…‡~€Œ‰…‹Š‡†Š‹†…‚€ƒ†“Š‰ƒ“ˆ‰‰ˆ„‚‡Ž‡ƒ„{ƒŽˆ„…‹ƒ††‡ˆ†Œ‹Œƒ}}~|‰”Œˆ‰†‚‡†ˆ‹Š‡†ˆ„Œ‹ƒˆŠ‚‚…„‹‡‚‚…‡ƒ‹‰Œ…„{‡Ž“†}zz|…І‰‘š‡š’‡‡‰†„‚‚|~z‰Œˆ‹ƒ„†Š’™”‹‹‚~…Œ„‰Š†…ƒ~‚ˆƒ„ŠŒ’”™‡~Šz}ˆ}~„~|…ƒ…ฃ“‰•“‘ŽŽ•މ‚{|w|u{€†ƒ„ˆŽŽ’Ž„Ÿ‘šˆ{|w‚…~†}qˆ‹—˜‹Ž€y‹Žƒ‘ŠŠŽŠˆ……”œ…Š‘‚„srrt‚|{“†™˜™‘Œ’‰ˆ…|jhohssz‘‰—œžณฃ–•Ž}z…|sgljm~œ ซŸจž™…‡{{p{ƒztrux}~‡ž˜‘ฃฃข—Œ‚ˆsx‰ypt…‹‚…‰˜Š‡˜“Ž…†‹Œx€–‰~~~uuŒy|’›—’•ŒŠ‘”ฅ’‡‰tnrqfrp‹zŽขŸšžซค•›{zˆ|mbkf`fo‹…Žฑฝชขฃššx|Štcefjhx”Œกฃ•›™— q‰†ignoxv–ฅ‰–š’–‘u‚‰oitxpyซ•ƒก›“—“ƒ‰iŒqszv€”™‡ ˜”ŠŒ–yu‹ur}z|Ÿœ€“–Œ„Аx‡ˆluxr|ง“†ฃ’”‡Œ‰t„ƒltvrvฃž‚Ÿš‘“ŠŽy|ˆnotrq›ฏƒ› ‘ˆ‚Œ}z‘xqxqv ›œ•ށ‹ˆsŠ„qvytŽง‡ž‘Ž…„{}Œxuut –„ŸŸ”‹€†Žpw~zv~’˜”†—œŒƒŒŽru’uxŽ‘ˆ™‡‘™z„…t“Šs|’ƒŒ‘ƒ–“z‘ˆlˆ‰qw‹˜’–Ž“–ˆy‡o‚ˆlz|‹ฅ‘’‡ŠŒrˆyew{ˆฑ˜žŒ‰‰uƒŒglvo…คฅš˜œ•Šn‹~Ymk…—ท”“ก™††ƒnoiv‚~Šžฑฆ’‘]cpr{xŠŠŠซฦ‘—กrrhb„xwŠ‘ฆฉฃ”~~uq{x†‚‰’ต€†xŽtw‰}€Ž‹|›ฌŒ‚•†ux{z†ˆy“„~ žq‰wqŒ{n’Ÿ‘”–†vƒ‹qŠ‚s~€ฉ ž€‚~yik{{ดชŽก–’•~xp]lh€ ฆ——กŸy‘y`kj…ƒซฏ„Ÿขnmoe}{‡œฐฏŸ›˜Š][mztz†€ล•Ÿzzc‹|†‰—ถ‚zˆ~†l…‡y–‹™•u™‰t‹sw†nฌœ“ž ˆ…zpadrŽณข‘›ฆ‹~†h`qzz‰ตฐœœœY]}sp…„“ผตŸ”„}onvwryŒ~ฆต~Š—|q}}„y„}~ง“’ƒpŽƒ€{hr‘พ•”“ˆi„m]u‡ฌมˆฃกŒejeuzyˆฐปŒŸ™{dt…q„‚Ÿธค€|so}w‹”‚ฌฟ€}Šˆnmq…ƒŒ‰žญ€”Žˆt{”o……d‚ด›˜ŠŠx…ey„Œณช~•voloo‹‹Šดย”•lOkmz‡Œญย›…€qm„t€ƒ‚˜ญŒˆ—†soz|„tƒผฎ…”Œ`{s\{‘Žพฟ—กvNWsoŒ•ฬนšŒumiwsrŒ„˜ถŒŠž…pr‹qy~nœว˜—‘eirRh‘Œฐสงค†NVpcp€‹ฤยค•†}kord‚‚‡ถข‡ฃ•}srllˆมก‹spw\`~ˆนบญกuobN]wvควตงงˆXhw^m|ฟฆ”ƒ}{tr…‚ฃด}‡“‚p€w€ˆค‹’›|{ŠnrucŸตžž„…{vd_pคฅ˜ฌ“‚†e`{x งŒก‘|nip„„†ญบ”“e^}sn€ตธ•uvwrr‰จฉtŠฃƒuˆ„zywŠ™‹”~y“zwrกท‡’˜„q‚iY{“จซ’ฌ•urhc}wฑชกงƒcyˆkrxกจ‹ƒtŠ’|yŒงœt„Œst{†•ข†ƒx‚‰su„ชš™„†szlmฅ†›ฅ‘kivฃ‰‡ž}x†rq…‘ฏœˆœ†xrgl}…ฒฃ“žŽt]nvx›ฑœ–ฅrc~}q{Šฏ™‚šqbŒ‹|‹‹ฑฅƒ“nYqƒzŒงต‘ygs|y|Ÿผข‚‚prws|‡—ฎ™x‰†vƒ‚ŽŠฎi€xk†ˆ‰–œบ‰m|g~x…‡ฅฏ~„™{k{‡’™‰š|wƒo}””Œ‰Œ}†yv šxz€‚†mบ“‰‚x|tfsธฏ†™—zvy`eฐ›’ถ“w‡cauฆŠ•ฃwŒ„c€Œข›‡ฅ{ux\t“žฆŽค“t~ge„Žฆ ž{nZz†›ฃ“jvŽž„“‘v„v{…™ฎ‘‡›zxt]o‰ฑฆ…ขn€hbx›ฅ ฉu„xYcก…›…‹˜rjขx…Œv†€‚}Žฉ‘‹’q‡‚t}z˜—“…ƒˆ{‚…|†–‡‹Ž‰nwŠw‡Ž ˜ฐug‡mr{}›ภ‹w’|p~vƒฉ‰|~„‡|‰ข ‚uq{–‚ƒฑ–}~`oŠu‘ ปก…Zlxkzนค–”ku}t|’กˆ‰Žpu‡‡ˆฅ †Šzev‹ƒ“ฌ‘‰‰ukn}ˆจฌŽž‡zqfsˆกŽฎŠ…fu˜{„‰‚ƒp‰ฒ€ˆx„}ˆ~Œข†zx‡‹ “ˆˆx{„… ‹ky‰Š‘ชgtsƒŽ„–ปŸƒ{`n}uŒฆตyWqz“ฏœกƒ|y_k‹ „’‹‡ˆxx˜•„p‡Œ•—šƒ‡vyu„ฃฏt|„s€ƒˆขซ”ˆplƒv|Œต•Š‹_x„€“ฌš”‡qi^x›ชฆ˜ywr_uกค…}{–ˆ‡„~…|‹—…‡‘u€ˆŒฉ˜q{|ttwขท•—cywo†ฉŸ™’rvyxŽ‹’‡‰ub”™•‘€‡wmŽฅ‚‚‹}…y‡ฆ†…}‹z‡˜z|ˆ‚†‰‘…rm~ƒชฑ‚qe|}Žฅ—–…uxlp’ฉŸ‘‹†{wj|•‹’“„„†’~v…vŽŠ ซ•umqxtณ‘‡mo{ƒœ™”›|ˆs]‚ž‰ˆˆ–”~‘ry}vƒš ขn`s|vฌค’•go|’ˆ•‹€Œpxก†‡…•„‰š|uƒw„Œขฆ”zio}z‰งช˜~iku›Ž•ƒŽxy˜Œ‚ƒŽ‚Œ—w}z†”กš„jfz|ฉฐ”gf|˜‘›ŽˆktœŒ|‚Š€ƒŽˆyƒ‰‰“ ukx€€ŠกฒŒmasz‡Ÿ–ขŠ‚gyœ‰†ˆŠ‰ƒ–zˆƒx†ƒ“ŸŽ~s~Š€˜ฅ•ˆpfk†งฅ•‘|sƒ‚‡‹ˆ—ˆ nr†y…ขŽqmŠ“•‚‹ƒ€…y˜œ‡„w~†|žŠ|†ƒˆŽž’ƒ‹vht•›ŒŠ‰‹‹}{€‡€‘ฉ›ƒqfz€™คขˆˆzby—†„ŒŒ‰|€€Œ~›˜…kt‹›š“Š~pr›ฃ†ˆ‚Ё‡Ž€‘–z†Ž—’~rz‚ƒ’›™„~ymˆ•€‡’ˆ•‰xˆ†{~‡’–›|t…‚††—•”…r~‹œ‰‹€q†…Œš††uh{‘‰”––‹„‚jp‡–ˆ’’‚‰vqˆ”‡Ž‡ˆxo‹„Œ„™Š‹}ˆ‡~„‰“‘œ‡wƒ„ƒ‚””–‘vv‰†€”›ˆŽ~my…—’ƒ‰wt„‘މ‹‘‡{wŒ‰ƒ‰‹‰|yŠ…„ސ’ˆpv‡‡‰Œ›’ƒnzŠ…Š‘Ž…ˆtq”‰—‰†€n|‹†‘Ž–„Š€nˆŠ”™—†uv†…„š˜‰Œoo„…†–˜œŠŠ}k{‰‹’ ‘Œˆq{Žƒ„€Ž‘‡Žx…†€Š‘‘š|yŒƒ„‹™‹yk{„’—‡Ž„v†‘ŒŠ™‡‰ƒx…”…€|‹‚~}ƒ‰†•Ž‹‘~Ї‡›ƒ…pmƒƒŠ–‰‰„z†š™‹’‹€„q{‡…‚ƒŒx…މ“™›žŽtp~€~†„ˆ…ƒv|‘Œ‹žŽƒ~Š~~y‚‰„Šym‚‚”š˜–’wxˆŒ‹Œ†ƒ†xk{‚‡‡”ŸŸฉ„y‚…‚‚ƒ–ˆˆgn‰‹Œ”€Ž“ˆŠ‘‡z„jl€ƒ‡–ขŒ‘†}‡ˆ™š›ˆ„sbp†|Š‘”Љ‘’ŽŽŒ…pm|ƒŒ˜‡‹|{š˜šš‘—ƒl[…‡„“†Œ…tŒฃŒ‘ ‘Œ}eo‰{}„Ž‚‡†r‚ญŸ‹’–އ†or‰y}‚‡‹z{š›”˜žˆ‡xdo€~}…Œ‹Š•„‘˜ŠŠŽŒ–‘Žvhlvw‹’œ’“’„…˜ŽŒ–€|ƒmm}€‹‹–™จŠ{‰‘•„ƒ‡{}fh‚‹†Œ”ฉš“z~Їw€†{„nv‰’ฆ––ข’’{hl{|}’’‡ˆrก‘˜œœˆ‰kcx|v‡„’’ˆ”‘—‰z‡qcy…~†…™ง†Š’ˆ}w‡„{qu‡‡Œคขœš™~vyz~„‰{o‡จŸœฅŽx]s„|ƒƒ‘‡‡~‚œ•”˜‘šˆ|qfr„|}€” ŸzŠ™ˆ~‹~pm~„€–ชŸ“ข†u}yw~{‹††…s‚ซ–™––‡{jmv€…†’Šคก{Š•ŠŠ~y‹}sq‡šฆž—šzzxz‚|~Šz ”’Ÿ’“Štƒncx‰„Œฑจ™€y‡zsy‚ˆ‰oƒญ—Ž˜”™ƒyper€~‰‡’ฃฅŽzŒ||„Šz~yn~”งขžšˆ``{{r€‡•‹ฉ›x™‹y†ƒztdpŒ‹ฆฅ’‡sd}„t{‡”‰•ฃˆš‹‡„|oau‹„ฒณ‘žŒt}‚‚€x†~{tขฉ™›…u~hkƒ~„„ นœ’ƒvˆwn}‚€yƒsxซฎ”œ˜—ytsao|„…ฎฌŒ–€}†q{…‚Œ€‹x€ฌ•†‘wv_j‚…“ตฐ‹ }urzwn€‚ƒ‡”œŽœ–˜€€ƒmam†…ฎจค“’m\zxr€…“คภฆz„‰„kw‚ƒ€}€nŠถ“ค—’tƒ}]nzw†คต••xhm€‡ƒ~‘„ŒซŒy›“‰tw‡v{kg‚ธŸ‘ฌ—…eapru~šฝ Šˆ†’ssz…}‰}›ฅ†Ž‡uˆnbzˆฎนš˜œ‚[e„qry‰ˆขด‚ฃ‘€oކvudo—ฒ—Žจ™†qir|~~„ขฤ˜‰„y}mzzyŒŽšง˜˜‹wx{slerŠฎฏ…ฃค‹rjvuy|xรž†Œ{zp{{ކ†กฉ„„’ˆyowywfxฒทšค’urkZt~{ผณ‚›hb‰u‡‰Œฌธtu‡~fz…ƒ’‹žชŠ‹ˆ‚hxŠx|sq˜ศฃœ›uox]f‚”ฟณ“hUxwˆ‰—ทป„vyZoz}“‹ฆฒŽ‰{`u{uwr~ตล™” ƒcoZZ}‚ˆพฝž—“mSqxmƒˆžฟฐ†€„t`riމœธœšš‡foudiiqฆฬช˜ฌ—mlZOs}{ฌะค›x]sthu‰ถธ„”xivo…„…œฒš —„h€qbpg{รฒ›ฃค„txQStyŸดญ –pfllsxŠผ •ž{eyzr|~’ฒฒƒŠn}ptƒ|คฌ” †y{‡qwqvฅ™‘จ–|vm]ฎŽŒ—‘ke{’ณ›Šงp}cXr~—ภ กŸ‘m]oqs~Žผง“ซƒa{|lyv–ท›ˆ{w…‹y‡Šต‹q‘‰l{|yƒŠ Ž”™~rЁn|jŠฎ𗙇†ƒu_bwง›‹›กˆ‰€cs†‰ฃ”–€qim‚‰~กท—™ff„sq~Šบจ†‡~z|}qƒŠฏ}ญs‡†‚v}‘‹’ˆvƒค{……‡คŒ‡•x„xvt‰ฐ™‰–‹x~‡ihƒงŸ“ ˜{†|Zj~จŠ“š€{j‡ˆง”jcsˆ…†ฎฒ•ˆa_yx|ˆฆลŒ‘\c|w}ผŠš^o‡v||žด†\r}ˆจถˆ~[h{p€‘ฎณ™{aq}uyˆจฑง‡xvvusy‹šฎ{Š‹z‚ƒŒฎ~p…ypŒ†‰Žฉฒr|’mr{v‡–ถ‘y•†ezx}‘จˆ•กuy€}t~”{“€‹ƒ‡ƒ‰‡‚n……†‹v› ŽŽ€€‡w~iˆธŒ–{xxnmกฆง‘ƒ‚ya`‰จ…Œ’‹•rqƒง‹„„x‚|x ฅˆ‹|kk’ท——ˆxxkbxฌ—ˆจŸˆ†h`œz“„‘–lŠฅ}„Œu…~}‚ฃ™…˜z„vxn’ฆŽ•‹}qzv‡Ž‚—œ†Ž‘~Žzkˆ|x‰œ™Œณ‘g|i{wˆ“บฅp‡‡q|v|กž€ˆ}|„zwŽข›ƒzzŒŽˆŠฆ–~zdk†‰“ถฌ€h[yuv—ปฃ‹žtg{{w”ฅ”–•spv|~›ž„†|q…‹ Ž…q|oo•˜จ“Ž’sj`}Ÿญ‰”Ÿ~ƒqfฃž{‹rc‰ฐ‹€ŽŒŽus• y…x„ˆ’ž›„‚m†ƒw…›‰Žˆ…Š}’—o}–z€ˆ‡ชœh{}yŒ‡Šฉจ†sjg€†žฟŸŽ†Zk|v›ฑ ’Œpks‚ƒขŽŠ“€€or‹ฆ›„‡…}‹}l“ž{„w||– “„‹vr|~‡–ฌ‹‚yz€z|›ซ„pl}Ž–จจˆˆd\w†„ฉ Ž“~zfj‹ญก‹•…o|me“ฏ“˜‚„…pƒ‰ˆ‹…††ก˜v€zo‘ขฉ‰x}yx‚ฑฉ‹’hbyt‚กขขŸ†pgo}™‹›ˆ•sc‰ž†ƒ‹ˆ„{tข ƒ…‚Œxz‡”‡ˆx€“€“œ|‹Š}…v†›”‚yy’‡ฃ”ƒ„ek„จ“–}znav ฆ‹”…‚zq”‡‘}„Œx˜|€‡ƒ’Œฃ˜‚qfy†‹’จชˆ…odo|‹ฐ˜Ÿ—}hfŒ”ˆ•‚‘…„‘‡|ˆ€…Ё‘™”yjs…~›ง˜†‚ifsกซ‰”Š~|f{˜‡‘ІŸ…ˆ–sux‹€‹ฆ˜“e|†„Ž Ÿ„‚tfw‰›คŠ“‡w„iuš“Žƒ•~ˆnz„‚Šƒญ™„mhz€†”ฆ”ƒ…wn˜ฆ‰Št€rpขŠ“|ƒ‘v~‰Œ‡•™}go‡•ฏ˜whu} „”y}n…จœ•~ˆƒs‚„zŽ˜‰––ŽthvŒŠญก…ŠrcsŒขŠ—‡‰~oŽ”‹~z†ฅu‹Š|‚”ƒ„n‚†„ ˜ˆ“yxs›‰ˆ~‹„ฃŠr†|ƒ‹†ซ—“‡bqwš‘“šˆxs‰‡{›”ค‚pw|}~™ฅ…hn}‘””‹‹…ƒ„…‚ˆ‰†ˆŽ“ux…š‘„uixก›Œ‰ˆƒ„ˆ€…„ƒ›–Ž{l‚{~Ÿ™‘Œtf“…ˆ…”˜‹†s~wƒŠฅ›’‚q}‚~Š‘‘‰Œ‰y|ˆ‡’ˆ„‡†|‚ŽŒƒ……ƒ‡„…“‰†‚}„‚ŠŽŽŽƒƒ†ˆŽ‡ƒ„„‡„‹ŒŽ‡„~~„‡…‘…‡†‚‚ƒˆ”‡Œ‚}‚€€Œ”ŽŽ†ƒƒ~‚‹Ž‡†ˆ†…†…‹‰…~‚…„‹‘‰Œ‡‚ƒƒ‘‘‡Šƒ~€€„Œ‘‡…„~€‹‰…‰ŠŽ‡ƒ‰Œ‡„†‚‚†‰ˆ‘………ƒ€ˆ”‰„ˆ€‚‡‚ˆŒ…‚‡~ˆ‰„‰‰Œ‰…‰‹…„ƒ‚†Œ’Šˆ‚€ƒŒ”‰‰‰‰…‚‡Ž‰Œ„…}Š„…ˆ„„‡†ˆ…‰‹Ž…~|}z}…“ˆˆ‡‚…†‡Œ‹‘Іˆ„‹„†Š……„ŠŠ………‰…АŠŠ„ƒ{…’‰~{z|‚‰…‹ŠšŠ‰™“‹‡…‰‚…„€{~€y…‡‹„‚‡Š˜—Œ‹ƒ~‚Œ†‚ˆ‹†„…‚‰ƒƒ„‰‹•™|ˆ~x‡€{ƒ~{}„‚ƒŒŸ™ˆ“”‘•Š„z|wzww€~‡„„‡ŽŽ“‘‡Šž“Œ›“‹~w€‡…ƒqƒŒ”Œ„x}‡Ž„Œ‘‰ˆŒ‰†„‚žŠ„’ƒ‚wosp€}x†”ˆŠ—š˜ž”Œ‘Žƒ†‡€mgoipttŽ‹’œœฑฉ—–‹ƒw„}ugiik{€{™—ฌŸงกš“…ˆ||su„|urtx}~„™‘กคค›ƒƒ€ŠzsŠ~rs‚ƒ…†•ƒ–“Ž……ˆ{{—}}{vo‡~v™˜“ˆ‘‘ฃ™…xnqrgorw{‡  šœฉฉ—™ „vˆ€qcji_ej‡ˆ‡ซฝฎกฃ››ž~vŠydcghjq“Œœฆ—šš—ž–r‚Šnemnwvจ‘ž‘–•Ž•z}Œthrxsrฃž€›ž’–”„ˆŽkxuoyt{™‰Šž™“Šˆ•p‰xoz{x˜ขŽ˜‡‡’{oryswกœ‚ ˜–Љv‰nrwts™ง™‘“މ}x‰sltrqด‰“ค“Š‚‹u~oysr˜ฆ‚—Ÿ–’ƒˆŽt…‹tuzt…ฉˆŸ•Žˆ‚x}tuty™ƒ™ข•€up‹ywxŽ••‡‘ž‚€ˆyoˆuw‰–†—Œ›„x‚‹s‘vx‘ˆ‡“ƒ’˜}}o~st‡™’–‘•‹y‚szŒnu}„ค•Š“‰…Žtƒds{ญกŠž‰Œx}nixo€ ง›—œ‘’‘n„…Zhkx†ถ›ŽŸ›ˆ…„pmio|†–ฒŸข—‹”e]po{v†‹ˆกวจzol^}s‚~‰Žขซฅš‚~zp{w…ˆ‘…ธ‰{‰v‹|p‰}‹|‘ญ”€Œ•Œvxzz‹xˆ‡ข–ฆ’uzŠ|n‰ƒm‹ก“‘•™‹y~s„ˆr}| ช€™”Ž„~vme{vงณž™–ƒs‹xZigwšงš” Ÿ•zŒƒ_kg‚ƒŸธˆ˜ง…sisdz~ƒ˜ญณกœ™‘eWjyvw†‘ล›Œค}{ev|……ถŽtŠ}ˆo}‹w‘~–œ›x†œ‹„u}Œws†ruจฃ’œขŽ„~rbbp†ฏจ‘˜ฆ‘|…n]mxy‚ญต™ž‡\Wxvk‚ƒŒตนข•†~rltxsvŠ›ป†…œ›q|~ƒ{‚xฅ–‹”“‰qЇ~€hq‡ปŸ‹–’ŽitZq~„กว›งŒ†fjfqzxƒฆย™žhm‡r~…‚Ÿธฃ~|}ro…}t›‹ร—zŽshy~vzŽ}กญ•‘f‡xvnvฃฝˆ“Œiu„^q†‹คศ—““gKlvz†‘ าฏŠœw]\wtt~Ž•ภทx…—yc{}‚‡„ชž”‹nr{vxkwชฬจ’ŸbgZOt‡„นึช vOdl`v‡“นฦ‹ƒ—‰bsvzƒˆ€งฎ“•vwumknzŸวญ—ฉ‘m^WTm~~จาญก p[|k[r—ปช‹Žzwwj{|ˆจ˜Žฃ“|n‡ujƒl‹ภ››ฆ|vxZTk‡ฑซ ฏข‚}n]fuu ฏœ˜ฃ„h~{kzx˜น••‰vt{yv}••ธ{Œ‰oz}nz“ญ†ข‰y†}x†œŠ”ˆr“‹r…k{ฏ‘Œ˜…|{jf‚˜ตฃกjzfRnxˆธกซจ’wgnmnzบจŽ x^‚‚l€ฆฒ’Œ‚sw~vq‘“ชฏ~‹‘pr€t€w›‡™กЂБn|o{Œ‹•†”Œvk{จ•ƒ•›xƒ`€‰ฑ•™›kfnw|€ยž–—jlsu‘ญ„~u€‡~}‹”ฆฅxy€tu€™„ฃฉr‚Šty|‚}‚–ง‘Žœ‚wƒsy’…••}Аˆk‡ซˆ‹‘u…ŒykฒŒ…‚y€ko‘พ™‹œŽq{v`j†ฌš‹ฉœt{fp†ช•–Œp’{b~’ซœ‰Ÿ†o€gb‡žฌขขiv`d~ดกขงƒ}m_k|‡ญ”’–‚}kl……ฌž–€abo†„–ทฆ’’p`mut€ควŸ•–bernt~ฏฐŠฉc}‚uzˆป“‰ah€|‚ชด‰~h~{s|›ฏŸ‰„wtttŽ’ญขƒŠ{}iƒŒคt€ฃˆƒ„„‹~ง†m~s‹‰…ช–h†Žk}†Œฌฉsƒ“hm|}ˆฎŠˆก‚z‡w|{ก‘g†Œˆ’กvvŠvx„Š—Œฏ’j~~rƒz„•ตฒx‚…ltxpˆกฃ“•‚zŠ~vyก™ƒ‰qt”‚ƒŠขญ|\t}Š‘žณ“ˆŠccq~ ฝข—–xebvr‹ฆ‰ขฃ‰€px}Žคwސw’so‹™ค†ˆ’oƒso‡ŸงЇ‹wshwฉฏ‡”“„|xfm{‹”Šˆv|ฃˆx‡t”‚ƒŽ›‡Œp~€”“uw‹’˜Œ’‘}~„}‘Šm—}‹“‹‚กˆg‰€{‹•ญts†u€„ฅง ~tjz~x€ชดš‘sl„ww…ฅœ{xpŠƒšง‘}liˆ‹ฎ™„•w{of‚ฌฃŠŠs‚wbฏ𒐂x~u‚•„‰ƒ—ŽŒ ”v{vp…‡‘›ฒŠqtp{}ƒฝ’€Un~y‘ญฃ }qao‡žœƒ—…‹ˆk{ ก‹ˆyƒ{‡{€ฅ‘Š„sŠƒž Œƒi{{Œ•ฏ•€vuuy˜ซ’ˆvuŠw€–ฉ›…„ac|‚ฌ›†r`lšฎ‘™wytgƒง‘›Œ„ˆxr‹‹“ƒ†š‚o~v~‘›จ{u…}u‡ฒœ„}k{‡|‚ฅฆ’rpxyˆ‡™Ž‡kz𐂄ƒ„‹™ก‡ƒx‚‚w“žƒŠuƒ‹›ง‰}x|v| Ÿ‰‘px€~ˆ ‘ƒy}oœฃ‡‚‚v|pŽœŠ}ŠƒŠvƒ|ƒ~}ฌœŠ†n‚„~—›Š”|‚sžš‰}Šz…‰’“…‚€‰…›r{|‚Šˆ›ญ‰Œpm}ˆก‹—“yƒwu’›ˆ†~‹…”—‚vy‡‡™–~~†€žก}…sly…ฃ’“‚}nฃ‹‚~†ˆ‡‡”‹…wvˆ‡—ˆ…„~t• „qs‡•›˜“yzql†ขŠ“‹€ƒz‹”‚v€Š‚ค”€ƒ‚xxy ™‰‹~|‰‚’•Œ‡vwlšฌ‹ˆ‰}ƒ~Žu„ˆŠ˜ง’sp~wyงž‘”uksŠ–…‰ŽŒ˜‚}†ƒyzŽŸ‹uz„Žณ‘‚„cn™•–ƒ…wy…ŽŒŠ†“–•}kmƒŒ ž’†qdข‰‰Š†…€‹~|ƒ~ฆœ‹…vq†€—Ž‰Žxn–|‰{•Ÿƒ{…z~{ฉ•„ro„„Œ —„qb†ฃˆ‹’“‡ˆ|{†~”|pl~„˜ž’‡…lmˆŒŒ‚”ˆ‹yt•‡‚‰‰…Štw—ކ‡…ƒ‡ŠŽ‡~†•ƒŽŠy‡‘ˆƒ‰‹n{Š‹Œ†•˜Œtn…„ˆก‹Ž|k‡‚ššŠ€mr„‹‘“•˜ƒ‰vk‘†‹—•†‹y}‰†ƒ„†–ˆyЁ‡„‹”švv~€ˆŒ•†jy„|‹–Š•~m€Ž‰‡‡Ž‹…Žwx…‹‡“ˆ‡‘{v‹…ƒˆŽ’•v‹…ˆ›Œ‹u{†„‹ŠŠ•ˆ|v…—ŒŠ‘„‚t…„ˆ„ƒ€v‹‰‰‘’€y„”†ˆ‹šŠ‰juˆŒ‘š‡„nrŠ’•‹œ™††ps†ˆ„‡Œ‚z{Љ‡’”‘yzˆ‡ˆŠ˜‰‰ofyƒ~‰• ‚r}‹Ž”Œ›‡‹rx€|АŠ~tˆ…Š’ข–—‰qw„}˜Œ„‡kh}…Š“”ก“˜’y‚’ƒ…‡‹‹€ˆ{p|ƒ~Š‹˜™•‹u“••„ƒtao„„‰”‰Šz‡•Œ”™™oao~}€Š–Œ‘‰s|”ก–”“†‡ws}…~€|ˆ…‡Žv|–“šš”ฃŠ‹wh|}z‚Œˆo~‰”š˜žŽ”†w‚~r{{Œ‰Œ€u~…‘ฃž•”wŒˆy}„ƒ|ƒsx’‹‘ฆœ‘ฃt‰€{z…’ƒ‰pl„„‰”ฎš–„wŒ}wŠ‚ƒzq{Ї‰จจ”ށ~†‚|ŠxzkkŠˆฆจŒ•…{‡ˆ~ƒŒƒ‚xkr„Š’จฎ›”zo~‹z}€‡ƒ„u{Š—ŸŽž›–v|wxƒ|‡ƒ‚‹xx–ง”‘“šŽ•‰irxx|…“‹Ž†Ž‘”’˜“x€ocs~€‰•—ก˜w’Œ††~€nf~‰‡ฎข‹•~{†„w€†‹{†my‰‰ฅŸšŸ™“yot{}z”†ˆzp—กˆ–™Ÿ’‰rfs}v‚„ŽฃŽ—•ˆŒ€z†lh†‡‚†Žจฅ’‡ˆ…u{‹|€um†ƒ–ชŸ“ž…u„…w~€Š€‚vl{žฅ’•ซ•Œ€_m‚v…ˆƒ’•„Œ›’Ž…z„mc{‡€‰ณข–||Œyq‚‡ˆ‚Žxpœก‘”ง–…^h~vy†ˆ•‡– ‚šŽŽŒ„‚…}cl€‚€“ฉฅ—ž‘ytsz}||“Žƒš‘”Ž’Švƒn`p„ˆŠถฉ‘™|…xx€}Š‚ˆo‰จŒ’—š„{mjuy}ˆŽ›ซซŠ~†‡xuƒ†y|ns„กช“—ฆ’“rdy{q}~•‘ฅฆw‚‘„„w…~}qq‰Šฅช’ข”‹x\w„rt‡Œž™Œœ“Œ…Šn_v‚~„ฉท“ก‰s€vwƒyŒˆƒzฉฌ‹›Šr|gi€ƒ„ˆฏท—Ÿ‡x{rv{{Šˆz‚ฅ›Ž•}~…dl‚€‚ณชˆžŠsnrzwt‹ˆ‡’›œš–•‡}z|c[n…ƒขท™’{_x‚q‚|‹ฅชp€“‰~t†Œt„{m‚บช‹œ—”wuwbl{x…‘ภฉŽฆ‡wux…{y‰|…™†“–w‡†‡nj…ˆฆณ‰กšrQmyr€Œฃนจ}…“‡lz‚yvlคฌ˜™ก…wah~{†ฉน”’˜wdp„vw…’„ฅต‹ŸŒvkˆwsnc|Ÿต ™ช–ˆfby|xz~˜ณขƒŒo|††ƒ‚}zชจ„•Žvwakƒ†™ฝขœŸ—qWvwmy~จภˆ|—•su‡|~zm ช‘—‹{xˆoky…“ฟข˜ŒTj|r|ƒฐฤ–‰…‚~l‚t}†|‰žœ‚”–oŽ‹wmjœน‰ˆ—“mv`t‰„คฦก–Œ‡aLrzrˆˆ™ฮณŽ…|sg{}tŽˆดžy‘Š€n{‡zqฃภŽ’hl|^t†ฆฮจ™…VIotrˆŠดะฆŒ€xgdqh‚ˆฒฏ†–“}kw€s…xuณถŠ•“…avgSƒŽ‹ษธกก’hKfke|€ขฬท”ŠŒ{fr`t|—ฒ™Ÿ’szzhqipฒป”– †hzZ]„ƒ–ศฐจœ_Xlfi‚รฟŸŸˆvvykd€~–บ‰Žข™}}{r~x–—š”{†vhhกถ’›œ“rmQi~ŽฟŸšฉ|felruˆฏญ”จemsszƒป›‹‘vhzˆ‚{‡–ณช{‡or}m|ˆŽภ—}–ssz€v˜—ฅ{ƒŒowigฆง…’…‡yft…ฉฃ‹œu{tVq‰†ดซžฃŽojnoux”นจšti…udx}ฅฃ’‰„„‰†}Šฆo…ˆp{‚‰Ž„“š‡š~wŠ‚uzj˜ต†“•‡}wblŠจ™†ฒกtƒpc}x–ฅ‹”Œzh~ˆ˜ฒž‚™vYu|q†•บฆŽ“r`}‚x~Šจช–Œy€„wt‹ŒฎŒp‰†„„‰‘ˆฅ‹n‰ƒk|‘… š€’ˆuu„yˆ‹คŽŒ’~pˆ~{€zŒง…v–~}ut‹’|{ž„‰ƒ~ฃŽ‚”zs‡v€ƒฅ›—x|…yxi€ฐฃ““…ƒzvifƒฎ’šœƒ„jk‰ช†“‰q‹€fzขฑ’ˆกzr|[i‘ญฉ‘ก™myh]{ˆฆง ฐƒzv\g{Šช›—†Œojˆ~šก“”Špdl†Šฉฐ•”„cmzywŽรœŠi`~wy~คฐ“ฉ…cƒ{ntŠฐŒ†gˆ™tƒŽฎ”…‰gd†v†คฌua~w~—ผก†ltyk{€ฑคˆœ‰t†|yy”ซ€’‚c‚›‚†–ถ‹„\e„uˆœฎฌŠ›uZwxw…žท™–elnuy›ค’–กˆquz”y’†zx„ˆคฌŒl}jb}ฏฎ‹•}|xai—ŸŠ ‘‡‡leŠ ~ŽŽ•™ƒ„q~˜y~‚v‘‹•†žƒ„…oƒ€y‹ŸŽ‰–„~…†y–wŠ—v†‡†€œšp~Š}“…ฃ•hw|r€€žซšsxvy{s…ฑ“wƒ†{}‡ฃ›†vw‰wŒณ–‚~iŠ’y†ฎ~†rY{‡˜ชญ†Šlaqy—ฏ›’ށmj†Œ‚žym{กฃ‰ŒzŽˆj‡ฌ‡{†t…‚‡‡›œŒ‡xxŠ|”˜†‹|„‚Ž…ข‹eƒ„zˆ‡–ญฅˆsfuˆ€‡œฒ††}]s{†ฅฐ•™uu`lŽงšŒ†ƒ~ps™•‰~Ž…‹—Œˆ„puƒ•‡คŸm}‚v}~”ณซ€ggxq}˜ฝœ›`oqt•ฆ—’Œ„no•ข‘ކs€rl’ซ‰•І|y‰žƒs†{‚Ÿ‹ƒก‰~~}‚˜šr|’ƒ{ง‘…zg|ƒ„‡งฏˆ‹rizx‚ช˜}no{ฃ”–˜}Šq_‡ŸŒ‰™Ž‚‰ƒ‰v}”šฌ‚txwv‚กฌ”€q{ƒv„›ค‹”€epu€Ÿ›‹“„–xd‡|‚Œ‹Š€u{‡‰ฏ–|‰€y€z“กŒ™sm€Žค–‹…ko””‚ˆ€”„–‹‚‡}y€‹œณ†ox~w{Šค”o|„€š•{Œe‰žŒ–~ƒ‘…ŒŒ€€v„•œชˆtqw|}‡ฅš•“no}‘ŒƒŽ„wrœž‚…yƒƒŠŠˆ~‡}†„‰™ช‘ppuw|‚ฆช”’oo}”‘Š“ƒ’zo˜›…zˆ‚Œ†Œ•–€ƒ‡‹จn}{}†Œฎ š}ctyy—–‚qx™€‘†ˆ˜†ƒŠwzข›vzŠ€œฃ’†{hi|›–™„vw†ƒ~€‘•ŠŸsrvz}Ššจ‹yho|•ข‹‰r’‰~€†ƒ™–z|†‹€‹–˜…„yn€œ•‹†‹ƒŒ‰xŒ†{„ˆ™——}g}Ÿ’•‘ˆ{hqŒ†š‹ow‚t‚„จจ‹nk€zŠฃˆ‡vk‹—‰—€‹ˆ~š…r‹Š‡‹{l‰„‰‰Šzƒs…›ˆ†„ƒŒ‹{|Šƒ…ˆŽ‘–}ƒ†ˆ†““ˆ„}|†‚‡”˜‹†|‡‘‘‘‰ƒ‡ƒ‚…Œ‰ƒ†…‰ƒŠŽ‹‹‡„~„‰„‘„……‚‚„ˆ’“ˆ‰ƒ{‰•‰ƒ„|‰‰‡‰ˆ†‡†‡‰†€~ƒ†…Š‘ˆ‰ˆ‚‚ƒŽ“‡‰…}€‚Ž‹’‰„„ˆŠ…‡ˆŽˆƒ‡Œ‰„†ƒ‚„‰‰Ž“‰…†„‚…“„‰„‚ˆ…‡Žˆ‚‡‚~‡Œ„ˆ‰‹Š…ˆŠ‡…ƒ€„А’‹ˆ„€€€‰”‹ˆ‰ˆ…‚…ŒŒ‚‹‡†Œ……‡Ž‡ƒ‘ˆ…‡…‡ŽŒŽ‡{~{}ƒ‰ˆˆ‚…„‹‰Ž‹…ˆƒˆŽ…„Š…‚…„‰‹„„„ˆ…ˆ‘ŒŒŒ…„{ƒ‹“~{|‰†ŠŒ›‡—”Œ‰„‰…€††‚‚||€z‚އ‹…†‡•™Ž‹†€Œ‡ˆ‹ˆ…†‚‰…‚…‡Œ”˜“}ˆ‚x†‚{ƒ|}„ƒ‚ˆšœ‰Ž”‹’‰…{{xxys€}ƒ……Œ‘‡…™˜‰˜•Œ‚}€x~‡€‚ˆt}‹ˆ~‚z}…Žˆˆ”ŠŠŒŒ‡†‚‹›†‚{oup|x’Œ‡–œœ—œ–Œ……ˆ„sfnlmwr‰Ž›ฌฎ™—‘Œ‹w‚xkhjiw‚y’•ฉŸคฃ𖆇{xpƒ~wrsv|}‘Ÿ‘›คฃŸ‘†~ƒ‰o‡„tr}…„†–ƒ’–‘ސˆ†ˆƒx‰–‘€}}yn„uˆ—š‘’‘ˆŽž „‹~npsjjtpŒ€ก›œฅซ™– Žs„„vfhlaegƒกผฒกฃ™ŸˆqˆgagekjŒ”ฅ˜—š–šœx{vdkmtv‚ง“‹Ÿ’‘•—–‚vŒ~hqywo–จ‚”ข••˜‰…“upoywyŠ™‡œ•‡”Šn…‚ny|xŽฆ‡†šŠƒ”‚{‘wpzus–ฅ‚šŒ–‹‹u‹~ivznซ†“Œ‘’ƒ}’wgsrpŒฆ‘›ž•q|oixuqฆ–”ž‘‘š…rcrto|ฃฃœ˜ŽŽ•Žu…opust‘ฉ”œ‘•“~Žnhsoqจง‡ž™‹‰‰ŒzƒllymyฒšŒก“‘‹‡‡wŠzerwtญœ—ŠŠt‘…gutn‰งšš›—“‰kŠbmqkƒ™ ข˜•‘–…m|evl€…ฐ’”ฆžƒ}~fdis‡€ฅฐšขŸˆ—rYvhsƒŒŠŸดœŽ Žsjc|}t‰‰•ฏข“˜zzvp~}~y~‹•ƒชญw‹„†‘u‚t‚‡{Ž—–‡z›‚€ˆˆy‘u{ฆ–—˜’ŒsxŽsv€fx|จฏ‹ฆ–‰Š~y„{don€žฅ––š–’j…`st…‹ถ”Œฅš{gjdx…~•ฏŸกซ‘žtbvdyx‚Š”ด–štfs€~x„‚‰นทƒom`…{tƒ|Žฒฎށ„xx{ƒ…x{}’ท}~ŠŽŒsЇ{’ƒ€Ž‹˜tŒŸŒˆuŒw{†n€จœ•กŸ‰}sv_cp‡ดค“คšu…r[hv}‡ตซ˜ฃ’_Yppzƒ‹‹พภ”›‚pelz{x}’„ชน”{p{~†{†€‚ฆ‹”•}xŠƒ€noyคต‘••wvv\eyˆมต•Ÿ•Ž]gvqv}‘รš‘~ys‡{~€‰Ÿพ{uƒˆsoy‹Š‡›ก}•‡nzŽkƒxiทฃ…ขŒŠy„‹ins‚คฐ…Š‚svyn„ฌภœˆ†SYx{z‰ฅาš’‡tik|x{‚Œรฅpˆ~e€‚„Š‚ซ…‹}h|€~~p{ญษ–”ŽbevWf†Šฏาขก˜„ZMisw…ˆภล˜–rdrwm‰“Šผขu‘‘ocxƒxŠz~ฟฎ‹š}ct`Rv†šาญฃฃ“hSikhzzฑหŸ•’ˆrptb~€€ดฌŠก˜~c|~m|m„หญ‘œ—uitPU{Œฝฟ ฒ›€aX^hrx™ศŸžชe|zhp}Œณญ„ˆ|q€z‚ฅž”š„v„ƒlyrฏ˜ฃ‘~{{mWf|ฌฆ–ฉฉ}…}^au}ชŸŽฅ‘trny€‡ฑชŽ––bb|wuŠปฒ“™€`n€mp€ŽฏฐŽŒ‹€y†w}†€ซ‘r•y†„{ƒ|‘“’x|‰r„wmฌฎ‰™Šx~dZo‘ทจ”ฐ–w~c[{u”ซ”žžŽiv~uw{คญ‰ž‰ctŠ~|{ ฐ–…}xvw{rŠ„ฉฌwก€s€„w|~‘Žขvwyi‚ฐŽ…•Ž‹‘isˆจ”ƒ–’n€waŠ— ฏŸŠvujg{{‘ฏง˜˜„epxw}‡ฑฆ…™~hw…x‚ƒฆซ„Žw`v‰†ˆŠซด–|winwy}‹ขนœy‡ƒnyƒvŒ…ญw’†o~w‡†ญ•o‹‡w‚‘‡ง‹o‰i}z‰˜ต™x‘kyzƒŽฉ–”Šzy„€›‹…ž“x|Ž}€‘„Žƒt’šyЁ——†€k…yx‰ขฃŒ™zzƒpzh‡ต‘“}…xomiฌ†˜˜€€vevซ”ƒ•‹w…„mqขฎŒŠ w{[i‰ชฃ†ค”m|jeˆฆกงง€zlYt}Šฆ—š™‘xkz†‚Ÿ–‘ioƒคจ•މqhp}}ขธ˜–•y_hv}†ฉœžซnnnsq˜žŠ›„‡s{…ค‚’Žxrgu‘‰ญก‘–{xk_x‚จต‡ฃuu^g~›ขŒจงyw\g”š|‹”‡š”qp— xˆv„z‡€Œฆ‘’‡r‹u{zzฅš“}†€vƒ‚Ž~ ‡ƒ“‡{Œh€Šx˜š’Žฃšey†f€{Œšฅชy‚…s€w~Œ ญ{{„€yx˜ฃ–u€„ƒจ‡{ngŒŒƒŒณฌ~ƒj^|xy’ฝค›fhˆxuŠญ Žjp|„•งއ—nk„ƒ|œžŠ†€rz†Š”ญ‚‹ƒqtdr™ฐŸ‹ž}{‚el—ฅ‹Œ…„‚qxก•|Š…•‡ˆ€ƒ•…‚|‰˜•wƒnu{‰‰ตฏr„…o}{˜ฅ—€rr‡€€Œณš‚gs€‚‹ขฃ“Š€lkˆ™ญ‰‡†q~mi˜ป‘’Œ~‚ywŒ‹wˆŒŽฅ‚qƒt†~šขจƒrkyy…ˆซฏІbay|ˆคผŸ‘‡a`m{Šช•ค—z…fj•ฃŠŒ…|qƒฅ‘‰…wˆ|Šˆzy‚…€ฃฒ{ˆqrqŸ ”x‚„wvง‚Žos‰€ˆœœ‘Œ}jjƒ›žŒš†‚oeซ™ƒ’Švkqข˜’–”~xˆƒv‡}АŒŸ™now~†›ฎ™–ra|}w‘ญ ‡†wdsŒ™›Ÿ|‰jk˜Ž‘„™Ž„˜‰u‡{vˆœฅช€pt{r|ƒฑง‹qsz{žˆžˆdr“Š„‹Ÿ‚‡’€x„s~ƒ”  œzdpy€šฒ™•‡hk|‚•‹Œ˜€ˆ|q•—ŠxŒz“ˆq‡„~„Šžž™€jk€y~ป–‹…eex…™——€—yj™“y”‚‹—…‡x~…”˜‹mh}†’ณฅ‰„idz…˜œข~‰sg“”€‚†—€”ƒŠtt„‘‰ฃ„pˆŠ}€‘ต‰w\tจค…}`r˜Š……—•‚ŠŠ~~w‚Œœฆnwwคœ…Œtp|ž”Š…}{n}’ŽŽˆ’„”—kqzƒˆžง‡Œnfyˆ–›š……k… †ƒ{‰Ÿ•y…y|}}™™“„sy‘˜‹‡ˆƒ‚Œ…ˆ†…‚~~‹žฃŠsv~€”˜œŽƒxhvŸ–‰–‰|‡}x~–Œœฃzlj~~”ก›‚nh ‰‡†Œ‡††„…{~ƒŒ™žˆtŠy€’—‡ƒ‚€ƒ‹‹ˆ~‰‘‹€‡‹—~o…‰‡„Œ–Ž•|s‚…ƒ‹Œ›–Œylz†„’ฌސ„jy‡ƒ†Žš‘Ž‚uy‡‡‘‚ŽwoŠŽƒŠ~s…—††ƒŽ†‡ŠzŠŒ‰…€†‹…u†€Š…Ž’Œvt…‰‰ Š€iy‡…Ž“–‘†‡to‚˜’‹˜‚„{i‘Š—Ž“…‡zy~‰ƒŒŒ‘’‘rv~ƒ‹‹œ•Œ†rw„‚‡’˜“ŒŒsl|‡‘’ Œ„jwŒƒ…‡œ‡Œ„v}‡‰‡—•”’zxƒ…‚„ŽŸŒˆwk|†ƒ˜|r{ˆ‹Œ‰š‰q}‚†‹„~މƒ„А‰˜ŠzŒ†‚‡”Іzn‰’›‹~{‰•–ƒ†zr†‘…„|‹„‚~t‰•Ž‰”‘’wz‡ƒ†—„„vi‰“˜’…x‹•‘‹Žˆ€‚jq†ˆ‚ކŒŽxƒ‘šœŠ‡oi|{y‹‰–‹…ƒs~‘“–—‹–ƒ}ƒ…}y{ƒˆ‡Œ~|€‹–ง–”{s…†‡|‚k}Œˆ‘‘•ง˜ž…t}z”‡„kn~ƒŒŽ‘žŸค„z‹„€‰…~†vo‚€ƒ‡ค– ŠsŽ”„‘•|}u_n‡‚ˆŽš““œƒ‘ˆ…‡“‰niy}~…“œ˜~Œ”Ž”xnj‰„Šƒ’ˆŠˆ‡’˜–“›Œ…nap~}…Š—Š…}šš“Œ˜€ympz~†˜Œ’‹‹–„zxqt‡„Ž‘‡œ˜…•‡Šˆ‰cl~€‚‹—›ฆ€y‰’Ž…‰€}wfn}€‚“œฐฆ˜ˆx~‡ƒ‚ƒ‹‰v„ti}Žก™‘’yv{}wŠŠˆ‰z}ž›‹‘”™—ud{|s}~Ž‘‹’Ž‘™z|ufm{}‰Š—–Ÿคz‘ˆ}‡}lg„Ÿญ•Œu„Œ{€ˆ|ƒtu‹™ฃ“–ŸŽ”{dxvw‚ŽˆŒ{~ฃ™Œ’”ขŒ€pfu|uˆ”˜ „‡™Ž‡w‚}`tЁ„‡กซ–‘„ƒ•†x{Šƒxƒut‚‘ข˜ก•‚iv„zxyˆ‡„‡˜–’‘“˜Šs€pbt…„ŒŒขซ˜~}“Šv{„„v…yq”ฆขŸ”gfx}†•ƒ’Ÿ€€”“Žˆ€jdx‹Œžญžœ“Žzml|z{ŠˆŒ’’š”Œ‘Žz…p^q„„Ž•ท Š˜yrƒ{~‡ˆ†s”ฎ”•““wifoy|ƒˆฉฐœ‰…‘{{„‰}{zlqณ’‘ †{bq||~ƒ–œนŠyŽŠ…sr|~ue}Ššฑ˜ฆžŽ‚am†}z|‹ƒ–“‡–‘‰…}€xhq‡‡‹ฆท˜›’sko{zs†Žƒ•œ”œž‘‡u€j^v‹†”ฑฃ˜ufw‡}z…’‡ŸŒ™‹Œ‚{‚zscj‰Œคน’ฅ‘~^q|itu…Œ˜น‰œ“Œ|}‘uyujsœด’›˜vujk~~ˆ‰ฒผ‘Ÿ†soj{t‡‡Ž‰ก™ˆ†scnณ—•ง“‰ab‚}}‰ˆ•ฆธ‰s‰|oy…~x‡xwฑณ‡š™˜wtwYl€w‡งป’“•{rx„xwƒŠ€Ÿญ~‰—ƒ}n‹~{|m{›ธ ‘ซ”ƒf]mttx}™ฝฐŒŽps}}}~oœฑ‰‘“šu†akƒ†ญบ”–q]s‚q~†“”ผšt•™†py‰nywdŒย•Žคก†v‡de‚{zฆป“‹›_mˆtƒŒ”ธฒs}Ёex~‚ˆy‚ทŸƒšŠv€~^ix|กฟ‹œ›“r_zv~‰€˜ศ“†‰nfkƒ}€“’”วŸr†ˆpcw‚{‚Œ{จบŽ‘“}vzidxƒจยŽ”Ÿtckt‰ŠžัŠi\hxxƒ‘–™หฃvŒˆhcu~yŠƒ„ฝณ˜‹wqtl_p‚ ยกšค‡ta_i}†‰ฎห•”‹eVrlj„™ภป€Ž˜t`nwj{„wดฤ—›–…qveOh~มฉ ซ–~Zdom|}คฮ›•ŠmcwmnŽวจ„—•ohppk~|–นขก‡w€ofbd‰ธŸ›ฉช…€vXczzฅญ™ข™‡ajwyx€›ฦ™–xfzrkq‘พฎ‚‹‘}p|u{{ฆ’~œฃ‚}†„t|pŽ—ˆ““z~”‚‚ynขซ„“”~v^g}ฒญ“œฆ~sz[_~}ฆฎ•ฌŸ…ljmpp|กท‘–”gkxxЉฒซˆxmt|vu•ชฎ{p|ƒt}‘ž’–ž‰z†hzmzŸžŒ•Š„ygtฃš†–yvƒexŠŒฐ˜™Ÿ…wght~y™ม•‘œkb‚{u|‡ฏข‡Œ‹~‚‡u}‚‹ฎzp‘€s‡‰Œ’ค†y—‚qy‰u~—”p}wqช𗗁ˆ†kcyฆ“„™Ž‘ˆmr€œž†‹—uwm|…•ฒ•”›{xmcs‰ฟฃ“œ„oagy}ˆฑž–ฅonrxwƒจ›Œ†cv~Œ•ญขŒ’ƒZcswˆ›ซฎ”š€VlxsŒฏน—˜}]ouo€…ถคŠ›~ky{…‡ดœ…„hb‡ฃพœ„in{pvณฐ•…oryr}Žฅฐ‘ƒyzwmŠงšvˆŒ‡Šu‰‰’งzz‘vtzƒ˜ขš{–ˆu{€„zˆฆ‰†ž€p€ƒy‚ƒ”‘ค {Žnwq‡‘Š’†‡ฉ~„„„†Œ„n‹ƒ€“—•ŠŒtŒu„{–ฆ’†t‡ryy„š‡” †‹‹z}vŒ~‡~€ค…Œ‘ƒ}yr‡„€š›ƒ–‡t~ƒ{ƒš™†’x‚w{”ฃr~ž‰‡ˆ…ˆŠคud~w}‘’Žฆฏqtfsw{€ฏป“€fyzuz•ณ‹ก`}€n€Žญ†“v|ƒƒ„Ÿ{ˆmf~”ˆฑ“‰‡taewจซ‹ขŒrdr†š–Šฆƒ‚cm“ Ž„–…“ˆlvž~ƒ†{€€งฅ…Š~xkuฏ ƒ”ŒŒ€€n{Ÿ‚’z“‚}t‰…Š‚†Ÿ~…‡Œ€„o|Ž’– “{Œus}€ˆŽดˆt‘ƒ~„œ™o{€~‚…ขฎ‰phˆŠ~‘ฏzŠf`{ƒ‰ญช™yukdy‹ฉข”œ}‡rf|˜˜€Š…‰sŠง‰ƒ‚v•‰…’“z~r…„’žท’qxovxxฎข `x{t‡Ÿง‹Š‚ljฆŽ—wqvlv˜ชŒ†yqŠฐŒ‰n†x{‡–“–Š{~{€Œฅƒt‹~……šค›ii|zท—”‹am|u”ฌ˜•‰wed|–ก’ฃš}†h^Ÿ‚‹Ž}v€”„†€}‡Œ‘‰Ž€€„€ง’j‡„v…ƒ’ฃžŠwr‰yt†ฉŠ‹t}ƒ‡”“Žv~rs“ช—‰‡„x|ruฅ›ˆŒ‚€–‹w’ˆuƒˆšฅ~q{‘„|‘ฉ†bo‰Š•ง’‘y€r`tฅ “˜Œƒ}}nƒ‰‡…‡ŽŒฃ’ou~Š‚‚”ง‡‰xnu…’ข™x„scˆฐ’‰†‡…y‡ˆzˆ~ސŒ—ž{hkƒƒ~จž”ˆhl‡”œ†‘}~o‚ซŽŠˆ}Š…Œ~˜}‡†‰••ylx}‡Ÿฎމ|`m‰ˆ›’Š‡‰nuฆ˜}…|„~‚Š•}ƒ‚‡’šzp}‘†ƒ–ฉŒ…o`x‹ŸœŸ‡ƒ{byฉƒ†‡‚ˆ„†“žˆy~‚‘”t‚’„„†˜ „…jl†„ฃ‡—~yvh’ŸƒŽ„‰–‡|†yx~ขง“ˆzx€z‹–ŽŒ~~k“กƒŠ€…€‰Ž†…Š{€€™ฅ‘vlvŠ~•››”~hdŽ”Œ“‹š…ˆ‘tt€w•ง™|du{‰คŠ’—|ˆps’“Ž„’†›”o{Š~“Ÿ„‘yr‰ˆ–‘~}€}•’ˆ‡~…‹†ฃ„i„|ƒฅ“–†fs{œˆš„ƒwwˆˆ…š™‘ksx|€’ข‹Œ|pz‡‰ŽƒŽŽ„ˆ~|Œ‘‡‡†‡‰Šƒ€ˆ€„€‡ˆ†““Šˆ…|‚‡‘‰‚„ƒ„Ž„ˆ‡‡„…ŽŠ†~‚ˆ„ˆ“ˆ…ˆ‚‚„…Ž•‰ˆ‡~€€…’Š„„}‡ŽŠ‡‰‡††††Ž‡„~„„ˆ’ŒŠŒƒƒ‚Š“‰‡ˆ€€‚Š‰‹ƒ†€‡‹„††Œ‹‚†ŠŠƒ„„€„ˆˆ‹–‹„†…‚ƒŽ„‰„€‡ˆ„‘‘‰€ˆ}ƒ‰……‰‰‹†ˆŒ‰‰Œ…‹–†ƒ}|{|‘‡ˆ€…„‚Ž‘‡Œ††ƒ€‰…ƒ‰‘‚Š‹…†‚…‹‹Œ’Œ‡ˆ†„|’ŽŒŒy|{}††‰Š…“ˆ˜“Ž‰‹…ƒƒ|yy}‘‰‡‹€…†…’ž’Љ„~„‚‚‰‡ƒŠ‰€‡Œƒ‡•…‡z„‡|„~{{~‡Œฅ—‹š’ˆŠ‡‡{z}vp€|‚ƒ†—•‘‡˜ŠŽ•Ž„|„€|‹Š†~tƒ†‘ŠŠ„‚‚{А|‰ŠŽ‡‰…‚–~“Їvvrlu‚~‹™˜šฃจ•–p„…qmvqmvv†“…šคจฆค–“ˆrs…€qlopqtyŽŸกš›š ‘Žvgytlnz~z…—ค˜Ž˜šš–‘ˆ…‚„{g‘~uw†ˆ}‚’ŸŒŠŽˆ‡ŽŒŠ“s“’€syv}{€•|‚‹‹Œ›˜•ƒˆ”Šyoohbtq‰‹‚“—™›Ÿชง› žxƒŠqa]d^mu}•‡ชฑกชง—ข•n|‰tangefz“คŸœ––˜›‚tŒˆmitnjs˜™Šคฃ˜—“‰Œ†vŠŠmnuso†ญŽ‘ฅ”ƒ’‡r‰„nktv‚ Œ˜œŠ‹„‰–zƒ‘tmvs{ค—‡œ”ŠŒ‚ŽŽ{’ƒlqnoˆฎŽ•ฅŽŽ‚‹„{“ƒlqmnyช—ฌ˜Ž„„‡v‡Šlosqtฅก‡คš‹Šƒ„x†qoqm|ฆ–ค”ˆ|‹x“‚susr˜ ƒœ †‰‹t…Œrstr†จ‘Šฅ™‹‡}‹ˆm†’sut}‘˜Ÿ˜‹~€‡m„’xv}—‰Šˆ“”{{‰“ƒ}™o€”€‘œˆy‚‘ƒm‘‹p|“‘’“Š—•‚yŒo„„oyz’ก‰”Ÿ‘ƒ‹‚s‰og~yถœ‹‰Ž„v‡…covwŒจคšœ™Ž™m‹p^okˆ‡กฒ– ”‡€log}€~‹ฅฌšข‹–‰YjquyxŠˆฒฝ‹ขœpvci†v|€‰•ฌฅค–~‚ts|x„}ƒ“ซซwˆzŠn|…|‡’Š€ ค„€Œ“sz}z„…‚’‚–‘z “ˆv„‰vsŠxo”™‘””•‡wŠ…m{o‹ฒ™‡Ÿ‰†€…wy{cowƒฝฆ” ”ˆu}‡jenj†ฅง•—˜œ‹u•ycmp„‚ฐฅ‰งž‚„mjkoƒŠžฒคŸŸœ‡^cpws}…~จรŠœšweƒ€w‚~ขฑxz~€…p‹{—‚‚žขs‚|u‡Œs‚i‹ฌ”œ™ƒ‡ˆqadl’ฑŸ”Ÿจ‚||cdv}y‘ดฆšœ›wXdwkt…‚žรฎŸ„{hjsrn„’…ถซyŠ™zx}€…v…yจŽ“’ys•„zksžปŠ’“•‚q‡gcp}†ถถŠฐw`eayy}Žบฏ‡ฃ’uc€nƒ|„งทœ‚€xpkzy“–‰ปฒr~‰‚jw‚x‹~Š…ฅ ›Œ‡kƒlŒ|gถЁ”ˆˆy•{e|€‘ถ‚ ‹tkilr‰•รปŒ“Ž^Pv€r‚ˆ’ทพ“ƒ…ƒls‚s†„‡ฃฌ„’‚nw’z…oŽภž‡•ybg]‚Ž’หด—žŠoH\sqƒ‡ŸฮฎšˆsmjvowŽ…ฃถ‰Ž™€ix‰n‚~qฌม’•‰aohQr”ŠบรฅŸ™yF^ocw€’ษท ‘zmsig„}‘บ˜ฃzs‚mp~l˜ย™–„qusYi~‘รดžฑ˜qo]Ndw}ฒยณงฃ|Vmq[tz™ฟž’~{‚yst‡…ฎงwˆ’|q‚v…†—ข‡–˜y€…kxokฎฌŽฃ—ƒ‡{tc`yชœ›ฉ‹ƒƒaf{{ชœŽขŠwkgt†ถณ•‹\d~mwˆภฎ’~swxqv‹‡ตžu“Ÿzyˆ‚z{{•–‹–’x’zyrtฎฎ‡—•rb[}–ฏฃ”ฌŒsrcd|v”ณฉฅฃzd|}ktzชžŠ|v’’|}ฆŽu†ˆs{}~މœœ}’šzxŠ…s€q‹ฆ“‘–}‡‚sueyฌ”‡œกƒ‚hoz˜ŸŒštzƒov‡šถ“š}vnetธ›•šŠpcrwx…ฃญ—Ÿ ig}ws}’ณ‰–fi„|ŠŽถš‡”g[v{y’ณฎodv|z€†ฉผ–ƒ€ovxv|ˆ ฎŽ|Žƒy‡€…‹ฎ~kƒwq†Œ’กด|tql~uˆŒญง{ˆ–rl€ˆ~„š–ˆขxx†}u‚„˜‰ŠŠw~ฃu€€†ƒkธ‹Ž€yzob~ฟฃˆšsus]i›ฑ”™ณ‚y€[dz›ค†›˜szcƒŠค˜Šค}vu_w’Œฉ—ž˜|{if‚{šดœš•yfas}zฆฆ—ช—kqrxq’ฅux€}‡“ญސ’ygjn†–ซž–š~rpgx‚œญ›ฆ€w_c{‡ฆ””ฅ’xev~•–€™ŒvŒzs‚กฃ…‡—tz}_pฐ’–}„mcง™š–‡}sem™†›Œ …ƒo‹ŠxˆzŒ”‡œ‚†{u‚z€‡ข‹–}‡€y…“~‰ข~‚Ž„w‹”tz—z–“šuoŠlu€“™ตƒtrvu~‰—ถ|{–~…Šš n‚Ž|…‚ฃ“nzy‡‘€ŠฅฉŒtnh€xz”บจŽŽjh…rw‚ซจ‰’os‰}€ฉ–˜qj‚‚w”ฅ‘‹‹u|€„Šฅ‘ƒq}ngฌขސ‰sƒqbง™…“x‡•~€‹ƒŽ‡Š‚v„Šฏšctvqzฒด•ƒoe{yz†ญฅ‘˜qqz}‚›Œ‰ƒ~jo†•ฌ•ˆs„~jˆฎ‹‚|ˆฃ›ˆ‹ty{ˆšƒ‚™xƒ… psx}ฒฆ‚dm{wŠ—ต‹u]t~z™ผฃŒq_f}…ฅข›v†jaˆฆ‘†Š†y‚ข™Š„uƒ{ˆ„•†‚…{˜ฆ}‡”tuu…’ซ‰‹†€yu›ฃ…pr—}ฃ‡jg{Ž™Ÿ–Ÿ„ydu Ÿ„Š}s˜Ž•…ˆŽxŒo|†‡•„‘ค™}pix~•ซญŒ‰lfow‰ง™–‹~ˆlk” †‘Š‹~„ˆ‹{Œ’Žช…htvz€“ฉฌ’‘l`qv}คฅ˜œ„jgƒ—ƒŒŽ‡„‰‹„„Š˜rns|„„’ณ˜Žboz}•ขกœˆpb€š†‡“…”„ˆt€—ƒขr~Žx‚…—ฆ’r_|~{›ฏŸ‹‰ocx‰˜‹Ž†~i““x€|•‹†™‹‚Œ{{|˜‰oo…ƒ…ดฃ‡ig|‚–” ‰tgœƒƒ˜‰Ž†€‹qu}‘ข“x}ƒ~…ช›ƒ…dh{‹ก›š}ƒsdˆ‚…’—‹Šก€p|yzŒ‰ซฃŽƒgm{zก˜‹—{Œzi•Š‹yˆ€xš†{ŽŽ…„€ž”ƒ‚cr‘„™ขŠ•€‚xkŽ–}‡{˜—t{‚{ƒ‹ฆœŽ˜ikz“’ƒ’|w‰ƒwŠŽ–ข|qƒ}”ฎ‹ˆ€gvƒ•Š›†„‚j›ƒ†ŠŒ‡„—{o†Ž‘ญ‹ƒwav„‘ฆ“—†„€d„ค‹~Žˆ‘ƒ{“~ˆ™‹rz}~’•‡„y‚‘œ|‰ˆ{„€†‡‡‰‘ˆ”‚o~Œ„†ˆ–—Žsx†‚‰‡•žŒˆsn€‡†Ÿž‰uk|…–•ˆ‡trƒŽŠ‡Œ‰zsˆ”„ކ‹‹…Œx~ˆ†…‰’„“—yz‹€€„ˆ’‘–†wx‡‚ƒ†—–†Žvs~‰‹“Œ•Ž€…ou†‹‰–І‚t‡Œ‰Œ……‘‚Žu‚‘†Š†‰–ŽŽzp‚’‡‰‘Ÿ‰Œ„ks‡‰‘•š†ŒxmސЉ–††~qƒ‘†‘Š’„†ww‡…А‘‘’qr‚„€ˆ’ก”‘€k€ˆ{ˆ”žŽŠp|‡‰Žˆ—މmy‘‰‰Œ”“„sƒŒ‚}†Œ’y|Œƒ€ƒ‹’’›}‘Š€…‰˜‚Œk{ˆ€‘“ŠŒwx“‘†“‹Œ{}‰‰Œ‚‹‰{‰‰ˆ‡‘˜’}x„…‹Œ|{os‡Ž‰–“Š‘…„‹†„„Œ‡Š”po}|††›“w‘’‘ˆ“ƒŠ~ixˆ‚‚€…Ž„”…v„‰Œššก•‰mnyu|…ˆ—ŒŠr{—›š““}y„‚tz~ކނsŽ…ސฌกŽru‡ƒ‡Œ|‚kh„‰„‹˜ข• Œ{†‹{†Ž„Œhr{‚ž’”™„”•‹‘…xweo‰…‡Š“’‰’‹€‹’‘•Œ~khx€|Š™‹‚‚•˜“‰•„‚|kvƒ†~}ŠŒ‘xŠก—”—•ƒ„iaz†ƒ†„‘Љ‰‚™—”Ž’†„pns}z™˜Œ|‹“Œˆ’„zmr||€‚Ž›Ÿฎ†wŠŽ„ŽŠ€~gi€Š†‘ŽŸฆ”“…Š‹‰zy‘||xgzŽŠ•กค™’{xŠƒ|„~ˆ~ƒ…pwŠ™ก˜ŸŽ—gs€x~‘‹…s‰ Š”—Ÿ›‰†ej}xx†Œ•‘Ž‡•‘‘‹•~{~gn…‚ƒ†“Ž›ฆ™‰ƒ„~kqˆƒƒ…˜ฏ‘’‰}xx†‡y…vk„‹’ฆ˜ฃš“€rr{{€|†…‚q„ฉ•‘œž“‹~_h|z€‹•†‘˜…ŠŒ{ƒzgu€ƒ™ญœ—ЁŒ‰v{„‰~‹|ky‰œก‘ ก“p`{~u‚„‡Œ›‘ƒ–”Š†€x‡tf{†…ญกŽ „wxu„z…‰ƒ‰ut›ค‹™—š‘ƒwkow}‚‡•กคˆƒˆztŒ‚x„uu†–จ—ฃŽ{^nt{‚’‘‡ก˜}’•Œƒƒ~„mg€ˆ„งซŽ—Œx€u}‚…†‹u‹ฑ–’˜–˜uhfvz{ˆŠŸฒŸ…‚Ž–€v€ˆx|tn„šช—Œ ŒŒy]y‡w‚•Ž™ซ€‚Ÿ‰ˆ~†zvdj„ˆ˜ฒ š•jvŠxt|ˆ~„™Œ˜•‹Š„y…zdmƒŠ‡คน™“—vij{}z~ŒŠ‰™œ–™ˆwƒphy…‰ฎ˜ก’Žjeƒ€y…‚“‡ฉชsˆ™ˆ€p|‡q„xl~ ต›•จ ‰zddgovƒ…œผค”‰|t„y‰„„{ฃ•ˆ™Ž‘y‰caz…„ญน˜š‰i^}{ty~Œ„ฐกq— v“xr_oฎขŠข™ˆv_u‡}{†Œขถœz‚Œ‚hu†‚{tฆธˆ˜›š{r~ahƒ{{›ภ’š‚{y}|v…‡‡”ก…—‰~{‚uhr†“ผจ’ง”…Z^yqqzƒœฒด†rq‚‡{|l•ฑ‹“—–„s‰jd}ƒƒฉท•™‚^d„qw€Š–ดณzŠ”‡mu|{vy{ฏข†กœŠ|†ƒahu{šผ—ŸŽ{\rvƒ†ภท‹Šyulr†v~~•น{œ‘ˆp‡oƒnf’ผŠšžwdf…{ˆปฃ“lOxw‰žวฒŒ{stbqƒv‹Œซฎ†’”„h}†syoqคภ‘Š˜rurhyŠ‚•รฑ…•XU|rzŒ—™ฦธyƒ‹m\n€|€Šทพ‘—xmtl\n†ฦฆ˜ข‰v[au~„…งฮ›“†nblph~†ธภƒxbkzhvoจษ›ŸžŒprkNczŠฝบœฌœ…`_gox~–ฯง•šv]qqi‰“ผมއŒxduhq~~žฒ”œขŽv{`slhฉซ”ฆž“ƒ~y[dqšฌ“šงŒx€cex{พฅฃ–s]jjn}‚ทพ‘ฃ“iiztpx‚ชฏ•‹‚x‚}qˆ|Ÿฆp”zw‡Œ‡ˆ–…‘–n‹wp|k›น‘˜šˆzy|]ezฑ•Ÿด…{v^dztšณ›–š}b}…r€ขทŒ•…kp~qm‹‘กบ„ƒ•zs‚s€z‡Ÿ“•ฃ|‚hvlqฅšŒž•Œ†sjw œ†›}wfwŒƒฎŸ˜ †{hms|}ผกŠ y`xr{|จฉ‹˜s}‰yy„ฉ”p~~sˆz–ญk†Œmwz†จœz“qt…Š}€Œ–Š—˜‚{‰ŠmvŠ–ƒ‚•}‹tžŠ…v~…‚n}ฐŠ“}€vlzฒง…šŒz€oeyชขŠฅ {ƒ†cd}คœ‘–rއf~คฃškxi_ƒ”ฅช’ฃ‡rqdk„ฉฑง™tchty€คฌ’–šph„|€ฆญ“yYt|~’มฆ„m`}rp„ฎตš€lsxpx‹ฃฐ–„z|yk€ˆคqˆ…w‰Œ‹ฌ}u’{r~š‚šฅ|‹“w||„|ญ“yžˆqw‚~Ž—†›ง{z‡|p~…{–„œŒŒ˜ŠrЉn~„‹‘–ž‚~“uyƒ‚…„ฉœ|‘‹s}qƒ{–จtƒฅ†…|…|ฆƒi‰~xšˆ”ฆžjwvm|~žซช~zk{yyžฒ Žn~wsyณŽ“zŠ~†ฎˆ}Š`kސ‰šนž|fXpy{ ผก’œx`lwuˆง˜Ÿœ~pquy…ค‘‘‘‘„s|ІŸ‰ˆŠxvr…““ฑŒ‘trdfƒคฎ‰™~hhƒž—ก‹|‰ieŽค’‰Žnp™ข€‚…~‚~~œซ†‚ytp ง‚–ˆŠ…€y“†‹–vˆ‘{‘}‹‚•”vp‡ny„”  ฎysvq{y}™ฏฃƒ{v€{}Ÿฆ|”~eˆ|“ฎš†ˆwnz€‰จŸ{”vvi|งญ‘ƒ~~~pn™ฃ“‡Œ}‡‚‡x…†~ƒ’˜ฐzos„‡„ช–wkg~ƒšผฉ‹Š^axxƒฆฆฉ”}{gj†™ข…’‹‚o~šฅŒ‹||‰v|จ‘€‰{‡}ˆ”ˆ‘‡jt‚|ˆญ‘„”w|tz“ฅvy…~‚ฐ™Œs[v‚~ˆญฅ•ldy{‹ฌ˜šxj^q•ข‘ฃ}…nZ† ‚‹…œ’{ƒˆ‚……z}†คŒ}€‚y|›ง“ylz}‹œจ”…iu‚˜Ž†’“n’ฃ{‡~~…™”‰Šwz‚…ฅ“y~‚‚„{œช‹ˆsrw}›”œŒ~†wxข‹ƒ~ˆz‚Œ”ŒŽŠz{‚… ƒ}†{†ฆŽ€…pv~…˜ ’}ƒ}p‚ Œ‡{€Š„ˆ’‰y‰Ž ƒ‚z„ƒ ›…‡lw…Œคœ‡–wzrmŸˆ‹–‡€‹‡‡€{y‡›Ÿyz„~˜ฆƒ†mpŽŠ“ ‹uzoi˜ฆ˜Š‰‚{w“‘€}ˆŒงŽs‰v€|šœˆ€p~’~—žŽ‰zyinŸฉŽ‹…‡yw|…‘{†ŽŒ‘กp~~w}‡ง–“†p‡œ…ƒŠv„Šœƒwˆ~…ก„y‰ˆ}Šฅ‹‹„hu‚Šจ’‘{Œlm—‡‰…–ˆ คoxyr||ณ›ƒns~’•…“•€z~„~‚‹Žœ”{wyƒ…’š›…€xgu–ก™‹†|z}’‹ƒ‰“——‚moˆƒข˜‡‚ppˆšŽŠ†’ˆ‚‹Ž€‚t€ƒœฆ›Šqv€tŽ•‘rw’€†ƒ‹…‰‚}ˆ‚…‡š’…Šx|‹…„“ˆ‡„||‡‘•‰€…}|„’ŽŽŠ††„„†‹‚„ˆ„†‰ˆŒ“‰‚„…ˆ…ˆ‰‚ƒ~ƒ„ƒ•ˆ‡~~‚ƒƒ‡„€ƒ‰…„†ˆ††ŒŠ‡‚~‚‰‡ˆ“‹„ˆ„‚ƒ†—Œ‰‰|}€„““Ž‹ƒƒ}…ŽŒ†ˆˆ††‡†Ž†ƒ~€…††‘ˆŒƒ‚ƒˆ”Œ‡‰€ˆ‹Ž……€}†Œ„ˆ†‹Œ‚‡Ž‰‚…†‹Œ‘‚ƒ‡€†’Š„…„‚„‹‹Ž‰‡‡ƒŠ„„„‰‹‡„‡‹…Œ˜˜Šˆ€~~zˆ‹Š†…‚„†ˆ“Œ…ŠŠˆ……‹‰ˆ††‘„ƒ’†„€ƒ‹•‹Œƒ‡ˆ„„†ŒŠ‰Šz}†€„†‹‡‘˜“‘ŽŠ‹‰‹…|yuw€…ˆŒ†ƒ‰‚‚‰–’†‰†‹“~{ƒ…†‰Šƒ…~‚ˆ‘š’Ž‚€Œ|„’ƒy{{y{€‰Šš–ˆ˜———‹ˆ„‡~†}lsy{‚…‰ŽŽ†Žก‘Ž‡ƒyƒ‰ƒ~ƒƒ‚t‡Ž’ƒ‹Š„ˆ‹ƒŠ{„Š“šŒŽˆ†„ก‡Œ„‡wy}pvzuƒ„•›•—จ–ŽŸ‹s{}riw}owsu‘„Šกฆฌฃ›•‘•|q€yrhozuvx}‘šญŸŸš–“Š’‹~lrvrjo}‹›’ž›ž–ˆ†‚‡‹€kuˆ~t{Š‹€|„›‘Ž•‰‰‰†…˜™z~‹ƒv{|r€€’ŽŽŒ“Ž‹šก‹‰|vulbmi}‡’—š••ฅฉคขฃv†sgdf`hnpงดคกจ™กฃvw‹v`llgitŽŒกขžก™˜••‰rˆuipkknข‰žค–—”‹‰ŒvŽsjtsp{ช—‰ค˜Ž„Žs‚Šsjtv~—ข‘ž‰‡…—‚|“|ktuužŸ†—–‰‹ƒˆ“{‹Œmpoo}ซ—Žฅ’Œƒ‡ŠzŠnrmorกกŠซŸˆ‚Šz‚‘rnttr›ฌˆ  Ž‹†~”wmqnuŸŸ‹ขš‹}‡ˆu‰uuupค†•กŒˆ†x€urssค›‰กžŒ‡†s€‘xrs{–—Œ—›‹~~‹uy‘|qz’† †Œ•|x†“Œy“‡my“‚˜‹˜Œv~ŽˆpŽŽqv”––”…v‡’qntyŠขค“Žƒ…‡q‡yiyx‚ฒ˜Šž‘‹‰…uŠfl{s‚ขฆ››œ”˜†h†x[nn††•ต““กšŠ†mmgx‚Žญ™ข‘‘•cdnpyv‰‹ชฟŽ˜ฃtvmf‚tu~ˆ•ฎงŸ˜€ztyyŒ•„คท|}‚w‹v|‹~€Ž~šฏˆ„sz€ƒ†z„œ~œ™‰‹uŒq‡ziŠ›”™––†uƒŠo‹„ny€ฉฃ„ฃˆ~yvnl{yฐฑก“xs‡odtkŸฃ–”™ •u}_kk‡ฆญžฃƒ‰ugld}~…ฒช™™deoxrs‚{šอ–”ก}{d‹xƒ~‡™น‰u‚}…n„Š|”Š{–Ÿ—xŒ”…~pz}†m|ง™žŸ‡„†}tcfk‡ฑก‘œฌ|g^q}~Œฒญš˜_bwpn€€”ฤนข•‚ziivun}€ฉธ…˜“zs|ˆx‚}ง’’’“‚nŽ„€mq‘ฝŒ–”p‡o\n{„ซยฉฅ€bhau{zˆฑผˆž™{cw‡m~€Ÿทฆ„€zsj{~uš†ฎพzw‰…np…vˆ€‡…›ซ˜ˆqy“m†…f‚ด—{–‰‹y…cw€‰ฐจ€š‘vlfkl‰Œบฤ‘’fLk‚r|‡ญรœƒ…„qlƒs€†„›ฏ‹‡”…so‘~‚„q‚ปฌ…–‚b{qZzยภ— wKUsq~Š“หธœŽwnisqsŒ…šบˆš…npŒs~€nว–—“hipQi“Œฏฬง ›„LWqfs€Šมฟฃ•…opna€€‡ทคŠข”~q€rn€lˆภข’Ÿ‹wrt[a}ˆบภŸฌ tnbN^zxฅรถงฆˆ\ju\m{ฟฅŸ—€{|uq‡„กฐy‚“‚p„w~†€คŒ”œŽ{z‰oswfŸฒŽž„‰wc^oขค‘œซ’€‡ga|{ขฆ‰ |mjt„€†ฌบ•’—f[zqo‚‚นบ“‹styutЁงชvŠค…u…‚xyxžŒ’’}y“€{vnถ‰“™ˆrhVvชฎ“ฌ”tqfb|w‰ฎฉกฆ…fwƒiptžฆƒt‰•yก™q‰wy€{†”Ÿ‚Œ ‚w„Šsxƒง™Œ˜ƒ‹wwilคž„›ฅŒ|lkx”ฅ‡†šzt…vs…’ฑ‰†wpfl†ตฆ’Žu`nx{›ฎ›˜งvd|{qy‰ฐž†™ra‰ŠzŒŠฏฉ‚“qYr~vŽŠฆต“wdqzx~ƒกฝก‚€pr{vz„—ซ—zˆy…~ŒˆฎŽg‚{mˆ‹‰”™ธ‡nŒ|i~v…‰คฐ‚˜{hz‡€€–š‰œ—yx‚ƒsƒ~“‹Œ‰‚‡}wž™}Žy{‚ƒˆkŽป“‰‚z{resถฑ‰™–zsyadณœ“ดt„a^u’ง‹’กu‰…b}ˆ›ข‡ฃˆtwcm‘ˆคž˜ž€{nb~}Žด ˜™€hcmvžฌ—ฅฃqnrwr‡ง”’{s‚{‡Œฌ•‹”gik’ฆค“œ„rqgs“ฏ›ค•€{d^v‚ œฆ“‘€er|›’•uЁršชŒƒš|vƒcj”ฒ•Ž˜…z…rbuกŸ•šˆŒ‚the‘•‚›œ”‚ˆn…Žx…x‰”‡—•„†~t{„žš‡–„{†ƒyƒ’„€ข†~Œˆyƒ“{q–‡™ŽŽ›}i‡rp€Š›•ด‘oysvx‰ทŒs•ƒ~Š“จww‘|ƒ‚Žกžrw{ƒ“„†ขซ•vqg}|yŒณฐrb„vs~ŸฑŒ“xn‡}ˆฃข}˜|e}ƒwŠง—‰wx€ƒˆก‘wzue‡ชฆ‘‘t€zdu ก„’‡x~—ƒ{Œ„Œ‰†Œ‚~„u‰Šฅจjoxow‰ซนœ†sbvzy‚ฅญ™xmy~€”กމ„‚qlƒฉ †y‚„l{ช–ƒz‚{‡|™ก‰zsŠ}€š‹{š€x…‚Œšฆwqv}|Šฎญ“†ig~w‰‘ณ›‡]qzทซŽ{`ax€กฅx„r\{ค—†Œ‹†x|œ ˆŠs|„…•‰€…|Žฉ‡—wtuŒจ“|‹‡‚|t‘จˆŽym“Šy–ฅ“ˆ‡nhs‹“ก• ‡€~dl•ฆІ‚z€sˆ›•ˆ‚|„”uu†„”ˆ‹กŸ„qjs’ฆด‘‹tdow‚ขŸ”’}ŠtfŠฃ‰Ž‹…~€~„…{‡’‹ฆ’hstz}Žฃฑ—’x^nvy™ซ˜‘ˆpez˜†‹ŽŠ…€ƒ…†ŠŽŒ’ฃ}msz…†‹ฏข‡djxz‹ขŸ ‚‡w`v—‹„”†Š{މtz•ˆ†ฅ{uz}†จ•|^ux’ฌฅŠwbr…–Šž‹Š„h‡›yzƒ•‘€~y{Š–œrl€…ƒˆฌญˆ„lex‚˜—ฆ‚‡ze„ก‚„”ŽŠ‘‹Žwr|’Ÿœ||ƒ€‚คค„‰kbw…›Ÿ™ž‚za‘„ƒ˜„Ÿ‰o{zvЇกชˆkj{x–กˆš€ˆƒi‰ก‹|‚†u•y‹††~—œƒ…gk‡ฆ‹”…}i†˜ŒŽ€€‘{žxvƒ{€ˆŸฅŒštd~yŒ˜€š‘„q‹‚„w„‘ฆ†r„|Œฎ–†‡jqŠ–‰˜Ž€‡iƒž‡‚Œ‹‰–‚m}†‹Šช”‚|coƒ‰ฃ–”Ё…gwข‘‚~Šމxˆ|ƒ››vtŽ„zޕЂƒyœ‘}…‹{…€ƒ‘‡†‡’‰‘ˆox‹…††”‘“•wu……ˆ‰ŸŠxl|‡„Š›ฃŒ‘~ky…ƒ’”šŠ‰yqŒˆŠˆ€qƒ•‡‰‰‡„Ž{{‡ˆ‚„ˆ“‡švˆ„……‘•‹zv……‚…“œˆ|r}‡‹“’“†sqƒŽŒˆ“„†tˆŠ‡„‡‘wz‡ˆˆ…–Ž~p|Š‡žˆŠmp‚‰Œ“’œ‰‹}kz‹‘އ—Š…ƒr’ˆŽ‘„ˆzuƒ††Ž’Œ”vm~„~†Ž —…l{‹{„œ‘ˆ‚qw†‡Žˆ”“ˆ…quˆŒ“•Št}ƒ‚}‰Šˆ•}y‰‡„ˆ“Žœ…yŽ…„—†‡†lt‡€Š‘’‰Ž{uŽ•‡Œ“’‹~{‡‹€‹„‡|€ˆ‹ˆ‰™“–‚x‚ŽˆŠŒƒ|}pq‚މ‹“•‰‘ˆƒ‰ˆ„ƒŠŠ†–wk|z…„—”–z|“”‰’‡ˆ„ks‡…‚‚…‘‹w€Š‰™’•ฃ—rlwvx……•ˆƒqv‹’–™›’”€y…ux{Œ‡‹‡s}†ŒŽฆช’xq„„‰Šˆ“}ƒpeŒ„‹”ฅ—Ÿ”|„Ž}€…Ž„‰…im}~‹œ•›‰‘”‹Šwyhi…‡…‰•ˆ‚ГБ’–ƒngt{ˆŒ˜‹…Œ”˜–‰”‰€€ks†|‰Œˆ”}ƒ šŽ”•˜„„p]s…ƒ…„ŽŽ‡Œ•›Ž’’Œ“ˆ‡tnr{{~‰—”‹˜’~†–Žˆ”…ƒmrz}~‚‰š›ฏt†„ŠŠƒ|kezŠ„ŽŽšฉ–”ˆˆ‹ˆtށy{gtŒ‹‘ ฃŽ”v‡‡{ƒ~†ˆrs…–ก”“ฃ•‡in€y}}Š’‰ˆv€กŽŽ—š Š‰jeyzvƒŠ”†’’’Œ“…w‚jj‚…ƒ…’•ซˆ}–•‡†~…nl„…‚‡ฐ–{‰”zv‚‰zƒ{j~ŒŽฅ™ ”†spyz€{Œ‹‚†s|ฅŽœŸ˜‹„cdz{}‚†–ˆŽ›Š„œ‹Ž€€gp€ƒ‘ญŸ—Ž€‰Œxyˆ‡ƒku„˜ข“šฆ•z^t‚u€„ŽŠˆ›•„‘™Š‡ƒy‡{gv†ƒ„ฉชŽŸv€|s}Š‚‰yp“จŒ–˜˜–…zmnt|‚ƒ’žงނАŠ|t‡‡x„zsƒ“งžฃ•Œ„ag~wx€Ž•…ž~Œ˜ŽŽ‚„~„rcy‰„‰กญ‘’‘y}€t~~~†‚ŽxฎžŽš“š„vkdq|w‡ˆ˜ฒฅ‰ƒ‰˜†v~‰{{yl–จ‰ž’Ё^o‡y}€‘’ฎˆ{œ‡}‰|xgf~Аฑฃ›–†loŠzuxˆ€‚›•šŒ‹ˆ|ƒ€hj‹„žนก‘™|jhwz|ˆ…–ž’œ‹wvft„…จค“ค“‘rb}„xƒ€‘‹Ÿณz€˜ŒrvŠt~€kz™ทข”ฅคibemu„“บช”Œ‰o‚z„„‰w››†—‘Žˆv‰l]t…ขผก˜™p[vr{zŒƒฉฎtŒฆ…tˆuxajˆชง‹žŠ}`o„y„Šตค~ˆ‰hq~„€s™พŽ“œš…nha~x’ฟžŒ†|x|~u‚ˆ…’ฃ‹ˆšŒƒyƒ€xkoƒถฑฆ—ŠbXusny~—ฎน•„Š’xn€†~yn‡ฒ’˜•Œp‡s`y„€กปœ™‰e^€ws€‡–ฌผ…”Œqq{zw|}tฆซ†šก‹}ƒˆfdszผ–คŽ‚^mu}ƒ†ˆตภŽŒ|uom…zy‚‹นw˜•‰uyque†ปš…š‰r‘m`‚ถช“‘uNmƒv‰‰“ฤน‘~qsei„u‡ŽˆฅฒŠŽ•‡luŠszrn˜รšˆ••vsvhu‹„Žผปˆ’‡_Pwuv‰–—ผฤ~‹t[j}~|‹ชฤ–“”{nro^i‚–มฐ•ฅ{_^p}ƒ†œะค’ŒrbkriwžŠซห‹‹ €diylq„ošหฃ›กvnpQ[w„ฒม›ซŸ‹g\emv~Œศณ’œ}^jufzˆณศ—…Œdskm}–ดš—ฅ‘ywƒclrbœฑ”คข”‡}|_`mฎ•–ฅ“v‚hatz…นช Ÿ—|]hjl{ชฦ•ž›pexwnw}ฃฒšŒ†xq†€”ฏwx”‚t†‹Š~‡’Ÿ‡—…l…l}jŒป—“œŠ}wcav•ฑ™™ตŽy{`axtด —š‡bwˆu}‚—ฝ‘“Œnm}ul„’˜ฝ~•o‚t}|€œ–ข”|lpqh ‰œ‘”އwjp˜ก‡‰š„sƒkoฆง”ฃ‰~jkq{}ˆถฌˆ „asrzzžฐŒ•”vx‰{v‹ฅœqy€t“z‘’ฅฉo~sq€x…‹คฃ~†—wqƒŒ‰–“…{‡Žo}{‹“‚‰}˜~|‘‚l…ƒ|”{—ก—…kˆ~wt›ฌŽ’‹u‰ywvnฆˆ˜•ކ‚ll  €ƒ~}‹m…ด ŠŽ|uzce‰บ ŽŸ”s{r`o“ซ–“ฐwƒ^gyšจ‡˜™v‰}e‚Žฆข„กoq\q”ฑกค {njd|vŽฐซœ–zfpqw|žฐŽš”qvx{ซ›ˆ‘gf†…Œ}ฆถ‰t_|yq}•ฤ˜Œlt‚u}„ฒ›„›zgˆ{wwขซˆ“|gŽ‘z•ฒƒ†ˆ`k„s…œธฅŽ™k[~rr€šท˜‡ct}nŒฐšŠ›xsy|„™ข–byŒŽŒช Š‡ffn|‚ธด‘ข{f`nxœกƒฎœ|ˆjiwš“’}˜~h|ค”x‹…~‰x‡ฅง†’~}~tuiฏ•œ’ˆ”u|my–}…—Œ˜ˆŠˆ‰†}„{y‹•“š€…pwƒˆ€ชญz‰‘pxz|ž—n––zƒ‡‹ค†c|y„€•กฐŠo{vz{|˜งจˆvpx|{ฌช~qƒ€szซˆƒƒu†‰‚ˆŸงy‰k^„šด„‰pfo|‰ฐœŠ˜ywqq‚˜ง›—u‹w`{ค}‰Ž–‰ŠwŠž€~tŠƒ•—˜ˆ~wx€ƒ~ฃกs…„u~ƒ“”ญ‡px}…ƒŒณŽ‚{^v†’ฏข‰†uebt‘ฎฏš€w^h“ข“}‹‡„„™‡„z†„€—•y„‡s…˜—ฒ”nvqru|ฤฉˆbmys† ช‘œ{f{~€งžŽ’u…ma‡ฆ‘Ž›„{ƒužž‹‰t…uu‡—–•Ž€y}zŠŸz{›‚„ƒƒ‘ขŽns|ˆv›ซ‹•whˆƒ—ฅ—ˆ€giy‡–ฉ𛋁hczš“…–ž…†xm“‘zƒz——•ˆz€‚‘คvsr|~Žณค˜dvzsŒž“•—‹qq~””ˆˆˆ‘~u •Šz‚‚€ ‘yˆ‚yŒ{ŒžชŽmr|tw‡ก•ƒqz}™€‡„•{~›ƒ€tˆ…‹ซ†x‡€}œข•Œgq€w„ขข”Žvjv–‰‚‰…•ˆp””ƒ‚zƒŒˆกŽz‰zx…yช˜ˆqo€‚ž˜”€lqz“–…Š–{”„yv‹‰™จ‚|„v{xงžsnˆ‚•žŠ€km‚’›˜Œ‡‹jvšˆƒ{ŒŽ “‚‹‚syzŠกข}|‚~€˜ขultŸš‡”Ž…ylƒ‘‰„~’š‰žŽoz{t{~จซ˜ns„v˜™{ƒyp‘Ÿ†ˆ€€‹zŽ„ƒ’‹š›‰ugt‚…ชคš“~wfeŠŸŒŽ–‚Š’{w{y‚คŒ~o…ƒ€žŠ‰Žy‹w}˜€‚|ŒƒŒค…{‡~‚~Žฃ‡‘xd€ˆ’œ‰”†k~Œ…Š„‰กŠ›‹gu|xƒ—ฎ•‰…cm}‡››Œšƒ‚zv‡‡‰…zŒ‹™กyuƒ‡|‚“›„Š„r„“Ž‚‡†„ƒ‘Ї†ƒƒŽŠ’}Ž‚ƒˆˆŠŽ|~€„ŠŠŠ˜„‡zz€€‰—–Ž‹ƒ€‚}ˆŽŒŠ……ˆ†‡Œ‡‡†††‚…‰‰††ƒ‚‰‹‰•……}€…—–†Œ„€€‚ŒŒˆ…ƒŠƒ‚……†‡€†‰‡‚††Š†~~ˆ•“‹Š†‚}†‰ƒLISTINFOICRD 1996-03-29Efactฃlogtool-1.2.8/conf/sounds/red.wav0000644000372000017500000000206610046522400016362 0ustar wouterwouterRIFF.WAVEfmt ๚๚data ~~€|y‰ข~Qhxv‘ฌจŽp_fofY]v”ฆฃšœ š‚gV_lh\\t”งฅขœ†lY_mj][pฆฆ›› œˆoY[lj_ZjˆขฆœšŸŸt][jk`Wfƒžงž›žŸ‘x`YgkcXa›ง ›žŸ”{aWeleZa}›จกœŸ”}cXdmg\a{˜ฉฃ›œŸ˜fWblg[^u”งฃžกšƒiX`kfYYt’ฅฃž ขš„iX`keYZt’ฆฅŸกฃ›…jX`jfZYs“จฆ ฃค‡kX^jeYYqฅฅŸกค‡kX\hdXVmŽฅฅž ฃžˆmY]ieYWmŒฃฅžขŸŠoZZig[WkŠฃฆžžกžŒp[\ji^Yk‰ขฆ›กกt^\ll`Wh†žฅœ›  ‘xa[imbXd€›ฆž› ก”zbYfkcXb}˜ฅŸ› ข–~eZekcX`{—ฅก› ฃ˜hYdmfZ\v“ฆข›ก›…kZ_kh\[oŒขฃ› ›ˆp\]ih^Xj‰กฅœŸŒs]\ij`Yh† ฅ›žžŽu_[ilc[g‚ฆžšŸ‘zc[hmeZcšฆŸ›ž ”}e[flcX`}˜ฅ ž ก•}dZejcX_{—คŸ  •}dZdjcX_z—ฆ  ข˜€fYdkdX^x•ฅก ฃ™gZdjdY]v”ฅก ข™gZdkdY\v“ฅก›Ÿก™ƒhZckfZ\s’คก›กš„j[cmh[]t‘ฃ ™› š„l]cni]\rก ™š ‰p^ank^ZmŠŸขš› žŒs_^lk_Yj†žฃ›šŸŸŽu_]jk`Xh„œคœšŸŸyc]ilcYe€šคš ”|e]gmf[b}—ฃž™Ÿ•~g\emg\^v”ฃ šœž—i\cmi]^tข ™šž™…m\bmj`_rกก™™œšˆo^`lka\l‰ ข›šœ‹s__lk`[kˆžขššŸžŽua^llaZi„œข›šžŸwa^klbZg‚šข›˜žze^imdZd˜ฃ˜›ž”}g]gmg\b{•ขž˜œŸ—€i]eni^_u’ขŸ™›ž˜ƒk]cmi_^sกŸ˜™™†n]blja_qŒ ก™˜››‰q_amlb\lˆŸขš™œ›‹t`_lka[k‡กššœŒta`kka\k‡œ š›žŒt``lkb[k‡žข››ŸŽua_kk`Zi…ก›œŸžwc`kk`XfƒšŸššžžwballbZgƒ›กššŸŸ‘zd`mmbZh‚™กฃ›Ž„~zxvuuvwxz|}€‚ƒƒ„„ƒ‚€~}}~€€€€€€logtool-1.2.8/dd/0000755000372000017500000000000010276711613013227 5ustar wouterwouterlogtool-1.2.8/dd/substvars0000644000372000017500000000004710276711557015216 0ustar wouterwoutershlibs:Depends=libc6 (>= 2.3.2.ds1-21) logtool-1.2.8/dd/dirs0000644000372000017500000000001007570157122014104 0ustar wouterwouterusr/bin logtool-1.2.8/dd/README.debian0000644000372000017500000000020007570157110015317 0ustar wouterwouterlogtool for Debian ---------------------- Comments regarding the Package root , Sun, 24 Nov 2002 07:12:19 -0700 logtool-1.2.8/dd/changelog0000644000372000017500000001011310276711506015076 0ustar wouterwouterlogtool (1.2.8-1) unstable; urgency=low * applied patch from Massimiliano Mirra * fixed bug in mod_unknown handling * probably some misc stuff I'm forgetting -- A.L.Lambert Sun, 24 Nov 2002 07:12:19 -0700 logtool (1.2.7-1) unstable; urgency=low * Fixed makefile to use $(MAKE) instead of 'make' to make it easy to build with gmake on non-Linux systems. * Applied patch from Wouter Verhelst to use opendir() and friends to make logtool compatible with logcheck-database package, and just generally be more flexible. -- A.L.Lambert Sun, 24 Nov 2002 07:12:19 -0700 logtool (1.2.6-1) unstable; urgency=low * Fixed bug in the excaping of <, >, and & in HTML output module. :) * Fixed what might have also been a related bug, but which never caused any problems that I know of. -- A.L.Lambert Sun, 24 Nov 2002 07:12:19 -0700 logtool (1.2.5-1) unstable; urgency=low * Added escaping of <, >, and & to HTML output module. * Fixed a \033 handling bug in mod_syslog.c, and mod_unknown.c which would prematurely add color.end to an event prior to output modules possibly escaping various characters. -- A.L.Lambert Sun, 24 Nov 2002 07:12:19 -0700 logtool (1.2.4-1) unstable; urgency=low * Renamed this directory from 'debian' to 'dd' to avoid conflicts with the official debian packaging and such. * Some minor gyrations in $TOPDIR/Makefile to accomidate the above. * Fixed up the RPM spec file a bit per recommendations. * Fixed up src/Makefile.in to $(INSTALL) each config file individually to avoid problems with install-sh on Solaris. (I do more work making this program portable to Solaris than I do all other platforms combined!) -- A.L.Lambert Sun, 24 Nov 2002 07:12:19 -0700 logtool (1.2.3-1) unstable; urgency=high * ./configure should now detect -lnsl and such on Solaris * fixed build for platforms without setenv() or rindex() (Solaris) * LSIZE increased to ridiculous levels (8kb). * A few minor tweaks. * Code-freeze in anticipataion of logtool-1.4.0 in a few months. -- A.L.Lambert Sun, 24 Nov 2002 07:12:19 -0700 logtool (1.2.2-2) unstable; urgency=high * Again, cleaned up dupe suppression feature better to handle unknown events. This time I think we've got it. :) -- A.L.Lambert Sun, 24 Nov 2002 07:12:19 -0700 logtool (1.2.2-1) unstable; urgency=high * Really fixed the underlying buffer size problem related to that segfault. * Cleaned up dupe suppression feature better to handle unknown events. -- A.L.Lambert Sun, 24 Nov 2002 07:12:19 -0700 logtool (1.2.1-1) unstable; urgency=high * Fixed a few glitches with dupe suppression which were causing the odd 'blank line' and spurious '!', due to my mistakes in setting 'cf.input' in some cases where it should not have been. * First public release since several versions back as noted below. -- A.L.Lambert Sun, 24 Nov 2002 07:12:19 -0700 logtool (1.2.1-0) unstable; urgency=low * Fixed (we hope) a little segfault thing. (bummer!) -- A.L.Lambert Sun, 24 Nov 2002 07:12:19 -0700 logtool (1.2.0-6) unstable; urgency=low * Wow; MASSIVE changes in place. See config file for most of them -- A.L.Lambert Sun, 24 Nov 2002 07:12:19 -0700 logtool (1.2.0-5) unstable; urgency=low * Re-added duplicate suppression feature from earlier version -- A.L.Lambert Sun, 24 Nov 2002 07:12:19 -0700 logtool (1.2.0-4) unstable; urgency=low * Re-fixed bug with src/dst mixup in mod_snort * Added changes which make easier to display syslog-ng log's -- A.L.Lambert Sun, 24 Nov 2002 07:12:19 -0700 logtool (1.2.0-3) unstable; urgency=low * Fixed bug with src/dst mixup in mod_snort -- A.L.Lambert Sun, 24 Nov 2002 07:12:19 -0700 logtool (1.2.0-2) unstable; urgency=low * Initial release. -- A.L.Lambert Sun, 24 Nov 2002 07:12:19 -0700 Local variables: mode: debian-changelog End: logtool-1.2.8/dd/conffiles0000644000372000017500000000052507635664232015135 0ustar wouterwouteretc/logtool/logtool.conf etc/logtool/blue etc/logtool/brightblue etc/logtool/brightcyan etc/logtool/brightgreen etc/logtool/brightmagenta etc/logtool/brightred etc/logtool/brightwhite etc/logtool/brightyellow etc/logtool/cyan etc/logtool/exclude etc/logtool/green etc/logtool/include etc/logtool/magenta etc/logtool/white etc/logtool/yellow logtool-1.2.8/dd/control0000644000372000017500000000133407661756325014650 0ustar wouterwouterSource: logtool Section: utils Priority: optional Maintainer: A.L.Lambert Standards-Version: 3.2.1 Package: logtool Architecture: any Depends: ${shlibs:Depends} Recommends: logcheck-database, retail | logtail Description: logfile parser with lots of output options. Logtool is a logfile parser and report-generator, capable of producing ANSI, ASCII, CSV (for spreadsheets), HTML or just raw output. It can parse and process syslog and multilog formated logs, as well as colorize unknown/unformatted logs as well. It has special support for snort and iptables, and can do ip->hostname resolution in any logfile. . It's very handy in generating nightly reports and in online monitoring of logfile activity. logtool-1.2.8/dd/copyright0000644000372000017500000000024007570157110015155 0ustar wouterwouterThis package was debianized by root root@minideb on Sun, 24 Nov 2002 07:12:19 -0700. It was downloaded from Copyright: logtool-1.2.8/dd/crontab.ex0000644000372000017500000000004307570157110015211 0ustar wouterwouter0 4 * * * root logtool_maintenance logtool-1.2.8/dd/debian0000777000372000017500000000000010321261344014673 2ddustar wouterwouterlogtool-1.2.8/dd/files0000644000372000017500000000005010276711557014256 0ustar wouterwouterlogtool_1.2.8-1_i386.deb utils optional logtool-1.2.8/dd/diversions.ex0000644000372000017500000000004307570157110015746 0ustar wouterwouter logtool-1.2.8/dd/inetd.conf.ex0000644000372000017500000000011107570157110015604 0ustar wouterwouter#:OTHER: logtool stream tcp nowait root /usr/sbin/tcpd /usr/sbin/logtool logtool-1.2.8/dd/info.ex0000644000372000017500000000102207570157110014512 0ustar wouterwouter# This is a configuration files for installing a .info menu # The Description to be placed into the directory DESCR="Description" # The section this info file should be placed in (Regexp) followed by # the new section name to be created if the Regexp does not match # (Optional. If not given the .info will be appended to the directory) #SECTION_MATCH="Regexp" #SECTION_NAME="New Section Name" # The file referred to from the Info directory FILE=logtool.info # Optional. The files to be copied to /usr/share/info #FILES=*.info logtool-1.2.8/dd/init.d.ex0000644000372000017500000000276707570157110014765 0ustar wouterwouter#!/bin/sh # # This file was automatically customized by debmake on Sun, 24 Nov 2002 07:12:19 -0700 # # Written by Miquel van Smoorenburg . # Modified for Debian GNU/Linux by Ian Murdock . # Modified for Debian by Christoph Lameter PATH=/bin:/usr/bin:/sbin:/usr/sbin DAEMON=/usr/sbin/logtool # The following value is extracted by debstd to figure out how to generate # the postinst script. Edit the field to change the way the script is # registered through update-rc.d (see the manpage for update-rc.d!) FLAGS="defaults 50" test -f $DAEMON || exit 0 case "$1" in start) start-stop-daemon --start --verbose --exec $DAEMON ;; stop) start-stop-daemon --stop --verbose --exec $DAEMON ;; #reload) # # If the daemon can reload its config files on the fly # for example by sending it SIGHUP, do it here. # # If the daemon responds to changes in its config file # directly anyway, make this a do-nothing entry. # # start-stop-daemon --stop --signal 1 --verbose --exec $DAEMON # ;; restart|force-reload) # # If the "reload" option is implemented, move the "force-reload" # option to the "reload" entry above. If not, "force-reload" is # just the same as "restart". # start-stop-daemon --stop --verbose --exec $DAEMON sleep 1 start-stop-daemon --start --verbose --exec $DAEMON ;; *) echo "Usage: /etc/init.d/logtool {start|stop|restart|force-reload}" exit 1 ;; esac exit 0 logtool-1.2.8/dd/manpage.1.ex0000644000372000017500000000216007570157110015332 0ustar wouterwouter.TH NAME SECTION .\" NAME should be all caps, SECTION should be 1-8, maybe w/ subsection .\" other parms are allowed: see man(7), man(1) .SH NAME logtool \- programs to do something .SH SYNOPSIS .B logtool .I "[options] files ..." .br .B bar .I "[options] files ..." .SH "DESCRIPTION" This manual page documents briefly the .BR logtool , and .B bar commands. This manual page was written for the Debian GNU/Linux distribution because the original program does not have a manual page. Instead, it has documentation in the GNU Info format; see below. .PP .B logtool is a program that... .SH OPTIONS The programs follow the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options are included below. For a complete description, see the Info files. .TP .B \-h, \-\-help Show summary of options. .TP .B \-v, \-\-version Show version of program. .SH "SEE ALSO" The programs are documented fully by .IR "The Rise and Fall of a Fooish Bar" , available via the Info system. .SH AUTHOR This manual page was written by root , for the Debian GNU/Linux system (but may be used by others). logtool-1.2.8/dd/menu.ex0000644000372000017500000000016207570157110014527 0ustar wouterwouter?package(logtool):needs=X11|text|vc|wm section=Apps/see-menu-manual\ title="logtool" command="/usr/bin/logtool" logtool-1.2.8/dd/rules0000755000372000017500000000231407665446464014330 0ustar wouterwouter#!/usr/bin/make -f # Made with the aid of debmake, by Christoph Lameter, # based on the sample debian/rules file for GNU hello by Ian Jackson. package=logtool build: $(checkdir) ./configure --prefix=/usr $(MAKE) CFLAGS="-O2 -g -W -Wall" touch build clean: $(checkdir) -rm -f build -$(MAKE) distclean -rm -f `find . -name "*~"` -rm -rf dd/tmp dd/files* core dd/substvars binary-indep: checkroot build $(checkdir) # There are no architecture-independent files to be uploaded # generated by this package. If there were any they would be # made here. binary-arch: checkroot build $(checkdir) -rm -rf dd/tmp install -d dd/tmp cd dd/tmp && install -d `cat ../dirs` $(MAKE) install DESTDIR=`pwd`/dd/tmp # Must have debmake installed for this to work. Otherwise please copy # /usr/bin/debstd into the debian directory and change debstd to debian/debstd debstd CHANGES Changes README TODO dpkg-gencontrol -isp -cdd/control -ldd/changelog -Pdd/tmp -fdd/files chown -R root.root dd/tmp chmod -R go=rX dd/tmp dpkg --build dd/tmp .. define checkdir test -f dd/rules endef binary: binary-indep binary-arch checkroot: $(checkdir) test root = "`whoami`" .PHONY: binary binary-arch binary-indep clean checkroot logtool-1.2.8/dd/watch.ex0000644000372000017500000000041607570157110014673 0ustar wouterwouter# Example watch control file for uscan # Rename this file to "watch" and then you can run the "uscan" command # to check for upstream updates and more. # Site Directory Pattern Version Script metalab.unc.edu /pub/Linux/Incomingu logtool-(.*)\.tar\.gz debian uupdate logtool-1.2.8/CHANGES.history0000644000372000017500000002112107636145746015346 0ustar wouterwouter
%changelog
* Tue Mar 18 2003 A.L.Lambert 
- 1.2.0 is getting ready for initial release!  WOOHOO!!!!
-
- Still probably a few days away as I write this, but we're about there.
-
- Changes are WAY too much to list in total, but a few highlights:
-	Now speaks TAI64 dates (IE: D.J.Bernstien's multilog and friends).
-	Now can optionally suppress duplicate messages.
-	Now can support and colorize unknown logfile formats
-	Now can do really cool things with snort and iptables syslog entries
-		(ip->hostname resolution, special colors, and more!)
-	Now has special options for a syslog-ng formated log.
-	Code architecture is VERY VERY VERY changed and better.
-		Light years better at error handling.
-		Nice facility to write more modules like snort and iptables.
-		Way more efficient (but not faster; too much new processing :)
-
- 	And much much more!!! Try it, you'll like it!! (I hope :)

* Fri Nov 22 2002 A.L.Lambert 
- Returning to active development of logtool to implement a few new ideas I've had.
-
- Somewhat major changes; added color options for:
-	Magenta
-	Blue
-	Cyan
-	Bright Cyan
-
- Rewrote regex.c a bit to make it easy for future allowances of new REGEX's
- Minor tweaks and other code stuff.
-
- Have begun adding hooks for specialized output modules for known event types
-	(no working code on this front yet).
-
- Preparing to write a ncurses module (no code on this fron yet either!)

* Mon Jun 11 2001 A.L.Lambert 
- Minor changes for 1.0.6 release as follows:
-
- Modified the autoconf stuff to (hopefully) be more cross-platform
-
- Added a fflush(stdin); to make logtool happier with scripts that do
- line-by-line reading on platforms who's libc doesn't do this automatically
- for printf(); and friends.
-
- Probably a few little things I'm forgetting. :)


* Thu Feb 01 2001 A.L.Lambert 
- Tweaked the 1.0.5 release as follows:
-
- Added configure.in statements to make ./configure point to the propper
- paths in the documentation (config file stuff).

* Mon Jan 29 2001 A.L.Lambert 
- 1.0.5 release.  Not much new except the following:
-
-	Now uses GNU autoconf and friends to configure for build
-	Fixes a small compile time bug for ScoUnixware induced in 1.0.4
-	Not much else. :)

* Sat Jan 27 2001 A.L.Lambert 
- 1.0.4 release.  Only chage is a modification to the format check to allow
- for broken-ness in PAM syslog messages on RedHat 7.0

* Wed Jan 16 2001 A.L.Lambert 
- I think I have the configure stuff all tweaked out like it should be.
- No doubt I'm wrong on that count, but it's getting closer to release grade
- stuff.
-
- Wrote a manpage for logtool.  manpages are annoying to write/deal with.

* Sun Jan 14 2001 A.L.Lambert 
- Commenced converting to a GNU autoconf/configure build process for easier
- cross-platform portability.  Hopefully this will make our lives nicer in the
- long run.
-
- This spec file is even built using configure.  Isn't that neat. :)

* Thu Jan 11 2001 A.L.Lambert 
- 1.0.4 pre-release started.  Hopefully nothing major in this release.
-
- First change, modification of the lt_fmtcheck() function to fix some
- format mismatch problems on RedHat 7.0.  See logtool/regex.c for the
- specifics. (thanks to Laurent Jacquot for pointing this out)
-
- Fixed two minor compilation problems on AIX.
- 	1.  Getopt returns int, and I was reading it as a char: fixed
-	2.  AIX defines 'regex', which clashed with the struct I will be
-	    using to hold regex strings: fixed
- (thanks to Thanh Ma for pointing these two things out to me)

* Wed Jan 11 2001 A.L.Lambert 
- 1.0.3 release 'officially' declared ready to go.  No new changes since
- the comments below, just some e-mail feedback from the folks testing the
- changes indicating that everything seems to be working fine.
-

* Tue Jan 10 2001 A.L.Lambert 
- Updated version to 1.0.3 to reflect changes below.  Still waiting to hear
- back from the folks that are testing these changes.  They should work,
- but until I know for sure, the 1.0.3 release should be considered BETA, and
- subject to change without version number incrementation prior to public
- release.
-
- Wrote a really ugly configure script to handle the SCO vs everything else
- differences. (at this point, it just copies the appropo logtail.*.c file to
- logtail.c, and initializes the main Makefile)
-
- Made some changes to the logtool/Makefile to build only the objects/binaries
- by default (reported problems with OpenBSD 2.8's 'make' not building library
- correctly).  Also added a "make lib" option so that anyone wishing to have
- the library can build it. (really, who needs the library for this?)
-
- Later that night:
-
- Ying-Chieh Liao pointed out some "features" in the logtool/Makefile, which
- I have now fixed. (see, I told you I might change it before the official
- release) ;)
-
- Report from Andreas ึstling on the OpenBSD changes looks good.
-
- Sanitized e-mail addresses in this file, since it gets displayed on the
- website (I'd hate to think some spammer snagged the e-mail addresses of
- the nice folks who've helped me out from my website).

* Fri Jan 05 2001 A.L.Lambert 
- Updated to fix the missing symlink to /usr/bin/lt.
- Included the changes suggested from Thomas Hagar listed below

* Fri Jan 05 2001 Thomas Hager 
- replaced cp with install in %install

* Thu Jan 04 2001 A.L.Lambert 
- Various fixes so's it will compile under the original cc-compiler from
- SUN (Solaris 2.6).  Thanks to Christoph Krempe 
- for pointing out the problems, and working with me on fixes.  Christoph
- should also get credit for pointing out the bug in the includefile
- functionality that was fixed below.
-
- It compiled
- It worked for me
- I shipped it. :P

* Fri Dec 29 2000 A.L.Lambert 
- Working on fixes for Solaris (why did I expect this?) for version 1.0.2
-
- So far, I've done the following:
- 	Tested with removing the strncasecmp() decl - seems to work fine
- 	Removed the getopt_long() and related stuff, and use only getopt()
-
-	Waiting on report back from Christoph Krempe on the success/failure
-	of these steps.

* Thu Dec 28 2000 A.L.Lambert 
- Big OOPS! The includefile functionality was broken!  I have no idea how I
- missed this the first time around, but it's fixed now. Updated version to
- 1.0.1

* Tue Dec 26 2000 A.L.Lambert 
- Woohoo!  1.0 release is good to go (as far as I can tell)!
-
- Documentation is still a bit shabby, but it's better than some I've seen.
- Still some things in the TODO list that I'd like to get done Real Soon Now.
-
- But all in all, all the features are in place, they all work flawlessly as
- far as I can tell (famous last words of a programmer :), and as they say in
- GNU land; "It works for me."
-
- Later that day:
-
- Modified the getopt.c stuff to allow for specification of an alternate
- config file instead of being stuck with the system defaults.
-
- Fixed a minor bug in the ansi.c module (color display thing)
-
- Updated CREDITS and a few things in doc/logtool.txt

* Mon Dec 25 2000 A.L.Lambert 
- Now have a working program!  WooHoo!!
-
- I lied about not messing with it till the 27'th.
-
- I think most all of the back-end code is done (cfg file reader, getopt, etc)
- ANSI, ASCII, RAW, and CSV output modules are completed (more/less), and
- everything test's OK, even with bizare/broken input.  Probably some buffer
- overlows in here somewhere, but this program is not/will not be SUID, so I
- don't think that's too big a deal (and will never happen unless users muss
- up the config file really badly or overdo the REGEX string files).
-
- Still TODO
-	Write the HTML 
, and HTML  output modules
-	Change the way we do REGEX's (need to compile the paterns once, not
-		every time).
-	Documentation, Documentation, Documentation.  :(
-	Clean up the code some more so I won't be quite so embarrassed when I
-	release this thing.  :)

* Sun Dec 24 2000 A.L.Lambert 
- Came up with idea, and commenced work on getting this thing ready for
- distribution
-	Code is about half written at this point, but should progress
-	relatively quickly (I type way too fast).
-
-	Anciliary stuff (Makefile's, .spec file, etc.) is pretty much done.
-
-	Documentation is basically un-started (although this program ain't
-	likely to need a rocket scientist to run it).
-
-	I have to go to bed so's I can be fresh for Christmas, so no more work
-	will likely be getting done until around the 27'th.
logtool-1.2.8/CHANGES-1.20000644000372000017500000001133207635550752014143 0ustar  wouterwouterNew in 1.2.0

Interesting stuff for end users to know:

- Now handles TAI64 timestamped logfiles ala D.J.Bernstien's multilog package.
	In other words, you can "cat /var/log/qmail/current | logtool" and
	get output like you would expect from doing the same with a Syslog.

- Now does specialized output for some events, such as those generated by 
	snort and iptables (only in HTML, ANSI, and ASCII modes though).

- Now handles completely unknown and unformatted input.  (will colorize it 
	and or ignore it based on the usual REGEX's, but will not try to
	put it into formatted or colorized or other kinds of colums)

- Will (hopefully) never leave you wondering where your data went if you 
	feed it input that's not strictly a syslog-ish format.

- Now (hopefully) will never barf uppon being unable to read a config or 
	regex (or other) file.

- Now does hostname lookup's for iptables and snort (and possibly other) 
	events in your syslog's.

- Please see 'logtool -h' for a new listing of the command line.  In truth, 
	all old options from 1.0.7 have been kept in place for compatability
	with any scripts you may have written using said, but I hope you make
	note and update your scripts and such to avoid any of the depreciated
	options (depreciated options are not listed :).  Someday, I'll remove 
	the depreciated options entirely.  You have been warned!


Interesting stuff for the more technicly inclined:

- Oh wow, where to start?  Sooo many changes to the internals, that you might
	as well sit down and commence to reading the code and comments, as 
	big big big chunks of it hardly resemble anything that came before. If
	you don't believe me, do a diff with a logtool-1.0.x tree. :)
	However, I suppose I would be remiss if I didn't give you at least a
	few of the highlights.

- src/Makefile has changed quite a bit to (hopefully) be more dynamic in how
	it does the build.  (IE: I've discovered some new macro's :)

- A whole new environment based config file reader has been implemented.
	Syntax in config files is now MUCH more lenient on users, and lends
	itself better to the following new feature.  See readconf.c.

- See logtool.h for the new data struct's.  Very little remains of the old 
	variables and structs and such.

- Speaking of those structs, we now dynamicly handle REGEX's from file so
	that there's no limits based on buffer size (other than available 
	memory).

- Speaking of REGEX's, we now compile the strings before-hand, and just call
	regex() directly instead of regcomp() and free()'ing every time.  This
	spares a good deal of CPU overhead, which comes in handy, as there is
	so much more going on that even with all the efficiency improvements,
	we're slower than the old logtool by a few percentage points 
	(thankfully, ASCII parsing in C is fast enough, that you should notice
	very little difference without using 'time' :)

- Note the following two terms:  "Output Modules" and "Event Modules".  They 
	are separate things; where once they were not. :)

- Moved to a modular system, whereby we can do customized colorizations
	in output depending on what kind of messages are input.  (current
	modules are: UNKNOWN, SYSLOG, SNORT_SYSLOG, and IPTABLES_SYSLOG).  The
	modules in essence return a string in event.pmsg with embedded \033's,
	which are parsed into whatever color format a given output module might
	needs.  
	
	NOTE: Modules will take config directives in the config file instead
	of the command line.  The cmdline switches for this program are 
	getting	just too ridiculous.

	NOTE: CSV output module isn't really smart enough to know what to 
	do with modules just yet, so all it still does is syslog-like format.
	
	NOTE: I	was very bad, and used \033's that aren't standard to any other
	known format, just because it seemed like the thing to do, and it was
	easier than reading up on another encoding method :)

- Relating to modules, the internal code has changed regarding parsing of
	events.  Instead of each module doing some of it's own output setup,
	the various modules are now responsible for doing the parsing, 
	and the output code for the various output formats just parses what
	the modules generate.  This is simpler to write output modules, and 
	harder to code event modules.

- Changed a lot of the strncpy() calls to strcpy() calls in the name of 
	efficiency and performance.  Calls which rely on user input remain
	as strncpy(); however, to (we hope) avoid crashes. :)

- A bunch of other stuff I'm no doubt not remembering (or going to).  I hate 
	to admit it, but I've reached the point where I can't be bothered to
	do much documentation, and you should just "use the source Luke" if
	you need to know/do more with logtool than is immediately apparent
	without mucking with the source.

- Best of luck, and God bless you all.

logtool-1.2.8/Makefile.in0000644000372000017500000000124610037020003014665 0ustar  wouterwouter# This is just a bootstrap Makefile.  The real one's are in the various subdir's.
build_it: src/Makefile
	if [ ! -f ./config.cache ] ; then ./configure ; fi
	cd src ; $(MAKE)

install: 
	cd src ; $(MAKE) install

clean: 
	rm -f a.out core *~ *.o *.a 
	cd conf ; rm -f a.out core *~ *.o *.a 
	cd doc ; rm -f a.out core *~ *.o *.a 
	cd scripts ; rm -f a.out core *~ *.o *.a 
	cd src ; $(MAKE) clean
	cd dd ; rm -f *~

distclean: clean
	rm -f config.status config.cache config.log 
	rm -Rf dd/tmp/

dd: clean
	if [ -d debian ] ; then mv -f debian debian.tmp ; fi
	ln -s dd debian
	dd/rules clean build binary
	rm -f debian
	if [ -d debian.tmp ] ; then mv -f debian.tmp debian ; fi
logtool-1.2.8/COPYING0000644000372000017500000004310107221274652013675 0ustar  wouterwouter		    GNU GENERAL PUBLIC LICENSE
		       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

			    Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

		    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

			    NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

		     END OF TERMS AND CONDITIONS

	    How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    
    Copyright (C) 19yy  

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) 19yy name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  , 1 April 1989
  Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Library General
Public License instead of this License.
logtool-1.2.8/CREDITS0000644000372000017500000000712410276710725013667 0ustar  wouterwouter	A list of people who directly contributed to the code you'll find in 
this package:

Russ Allbery 
	Who's code I borrowed from when writing the TIA64 support.

Massimiliano Mirra 
	Contributed the code for the -m feature when using logtool with
	multilog files.
	
	A list of people who helped me by pointing out the errors of my ways, 
and in some cases, providing helpfull suggestions to fix various problems:

Christoph Krempe 
	Who reported the build/install error's on Solaris, and helped me
	more than he knows by trying out the various patches I sent him
	until it all compiled/ran fine.  Christoph also pointed out to me
	the bug in the includefile functionality that I finally got fixed. 

Thomas Hager 
	Made some good suggestions on updates to the *.spec file for the RPM
	distribution.

Andreas ึstling" 
	Helped me out by getting it to compile on OpenBSD, and reporting to
	me what was needed to fix the main distribution.

Ying-Chieh Liao 
	Pointed out some rather idiotic mistakes I had made in the Makefile.

Thanh Ma 
	Pointed out some compile problems on SCO UnixWare, and gave my fixes
	a try to verify that they worked.  Also pointed out some needed changes
	for AIX compatibility.

Laurent Jacquot 
	Sent me a patch to fix the lt_fmtcheck() function to work on the 
	latest RedHat 7.0 release.

Robert Huff 
	Suggested I fix the documentation to note a few things, and (in a
	roundabout way) that I make the ./configure script fix the various
	documentation (manpage, logtool.txt) to contain the propper paths
	to the various config files

Johan Swenker 
	E-mailed me a patch for logtail to stop coredumps under certain 
	circumstances.

Magnus F  and
Hans-Peter Gertges 
	For helping me track down and fix several Solaris-centric problems
	with the 1.2.x branch.

Mark Turnauckas 
	For suggesting the sound playing options which led to all kinds of 
	neat features which I started introducing in 1.2.8.

	Thanks to folks who contributed in a more general way:

	My ex-boss David Hughes, and my Co-Worker Wes Bateman, for not only 
encouraging my efforts to learn C, but for being two of the best people I've
ever worked for/with, and especially for suffering through my fits of psychotic
yammering over whatever latest neat trick I learned about C on any given day, 
and putting up with me on the other end of the spectrum when I was so lost in 
code that I kept having to ask them to repeat what they just said whilst 
having conversations.  You guys rock!
	
	Also, I would like to thank Mark Bainter; one heck of a cool dude, and
probably the smartest Linux geek I ever met.  He helped me out a lot when I was 
fighting my way through my early days of self taught C programming.

	Arlin Collins, for teaching me enough of the basics of C in a few short
classes to give me the background to understand the manpages when I finally got
around to teaching myself. 
	
	And last, but not least, Special thanks to everyone who's helped me out
with tidbits of knowledge along the way in my journey of learning C.  I picked 
up a lot from the manpages and a few books, but without you guys, I would never
have learned enough to code this thing (simple though it may be) :) I think I 
can get most all of you by including the folks from #linpeople and #c on 
irc.openprojects.net.  Thanks for the advice and help you guys (and gal's too).

	--A.L.Lambert

logtool-1.2.8/doc/0000755000372000017500000000000010276711540013404 5ustar  wouterwouterlogtool-1.2.8/doc/logtool.txt.in0000644000372000017500000001710207635772762016254 0ustar  wouterwouter	First thing you should do after install, is type "logtool -h" to see
the help on command line options.  I've included it below for your viewing
pleasure.

Command line options:
logtool version 1.2.0, copyright Y2K-current A.L.Lambert

Command line options:
 -c [/path/config.file]  = specify a config file other than /etc/logtool/logtool.conf
 -i [/path/include.file] = a file containing regex's for inclusion
 -e [/path/exclude.file] = a file containing regex's for exclusion
 -o [ ANSI | ASCII | CSV | HTML | RAW ]
  Output Format: ANSI (default), ASCII, CSV, HTML, RAW
 -t [ long | short ]
        Time display Format: (Long [default]) Mon Dy HH:MM:SS or (Short) HH:MM
 -n = do not resolve IP addresses (if applicable)
 -b = beep on RED events (ANSI output only)
 -s = do not display the syslog "source" field
 -p = do not display the "program" field
 -v = verbose (print event processing info to stderr)
 -d = do debugging output on stderr (for us developers)
 -V = print version and exit
 -h = this help message


	Please take note, that on many non-Linux distributions of logtool, the
default paths of the various config files in places other than @sysconfdir@
(such as /usr/local/etc/).  However, since I don't think it appropriate to
type half a dozen possible paths each time I refer to one of the config files,
I shall use @sysconfdir@ in this documentation.  You are responsible for
translating this notation to whatever the reality may be. :)

	Now, give it a try, and see what it does.  At the command prompt, type

tail /var/log/messages | logtool # or some other syslog generated file

	By default, logtool will ignore no messages, so you should have some
output on your screen in pretty ANSI colors (if your terminal does not support
the (mostly) standard escape sequences to alter colors, then you should switch
to one that does).  

	You may need to specify a different logfile if your system does not 
dump it's syslog files to /var/log/messages (IE: it's in the /var/adm tree on
most *BSD's as I recall).

	You can experiment with the output options by typing:

tail /var/log/messages | logtool -o csv
        
	The output options are not case sensitive, so "-o CSV" should yield
the same result.  Try the other options as well (listed at the beginning of
this file).  Play around with the various options until you feel comfortable 
that you know how to run logtool from the command line.
	
	NOTE: If you're like me, and like to use 'less' to view your logtool
output, you probably want to use the -R switch to keep it from clobbering the
color escape sequences when in ANSI mode.  .


	Once you have a good grasp of the options, and what they do, open up
@sysconfdir@/logtool.conf in your favorite text editor.  This is the heart and
soul of logtool's runtime configuration right here.  By modifying the settings
in this file, you can specify the default value for any of the command line
switches available above, and much more.  This file is well commented, and 
as such, should be self-documenting.  If you find you have questions after 
reading the comments, please e-mail me so I can write better comments for the
next release. :)


	
	Now, by this point, you should have played enough to grasp the concept
of colorization well enough for me to skip the gory details.  You have access
to control all the ANSI colors, except dark red and black via files defined in
logtool.conf.  The color definition and regular expression files are something
you will most certainly want to customize.  An example of a color file is 
listed below.

--cut--
# This file takes plain ole POSIX regex's, one per line (just like grep)

FTP session (opened|closed)
\(su\).*session (opened|closed)
--cut--

	Depending on which file this was (we'll assume 'green'), any log 
messages matching the regular expressions above would be displayed in green.
The same logic applies to all the colors, as well as the include/exclude files
explained below.

	NOTE: The strings you put in this file are _CASE SENSITIVE_.  Keep that
in mind as you build your own lists.


	Unlike the color definition files which only define certain strings of
text to be defined as a certain color when being displayed, the include and
exclude files define log messages to include or exclude.  By default, nothing
is included, or excluded.  The logic of these two things can best be explained
by the following:

	include file = only include these log messages
	exclude file = include all log messages except for these

	You can use this logic go build your own boolean searches.  An example
script is listed below:

--cut--
#!/bin/sh

# mail a report to john_doe@somedomain.com
retail /var/log/messages /var/log/secure |\
logtool -o ascii -c /home/john/report.cfg -i /home/john/report.inc |\
mail -s "Your report" john_doe@somedomain.com

# mail a report as a CSV file to me@mydomain.com
tmpfile=/tmp/$RANDOM.$$.tempfile
retail /var/log/messages |\
logtool -o csv -e /home/me/report.exc > $tmpfile
mutt -a $tmpfile -s "Your report" me@mydomain.com


# EOF
--cut--

	In these examples, there are include and exclude files which have been
set up prior to running this script which contain the events relevant to the
user the report is being mailed to.  

	John's include file specify's that he only views events generated by 
(host1|host2), which contain the strings (error|warning).  He also has a
customized configuration file in which he alters the system-wide default 
behavior to meet his personal preferences.

	Me's include file specifies that I only look at messages generated by
(host1), and that Me excludes events that contain (notice).

	You'll also notice, that the report is formated to each users 
preference.  John just likes a flat ASCII dump of the logfiles, whereas Me
likes a CSV file as an attachment so I can import it into my favorite
spreadsheet for easy manipulation/viewing.

	If you wrote a simple shell script similar to the one above, and put
it in /etc/cron.daily (or whatever your flavor of UNIX uses for such things),
you would have an instant daily report based on your logfiles show up in Me
and John's INBOX every day.

	Another example use would be something like the following:

--cut--
#!/bin/sh

# Generate a webpage of the logfiles
cat /var/log/messages | logtool -o html > /home/httpd/html/logs/index.html
 
# EOF
--cut--

	This will use the system defaults to generate a webpage for viewing
anytime you get in the mood to go look at your logfiles (assuming you have a
webserver configured to have access to /home/httpd/html/logs/).


	Pretty simple stuff, eh?  You can peruse the scripts in the ../scripts/
subdirectory for more examples on uses of logtool.


	I should include a quick note (plug) about the program 'retail' you
may have noted me using above.  It is a ground-zero re-implementation of the
functionality of logtail by Craig H. Rowland , which
attempts to better handle 'file changed' situations.  I no longer include 
logtail in the logtool package, nor do I include retail, which is available
seperately (probably from the same place you got logtool).

	Both retail and logtail will read the specified file(s), and output 
their contents to stdout.  It will also create a record of where the file 
ended, and will pick up again at that point later when re-run.  Long story 
short, it's a lot like "tail", with a memory.  :)  The usage is simple enough,
I expect you'll get the hang of it without me having to spell it out for you
in this documentation.


	More documentation stuff will be written later, but this should be 
enough to get you going, and suffice to call "documentation" for the time 
being.


logtool-1.2.8/doc/logtool.10000644000372000017500000000751610276711540015156 0ustar  wouterwouter\"
.\" logtool.1
.\"
.\" Copyright (C) 2001 A.L.Lambert.  All rights reserved.
.\"
.\" Process this file with
.\" groff -man -Tascii pgp.1
.\"


.TH logtool 1 LOCAL 

.SH NAME

logtool - parse and filter syslog files

.SH SYNOPSIS

.B (stdout) | logtool -[args]  

Logtool is a command line program that will parse logfiles into a more palatable format. 
It will take anything resembling a syslog or multilog file, as well as unformatted ASCII, 
and crunch it into one of the following formats for your viewing pleasure: 

.TP
	ANSI (colorized for easy "at a glance" viewing) 
.TP
	ASCII (e-mail reports/term's w/o color) 
.TP
	CSV (spreadsheet/database imports) 
.TP
	HTML (for generating web pages) 
.TP
	RAW (for no good reason) 
.B 


.SH OPTIONS

.TP 5 
-o [ ANSI | ASCII | CSV | HTML | RAW ]
Allows you to specify the output format to be one of the following: ANSI (default), ASCII, CSV, HTML, RAW.  Options are not case sensitive (ie: -o CSV and -o csv should yield the same results)
.TP
-t [ long | short ]
Allows you to specify the time display format to be one of the following: (Long [default]) Mon Dy HH:MM:SS or (Short) HH:MM
.TP
-b 
Causes logtool to beep on RED events (ANSI output only).  This is usefull when you want to monitor a logfile on an ongoing basis, and wish to have your terminal beep whenever something out of the ordinary happens.
.TP
-s 
Causes logtool to not display the syslog "source" field
.TP
-p 
Causes logtool to not display the "program" field
.TP
-c [/path/config.file] 
Allows you to specify a config file other than the default /etc/logtool/logtool.conf
.TP 
-i [/path/includefile]
Allows you to specify an alterate file containing regex's for inclusion [default=/etc/logtool/include]
.TP
-e [/path/excludefile]
Allows you to specify an alternate file containing regex's for exclusion [default=/etc/logtool/exclude]
.TP
-n
Causes logtool to skip any attempts to resolve IP->Hostname by the various modules (handy when your DNS is down temporairly).
.TP
-v 
Set logtool to operate in verbose mode (does nothing currently)
.TP
-V 
Causes logtool to print it's version information and exit 
.TP
-h 
Display the help message
.SH SUGGESTED USAGE(S)

.TP
As a 'live' logfile monitoring tool:
tail -f /var/log/messages | logtool -o ANSI -b
.TP
To generate colorized webpages of logfiles:
cat /var/log/messages | logtool -o HTML > /home/httpd/html/logs/messages.html
.TP
To generate reports via a cronjob:
retail /var/log/messages | logtool -o ASCII | mail -s "Daily report" someuser@somedomain.ext

.SH CONFIG FILE

.P 
/etc/logtool/logtool.conf
.P
The config file should be commented to the point of being self-documenting, so we will not comment
very extensively on it here.  Suffice to say, this is the place where you should configure 99% of your
runtime options for logtool.  You may also  have a collection of different default configurations, 
and select amongst them by the '-c' option of logtool.

.SH AVAILABILITY

Logtool is known to compile/run on all UNIX flavors using a 2.95.x GNU C Compiler, the GNU Make utility, and a proper ANSI C library 
(glibc is recommended, but not required).  Specific reports of success include FreeBSD, OpenBSD, Solaris, SunOS, AIX, SCO, and 
of course, any known flavor of Linux (including at least 2 embedded system variants).

.SH SEE ALSO

.P
regex(7) for help with constructing regular expressions for the include/exclude/colors files.  If you find no regex manual
on your system, try 'apropos regex' and see what you get, or as a last ditch, 'man grep' should at least point you in
the right direction.
.P
You can also find a somewhat better bit of documentation in the textfile 'logtool.txt'
(usually in the /usr/doc/, /usr/share/doc/ or similar tree on most Linux distributions).  If
you don't know where to look, you can probably find it by typing 'locate logtool.txt' at the
command line.

.SH AUTHOR

A.L.Lambert 
logtool-1.2.8/doc/logtool.1.in0000644000372000017500000000751607636005246015570 0ustar  wouterwouter\"
.\" logtool.1
.\"
.\" Copyright (C) 2001 A.L.Lambert.  All rights reserved.
.\"
.\" Process this file with
.\" groff -man -Tascii pgp.1
.\"


.TH logtool 1 LOCAL 

.SH NAME

logtool - parse and filter syslog files

.SH SYNOPSIS

.B (stdout) | logtool -[args]  

Logtool is a command line program that will parse logfiles into a more palatable format. 
It will take anything resembling a syslog or multilog file, as well as unformatted ASCII, 
and crunch it into one of the following formats for your viewing pleasure: 

.TP
	ANSI (colorized for easy "at a glance" viewing) 
.TP
	ASCII (e-mail reports/term's w/o color) 
.TP
	CSV (spreadsheet/database imports) 
.TP
	HTML (for generating web pages) 
.TP
	RAW (for no good reason) 
.B 


.SH OPTIONS

.TP 5 
-o [ ANSI | ASCII | CSV | HTML | RAW ]
Allows you to specify the output format to be one of the following: ANSI (default), ASCII, CSV, HTML, RAW.  Options are not case sensitive (ie: -o CSV and -o csv should yield the same results)
.TP
-t [ long | short ]
Allows you to specify the time display format to be one of the following: (Long [default]) Mon Dy HH:MM:SS or (Short) HH:MM
.TP
-b 
Causes logtool to beep on RED events (ANSI output only).  This is usefull when you want to monitor a logfile on an ongoing basis, and wish to have your terminal beep whenever something out of the ordinary happens.
.TP
-s 
Causes logtool to not display the syslog "source" field
.TP
-p 
Causes logtool to not display the "program" field
.TP
-c [/path/config.file] 
Allows you to specify a config file other than the default @sysconfdir@/logtool.conf
.TP 
-i [/path/includefile]
Allows you to specify an alterate file containing regex's for inclusion [default=@sysconfdir@/include]
.TP
-e [/path/excludefile]
Allows you to specify an alternate file containing regex's for exclusion [default=@sysconfdir@/exclude]
.TP
-n
Causes logtool to skip any attempts to resolve IP->Hostname by the various modules (handy when your DNS is down temporairly).
.TP
-v 
Set logtool to operate in verbose mode (does nothing currently)
.TP
-V 
Causes logtool to print it's version information and exit 
.TP
-h 
Display the help message
.SH SUGGESTED USAGE(S)

.TP
As a 'live' logfile monitoring tool:
tail -f /var/log/messages | logtool -o ANSI -b
.TP
To generate colorized webpages of logfiles:
cat /var/log/messages | logtool -o HTML > /home/httpd/html/logs/messages.html
.TP
To generate reports via a cronjob:
retail /var/log/messages | logtool -o ASCII | mail -s "Daily report" someuser@somedomain.ext

.SH CONFIG FILE

.P 
@sysconfdir@/logtool.conf
.P
The config file should be commented to the point of being self-documenting, so we will not comment
very extensively on it here.  Suffice to say, this is the place where you should configure 99% of your
runtime options for logtool.  You may also  have a collection of different default configurations, 
and select amongst them by the '-c' option of logtool.

.SH AVAILABILITY

Logtool is known to compile/run on all UNIX flavors using a 2.95.x GNU C Compiler, the GNU Make utility, and a proper ANSI C library 
(glibc is recommended, but not required).  Specific reports of success include FreeBSD, OpenBSD, Solaris, SunOS, AIX, SCO, and 
of course, any known flavor of Linux (including at least 2 embedded system variants).

.SH SEE ALSO

.P
regex(7) for help with constructing regular expressions for the include/exclude/colors files.  If you find no regex manual
on your system, try 'apropos regex' and see what you get, or as a last ditch, 'man grep' should at least point you in
the right direction.
.P
You can also find a somewhat better bit of documentation in the textfile 'logtool.txt'
(usually in the /usr/doc/, /usr/share/doc/ or similar tree on most Linux distributions).  If
you don't know where to look, you can probably find it by typing 'locate logtool.txt' at the
command line.

.SH AUTHOR

A.L.Lambert 
logtool-1.2.8/doc/logtool.txt0000644000372000017500000001710210276711540015625 0ustar  wouterwouter	First thing you should do after install, is type "logtool -h" to see
the help on command line options.  I've included it below for your viewing
pleasure.

Command line options:
logtool version 1.2.0, copyright Y2K-current A.L.Lambert

Command line options:
 -c [/path/config.file]  = specify a config file other than /etc/logtool/logtool.conf
 -i [/path/include.file] = a file containing regex's for inclusion
 -e [/path/exclude.file] = a file containing regex's for exclusion
 -o [ ANSI | ASCII | CSV | HTML | RAW ]
  Output Format: ANSI (default), ASCII, CSV, HTML, RAW
 -t [ long | short ]
        Time display Format: (Long [default]) Mon Dy HH:MM:SS or (Short) HH:MM
 -n = do not resolve IP addresses (if applicable)
 -b = beep on RED events (ANSI output only)
 -s = do not display the syslog "source" field
 -p = do not display the "program" field
 -v = verbose (print event processing info to stderr)
 -d = do debugging output on stderr (for us developers)
 -V = print version and exit
 -h = this help message


	Please take note, that on many non-Linux distributions of logtool, the
default paths of the various config files in places other than /etc/logtool
(such as /usr/local/etc/).  However, since I don't think it appropriate to
type half a dozen possible paths each time I refer to one of the config files,
I shall use /etc/logtool in this documentation.  You are responsible for
translating this notation to whatever the reality may be. :)

	Now, give it a try, and see what it does.  At the command prompt, type

tail /var/log/messages | logtool # or some other syslog generated file

	By default, logtool will ignore no messages, so you should have some
output on your screen in pretty ANSI colors (if your terminal does not support
the (mostly) standard escape sequences to alter colors, then you should switch
to one that does).  

	You may need to specify a different logfile if your system does not 
dump it's syslog files to /var/log/messages (IE: it's in the /var/adm tree on
most *BSD's as I recall).

	You can experiment with the output options by typing:

tail /var/log/messages | logtool -o csv
        
	The output options are not case sensitive, so "-o CSV" should yield
the same result.  Try the other options as well (listed at the beginning of
this file).  Play around with the various options until you feel comfortable 
that you know how to run logtool from the command line.
	
	NOTE: If you're like me, and like to use 'less' to view your logtool
output, you probably want to use the -R switch to keep it from clobbering the
color escape sequences when in ANSI mode.  .


	Once you have a good grasp of the options, and what they do, open up
/etc/logtool/logtool.conf in your favorite text editor.  This is the heart and
soul of logtool's runtime configuration right here.  By modifying the settings
in this file, you can specify the default value for any of the command line
switches available above, and much more.  This file is well commented, and 
as such, should be self-documenting.  If you find you have questions after 
reading the comments, please e-mail me so I can write better comments for the
next release. :)


	
	Now, by this point, you should have played enough to grasp the concept
of colorization well enough for me to skip the gory details.  You have access
to control all the ANSI colors, except dark red and black via files defined in
logtool.conf.  The color definition and regular expression files are something
you will most certainly want to customize.  An example of a color file is 
listed below.

--cut--
# This file takes plain ole POSIX regex's, one per line (just like grep)

FTP session (opened|closed)
\(su\).*session (opened|closed)
--cut--

	Depending on which file this was (we'll assume 'green'), any log 
messages matching the regular expressions above would be displayed in green.
The same logic applies to all the colors, as well as the include/exclude files
explained below.

	NOTE: The strings you put in this file are _CASE SENSITIVE_.  Keep that
in mind as you build your own lists.


	Unlike the color definition files which only define certain strings of
text to be defined as a certain color when being displayed, the include and
exclude files define log messages to include or exclude.  By default, nothing
is included, or excluded.  The logic of these two things can best be explained
by the following:

	include file = only include these log messages
	exclude file = include all log messages except for these

	You can use this logic go build your own boolean searches.  An example
script is listed below:

--cut--
#!/bin/sh

# mail a report to john_doe@somedomain.com
retail /var/log/messages /var/log/secure |\
logtool -o ascii -c /home/john/report.cfg -i /home/john/report.inc |\
mail -s "Your report" john_doe@somedomain.com

# mail a report as a CSV file to me@mydomain.com
tmpfile=/tmp/$RANDOM.$$.tempfile
retail /var/log/messages |\
logtool -o csv -e /home/me/report.exc > $tmpfile
mutt -a $tmpfile -s "Your report" me@mydomain.com


# EOF
--cut--

	In these examples, there are include and exclude files which have been
set up prior to running this script which contain the events relevant to the
user the report is being mailed to.  

	John's include file specify's that he only views events generated by 
(host1|host2), which contain the strings (error|warning).  He also has a
customized configuration file in which he alters the system-wide default 
behavior to meet his personal preferences.

	Me's include file specifies that I only look at messages generated by
(host1), and that Me excludes events that contain (notice).

	You'll also notice, that the report is formated to each users 
preference.  John just likes a flat ASCII dump of the logfiles, whereas Me
likes a CSV file as an attachment so I can import it into my favorite
spreadsheet for easy manipulation/viewing.

	If you wrote a simple shell script similar to the one above, and put
it in /etc/cron.daily (or whatever your flavor of UNIX uses for such things),
you would have an instant daily report based on your logfiles show up in Me
and John's INBOX every day.

	Another example use would be something like the following:

--cut--
#!/bin/sh

# Generate a webpage of the logfiles
cat /var/log/messages | logtool -o html > /home/httpd/html/logs/index.html
 
# EOF
--cut--

	This will use the system defaults to generate a webpage for viewing
anytime you get in the mood to go look at your logfiles (assuming you have a
webserver configured to have access to /home/httpd/html/logs/).


	Pretty simple stuff, eh?  You can peruse the scripts in the ../scripts/
subdirectory for more examples on uses of logtool.


	I should include a quick note (plug) about the program 'retail' you
may have noted me using above.  It is a ground-zero re-implementation of the
functionality of logtail by Craig H. Rowland , which
attempts to better handle 'file changed' situations.  I no longer include 
logtail in the logtool package, nor do I include retail, which is available
seperately (probably from the same place you got logtool).

	Both retail and logtail will read the specified file(s), and output 
their contents to stdout.  It will also create a record of where the file 
ended, and will pick up again at that point later when re-run.  Long story 
short, it's a lot like "tail", with a memory.  :)  The usage is simple enough,
I expect you'll get the hang of it without me having to spell it out for you
in this documentation.


	More documentation stuff will be written later, but this should be 
enough to get you going, and suffice to call "documentation" for the time 
being.


logtool-1.2.8/scripts/0000755000372000017500000000000007636144450014334 5ustar  wouterwouterlogtool-1.2.8/scripts/monitor.logs.sh0000755000372000017500000000012607222254124017313 0ustar  wouterwouter#!/bin/sh


logfiles="/var/log/messages /var/log/secure"

tail -f logfiles | logtool

logtool-1.2.8/scripts/README0000644000372000017500000000024307222254124015202 0ustar  wouterwouter	These examples are very simple.  You probably want to complicate them
a bit for your uses. :)  Also, if you haven't already, go back and read the 
documentation!
logtool-1.2.8/scripts/cronjob.emailreport.sh0000755000372000017500000000024207222254124020636 0ustar  wouterwouter#!/bin/sh

mailto="me@mydomain.com"
reportname="My Report"
logfiles="/var/log/messages /var/log/secure"

cat $logfiles | logtool | mail -s "$reportname" $mailto

logtool-1.2.8/scripts/cronjob.genwebpage.sh0000755000372000017500000000026007222254124020417 0ustar  wouterwouter#!/bin/sh

# Season these variables to suit
logfiles="/var/log/messages /var/log/secure"
outputfile="/home/httpd/html/logs/index.html"


cat $logfiles | logtool > $outputfile

logtool-1.2.8/scripts/logtool_logcheck.sh0000644000372000017500000000643407636144441020215 0ustar  wouterwouter#!/bin/sh
#
# This script is copyright 2001 by A.L.Lambert.  It is distributed under the
# GNU public license.  If you don't know what this means, I suggest you point
# a web browser at www.gnu.org and find out.
#
# Usage: I use this script to monitor my logfiles on a regular basis, and e-mail
# me when events I've not previously defined as "OK" happen.  I am not going to 
# hold your hand too far in this, as I expect you to be able to code simple
# shell script and know a bit about what you're doing before you get here. :)
#
# YOU MUST CREATE /etc/lt_watch/logtool.conf BEFORE YOU RUN THIS SCRIPT!!!!!!
# The easiest way to do this is cp -rapfvd /etc/logtool /etc/lt_watch/
#
# SEASON THIS CONFIGURATION INFO TO SUIT YOUR SYSTEM BEFORE USING THIS SCRIPT!
logfiles="/var/log/maillog /var/log/messages /var/log/secure"
mailto="me@mydomain.ext someoneelse@someotherdomain.ext"
pagemail="mypager@mypagercompany.net"

# the code for these will most likely need to be edited for non-Linux systems
# If you don't know how to do such editing below, SET THESE ALL TO "NO"!!!!
tcpstats="yes"
logusers="yes"
lastlog="yes"
proclist="yes"

# we need a tempfile name
# see if we've got mktmp, and if we do, use it.
if [ -x `which mktemp` ] ; then
tnpfile=`mktemp -q /tmp/$0.XXXXXX`
	if [ $? -ne 0 ]; then
		# oops; we got it, but it's not working right; complain to user about it
		echo "$0: Can't create temp file, exiting..."
                exit 1
	fi
else 
# NOT INCREDIBLY SECURE!!! DO SOMETHING BETTER IF YOU WANT
tmpfile=/tmp/$$.$RANDOM.$$.logtool.check
fi


# touch the run file
touch /var/run/logtool.check

# for each logfile, see if there's anything new to report
for i in $logfiles ; do
retail $i | logtool -c /etc/logwatch/logtool.conf >> $tmpfile
done

# if we found anything, load it into a memory variable
found="`head $tmpfile`"

# if there wasn't nothing found, then we can bail out
if [ "$found" = "" ] ; then
rm -f $tmpfile /var/run/logtool.check
exit 0
else

# Houston, we might possibly have a problem... Let's e-mail someone about it, shall we?

# if the user wants TCP stats with their report
if [ "$tcpstats" = "yes" ; then
echo "
-----------------------------------------------------------------------------
Current TCP/IP status" >> $tmpfile
netstat -nap >> $tmpfile
fi

# if they want to know who's currently logged on and doing what
if [ "$logusers" = "yes" ] ; then
echo "
-----------------------------------------------------------------------------
Currently logged in users: " >> $tmpfile
w >> $tmpfile
fi

# if they want to know who's the last users logged on
if [ "$lastlog" = "yes" ] ; then
echo "
-----------------------------------------------------------------------------
Current last log: " >> $tmpfile
last >> $tmpfile
fi

# if they want to know the current proclist
if [ "$proclist" = "yes" ] ; then
echo "
-----------------------------------------------------------------------------
Current process list: " >> $tmpfile
ps auxfwwwwww >> $tmpfile
fi

# pump that tmpfile into the mail post-haste.
cat $tmpfile | mail -s "Logwatch report `date`" $mailto
rm -f $tmpfile /var/run/logtool.check

# and a quick pager message to make sure he knows to check...
if [ "$pagemail" -ne "" ] ; then
echo "Check your regular e-mail for unusual log activity" | mail -s "Log Activity" $pagemail
fi

fi # if found != "" end FI

exit 0

logtool-1.2.8/src/0000755000372000017500000000000010324457556013436 5ustar  wouterwouterlogtool-1.2.8/src/install-sh0000777000372000017500000000000010321261344017631 2../install-shustar  wouterwouterlogtool-1.2.8/src/Makefile.in0000644000372000017500000000417310117533045015474 0ustar  wouterwouter# generated automagicly from Makefile.in - don't edit Makefile directly!!!
PROG = logtool
OBJS = readconf.o getopt.o regex.o parser.o ansi.o ascii.o tai64nfrac.o \
	csv.o html.o raw.o logtool.o main.o ncurses.o env.o gethost.o \
	mod_snort.o mod_syslog.o mod_unknown.o mod_iptables.o \
	mod_common.o mod_sound.o output.o loop.o parse_pmsg.o


PREFIX = @prefix@
prefix = $(PREFIX)
ETCDIR = @sysconfdir@
MANDIR = @mandir@

CC = @CC@
INSTALL = @installprog@
CFLAGS= @CFLAGS@ @DEFS@
LDFLAGS = @LIBS@

### The main build stuff
logtool: $(OBJS)
	$(CC) $(CFLAGS) -o $(PROG) $(OBJS) $(LDFLAGS)

# Things for the library build stuff
$(OBJS): %.o: %.c *.h ../config.h
	$(CC) -c $(INCLUDES) $(CFLAGS) $< -o $@
	

### How to install this puppy
install: logtool
	mkdir -p $(DESTDIR)$(ETCDIR)
	mkdir -p $(DESTDIR)$(PREFIX)/bin
	mkdir -p $(DESTDIR)$(MANDIR)/man1
	$(INSTALL) -m 0555 -o root $(PROG) $(DESTDIR)$(PREFIX)/bin/$(PROG)
	$(INSTALL) -m 0444 -o root ../doc/logtool.1 $(DESTDIR)$(MANDIR)/man1
	# we do each individual file here because install-sh is braindead. :(
	$(INSTALL) -m 0644 -o root ../conf/blue $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/brightblue $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/brightcyan $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/brightgreen $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/brightmagenta $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/brightred $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/brightwhite $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/brightyellow $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/cyan $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/exclude $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/green $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/include $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/logtool.conf $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/magenta $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/white $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/yellow $(DESTDIR)$(ETCDIR)/

clean:
	-rm -f a.out core *~ *.o *.a $(PROG) debug

logtool-1.2.8/src/Makefile0000644000372000017500000000427310324457556015104 0ustar  wouterwouter# Generated automatically from Makefile.in by configure.
# generated automagicly from Makefile.in - don't edit Makefile directly!!!
PROG = logtool
OBJS = readconf.o getopt.o regex.o parser.o ansi.o ascii.o tai64nfrac.o \
	csv.o html.o raw.o logtool.o main.o ncurses.o env.o gethost.o \
	mod_snort.o mod_syslog.o mod_unknown.o mod_iptables.o \
	mod_common.o mod_sound.o output.o loop.o parse_pmsg.o


PREFIX = /usr
prefix = $(PREFIX)
ETCDIR = /etc/logtool
MANDIR = ${prefix}/man

CC = gcc
INSTALL = /usr/bin/install -c
CFLAGS= -g -O2 -DHAVE_CONFIG_H
LDFLAGS = 

### The main build stuff
logtool: $(OBJS)
	$(CC) $(CFLAGS) -o $(PROG) $(OBJS) $(LDFLAGS)

# Things for the library build stuff
$(OBJS): %.o: %.c *.h ../config.h
	$(CC) -c $(INCLUDES) $(CFLAGS) $< -o $@
	

### How to install this puppy
install: logtool
	mkdir -p $(DESTDIR)$(ETCDIR)
	mkdir -p $(DESTDIR)$(PREFIX)/bin
	mkdir -p $(DESTDIR)$(MANDIR)/man1
	$(INSTALL) -m 0555 -o root $(PROG) $(DESTDIR)$(PREFIX)/bin/$(PROG)
	$(INSTALL) -m 0444 -o root ../doc/logtool.1 $(DESTDIR)$(MANDIR)/man1
	# we do each individual file here because install-sh is braindead. :(
	$(INSTALL) -m 0644 -o root ../conf/blue $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/brightblue $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/brightcyan $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/brightgreen $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/brightmagenta $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/brightred $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/brightwhite $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/brightyellow $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/cyan $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/exclude $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/green $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/include $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/logtool.conf $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/magenta $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/white $(DESTDIR)$(ETCDIR)/
	$(INSTALL) -m 0644 -o root ../conf/yellow $(DESTDIR)$(ETCDIR)/

clean:
	-rm -f a.out core *~ *.o *.a $(PROG) debug

logtool-1.2.8/src/build_lib.sh0000755000372000017500000000015107637522166015722 0ustar  wouterwouter#!/bin/sh


for i in *.o ; do
if [ "$i" != "logtool.o" ] ; then
ar rv liblogtool.a $i
#  a - $i
fi
done

logtool-1.2.8/src/ansi.c0000644000372000017500000000476510046516070014534 0ustar  wouterwouter/*
 *   logtool - a logfile parsing/monitoring/manipulation utility
 *
 *   Copyright (C) Y2K (2000) A.L.Lambert
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2, or (at your option)
 *   any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include "includes.h"

void lt_colorset_ansi() { /* this sets up color definitions for the output module */
	
	/* simple strcpy's to the appropriate variables			*/
	strcpy(color.red, 		"\033[0;31m");
	strcpy(color.brightred, 	"\033[1;31m");

	strcpy(color.green,		"\033[0;32m");
	strcpy(color.brightgreen,	"\033[1;32m");
	
	strcpy(color.yellow,		"\033[0;33m");
	strcpy(color.brightyellow,	"\033[1;33m");

	strcpy(color.blue,		"\033[0;34m");
	strcpy(color.brightblue,	"\033[1;34m");
	
	strcpy(color.magenta,		"\033[0;35m");
	strcpy(color.brightmagenta,	"\033[1;35m");
	
	strcpy(color.cyan,		"\033[0;36m");
	strcpy(color.brightcyan,	"\033[1;36m");
	
	/* we use actually the ANSI for bright black for dim white :)	*/
	strcpy(color.dimwhite,		"\033[1;30m");
	strcpy(color.white,		"\033[0;37m");
	strcpy(color.brightwhite,	"\033[1;37m");
        
	strcpy(color.end, 		"\033[0m");
	strcpy(color.unknown,		color.end);
	strcpy(color.beep,		"\a");
}

void lto_parse_ansi() {
	/* we put this here in a wrapper in case we want to add our own post-parsing later	*/
	parse_pmsg();
}

void lto_ansi() {

	/* parse the \033e escpae sequences into native ANSI	*/
	lto_parse_ansi();
	
	/* if it's a duplicate message, just print the "!" warning to screen	*/
	if(event.type != EVENT_UNKNOWN && cf.input == TRUE && 	cf.supdupes == TRUE && 
			strcmp(event.message, event.lmessage) == 0 && strcmp(event.source, event.lsource) == 0) {
		printf("!");
	} else {
		if(cf.input == TRUE) {
			printf("\n");
		}
		/* if this isn't the first message, print a \newline			*/
		/* print yee old message as parsed by the module in question	*/
		cf.input = TRUE;
		printf("%s", event.pmsg);
		if(cf.sound == TRUE) {
			lt_sound();
		}
	}
	fflush(stdout);
}
logtool-1.2.8/src/config.h0000644000372000017500000000466010276711537015060 0ustar  wouterwouter/*
 *   logtool - a logfile parsing/monitoring/manipulation utility
 *
 *   Copyright (C) Y2K (2000) A.L.Lambert
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2, or (at your option)
 *   any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */


#define CONFIG_FILE	"/etc/logtool/logtool.conf"	/* This is the logtool config file	*/
/* we don't have default colorization files and such anymore, we just take default config file	*/

#define LSIZE		8096	/* how big a line of text will we read? */

/* You shouldn't muck around with anything below this line less you know what you're doing	*/

#define DATE_LONG 	0	/* If we display the full date */
#define DATE_SHORT 	1	/* If we display the short date */

#define HOST_DEFAULT	0	/* display the host-field as-is */
#define NG_HOST_NAME	1	/* syslog-ng display name of host only */
#define NG_HOST_IP	2	/* display the origin host IP only */
#define NG_HOST_BOTH	3	/* display hostname and IP */

/* define values of TRUE and FALSE so code is more readable */
#define TRUE		1	/* the value of TRUE 	*/
#define FALSE		0	/* the value of FALSE 	*/

/* Define the version specific stuff's */
#define PROGRAM_NAME    "logtool"
#define AUTHORS         "A.L.Lambert"
#define VERSION         "1.2.8"
#define PRINT_VERSION   printf("%s version %s, copyright Y2K-current %s\n", PROGRAM_NAME, VERSION, AUTHORS);

/*
 * Define's for the different event types we might see.  See regex.c for the rest
 * of the stuff to go with this (like the REGEX's for each event type and such)
 */
#define EVENT_UNKNOWN   0
#define EVENT_SYSLOG    1
#define EVENT_SNORT     2
#define EVENT_IPTABLES	3

/* 
 * These define the different output formats.  Unless you know what you're doing, 
 * don't muck with em.
 */
#define OUTPUT_ANSI		0
#define OUTPUT_ASCII		1
#define OUTPUT_CSV		2
#define OUTPUT_HTML		3
#define OUTPUT_RAW		4
#define OUTPUT_CURSES		5	/* this don't exist yet :)	*/

logtool-1.2.8/src/ascii.c0000644000372000017500000000326507651026745014701 0ustar  wouterwouter/*
 *   logtool - a logfile parsing/monitoring/manipulation utility
 *
 *   Copyright (C) Y2K (2000) A.L.Lambert
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2, or (at your option)
 *   any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include "includes.h"

int lto_parse_ascii() {
	parse_pmsg();
	return 0;
}

/* this is a pretty simple module :)	*/
void lto_ascii() {

	/* parse the \033e escpae sequences into native ANSI    */
	lto_parse_ascii();

        /* if it's a duplicate message, just print the "!" warning to screen    */
        if(event.type != EVENT_UNKNOWN && cf.input == TRUE && cf.supdupes == TRUE && 
			strcmp(event.message, event.lmessage) == 0 && strcmp(event.source, event.lsource) == 0) {
                printf("!");
        } else {
                /* if this isn't the first message, print a \newline                    */
                if(cf.input == TRUE) {
                        printf("\n");
                }
                /* print yee old message as parsed by the module in question    */
		cf.input = TRUE;
                printf("%s", event.pmsg);
        }
        fflush(stdout);
}

logtool-1.2.8/src/getopt.c0000644000372000017500000002072410276707676015120 0ustar  wouterwouter/*
 *   logtool - a logfile parsing/monitoring/manipulation utility
 *
 *   Copyright (C) Y2K (2000) A.L.Lambert
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2, or (at your option)
 *   any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include "includes.h"

/*
 * Yee ole show usage function.  Put it here because I didn't feel like
 * having a separate object for this one dinky little function, and it's
 * related to getopt, because it'll be called from the lt_getopts()
 * function if ever 
 */
void lt_sh_usage()
{

    /*
     * NOTE: we don't tell the user they can specify green/yellow/whatever 
     * else on the command line anymore, as we've got way too many
     * different files, and I get sick of trying to maintain too many
     * command line switches for them. :) HOWEVER: I have not removed
     * the existing cmdline switches from the getopt() stuff below, in the 
     * name of backwards compatability 
     */

    PRINT_VERSION;
    printf("\n");
    printf("Command line options:\n");
    printf
	(" -c [/path/config.file]  = specify a config file other than %s\n",
	 CONFIG_FILE);
    printf
	(" -i [/path/include.file] = a file containing regex's for inclusion\n");
    printf
	(" -e [/path/exclude.file] = a file containing regex's for exclusion\n");
    printf
	(" -o [ ANSI | ASCII | CSV | HTML | RAW ]\n  Output Format: ANSI (default), ASCII, CSV, HTML, RAW\n");
    printf
	(" -t [ long | short ]\n\tTime display Format: (Long [default]) Mon Dy HH:MM:SS or (Short) HH:MM\n");
    printf(" -m = specify a program name for multilog files\n");
    printf(" -n = do not resolve IP addresses (if applicable)\n");
    printf(" -b = beep on RED events (ANSI output only)\n");
    printf(" -S = disable mod_sound (if enabled by conffile) (ANSI output only)\n");
    printf(" -s = do not display the syslog \"source\" field\n");
    printf(" -p = do not display the \"program\" field\n");
    printf(" -v = verbose (print event processing info to stderr)\n");
    printf(" -d = do debugging output on stderr (for us developers)\n");
    printf(" -V = print version and exit \n");
    printf(" -h = this help message\n");
}


/*
 * Set the options to something sane before we accept any user defined
 * options 
 */
void lt_optsanity()
{
    /*
     * Set the defaults for what/how to parse to something sane by default.
     * The defaults set here can/will be overiden by user defined preferences 
     * in either command line or config file.
     */
    cf.outfmt = OUTPUT_ANSI;	/* ANSI is the default output type */
    cf.input = FALSE;		/* no, we ain't seen no input yet, eh? */
    cf.timefmt = DATE_LONG;	/* what date format shall we use? */
    cf.verbose = FALSE;		/* We are not verbose by default */
    cf.debug = FALSE;		/* do we do debugging output? */
    cf.redbeep = FALSE;		/* We do not beep on red events by default */
    cf.sound = FALSE;		/* nor do we do sounds by default 
				 */
    cf.showprog = TRUE;		/* set this to true by default */
    cf.showsrc = TRUE;		/* do we show the program field? */
    cf.supdupes = TRUE;		/* do we show duplicate entries? */
    cf.sys_ng_host = FALSE;	/* suppress syslog-ng *@'s in host field? */
    cf.hostfmt = HOST_DEFAULT;	/* do we parse syslog-ng host filed (and
				 * how) */
    cf.resolv = TRUE;		/* let config file enable host resolution */
    /*
     * a sane default for our config file 
     */
    strncpy(cf.configfile, CONFIG_FILE, 1023);
    strncpy(cf.multilog_program, "local prog", 255);
}

void lt_getopts(int argc, char **argv)
{

    int option;

    lt_optsanity();

    /*
     * Read the default config file for our user defined defaults (if any) 
     */
    lt_read_config();
    /*
     * Check out the command line options liberal use of strn*() here, as 
     * users can send who knows what to these calls B-g below is depreciated
     */
    while ((option = getopt(argc, argv, "B:M:C:I:y:g:c:i:m:e:o:t:nbsSpvdVh")) != -1) {
	switch (option) {
	case 0:		/* I dunno why this is here; was there in
				   * the example so I left it... */
	    break;
	case 'n':
	    cf.resolv = FALSE;
	    break;
	case 'd':
	    cf.debug = TRUE;
	    break;

	case 'h':
	    lt_sh_usage();
	    exit(0);
	    break;

	case 'c':
	    strncpy(cf.configfile, optarg, 1023);
	    lt_read_config();
	    break;

	case 'm':
	    strncpy(cf.multilog_program, optarg, 255);
	    break;
		
	case 't':
	    if (strncasecmp(optarg, "long", 32) == 0) {
		cf.timefmt = DATE_LONG;
	    } else if (strncasecmp(optarg, "short", 32) == 0) {
		cf.timefmt = DATE_SHORT;
	    } else {
		lt_sh_usage();
		exit(0);
	    }
	    break;


	case 's':
	    cf.showsrc = FALSE;
	    break;

	case 'p':
	    cf.showprog = FALSE;
	    break;
	case 'o':
	    if (strncasecmp(optarg, "ansi", 32) == 0) {
		cf.outfmt = OUTPUT_ANSI;
	    } else if (strncasecmp(optarg, "ascii", 32) == 0) {
		cf.outfmt = OUTPUT_ASCII;
	    } else if (strncasecmp(optarg, "csv", 32) == 0) {
		cf.outfmt = OUTPUT_CSV;
	    } else if (strncasecmp(optarg, "html", 32) == 0) {
		cf.outfmt = OUTPUT_HTML;
	    } else if (strncasecmp(optarg, "raw", 32) == 0) {
		cf.outfmt = OUTPUT_RAW;
	    } else if (strncasecmp(optarg, "curses", 32) == 0) {
		cf.outfmt = OUTPUT_CURSES;
	    } else {
		lt_sh_usage();
		exit(1);
	    }
	    break;

	case 'b':
	    cf.redbeep = TRUE;
	    break;
	case 'S':
	    /* this switch is just to switch off sound quickly in case of a rash of alerts or
	     * other reasons you might want to stop beeping and bonging via wav file. */
	    cf.sound = FALSE;
	    break;
	    
	case 'i':		/* we skip the strn*()'s here as we're
				 * dynamicly allocating the space for user 
				 * input */
	    reg.include_file = malloc(strlen(optarg) + 1);
	    strcpy(reg.include_file, optarg);
	    reg.include_check = TRUE;
	    break;

	case 'e':
	    reg.exclude_file = malloc(strlen(optarg) + 1);
	    strcpy(reg.exclude_file, optarg);
	    reg.exclude_check = TRUE;
	    break;

	case 'v':
	    cf.verbose = TRUE;
	    break;
	case 'V':
	    PRINT_VERSION;	/* put version stuff to screen */
	    exit(0);		/* exit with errlevel 0 */
	    break;		/* why is this here? I dunno... */

	    /*
	     * all of the below is depreciated: please don't use them
	     * anymore !!! 
	     */
	case 'y':
	    if(cf.verbose == TRUE) fprintf(stderr, "colorfile setting on command line is depreciated, please use a config file\n");
	    reg.yellow_file = malloc(strlen(optarg) + 1);
	    strncpy(reg.yellow_file, optarg, 254);
	    reg.yellow_check = TRUE;
	    break;

	case 'g':
	    if(cf.verbose == TRUE) fprintf(stderr, "colorfile setting on command line is depreciated, please use a config file\n");
	    reg.green_file = malloc(strlen(optarg) + 1);
	    strncpy(reg.green_file, optarg, 254);
	    reg.green_check = TRUE;
	    break;

	case 'B':
	    if(cf.verbose == TRUE) fprintf(stderr, "colorfile setting on command line is depreciated, please use a config file\n");
	    reg.blue_file = malloc(strlen(optarg) + 1);
	    strncpy(reg.blue_file, optarg, 254);
	    reg.blue_check = TRUE;
	    break;

	case 'M':
	    if(cf.verbose == TRUE) fprintf(stderr, "colorfile setting on command line is depreciated, please use a config file\n");
	    reg.magenta_file = malloc(strlen(optarg) + 1);
	    strncpy(reg.magenta_file, optarg, 254);
	    reg.magenta_check = TRUE;
	    break;

	case 'C':
	    if(cf.verbose == TRUE) fprintf(stderr, "colorfile setting on command line is depreciated, please use a config file\n");
	    reg.cyan_file = malloc(strlen(optarg) + 1);
	    strncpy(reg.cyan_file, optarg, 254);
	    reg.cyan_check = TRUE;
	    break;

	case 'I':
	    if(cf.verbose == TRUE) fprintf(stderr, "colorfile setting on command line is depreciated, please use a config file\n");
	    reg.brightcyan_file = malloc(strlen(optarg) + 1);
	    strncpy(reg.brightcyan_file, optarg, 254);
	    reg.brightcyan_check = TRUE;
	    break;

	    /*
	     * end dpreciated block 
	     */
	default:
	    lt_sh_usage();
	    exit(1);		/* some sucker done put in invalid cmdline 
				 * options ... grrr... */

	}
    }
}
logtool-1.2.8/src/config.h.in0000644000372000017500000000466407661244407015472 0ustar  wouterwouter/*
 *   logtool - a logfile parsing/monitoring/manipulation utility
 *
 *   Copyright (C) Y2K (2000) A.L.Lambert
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2, or (at your option)
 *   any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */


#define CONFIG_FILE	"@sysconfdir@/logtool.conf"	/* This is the logtool config file	*/
/* we don't have default colorization files and such anymore, we just take default config file	*/

#define LSIZE		8096	/* how big a line of text will we read? */

/* You shouldn't muck around with anything below this line less you know what you're doing	*/

#define DATE_LONG 	0	/* If we display the full date */
#define DATE_SHORT 	1	/* If we display the short date */

#define HOST_DEFAULT	0	/* display the host-field as-is */
#define NG_HOST_NAME	1	/* syslog-ng display name of host only */
#define NG_HOST_IP	2	/* display the origin host IP only */
#define NG_HOST_BOTH	3	/* display hostname and IP */

/* define values of TRUE and FALSE so code is more readable */
#define TRUE		1	/* the value of TRUE 	*/
#define FALSE		0	/* the value of FALSE 	*/

/* Define the version specific stuff's */
#define PROGRAM_NAME    "logtool"
#define AUTHORS         "A.L.Lambert"
#define VERSION         "@version@"
#define PRINT_VERSION   printf("%s version %s, copyright Y2K-current %s\n", PROGRAM_NAME, VERSION, AUTHORS);

/*
 * Define's for the different event types we might see.  See regex.c for the rest
 * of the stuff to go with this (like the REGEX's for each event type and such)
 */
#define EVENT_UNKNOWN   0
#define EVENT_SYSLOG    1
#define EVENT_SNORT     2
#define EVENT_IPTABLES	3

/* 
 * These define the different output formats.  Unless you know what you're doing, 
 * don't muck with em.
 */
#define OUTPUT_ANSI		0
#define OUTPUT_ASCII		1
#define OUTPUT_CSV		2
#define OUTPUT_HTML		3
#define OUTPUT_RAW		4
#define OUTPUT_CURSES		5	/* this don't exist yet :)	*/

logtool-1.2.8/src/mod_sound.c0000644000372000017500000000450110046526015015555 0ustar  wouterwouter/*
 *   logtool - a logfile parsing/monitoring/manipulation utility
 *
 *   Copyright (C) Y2K (2000) A.L.Lambert
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2, or (at your option)
 *   any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include "includes.h"


int do_sound(char *ifenv) {
	char sndprog[1024];
	char cmdline[1024];
	char sndstr[1024];	
	
	if(getenv("modsound_cmd") != NULL) {
		strcpy(sndprog, getenv("modsound_cmd"));
	} else {
		cf.sound = FALSE;
		fprintf(stderr, "\nERROR: modsound_cmd not correct in configfile!\n");
		return -1;
	}
	
	strcpy(sndstr, "modsound_");
	strcat(sndstr, ifenv);
	strcat(sndstr, "snd");
	/* see if we have a sound file in memory for sndstr */
	if(getenv(sndstr) != NULL) {
		strcpy(cmdline, sndprog);
		strcat(cmdline, " ");
		strcat(cmdline, getenv(sndstr));
	} else {
		return 1;
	}
	system(cmdline);
}

int lt_sound() {

	switch(event.pcolor[1]) {
		case 'r':	/* red sound */
			do_sound("red");
			break;
		case 'R':	/* alert sound */
			do_sound("brightred");
			break;
		case 'y':	/* yellow sound */
			do_sound("yellow");
			break;
		case 'Y':	/* bright yellow sound */
			do_sound("brightyellow");
			break;
		case 'g':	/* green sound */
			do_sound("green");
			break;
		case 'G':	/* bright green sound */
			do_sound("brightgreen");
			break;
		case 'b':	/* blue sound */
			do_sound("blue");
			break;
		case 'B':	/* bright blue sound */
			do_sound("brightblue");
			break;
		case 'c':	/* cyan sound */
			do_sound("cyan");
			break;
		case 'C':	/* bright cyan sound */
			do_sound("brightcyan");
			break;
		case 'm':	/* magenta sound */
			do_sound("magenta");
			break;
		case 'M':	/* bright magenta sound */
			do_sound("brightmagenta");
			break;
		default:	/* by default we just break */
			break;

	}
	return 0;
}

logtool-1.2.8/src/gethost.c0000644000372000017500000000331107662312224015246 0ustar  wouterwouter/*
 *   logtool - a logfile parsing/monitoring/manipulation utility
 *
 *   Copyright (C) Y2K (2000) A.L.Lambert
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2, or (at your option)
 *   any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

/* Yee ole includes (I put this all in one file for my sanity) */
#include "includes.h"

/* a wrapper for gethostbyaddr() for my own sanity      */
char *get_host(char *ip_addr) {
	
#ifdef NO_RESOLVER
	return NULL;
#else
        in_addr_t ad;   /* our network byte order storage spot  */
	
	if(cf.resolv == FALSE) return NULL;
        
	h = NULL;       /* null out our global variable */
        ad = inet_addr(ip_addr); /* crunch input into network byte order        */
        /* see if we can get a hostname on it   */
        h = gethostbyaddr((char *)&ad, sizeof(ad) ,AF_INET);
        /* if we couldn't, return NULL  */
        if(h == NULL) return NULL;
        /* else wise, return the name we got    */
        if(h->h_name != NULL) {
                return (h->h_name);
        }
        /* if we made it this far and didn't return, things are bad; so return now      */
        return NULL;
#endif
}

logtool-1.2.8/src/csv.c0000644000372000017500000000454107654513111014371 0ustar  wouterwouter/*
 *   logtool - a logfile parsing/monitoring/manipulation utility
 *
 *   Copyright (C) Y2K (2000) A.L.Lambert
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2, or (at your option)
 *   any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include "includes.h"
void lt_colorset_csv() {

        strncpy(color.red, "\"", 127);
        strncpy(color.brightred, "\"", 127);
	
        strncpy(color.green, "\"", 127);
        strncpy(color.brightgreen, "\"", 127);
        
	strncpy(color.yellow, "\"", 127);
        strncpy(color.brightyellow, "\"", 127);
        
	strncpy(color.dimwhite, "\"", 127);
        strncpy(color.white, "\"", 127);
        strncpy(color.brightwhite, "\"", 127);
        
	strncpy(color.cyan, "\"", 127);
        strncpy(color.brightcyan, "\"", 127);

        strncpy(color.magenta, "\"", 127);
        strncpy(color.brightmagenta, "\"", 127);

	strncpy(color.blue, "\"", 127);
        strncpy(color.brightblue, "\"", 127);
	
	strncpy(color.unknown, "\"", 127);
        strncpy(color.end, "\",", 127);

}

void lto_parse_csv() {
        /* we have to do some additional parsing for CSV's :(	
	 * some variables to facilitate this	*/
	char tmp_str[(LSIZE * 2)];
	char *ptr;

	parse_pmsg();
	
	strcpy(tmp_str, event.pmsg);
	
	ptr = event.pmsg;
	ptr = ptr + 2;
	strcpy(event.pmsg, ptr);
	
	while(strcmp(event.pmsg, tmp_str) != 0) {
		strcpy(event.pmsg, tmp_str);
		lt_strep(tmp_str, sizeof(tmp_str), "\", \"", "\",\"");	
		lt_strep(tmp_str, sizeof(tmp_str), "\",\" ", "\",\"");	
	}
	
	ptr = event.pmsg;
	ptr = ptr + 2;
	strcpy(event.pmsg, ptr);

	ptr = strrchr(event.pmsg, ',');
	ptr = ptr - 2;
	ptr[0] = '\0';
			
	
}

void lto_csv() {

        /* parse the \033e escpae sequences into native ANSI    */
        lto_parse_csv();

        printf("%s\n", event.pmsg);
        fflush(stdout);
}

logtool-1.2.8/src/env.c0000644000372000017500000000476107661623457014407 0ustar  wouterwouter/*
 *   logtool - a logfile parsing/monitoring/manipulation utility
 *
 *   Copyright (C) Y2K (2000) A.L.Lambert
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2, or (at your option)
 *   any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include "includes.h"

/* for solaris, which has no setenv, we do this monkey business */
#ifndef HAVE_SETENV
/* prototype */
int local_setenv(char *name, char *val, int clobber);

/* we assume we have getenv and putenv - if we don't, we've got trouble */
int local_setenv(char *name, char *val, int clobber) {

	char   *cp;	/* place for variable we want to set */
	
	/* if this value already exists, and clobber == 0, then don't clobber it */
	if (clobber == 0 && getenv(name) != 0) {
		return 0;
	}
	
	/* malloc some space for cp */
	cp = malloc(strlen(name) + strlen(val) + 2);
	
	/* make sure that worked */
	if (cp == NULL) {
		/* oops - no space for cp - bombs away! */
		return (-1);
	}
	/* setup cp to appropriate NAME=VALUE text */	
	sprintf(cp, "%s=%s", name, val);
	/* return with the value of putenv(cp) for checking by calling program */
	return (putenv(cp));
}
#endif

void strip_space(char *input) {
        int i, j;
	char tmp[LSIZE];
	
        for (i = 0, j = 0 ; input[i] != '\0'; ++i) {
                if(input[i] != ' ') {
                        tmp[j] = input[i];
                        ++j;
                }
        }
	tmp[j] = '\0';
        strcpy(input, tmp);
}


int lt_putenv(char *line) {
        
	long int retval;
	char name[LSIZE];
        char val[LSIZE];
	
	/* strip the line into the name/value var's	*/
	sscanf(line, "%[^=]=%s", name, val);
	/* remove any spaces from the variables		*/
	strip_space(name);
	strip_space(val);
	/* set the environment variable passed as line	*/
	#ifdef HAVE_SETENV
	retval = setenv(name, val, 1);
	#else /* probably a solaris box without setenv  */
	retval = local_setenv(name, val, 1);
	#endif
	/* return to calling function			*/
	return retval;

}

logtool-1.2.8/src/mod_iptables.c0000644000372000017500000001342107647506570016252 0ustar  wouterwouter/*
 *   logtool - a logfile parsing/monitoring/manipulation utility
 *
 *   Copyright (C) Y2K (2000) A.L.Lambert
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2, or (at your option)
 *   any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

/* Yee ole includes (I put this all in one file for my sanity) */
#include "includes.h"

/*
 * a module to process iptables messages into something sane to read with the naked eye
 */

/* a function to get the value blah where SOMETHING=blah in the event message		*/
int mip_parse_val(char *target, char *str) {

	char tmp_str[LSIZE];
	char *ptr;
	
	/* okie, we're going to jump to target	*/
	ptr = strstr(event.raw, str);
	/* if ptr == NULL, we didn't find anything	*/
	if(ptr == NULL) return -1;
	/* move forward to the = sign	*/
	ptr = strstr(ptr, "=");
	++ptr; /* and then to first char of our value	*/
	strcpy(tmp_str, ptr);	/* copy that to tmp_str	*/
	ptr = strstr(tmp_str, " ");	/* jump to the space after the value	*/
	ptr[0] = '\0';			/* null terminate it there		*/
	if(tmp_str[0] != '\0') {		/* if we got a value	*/
		strcpy(target, tmp_str);	/* put it into the target variable	*/
	} else {		/* otherwise, return an error				*/
		return 1;
	}
	/* if we made it this far, return no error		*/
	return 0;
}

/* a function to rip everything outside the syslog message into a variable we can parse	*/
int mip_parse_msg(char *msg) {
	
	char tmp_msg[LSIZE];
	char *ptr;
	
	sscanf(event.raw, "%*s %*s %*s %*s %[^\n]", tmp_msg);
	/* in == the start of iptables messages	*/
	ptr = strstr(tmp_msg, "IN=");
	/* if we found the beginning, then null byte it and copy it to *msg	*/
	if(ptr !=NULL) {
		ptr[0] = '\0';
		if(msg[0] != '\0') {
			strcat(msg, tmp_msg);
		}
	}
	return 0;
}

short int mip_build_sd(char *src, char *src_prt, char *dst, char *dst_prt, short int resolv) {
	char tmp_str[LSIZE];
	char *ptr;

	if(resolv == TRUE) {
		ptr = get_host(src);
		if(ptr != NULL) {
			strcpy(tmp_str, ptr);
			strcat(tmp_str, "(");
			strcat(tmp_str, src);
			strcat(tmp_str, ")");
			strcpy(src, tmp_str);
		}
		ptr = get_host(dst);
		if(ptr != NULL) {
			strcpy(tmp_str, ptr);
			strcat(tmp_str, "(");
			strcat(tmp_str, dst);
			strcat(tmp_str, ")");
			strcpy(dst, tmp_str);
			/* output snort-esque color formatting if we're in ANSI or HTML mode	*/
			if(cf.outfmt == OUTPUT_ANSI || cf.outfmt == OUTPUT_HTML) {
				lt_strep(src, 1024, "(", "\033e\033l(\033e\033w");
				lt_strep(src, 1024, ")", "\033e\033l)\033e");
				
				lt_strep(dst, 1024, "(", "\033e\033l(\033e\033w");
				lt_strep(dst, 1024, ")", "\033e\033l)\033e");

			}
		}

	}
	
	if(cf.outfmt == OUTPUT_ANSI || cf.outfmt == OUTPUT_HTML) {
		if(src_prt[0] != '\0') {
			sprintf(tmp_str, " \033W%s\033e\033l:\033e\033W%s \033l->\033e \033W%s\033e:\033W%s\033e", src, src_prt, dst, dst_prt);
		} else {
			sprintf(tmp_str, " \033W%s\033e \033l->\033e \033W%s", src, dst);
		}

	} else {
		if(src_prt[0] != '\0') {
			sprintf(tmp_str, " %s:%s -> %s:%s", src, src_prt, dst, dst_prt);
		} else {
			sprintf(tmp_str, " %s -> %s", src, dst);
		}
	}
	
	strcat(event.pmsg, tmp_str);	
	return 0;
}

short int ltm_iptables() {
	/* see mods.h for the iptables data struct */
	/* variables local to this guy	*/
	char msg[LSIZE];		/* user defined message (if any)	*/
	char tmp_str[LSIZE];	/* some place to stick data temp basis	*/
	short int resolv = FALSE;/* do we resolve IP addresses?		*/	

	resolv = mod_varcheck("modipt_resolvips");
	
	/* Figure out what color this message should be         */
	lt_set_event_color();

	/* because you most often don't get a 'program' field in one of these	*/
	strcpy(event.program, "iptables:");
	
	/* parse up the basics (date format's, prog/src, etc)  */
	mod_premsg_setup();
	
	/* see if user used any prefixing and put it in the output if so	*/
	strcpy(msg, "-j LOG: ");
	mip_parse_msg(msg);
	
	/* now we get to work on parsing the variables in order	*/
	strcpy(it.in_if, "");
	strcpy(it.ou_if, "");
	strcpy(it.src, "");
	strcpy(it.src_prt, "");
	strcpy(it.dst, "");
	strcpy(it.dst_prt, "");
	strcpy(it.plen, "");
	strcpy(it.tos, "");
	strcpy(it.prec, "");
	strcpy(it.ttl, "");
	strcpy(it.proto, "");
	mip_parse_val(it.in_if, "IN=");
	mip_parse_val(it.ou_if, "OUT=");
	mip_parse_val(it.src, "SRC=");
	mip_parse_val(it.src_prt, "SPT=");
	mip_parse_val(it.dst, "DST=");
	mip_parse_val(it.dst_prt, "DPT=");
	mip_parse_val(it.plen, "LEN=");
	mip_parse_val(it.tos, "TOS=");
	mip_parse_val(it.prec, "PREC=");
	mip_parse_val(it.ttl, "TTL=");
	mip_parse_val(it.proto, "PROTO=");
	
	/* okie, parsing done, start building event.pmsg	*/
	/* start with the msg (if any)				*/
	if(msg[0] != '\0') {
		sprintf(tmp_str, " %s%s%s", event.pcolor, msg, "\033e");
		strcpy(it.msg, msg);
		strcat(event.pmsg, tmp_str);
	}
	
	if(it.proto[0] != '\0') {
		strcpy(tmp_str, " \033e\033l{\033e\033C");
		strcat(tmp_str, it.proto);
		strcat(tmp_str, "\033e\033l}\033e");
		strcat(event.pmsg, tmp_str);
	}
	
	mip_build_sd(it.src, it.src_prt, it.dst, it.dst_prt, resolv);
	/* make a link from the event.module structure to our iptables data */
	event.m.iptables = ⁢

	return 0;
}

/* 
Mar  5 02:48:09 kern@friday/1.1.1.1 Bad packet on pub int:IN=eth1 OUT= MAC=00:40:05:6c:f9:8b:00:02:3b:01:be:9d:08:00 SRC=61.14.66.78 DST=65.71.249.147 LEN=78 TOS=0x00 PREC=0x00 TTL=108 ID=11861 PROTO=UDP SPT=1028 DPT=137 LEN=58
*/
logtool-1.2.8/src/getopt.h0000644000372000017500000001334507223504557015115 0ustar  wouterwouter/* Declarations for getopt.
   Copyright (C) 1989,90,91,92,93,94,96,97,98 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public
   License along with the GNU C Library; see the file COPYING.LIB.  If not,
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */

#ifndef _GETOPT_H

#ifndef __need_getopt
# define _GETOPT_H 1
#endif

#ifdef	__cplusplus
extern "C" {
#endif

/* For communication from `getopt' to the caller.
   When `getopt' finds an option that takes an argument,
   the argument value is returned here.
   Also, when `ordering' is RETURN_IN_ORDER,
   each non-option ARGV-element is returned here.  */

extern char *optarg;

/* Index in ARGV of the next element to be scanned.
   This is used for communication to and from the caller
   and for communication between successive calls to `getopt'.

   On entry to `getopt', zero means this is the first call; initialize.

   When `getopt' returns -1, this is the index of the first of the
   non-option elements that the caller should itself scan.

   Otherwise, `optind' communicates from one call to the next
   how much of ARGV has been scanned so far.  */

extern int optind;

/* Callers store zero here to inhibit the error message `getopt' prints
   for unrecognized options.  */

extern int opterr;

/* Set to an option character which was unrecognized.  */

extern int optopt;

#ifndef __need_getopt
/* Describe the long-named options requested by the application.
   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
   of `struct option' terminated by an element containing a name which is
   zero.

   The field `has_arg' is:
   no_argument		(or 0) if the option does not take an argument,
   required_argument	(or 1) if the option requires an argument,
   optional_argument 	(or 2) if the option takes an optional argument.

   If the field `flag' is not NULL, it points to a variable that is set
   to the value given in the field `val' when the option is found, but
   left unchanged if the option is not found.

   To have a long-named option do something other than set an `int' to
   a compiled-in constant, such as set a value from `optarg', set the
   option's `flag' field to zero and its `val' field to a nonzero
   value (the equivalent single-letter option character, if there is
   one).  For long options that have a zero `flag' field, `getopt'
   returns the contents of the `val' field.  */

struct option
{
# if defined __STDC__ && __STDC__
  const char *name;
# else
  char *name;
# endif
  /* has_arg can't be an enum because some compilers complain about
     type mismatches in all the code that assumes it is an int.  */
  int has_arg;
  int *flag;
  int val;
};

/* Names for the values of the `has_arg' field of `struct option'.  */

# define no_argument		0
# define required_argument	1
# define optional_argument	2
#endif	/* need getopt */


/* Get definitions and prototypes for functions to process the
   arguments in ARGV (ARGC of them, minus the program name) for
   options given in OPTS.

   Return the option character from OPTS just read.  Return -1 when
   there are no more options.  For unrecognized options, or options
   missing arguments, `optopt' is set to the option letter, and '?' is
   returned.

   The OPTS string is a list of characters which are recognized option
   letters, optionally followed by colons, specifying that that letter
   takes an argument, to be placed in `optarg'.

   If a letter in OPTS is followed by two colons, its argument is
   optional.  This behavior is specific to the GNU `getopt'.

   The argument `--' causes premature termination of argument
   scanning, explicitly telling `getopt' that there are no more
   options.

   If OPTS begins with `--', then non-option arguments are treated as
   arguments to the option '\0'.  This behavior is specific to the GNU
   `getopt'.  */

#if defined __STDC__ && __STDC__
# ifdef __GNU_LIBRARY__
/* Many other libraries have conflicting prototypes for getopt, with
   differences in the consts, in stdlib.h.  To avoid compilation
   errors, only prototype getopt for the GNU C library.  */
extern int getopt (int __argc, char *const *__argv, const char *__shortopts);
# else /* not __GNU_LIBRARY__ */
extern int getopt ();
# endif /* __GNU_LIBRARY__ */

# ifndef __need_getopt
extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts,
		        const struct option *__longopts, int *__longind);
extern int getopt_long_only (int __argc, char *const *__argv,
			     const char *__shortopts,
		             const struct option *__longopts, int *__longind);

/* Internal only.  Users should not call this directly.  */
extern int _getopt_internal (int __argc, char *const *__argv,
			     const char *__shortopts,
		             const struct option *__longopts, int *__longind,
			     int __long_only);
# endif
#else /* not __STDC__ */
extern int getopt ();
# ifndef __need_getopt
extern int getopt_long ();
extern int getopt_long_only ();

extern int _getopt_internal ();
# endif
#endif /* __STDC__ */

#ifdef	__cplusplus
}
#endif

/* Make sure we later can get all the definitions and declarations.  */
#undef __need_getopt

#endif /* getopt.h */
logtool-1.2.8/src/html.c0000644000372000017500000001003110020522065014516 0ustar  wouterwouter/*
 *   logtool - a logfile parsing/monitoring/manipulation utility
 *
 *   Copyright (C) Y2K (2000) A.L.Lambert
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2, or (at your option)
 *   any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include "includes.h"

void lt_colorset_html() { /* this will set up the colors for the parseansi() function */

        /* 
         * determine if user asked us to "beep" on red events, and set up the value of
         * color.red accordingly. 
         */

	strcpy(color.red, "");
	strcpy(color.brightred, "");

	strcpy(color.green, "");
	strcpy(color.brightgreen, "");
        
	strcpy(color.yellow, "");
	strcpy(color.brightyellow, "");
        
	strcpy(color.dimwhite, "");
	strcpy(color.white, "");
	strcpy(color.brightwhite, "");
        
	strcpy(color.cyan, "");
	strcpy(color.brightcyan, "");
        
	strcpy(color.blue, "");
	strcpy(color.brightblue, "");

	strcpy(color.magenta, "");
	strcpy(color.brightmagenta, "");
	
	strcpy(color.unknown, "");
	strcpy(color.end, "");
}

void lto_parse_html() {
	long int i = 0;
	/* we have to escape <, >, and &'s for nice HTML */
        char *tmp_pmsg = NULL;
        char tc[2];
	/* make string == event.pmsg                                            */
        char *str = event.pmsg;

        /* we should never wind up 8 times the length of the original event     */
        tmp_pmsg = malloc(strlen(event.pmsg) * 8);
	/* zero this memory, or we get odd things happening (I don't know why!) */
	bzero(tmp_pmsg, (strlen(event.pmsg) * 8));
        /* here is our main parsing loop; we'll run through the message, replacing \033 escapes */
        /* with the appropriate color.* relevant to the current output module                   */
        for(i = 0 ; str[i] != '\0'; ++i) {
		switch(str[i]) {
			case '<':
				strcat(tmp_pmsg, "<");
				break;
			case '>':
        	                strcat(tmp_pmsg, ">");
				break;
			case '&':
				strcat(tmp_pmsg, "&");
				break;
			default:
				tc[0] = str[i];
				tc[1] = '\0';
				strcat(tmp_pmsg, tc);
				break;
		}		
	}
	fprintf(stderr, "%s\n", tmp_pmsg);
	/* put our parsed string into event.pmsg */
	strcpy(event.pmsg, tmp_pmsg);
        /* free our tmp_pmsg                                            */
        free(tmp_pmsg);
	/* now we parse results to get proper HTML fonts and such */			
	parse_pmsg();
							
}

void lto_html() {

        /* parse the \033e escpae sequences into native ANSI    */
        lto_parse_html();

        /* if it's a duplicate message, just print the "!" warning to screen    */
        if(event.type != EVENT_UNKNOWN && cf.input == TRUE && cf.supdupes == TRUE && 
			strcmp(event.message, event.lmessage) == 0 && strcmp(event.source, event.lsource) == 0) {
                printf("%s!%s", color.brightwhite, color.end);
        } else {
                /* if this isn't the first message, print a \newline                    */
                if(cf.input == TRUE) {
                        printf("
\n"); } /* print yee old message as parsed by the module in question */ cf.input = TRUE; printf("%s", event.pmsg); } fflush(stdout); } logtool-1.2.8/src/includes.h0000644000372000017500000000402710037020031015367 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* The configure/autoconf generated header file */ #ifdef HAVE_CONFIG_H #include "../config.h" #endif /* Include yee ole standard C function headers */ #include #include #include #include #include #include /* includes for the gethostbyaddr() stuff */ #include #include /* for AF_INET */ #include #include /* a couple var's for gethostbyaddr() stuff */ extern int h_errno; struct hostent *h; /* For stat(), opendir(), and friends */ #include #include #include #include /* in here we work with the event-centric modules */ #include "mods.h" /* declare this before logtool.h */ /* we use some structs from this in logtool.h (yeah, I know, lousy organization :) */ /* The program specific headers */ #include "logtool.h" #include "config.h" /* * Note: we include the getopt.h header in this package instead * of depending on the system getopt.h, since Solaris doesn't * seem to have one by default. This sucks, but it's not that * big a deal, so we'll do it for portability's sake */ #ifdef HAVE_GETOPT_H #include #else #include "getopt.h" #endif logtool-1.2.8/src/logtool.c0000644000372000017500000000227407221527277015266 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Yee ole includes (I put this all in one file for my sanity) */ #include "includes.h" /* Yee ole main() (short and sweet) */ int main(argc, argv) int argc; char **argv; { /* I'll Uncomment the functions as I get them written. */ lt_setup(argc, argv); /* Setup the environment */ lt_run(); /* Do the logtool thing */ lt_cleanup(); /* Clean up after yourself */ return 0; } logtool-1.2.8/src/logtool.h0000644000372000017500000001615010276707615015271 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * This header file declares the functions for ansi, ascii, and csv, * and the various data structures, global variables, and whatnot. */ #include "config.h" void lt_setup(); int lt_read_config(); void lt_set_config(); void lt_set_config_err(); void lt_run(); int lt_loop(); void lt_cleanup(); /* The various output module functions */ void lto_raw(); void lto_ansi(); void lt_colorset_ansi(); void lto_ascii(); void lt_parse_ascii(); void lto_csv(); void lt_colorset_csv(); void lt_parse_csv_header(); void lt_parse_html(); void lto_html(); void lt_colorset_html(); void lt_parse_multilog(); int lt_do_regexcheck(); /* we need to clean up how we've got these listed in here */ int parse_pmsg(); int lt_match_re(const char *string, regex_t re); /* utility functions */ void lt_sh_usage(); void lt_getopts(); int lt_putenv(char *line); /* From the regex.c file (regular expression stuff's) */ int lt_check_exclude(); int lt_check_include(); int lt_match(const char *string, char *pattern); void lt_loadstrings(); void lt_regex_vars_sanity(); void lt_regexinit(); short int lt_fmtcheck(char *tmp); /* from parser.c */ char *lt_strep(char *input, size_t bufsize, char *string, char *newstring); int lt_do_parse(); void lt_set_event_color(); /* from tai64nfrac.c */ time_t t64nfrac(char *sline); /* * strncasecmp seems to have a few portability issues, so we use * configure to test for it, and if it's not decl'd, we do it here */ /* Note: Why in the HELL do I have to define this, even though configure * says I've already got it? */ #ifndef HAVE_STRNCASECMP int strncasecmp(const char *s1, const char *s2, size_t size); #endif /* * This is the structure each line of syslog file get's parsed into. */ typedef struct { short int type; /* snort, iptables, syslog, and so-on */ char pcolor[256]; /* event color red, yellow, green, default */ char month[4]; char day[3]; char time[9]; char source[64]; char lsource[64]; char program[64]; char lprogram[64]; char message[LSIZE]; /* the current message in full (- timestamps) */ char lmessage[LSIZE]; /* the last message in full (- timestamps) */ char raw[(LSIZE * 2)]; /* the full event in RAW format */ char lraw[(LSIZE * 2)]; /* the full event in RAW format */ char pmsg[(LSIZE * 4)]; /* where we store the string we're going to print */ MOD m; /* pointer to where we store extra data for mod_* events*/ } st_event; st_event event; /* Structure for the event color variables */ typedef struct { /* these are kind of set around the \033[*m ANSI sequences */ char beep[256]; /* \033! probably only used in ANSI output mode */ char red[256]; /* \033r is what we use in pmsg for parsing */ char brightred[256]; /* \033R for pmsg parsing */ char green[256]; /* \033g */ char brightgreen[256]; /* \033G */ char yellow[256]; /* \033y */ char brightyellow[256]; /* \033Y */ char dimwhite[256]; /* \033l */ char white[256]; /* \033w */ char brightwhite[256]; /* \033W */ char blue[256]; /* \033b */ char brightblue[256]; /* \033B */ char magenta[256]; /* \033m */ char brightmagenta[256];/* \033M */ char cyan[256]; /* \033c */ char brightcyan[256]; /* \033C */ char unknown[256]; /* \033u */ char end[256]; /* \033e */ } st_color; st_color color; typedef struct { char configfile[1024]; /* ascii name of our config file */ char multilog_program[256]; /* program name when parsing a multilog file */ short int input; /* did we see any input? (set to FALSE by default) */ short int outfmt; /* what output format are we using? (see config.h) */ short int timefmt; /* what format do we print our timestamps? */ short int verbose; /* should we yammer about what we're doing on stderr? */ short int debug; /* should we debug to stderr? */ short int redbeep; /* to beep, or not to beep, that is the question.. */ short int sound; /* or do we use a full blown sound system? .. */ short int showprog; /* do we display the 'program' field from syslog */ short int showsrc; /* define if we want to show the src host or not */ short int supdupes; /* do we suppress duplicate junk? */ /* syslog prints host lines like src@hostname/hostip (no hostip if not remote) */ /* we may want to strip that *@ part, and only see name or IP in such cases */ /* the following options were added to accomidate such options (see cfg file) */ short int sys_ng_host; /* do we strip the *@'s from syslog-ng's src field? */ short int hostfmt; /* what format do we print the host line (syslog-ng) */ short int resolv; /* disable host resolution, even if enabled in cfg file */ } CONFIG; CONFIG cf; extern int errno; /* the error number thing from the errno functions */ /* yea thouhgh I walk through the shadow of the valley of malloc()... ;) */ /* here is where we have filenames, file contents, and regexcomp()'d stuff */ /* anything we do regex's with should go in here */ typedef struct { short int white_check; char *white_file; char *white_strs; regex_t white_reg; short int brightwhite_check; char *brightwhite_file; char *brightwhite_strs; regex_t brightwhite_reg; short int green_check; char *green_file; char *green_strs; regex_t green_reg; short int brightgreen_check; char *brightgreen_file; char *brightgreen_strs; regex_t brightgreen_reg; short int yellow_check; char *yellow_file; char *yellow_strs; regex_t yellow_reg; short int brightyellow_check; char *brightyellow_file; char *brightyellow_strs; regex_t brightyellow_reg; short int blue_check; char *blue_file; char *blue_strs; regex_t blue_reg; short int brightblue_check; char *brightblue_file; char *brightblue_strs; regex_t brightblue_reg; short int magenta_check; char *magenta_file; char *magenta_strs; regex_t magenta_reg; short int brightmagenta_check; char *brightmagenta_file; char *brightmagenta_strs; regex_t brightmagenta_reg; short int cyan_check; char *cyan_file; char *cyan_strs; regex_t cyan_reg; short int brightcyan_check; char *brightcyan_file; char *brightcyan_strs; regex_t brightcyan_reg; short int brightred_check; char *brightred_file; char *brightred_strs; regex_t brightred_reg; short int exclude_check; char *exclude_file; char *exclude_strs; regex_t exclude_reg; short int include_check; char *include_file; char *include_strs; regex_t include_reg; } STRUCTURE_REGEXS; STRUCTURE_REGEXS reg; logtool-1.2.8/src/loop.c0000644000372000017500000001025610276707437014561 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "includes.h" /* someday this function will someday hold all the 'while' read loop for all logtool */ int lt_loop() { int fmt; int dpv = -2; /* some modules we may or may not use */ int mod_snort = FALSE; int mod_iptables = FALSE; int mod_syslog = FALSE; mod_syslog = mod_varcheck("modsys_use"); mod_snort = mod_varcheck("modsn_use"); mod_iptables = mod_varcheck("modipt_use"); /* some sanity checking for CSV output module */ if(cf.outfmt == OUTPUT_CSV) { /* until we get CSV tweaked to understand funky modules, we just revert * back to syslog processing */ mod_snort = FALSE; mod_iptables = FALSE; } /* Open up stdin and read the input one line at a time till EOF */ while(fgets(event.raw, LSIZE, stdin) != NULL) { /* * this function will see if it's a multilog generated file, and * do a quick pre-parse into syslog format if it is */ lt_parse_multilog(); /* Figure out what format of log-line we were given (bomb out if really bad) */ if((fmt = lt_fmtcheck(event.raw)) == -1) { /* if we got an error, we need to stop now */ continue; } /* do our regex checking - we may be excluding this line of text */ if(lt_do_regexcheck() == FALSE) continue; /* if it's not an unknown event, parse it and store value of dpv */ if (fmt != EVENT_UNKNOWN) { dpv = lt_do_parse(); } /* if we couldn't parse this properly, then we continue */ if (dpv == -1 || dpv == FALSE) { continue; } /* depending what the format was, call the appropriate module */ switch(fmt) { /* these functions should set event.pmsg with the appro */ /* the appropriate \033 escape sequences (see the file */ /* logtool.h for a listing of how we interpet these) */ /* later in the parsing process. */ case EVENT_UNKNOWN: ltm_unknown(); break; /* * from here down, we fallback to other processing * if the module in question is turned off in config */ case EVENT_SYSLOG: if(mod_syslog == TRUE) ltm_syslog(); else ltm_unknown(); break; /* * we're doing double fallbacks here, since syslog * would be second best to what we got, but if * user disabled it, we want to go all the way down * to 'unknown' processing; Ugly, I know it... */ case EVENT_SNORT: if(mod_snort == TRUE) ltm_snort(); else if(mod_syslog == TRUE) ltm_syslog(); else ltm_unknown(); break; case EVENT_IPTABLES: if(mod_iptables == TRUE) ltm_iptables(); else if(mod_syslog == TRUE) ltm_syslog(); else ltm_unknown(); break; /* * these are our only modules to date. I need to either * write more, or get some friggin contributors. :) */ default: continue; } /* now, event.pmsg should be ready to be fed to the appropo output module */ switch(cf.outfmt) { case OUTPUT_ANSI: lto_ansi(); break; case OUTPUT_ASCII: lto_ascii(); break; case OUTPUT_CSV: /* we only do syslog's and unknown's here */ lto_csv(); break; case OUTPUT_HTML: lto_html(); break; case OUTPUT_RAW: lto_raw(); break; case OUTPUT_CURSES: /* * in truth, we'll probably never be here, as a curses * module is likely going to have to be a standalone * * Oh, did I mention none of this is written yet? :) */ break; default: break; } } return 0; } logtool-1.2.8/src/main.c0000644000372000017500000000405410235475742014527 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "includes.h" void lt_setup(int argc, char **argv) { /* Get the cmdline options and set up the environment accordingly */ lt_getopts(argc, argv); /* Initialize the regex stuff's */ lt_regexinit(); /* Set up the colors for whatever output mode we're in (if needed) */ switch(cf.outfmt) { case OUTPUT_ANSI: lt_colorset_ansi(); break; case OUTPUT_CSV: lt_colorset_csv(); break; case OUTPUT_HTML: printf("
\n\n"); lt_colorset_html(); break; } } void lt_run() { /* feed ourselves into the main loop */ lt_loop(); /* note: we do this from the lt_run wrapper function since we * kind of expect that someday we'll have more to lt_run than * just calling the main loop :) */ } void lt_cleanup() { switch(cf.outfmt) { case OUTPUT_ANSI: if(cf.input == TRUE) printf("\n"); break; case OUTPUT_ASCII: if(cf.input == TRUE) printf("\n"); break; case OUTPUT_HTML: /* we don't care to check if we did anything in HTML format - we draw the table anyway */ printf("\n
\n"); break; default: break; } /* Ain't no cleanup to do at the moment. If we ever need to */ /* though, we can just put it here and be done with it */ } logtool-1.2.8/src/mod_common.c0000644000372000017500000000523107647505760015737 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Yee ole includes (I put this all in one file for my sanity) */ #include "includes.h" /* * this function will setup the pre-message section of an event.pmsg * (what we print to the screen) for a module. Some modules may not call this * if they don't do the standard "Time Host Prog" line format. */ short int mod_premsg_setup() { char msg_tmp[LSIZE]; /* Always set the color to default white before we start */ strcpy(event.pmsg, "\033w"); /* Do the timefmt stuff as a switch statement to give us more flex later */ switch(cf.timefmt) { case DATE_SHORT: sprintf(msg_tmp, "%s", event.time); break; case DATE_LONG: sprintf(msg_tmp, "%s %s %s", event.month, event.day, event.time); break; default: sprintf(msg_tmp, "%s %s %s", event.month, event.day, event.time); } strcat(event.pmsg, msg_tmp); /* put that formatted time string in there */ strcat(event.pmsg, "\033e"); /* the "end of color" color (white usually) */ /* if we're supposed to print the source hostname of the event */ if(cf.showsrc == TRUE) { sprintf(msg_tmp, "%s %s%s", "\033C", event.source, "\033e"); strcat(event.pmsg, msg_tmp); } /* If user didn't ask us not to display the program, then display it */ if(cf.showprog == TRUE) { sprintf(msg_tmp, "%s %s%s", "\033w", event.program, "\033e"); strcat(event.pmsg, msg_tmp); } return 0; } /* check an enviornment variable (set by config file) and return true/false value */ short int mod_varcheck(char *var) { char *ptr; if((ptr = getenv(var)) == NULL) return FALSE; /* we found no such value */ if(strstr(ptr, "true") != NULL) return TRUE; /* we found value, and it was true */ return FALSE; /* had something, but not true, return false */ } logtool-1.2.8/src/readconf.c0000644000372000017500000001530210046521725015353 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "includes.h" void lt_set_config_err(char *option, char *val) { printf("Error: invalid value [%s] to option [%s] in cfg file\n", val, option); exit (1); } /* internal function to set a value to int TRUE/FALSE depending on string "true" or "false" */ short int lt_sctf(char *val) { if(strncmp(val, "true", 32) == 0) return TRUE; if(strncmp(val, "false", 32) == 0) return FALSE; return -1; } /* this sets up the filename and such for a regex file */ short int lt_set_regfile(char **file, char *val) { *file = malloc(strlen(val) + 2); /* if we couldn't malloc that space, then return false */ if(file == NULL) return FALSE; /* well, we made it here, we must have memory; copy that sucka */ strcpy(*file, val); /* we assume all went well. :) */ return TRUE; } void lt_set_config() { char *val; /* our file variables ; knock them out in one quick whack */ /* if you're adding one of these, see logtool.h, readconf.c and regex.c */ if((val = getenv("includefile")) != NULL) { reg.include_check = lt_set_regfile(®.include_file, val); } if((val = getenv("excludefile")) != NULL) { reg.exclude_check = lt_set_regfile(®.exclude_file, val); } if((val = getenv("whitefile")) != NULL) { reg.white_check = lt_set_regfile(®.white_file, val); } if((val = getenv("brightwhitefile")) != NULL) { reg.brightwhite_check = lt_set_regfile(®.brightwhite_file, val); } if((val = getenv("greenfile")) != NULL) { reg.green_check = lt_set_regfile(®.green_file, val); } if((val = getenv("brightgreenfile")) != NULL) { reg.brightgreen_check = lt_set_regfile(®.brightgreen_file, val); } if((val = getenv("yellowfile")) != NULL) { reg.yellow_check = lt_set_regfile(®.yellow_file, val); } if((val = getenv("brightyellowfile")) != NULL) { reg.brightyellow_check = lt_set_regfile(®.brightyellow_file, val); } if((val = getenv("bluefile")) != NULL) { reg.blue_check = lt_set_regfile(®.blue_file, val); } if((val = getenv("brightbluefile")) != NULL) { reg.brightblue_check = lt_set_regfile(®.brightblue_file, val); } if((val = getenv("cyanfile")) != NULL) { reg.cyan_check = lt_set_regfile(®.cyan_file, val); } if((val = getenv("brightcyanfile")) != NULL) { reg.brightcyan_check = lt_set_regfile(®.brightcyan_file, val); } if((val = getenv("magentafile")) != NULL) { reg.magenta_check = lt_set_regfile(®.magenta_file, val); } if((val = getenv("brightmagentafile")) != NULL) { reg.brightmagenta_check = lt_set_regfile(®.brightmagenta_file, val); } if((val = getenv("brightredfile")) != NULL) { reg.brightred_check = lt_set_regfile(®.brightred_file, val); } /* a few things we take a bit more time with */ if((val = getenv("output_format")) != NULL) { if(strncasecmp(val, "ansi", 32) == 0) { cf.outfmt = OUTPUT_ANSI; } else if(strncasecmp(val, "ascii", 32) == 0) { cf.outfmt = OUTPUT_ASCII; } else if(strncasecmp(val, "csv", 32) == 0) { cf.outfmt = OUTPUT_CSV; } else if(strncasecmp(val, "html", 32) == 0) { cf.outfmt = OUTPUT_HTML; } else if(strncasecmp(val, "raw", 32) == 0) { cf.outfmt = OUTPUT_RAW; } else { lt_set_config_err("output_format", val); } } /* do we beep when a red event occurs (only in ANSI mode */ if((val = getenv("redbeep")) != NULL) cf.redbeep = lt_sctf(val); if(cf.redbeep == -1) lt_set_config_err("redbeep", val); /* do we suppress dupe messages? (only ANSI/ASCII/HTML) */ if((val = getenv("supdupes")) != NULL) cf.supdupes = lt_sctf(val); if(cf.supdupes == -1) lt_set_config_err("supdupes", val); /* do we be verbose to the user about stuff? */ if((val = getenv("verbose")) != NULL) cf.verbose = lt_sctf(val); if(cf.verbose == -1) lt_set_config_err("verbose", val); /* do we display the host that generated this message? */ if((val = getenv("show_source")) != NULL) cf.showsrc = lt_sctf(val); if(cf.showsrc == -1) lt_set_config_err("show_source", val); /* do we display the program that generated this message? */ if((val = getenv("show_program")) != NULL) cf.showprog = lt_sctf(val); if(cf.showprog == -1) lt_set_config_err("show_program", val); /* do we be verbose to the user about stuff? */ if((val = getenv("verbose")) != NULL) cf.verbose = lt_sctf(val); if(cf.verbose == -1) lt_set_config_err("verbose", val); /* do we be strip syslog-ng *@'s from host field? */ if((val = getenv("sys_ng_host")) != NULL) cf.sys_ng_host = lt_sctf(val); if(cf.sys_ng_host == -1) lt_set_config_err("sys_ng_host", val); /* do we do sounds and such? (it's ugly to do this here but it * spares a lot of processing later) */ if((val = getenv("modsound_use")) != NULL) cf.sound = lt_sctf(val); if(cf.sound == -1) lt_set_config_err("cf.sound", val); /* if we're a syslog-ng host collecting for the whole network, * we have options to parse the host field specially */ if((val = getenv("hostfmt")) != NULL) { if(strncmp(val, "name", 32) == 0) { cf.hostfmt = NG_HOST_NAME; } else if(strncmp(val, "ip", 32) == 0) { cf.hostfmt = NG_HOST_IP; } else if(strncmp(val, "both", 32) == 0) { cf.hostfmt = NG_HOST_BOTH; } } if((val = getenv("time_format")) != NULL) { if(strncmp(val, "long", 32) == 0) { cf.timefmt = DATE_LONG; } else if(strncmp(val, "short", 32) == 0) { cf.timefmt = DATE_SHORT; } else { lt_set_config_err("time_format", val); } } } /* this function will open and read our config file into memory */ int lt_read_config() { char line[LSIZE]; FILE *cfgfile; /* if we got no config file, skip this */ if(cf.configfile[0] == '\0') return -1; /* try to open our config file */ cfgfile = fopen(cf.configfile, "r"); if( ! cfgfile ) { /* if we failed, bitch to user, but don't stop processing */ perror(cf.configfile); return -1; } while(fgets(line, 1023, cfgfile) != NULL) { if(lt_match(line, ".*=.*") == TRUE) { lt_putenv(line); } } /* close yee ole config file */ fclose(cfgfile); /* call the function above to set things based on config file */ lt_set_config(); return 0; } logtool-1.2.8/src/getopt.c.orig0000644000372000017500000002042210046524067016034 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "includes.h" /* * Yee ole show usage function. Put it here because I didn't feel like * having a separate object for this one dinky little function, and it's * related to getopt, because it'll be called from the lt_getopts() * function if ever */ void lt_sh_usage() { /* * NOTE: we don't tell the user they can specify green/yellow/whatever * else on the command line anymore, as we've got way too many * different files, and I get sick of trying to maintain too many * command line switches for them. :) HOWEVER: I have not removed * the existing cmdline switches from the getopt() stuff below, in the * name of backwards compatability */ PRINT_VERSION; printf("\n"); printf("Command line options:\n"); printf (" -c [/path/config.file] = specify a config file other than %s\n", CONFIG_FILE); printf (" -i [/path/include.file] = a file containing regex's for inclusion\n"); printf (" -e [/path/exclude.file] = a file containing regex's for exclusion\n"); printf (" -o [ ANSI | ASCII | CSV | HTML | RAW ]\n Output Format: ANSI (default), ASCII, CSV, HTML, RAW\n"); printf (" -t [ long | short ]\n\tTime display Format: (Long [default]) Mon Dy HH:MM:SS or (Short) HH:MM\n"); printf(" -n = do not resolve IP addresses (if applicable)\n"); printf(" -b = beep on RED events (ANSI output only)\n"); printf(" -S = disable mod_sound (if enabled by conffile) (ANSI output only)\n"); printf(" -s = do not display the syslog \"source\" field\n"); printf(" -p = do not display the \"program\" field\n"); printf(" -v = verbose (print event processing info to stderr)\n"); printf(" -d = do debugging output on stderr (for us developers)\n"); printf(" -V = print version and exit \n"); printf(" -h = this help message\n"); } /* * Set the options to something sane before we accept any user defined * options */ void lt_optsanity() { /* * Set the defaults for what/how to parse to something sane by default. * The defaults set here can/will be overiden by user defined preferences * in either command line or config file. */ cf.outfmt = OUTPUT_ANSI; /* ANSI is the default output type */ cf.input = FALSE; /* no, we ain't seen no input yet, eh? */ cf.timefmt = DATE_LONG; /* what date format shall we use? */ cf.verbose = FALSE; /* We are not verbose by default */ cf.debug = FALSE; /* do we do debugging output? */ cf.redbeep = FALSE; /* We do not beep on red events by default */ cf.sound = FALSE; /* nor do we do sounds by default */ cf.showprog = TRUE; /* set this to true by default */ cf.showsrc = TRUE; /* do we show the program field? */ cf.supdupes = TRUE; /* do we show duplicate entries? */ cf.sys_ng_host = FALSE; /* suppress syslog-ng *@'s in host field? */ cf.hostfmt = HOST_DEFAULT; /* do we parse syslog-ng host filed (and * how) */ cf.resolv = TRUE; /* let config file enable host resolution */ /* * a sane default for our config file */ strncpy(cf.configfile, CONFIG_FILE, 1023); } void lt_getopts(int argc, char **argv) { int option; lt_optsanity(); /* * Read the default config file for our user defined defaults (if any) */ lt_read_config(); /* * Check out the command line options liberal use of strn*() here, as * users can send who knows what to these calls B-g below is depreciated */ while ((option = getopt(argc, argv, "B:M:C:I:y:g:c:i:e:o:t:nbsSpvdVh")) != -1) { switch (option) { case 0: /* I dunno why this is here; was there in * the example so I left it... */ break; case 'n': cf.resolv = FALSE; break; case 'd': cf.debug = TRUE; break; case 'h': lt_sh_usage(); exit(0); break; case 'c': strncpy(cf.configfile, optarg, 1023); lt_read_config(); break; case 't': if (strncasecmp(optarg, "long", 32) == 0) { cf.timefmt = DATE_LONG; } else if (strncasecmp(optarg, "short", 32) == 0) { cf.timefmt = DATE_SHORT; } else { lt_sh_usage(); exit(0); } break; case 's': cf.showsrc = FALSE; break; case 'p': cf.showprog = FALSE; break; case 'o': if (strncasecmp(optarg, "ansi", 32) == 0) { cf.outfmt = OUTPUT_ANSI; } else if (strncasecmp(optarg, "ascii", 32) == 0) { cf.outfmt = OUTPUT_ASCII; } else if (strncasecmp(optarg, "csv", 32) == 0) { cf.outfmt = OUTPUT_CSV; } else if (strncasecmp(optarg, "html", 32) == 0) { cf.outfmt = OUTPUT_HTML; } else if (strncasecmp(optarg, "raw", 32) == 0) { cf.outfmt = OUTPUT_RAW; } else if (strncasecmp(optarg, "curses", 32) == 0) { cf.outfmt = OUTPUT_CURSES; } else { lt_sh_usage(); exit(1); } break; case 'b': cf.redbeep = TRUE; break; case 'S': /* this switch is just to switch off sound quickly in case of a rash of alerts or * other reasons you might want to stop beeping and bonging via wav file. */ cf.sound = FALSE; break; case 'i': /* we skip the strn*()'s here as we're * dynamicly allocating the space for user * input */ reg.include_file = malloc(strlen(optarg) + 1); strcpy(reg.include_file, optarg); reg.include_check = TRUE; break; case 'e': reg.exclude_file = malloc(strlen(optarg) + 1); strcpy(reg.exclude_file, optarg); reg.exclude_check = TRUE; break; case 'v': cf.verbose = TRUE; break; case 'V': PRINT_VERSION; /* put version stuff to screen */ exit(0); /* exit with errlevel 0 */ break; /* why is this here? I dunno... */ /* * all of the below is depreciated: please don't use them * anymore !!! */ case 'y': if(cf.verbose == TRUE) fprintf(stderr, "colorfile setting on command line is depreciated, please use a config file\n"); reg.yellow_file = malloc(strlen(optarg) + 1); strncpy(reg.yellow_file, optarg, 254); reg.yellow_check = TRUE; break; case 'g': if(cf.verbose == TRUE) fprintf(stderr, "colorfile setting on command line is depreciated, please use a config file\n"); reg.green_file = malloc(strlen(optarg) + 1); strncpy(reg.green_file, optarg, 254); reg.green_check = TRUE; break; case 'B': if(cf.verbose == TRUE) fprintf(stderr, "colorfile setting on command line is depreciated, please use a config file\n"); reg.blue_file = malloc(strlen(optarg) + 1); strncpy(reg.blue_file, optarg, 254); reg.blue_check = TRUE; break; case 'M': if(cf.verbose == TRUE) fprintf(stderr, "colorfile setting on command line is depreciated, please use a config file\n"); reg.magenta_file = malloc(strlen(optarg) + 1); strncpy(reg.magenta_file, optarg, 254); reg.magenta_check = TRUE; break; case 'C': if(cf.verbose == TRUE) fprintf(stderr, "colorfile setting on command line is depreciated, please use a config file\n"); reg.cyan_file = malloc(strlen(optarg) + 1); strncpy(reg.cyan_file, optarg, 254); reg.cyan_check = TRUE; break; case 'I': if(cf.verbose == TRUE) fprintf(stderr, "colorfile setting on command line is depreciated, please use a config file\n"); reg.brightcyan_file = malloc(strlen(optarg) + 1); strncpy(reg.brightcyan_file, optarg, 254); reg.brightcyan_check = TRUE; break; /* * end dpreciated block */ default: lt_sh_usage(); exit(1); /* some sucker done put in invalid cmdline * options ... grrr... */ } } } logtool-1.2.8/src/mod_snort.c0000644000372000017500000002743507654513077015624 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Yee ole includes (I put this all in one file for my sanity) */ #include "includes.h" /* * NOTES: * * This is some LONG and UGLY code. I think there's gotta be a way to * simplify it a whole lot, and to clean up some of the ugly, but for now * it's getting the job done. Too much stuff in one file for my tastes too. * :( * * Also, all yee would be code tweakers; the order in which these functions * are called is IMPORTANT!!! Each parser function modifies event.message, * and all subsequent parsing efforts expect previous ones to have been * completed. YOU WERE WARNED!!! * */ /* function to parse up the SID's from event.message (if exists) */ short int ltm_snort_psids(char *sids) { /* some tmp data storage */ char tmp_str[LSIZE]; long int i; /* if we got SID information at the beginning of the message, then crunch it into separate variable */ if(lt_match(event.message, "^\\[.*:.*:.*\\] .*") == TRUE) { sscanf(event.message, "%s %[^\n]", sids, tmp_str); /* strip the first string */ strcpy(event.message, tmp_str); /* copy the remainder back to event.message */ strcpy(tmp_str, ""); if(cf.outfmt == OUTPUT_ANSI || cf.outfmt == OUTPUT_HTML) { for (i = 0 ; sids[i] != '\0' ; ++i ) { if(sids[i] == '[') { strcpy(tmp_str, "\033l[\033e\033c"); } else if(sids[i] == ']') { strcat(tmp_str, "\033e\033l]\033e"); } else { sprintf(tmp_str, "%s%c", tmp_str, sids[i]); } } strcpy(sids, tmp_str); } } /* add a space to the end of it so it doesn't look so cramped later */ return 0; } /* function to parse the (snort_preprocessor) text field (if exist) */ short int ltm_snort_pproc(char *pproc) { /* some tmp data storage */ char tmp_str[LSIZE]; long int i; /* see notes in ltm_snort_psids(); above */ if(lt_match(event.message, "^\\(.*_.*\\) ") == TRUE) { sscanf(event.message, "%s %[^\n]", pproc, tmp_str); strcpy(event.message, tmp_str); /* do some special effects if our output format == ansi */ if(cf.outfmt == OUTPUT_ANSI || cf.outfmt == OUTPUT_HTML) { for (i = 0 ; pproc[i] != '\0' ; ++i ) { if(pproc[i] == '(') { strcpy(tmp_str, "\033l(\033e\033c"); } else if(pproc[i] == ')') { strcat(tmp_str, "\033e\033l)\033e"); } else { sprintf(tmp_str, "%s%c", tmp_str, pproc[i]); } } strcpy(pproc, tmp_str); } } return 0; } /* function to parse the "x.x.x.x:x -> x.x.x.x:x" from the end of a Snort message (if exist) */ short int ltm_snort_pips(char *src, char *src_prt, char *dst, char *dst_prt, short int resolv) { long int i, j; char *ptr; char tmp_str[LSIZE]; ptr = event.message; /* backspace from the end of the line, counting spaces to three */ for(i = (strlen(event.message) - 1), j = 0; j < 3; --i) { if(event.message[i] == ' ') ++j; } /* increment the ptr to the appropriate spot */ ptr = (ptr + i + 1); /* null byte it (will insert null byte into event.message * to clip the part we're about to parse separately) */ ptr[0] = '\0'; ++ptr; /* move ptr forward so we can work with data directly */ if(strstr(ptr, ":") != NULL) { /* then we've got a src:src_prt scenario */ sscanf(ptr, "%[^:]:%s -> %[^:]:%s", src, src_prt, dst, dst_prt); } else { /* this was probably an ICMP message; IP's only */ sscanf(ptr, "%s -> %s", src, dst); strcpy(dst_prt, ""); /* overkill way to make sure variable is blank */ strcpy(src_prt, ""); } if(resolv == TRUE) { ptr = get_host(src); if(ptr != NULL) { strcpy(tmp_str, src); strcpy(src, ptr); strcat(src, "("); strcat(src, tmp_str); strcat(src, ")"); } ptr = get_host(dst); if(ptr != NULL) { strcpy(tmp_str, dst); strcpy(dst, ptr); strcat(dst, "("); strcat(dst, tmp_str); strcat(dst, ")"); } if(cf.outfmt == OUTPUT_ANSI || cf.outfmt == OUTPUT_HTML) { sprintf(tmp_str, "\033l(\033e\033w"); lt_strep(src, 512, "(", tmp_str); lt_strep(dst, 512, "(", tmp_str); sprintf(tmp_str, "\033l)\033e"); lt_strep(src, 512, ")", tmp_str); lt_strep(dst, 512, ")", tmp_str); } } /* if we're making an ANSI event, then do some special fancy tricks. */ if(cf.outfmt == OUTPUT_ANSI || cf.outfmt == OUTPUT_HTML) { /* yeah, I could do all the below as a single sprintf(), and I may be doing * that soon. */ strcpy(tmp_str, "\033W"); strcat(tmp_str, src); strcat(tmp_str, "\033e"); strcpy(src, tmp_str); /* ditto */ strcpy(tmp_str, "\033W"); strcat(tmp_str, dst); strcat(tmp_str, "\033e"); strcpy(dst, tmp_str); /* if we got src/dst port's, then do the deed to them too */ if(src_prt[0] != '\0') { strcpy(tmp_str, "\033W"); strcat(tmp_str, src_prt); strcat(tmp_str, "\033e"); strcpy(src_prt, tmp_str); strcpy(tmp_str, "\033W"); strcat(tmp_str, dst_prt); strcat(tmp_str, "\033e"); strcpy(dst_prt, tmp_str); } } return 0; } /* function to parse the {PROTOCOL} text from a Snort event (if exist) */ short int ltm_snort_pproto(char *proto) { char *ptr = NULL; char tmp_str[LSIZE]; /* if we got a TCP, UDP, or ICMP message */ if(lt_match(event.message, "\\{TCP\\}$|\\{UDP\\}$|\\{ICMP\\}$") == TRUE) { /* parse it out of there */ ptr = strrchr(event.message, ' '); ptr[0] = '\0'; ++ptr; strcpy(proto, ptr); } /* you know about the ANSI prettyfication by now, don't you? */ if(cf.outfmt == OUTPUT_ANSI || cf.outfmt == OUTPUT_HTML) { strcpy(tmp_str, "\033l"); strcat(tmp_str, "{"); strcat(tmp_str, "\033e"); strcat(tmp_str, "\033C"); lt_strep(proto, 512, "{", tmp_str); strcpy(tmp_str, "\033l"); strcat(tmp_str, "}"); strcat(tmp_str, "\033e"); lt_strep(proto, 512, "}", tmp_str); } return 0; } /* function to parse the [Priority: .*] text from a Snort event (if exist) */ short int ltm_snort_pprior(char *prior) { char *ptr; char tmp_str[LSIZE]; if((ptr = strstr(event.message, "[Priority: ")) != NULL) { strcpy(prior, ptr); --ptr; ptr[0] = '\0'; } lt_strep(prior, 512, "[Priority: ", "[Pri: "); if(cf.outfmt == OUTPUT_ANSI || cf.outfmt == OUTPUT_HTML) { strcpy(tmp_str, "\033l"); strcat(tmp_str, "["); strcat(tmp_str, "\033e"); strcat(tmp_str, "\033c"); lt_strep(prior, 512, "[", tmp_str); strcpy(tmp_str, "\033l"); strcat(tmp_str, "]"); strcat(tmp_str, "\033e"); lt_strep(prior, 512, "]", tmp_str); } return 0; } /* function to parse the [Classification: .*] text from a snrot event (if exist) */ short int ltm_snort_pclass(char *class) { char *ptr; char tmp_str[LSIZE]; if((ptr = strstr(event.message, "[Classification: ")) != NULL) { strcpy(class, ptr); --ptr; ptr[0] = '\0'; } lt_strep(class, 512, "[Classification: ", "["); if(cf.outfmt == OUTPUT_ANSI || cf.outfmt == OUTPUT_HTML) { strcpy(tmp_str, "\033l"); strcat(tmp_str, "["); strcat(tmp_str, "\033e"); strcat(tmp_str, "\033c"); lt_strep(class, 512, "[", tmp_str); strcpy(tmp_str, "\033l"); strcat(tmp_str, "]"); strcat(tmp_str, "\033e"); lt_strep(class, 512, "]", tmp_str); } return 0; } /* * yee ole showtime function. This is the only function which should be * called by any external routines. */ short int ltm_snort() { /* various varibles and such are in mods.h struct SNORT */ /* we use these in parsing and such */ char msg_tmp[LSIZE]; /* some TRUE/FALSE variables for display opts */ short int modsn_dispclass = FALSE; short int modsn_dispprior = FALSE; short int modsn_dispproto = FALSE; short int modsn_2lines = FALSE; short int modsn_dispsids = FALSE; short int modsn_dispproc = FALSE; short int modsn_resolvips = FALSE; /* setup the display opt's based no environment */ modsn_dispclass = mod_varcheck("modsn_dispclass"); modsn_dispprior = mod_varcheck("modsn_dispprior"); modsn_dispproto = mod_varcheck("modsn_dispproto"); modsn_dispsids = mod_varcheck("modsn_dispsids"); modsn_dispproc = mod_varcheck("modsn_dispproc"); modsn_2lines = mod_varcheck("modsn_2lines"); modsn_resolvips = mod_varcheck("modsn_resolvips"); /* Figure out what color this message should be */ lt_set_event_color(); /* parse up the basics (date format's, prog/src, etc) */ mod_premsg_setup(); /* initialize sids, and parse it if we can */ strcpy(sn.sids, ""); ltm_snort_psids(sn.sids); /* ditto for pproc */ strcpy(sn.pproc, ""); ltm_snort_pproc(sn.pproc); /* ok, got the first parts of the line processed, head * for the rear of the line and do the IP's */ ltm_snort_pips(sn.src, sn.src_prt, sn.dst, sn.dst_prt, modsn_resolvips); /* see comments above regarding sids and pproc */ strcpy(sn.proto, ""); ltm_snort_pproto(sn.proto); strcpy(sn.prior, ""); ltm_snort_pprior(sn.prior); strcpy(sn.class, ""); ltm_snort_pclass(sn.class); /* ok, now we're ready to setup the event.pmsg * (which is what we show the user later :) * * If we got display orders, and variables not == nothing, then do */ /* this puts the main message, in appropriate colors, into the output */ sprintf(msg_tmp, "%s%s%s", event.pcolor, event.message, "\033e"); strcpy(sn.msg, event.message); strcat(event.pmsg, " "); strcat(event.pmsg, msg_tmp); if(modsn_dispproc == TRUE && sn.pproc[0] != '\0') { strcat(event.pmsg, " "); strcat(event.pmsg, sn.pproc); } if(modsn_dispsids == TRUE && sn.sids[0] != '\0') { strcat(event.pmsg, " "); strcat(event.pmsg, sn.sids); } /* if we want a 2line display, then do this */ if(modsn_2lines == TRUE && cf.outfmt != OUTPUT_CSV) strcat(event.pmsg, "\n\t"); if(modsn_dispclass == TRUE && sn.class[0] != '\0') { strcat(event.pmsg, " "); strcat(event.pmsg, sn.class); } if(modsn_dispprior == TRUE && sn.prior[0] != '\0') { strcat(event.pmsg, " "); strcat(event.pmsg, sn.prior); } if(modsn_dispproto == TRUE && sn.proto[0] != '\0') { strcat(event.pmsg, " "); strcat(event.pmsg, sn.proto); } if(sn.src_prt[0] != '\0') { if(cf.outfmt == OUTPUT_ANSI || cf.outfmt == OUTPUT_HTML) { sprintf(msg_tmp, "%s\033l:%s \033l-> %s\033l:\033e%s", sn.src, sn.src_prt, sn.dst, sn.dst_prt); } else { sprintf(msg_tmp, "%s:%s -> %s:%s", sn.src, sn.src_prt, sn.dst, sn.dst_prt); } } else { if(cf.outfmt == OUTPUT_ANSI || cf.outfmt == OUTPUT_HTML) { sprintf(msg_tmp, "%s \033l-> %s", sn.src, sn.dst); } else { sprintf(msg_tmp, "%s -> %s", sn.src, sn.dst); } } /* final finishing off of event.pmsg */ strcat(event.pmsg, " "); strcat(event.pmsg, msg_tmp); event.m.snort = &sn; /* we did some debug testing with the code block below */ /* fprintf(stderr, "msg:%s\n", event.m.snort->msg); fprintf(stderr, "dst:prt:%s:%s\n", event.m.snort->dst, event.m.snort->dst_prt); fprintf(stderr, "src:prt:%s:%s\n", event.m.snort->src, event.m.snort->src_prt); fprintf(stderr, "sids:%s\n", event.m.snort->sids); fprintf(stderr, "pproc:%s\n", event.m.snort->pproc); fprintf(stderr, "proto:%s\n", event.m.snort->proto); fprintf(stderr, "class:%s\n", event.m.snort->class); fprintf(stderr, "prior:%s\n", event.m.snort->prior); */ /* return 0; We really should be checking for errors above, * and bombing out if we got something bad, but hey, such is life. */ return 0; } logtool-1.2.8/src/mod_syslog.c0000644000372000017500000000265207706044421015757 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Yee ole includes (I put this all in one file for my sanity) */ #include "includes.h" /* there ain't no such thing as this module yet. Bummer, eh? */ /* * There is no such module as of yet. It is in the works for version 1.2.0 * * Try not to look so dissappointed, eh? :P * */ short int ltm_syslog() { char msg_tmp[LSIZE]; /* Figure out what color (red/green/yellow) this message should be */ lt_set_event_color(); mod_premsg_setup(); /* Always print the message from the log event */ sprintf(msg_tmp, " %s%s%s", event.pcolor, event.message, "\033e"); strcat(event.pmsg, msg_tmp); return 0; } logtool-1.2.8/src/mod_unknown.c0000644000372000017500000000307407706044725016144 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Yee ole includes (I put this all in one file for my sanity) */ #include "includes.h" /* there ain't no such thing as this module yet. Bummer, eh? */ /* * There is no such module as of yet. It is in the works for version 1.2.0 * * Try not to look so dissappointed, eh? :P * */ short int ltm_unknown() { /* Figure out what color (red/green/yellow etc) this message should be */ lt_set_event_color(); /* tear off any \n's we might find (our output fuction will add them as needed later */ if(event.raw[strlen(event.raw) - 1] == '\n') { event.raw[strlen(event.raw) - 1] = '\0'; } /* setup event.pmsg based on what we know now about the color */ sprintf(event.pmsg, "%s%s%s", event.pcolor, event.raw, "\033e"); return 0; /* and that's that :) */ } logtool-1.2.8/src/mods.h0000644000372000017500000000704707647507101014555 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * This header file declares the functions for the various event-centric * modules, and their related globals, structs, and so forth. */ #include "config.h" /* * Define's for the different event types we might see */ #define EVENT_UNKNOWN 0 #define EVENT_SYSLOG 1 #define EVENT_SNORT 2 #define EVENT_SUDO 3 /* a function to handle some of the repetitive work for all sub-modules */ short int mod_premsg_setup(); short int mod_varcheck(); /* a declaration for each sub-module type */ short int ltm_unknown(); short int ltm_syslog(); short int ltm_iptables(); char *get_host(char *host); /* for the snort log lines (this one's a bit complicated) */ short int ltm_snort(); /* variables to tell us if we're to use the functions in question or not */ short int ltm_use_syslog; short int ltm_use_snort; short int ltm_use_sudo; /* "ltm_unknown(); we allways have enabled (otherwise, what's the use? */ /* data structs for iptables and snort and so-on for linking in event->special */ typedef struct { char msg[8096]; /* the ASCII of the event */ /* where we store the src/dest port's and such */ char dst[2024], dst_prt[64]; /* destinationIP:port */ char src[2024], src_prt[64]; /* source IP:port */ /* various varibles we may/may not fill up below */ char sids[512]; /* the SID field */ char pproc[512]; /* the pre_processor */ char proto[64]; /* ICMP/UDP/TCP/RAW? */ char class[512]; /* Classification: field */ char prior[512]; /* Priority: field */ } SNORT; SNORT sn; /* repeat for iptables variables */ typedef struct { char msg[8096]; /* the ASCII of the event */ /* our variables we hope to collect */ char in_if[128]; /* IN=eth1 input interface */ char ou_if[128]; /* OUT=eth0 output interface */ char src[1024]; /* SRC=ip source ip address */ char dst[1024]; /* DST=ip destination ip address */ char src_prt[32]; /* SPT=src_prt source port (if any) */ char dst_prt[32]; /* DPT=dst_prt destination port */ char plen[64]; /* LEN=len packet length */ char tos[64]; /* TOS=0xxx type of service */ char prec[64]; /* PREC=?? no idea ;) */ char ttl[64]; /* TTL=ttl packet time to live */ char proto[64]; /* PROTO=UDP protocol of datagram */ } IPTABLES; IPTABLES it; /* a wrapper struct so's we can point to structs like the above from * event.* struct (see logtool.h for this struct) */ typedef struct { IPTABLES *iptables; SNORT *snort; } MOD; logtool-1.2.8/src/ncurses.c0000644000372000017500000000203007567522476015270 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Yee ole includes (I put this all in one file for my sanity) */ #include "includes.h" /* * There is no such module as of yet. It is in the works for version 1.2.0 * * Try not to look so dissappointed, eh? :P * */ logtool-1.2.8/src/output.c0000644000372000017500000000170307632610031015126 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "includes.h" /* someday this function will decide how to handle output (ansi/ascii/whatever) */ int lt_output() { return 0; } logtool-1.2.8/src/parse_pmsg.c0000644000372000017500000000634710020522343015730 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "includes.h" /* someday this function will parse the output appropriately */ int parse_pmsg() { int i; char *t_pmsg = NULL; /* make string == event.pmsg */ char *str = event.pmsg; /* we should never wind up 8 times the length of the original event */ t_pmsg = malloc(strlen(event.pmsg) * 8); bzero(t_pmsg, (strlen(event.pmsg) * 8)); /* void all colors that may be left over from last event */ strcpy(t_pmsg, color.end); /* here is our main parsing loop; we'll run through the message, replacing \033 escapes */ /* with the appropriate color.* relevant to the current output module */ for(i = 0 ; str[i] != '\0'; ++i) { if(str[i] == '\033') { ++i; switch(str[i]) { case '!': strcat(t_pmsg, color.beep); break; case 'r': strcat(t_pmsg, color.red); break; case 'R': strcat(t_pmsg, color.brightred); break; case 'g': strcat(t_pmsg, color.green); break; case 'G': strcat(t_pmsg, color.brightgreen); break; case 'y': strcat(t_pmsg, color.yellow); break; case 'Y': strcat(t_pmsg, color.brightyellow); break; case 'd': strcat(t_pmsg, color.dimwhite); break; case 'l': strcat(t_pmsg, color.dimwhite); break; case 'w': strcat(t_pmsg, color.white); break; case 'W': strcat(t_pmsg, color.brightwhite); break; case 'b': strcat(t_pmsg, color.blue); break; case 'B': strcat(t_pmsg, color.brightblue); break; case 'm': strcat(t_pmsg, color.magenta); break; case 'M': strcat(t_pmsg, color.brightmagenta); break; case 'c': strcat(t_pmsg, color.cyan); break; case 'C': strcat(t_pmsg, color.brightcyan); break; case 'u': strcat(t_pmsg, color.unknown); break; case 'e': strcat(t_pmsg, color.end); break; default: /* oops, not one of our escape sequences */ /* we better rewind and just copy as-is */ --i; sprintf(t_pmsg, "%s%c", t_pmsg, str[i]); break; } } else { /* just copy the existing string + the new char into t_pmsg) */ sprintf(t_pmsg, "%s%c", t_pmsg,str[i]); /* ugly and inefficient programaticly*/ } } /* make sure color is reset to default */ strcat(t_pmsg, color.end); /* put what we got back into event.pmsg for output module */ strcpy(event.pmsg, t_pmsg); /* free our t_pmsg */ free(t_pmsg); return 0; } logtool-1.2.8/src/parser.c0000644000372000017500000001501610276707615015101 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "includes.h" /* a parsing function to do a string replacement (sorta like sed w/o the extended syntax) */ /* A function to do string replacement's (a bit like sed) */ char *lt_strep(char *input, size_t bufsize, char *string, char *newstring) { /* Set our local variables */ int oldlen, newlen; char *p, *q; /* * Make sure the input contains the string we want to replace * and if not, return the input "as-is" */ if((p = strstr(input, string)) == NULL) { return input; } /* set the old/new length variables for the strings */ oldlen = strlen(string); newlen = strlen(newstring); /* If the strings too big for buffer size, then quit now */ if ((strlen(input) + newlen - oldlen + 1) > bufsize) { return NULL; } /* * Memmove and memcpy the string's around so's the new string * exists where the old one used to be. */ memmove(q = p+newlen, p+oldlen, strlen(p+oldlen)+1); memcpy(p, newstring, newlen); /* return "input" with the replaced string */ return input; } /* we make some decisions based on event.source and display accordingly */ int lt_do_parse_evtsrc() { char tmp[LSIZE]; char *ptr; if(cf.sys_ng_host == TRUE && lt_match(event.source, "src@|kern@") != FALSE) { ptr = strstr(event.source, "@") + 1; strcpy(tmp, ptr); strcpy(event.source, tmp); } if(cf.hostfmt != HOST_DEFAULT && lt_match(event.source, ".*/[0-9].*") != FALSE) { switch(cf.hostfmt) { case NG_HOST_BOTH: /* do nothing, we've already got em both here */ break; case NG_HOST_IP: /* we want just the IP, so... */ ptr = strstr(event.source, "/"); ++ptr; strcpy(event.source, ptr); break; case NG_HOST_NAME: ptr = strstr(event.source, "/"); ptr[0] = '\0'; break; default: break; } } return 0; } void lt_set_lasts() { if(event.message[0] != '\0') { strcpy(event.lmessage, event.message); } else { event.lmessage[0] = '\0'; } if(event.program[0] != '\0') { strcpy(event.lprogram, event.program); } else { event.lprogram[0] = '\0'; } if(event.source[0] != '\0') { strcpy(event.lsource, event.source); } else { event.lsource[0] = '\0'; } if(event.raw[0] != '\0') { strcpy(event.lraw, event.raw); } } void lt_parse_multilog() { time_t ttime; char tmp[LSIZE], tmp2[LSIZE]; char *ptr; if(event.raw[0] == '@') { sscanf(event.raw, "%s", tmp); ttime = t64nfrac(tmp); strcpy(tmp2, ctime(&ttime)); tmp2[strlen(tmp2) - 1] = '\0'; ptr = strstr(tmp2, " "); ++ptr; strcpy(tmp, ptr); ptr = strrchr(tmp, ' '); ptr[0] = '\0'; /* we're gonna have to fix up event.raw for later processing */ strcpy(tmp2, event.raw); ptr = strstr(tmp2, " "); ++ptr; strcpy(event.raw, tmp); strcat(event.raw, " "); strcat(event.raw, cf.multilog_program); strcat(event.raw, ": "); strcat(event.raw, ptr); } } int lt_do_regexcheck() { int retval = TRUE; if(reg.include_check == TRUE && lt_match_re(event.raw, reg.include_reg) != TRUE) { retval = FALSE; } if(reg.exclude_check == TRUE && lt_match_re(event.raw, reg.exclude_reg) == TRUE) { retval = FALSE; } return (retval); } /* The function that parses the line. It's pretty basic at this point, * but in the future, it will do a lot more to the data */ int lt_do_parse() { int retval = TRUE; /* if the event is just a \newline, skip it */ if(strcmp(event.raw, "\n") == 0) { return FALSE; } lt_set_lasts(); sscanf(event.raw, "%s %s %s %s %s %[^\n]", event.month, event.day, event.time, event.source, event.program, event.message); lt_do_parse_evtsrc(); return (retval); } void lt_set_event_color() { /* set color == red by default */ if(cf.redbeep == 1 && cf.outfmt == OUTPUT_ANSI) { strcpy(event.pcolor, "\033!\033r"); } else { strcpy(event.pcolor, "\033r"); } if(reg.yellow_check == TRUE && lt_match_re(event.raw, reg.yellow_reg) != 0) { strcpy(event.pcolor, "\033y"); /* yellow event color */ } else if(reg.brightyellow_check == TRUE && lt_match_re(event.raw, reg.brightyellow_reg) != 0) { strcpy(event.pcolor, "\033Y"); /* bright yellow event color */ } else if(reg.green_check == TRUE && lt_match_re(event.raw, reg.green_reg) != 0) { strcpy(event.pcolor, "\033g"); /* green event color */ } else if(reg.brightgreen_check == TRUE && lt_match_re(event.raw, reg.brightgreen_reg) != 0) { strcpy(event.pcolor, "\033G"); /* bright green event color */ } else if(reg.blue_check == TRUE && lt_match_re(event.raw, reg.blue_reg) != 0) { strcpy(event.pcolor, "\033b"); /* blue event color */ } else if(reg.brightblue_check == TRUE && lt_match_re(event.raw, reg.brightblue_reg) != 0) { strcpy(event.pcolor, "\033B"); /* blue event color */ } else if(reg.cyan_check == TRUE && lt_match_re(event.raw, reg.cyan_reg) != 0) { strcpy(event.pcolor, "\033c"); /* cyan event color */ } else if(reg.brightcyan_check == TRUE && lt_match_re(event.raw, reg.brightcyan_reg) != 0) { strcpy(event.pcolor, "\033C"); /* bright cyan event */ } else if(reg.magenta_check == TRUE && lt_match_re(event.raw, reg.magenta_reg) != 0) { strcpy(event.pcolor, "\033m"); /* magenta */ } else if(reg.brightmagenta_check == TRUE && lt_match_re(event.raw, reg.brightmagenta_reg) != 0) { strcpy(event.pcolor, "\033M"); /* magenta */ } else if(reg.brightred_check == TRUE && lt_match_re(event.raw, reg.brightred_reg) != 0) { if(cf.redbeep == 1 && cf.outfmt == OUTPUT_ANSI) { strcpy(event.pcolor, "\033!\033R"); /* bright red */ } else { strcpy(event.pcolor, "\033R"); } } } logtool-1.2.8/src/raw.c0000644000372000017500000000221607647506071014375 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "includes.h" void lto_raw() { /* Open up stdin and read the input one line at a time till EOF */ while(fgets(event.raw, LSIZE, stdin) != NULL) { /* Make sure the format of the input is correct */ if(lt_fmtcheck(event.raw) == -1) { continue; } /* Print that sucker */ printf("%s", event.raw); fflush(stdout); } } logtool-1.2.8/src/regex.c0000644000372000017500000001541210276707076014720 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* yee ole' includes */ #include "includes.h" /* A regex function to match paterns */ int lt_match(const char *string, char *pattern) /* This means "what you want to search", "what you want to search for" */ { int status; regex_t re; if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0) { return(FALSE); /* report error */ } status = regexec(&re, string, (size_t) 0, NULL, 0); regfree(&re); if (status != 0) { return(FALSE); /* report error */ } return(TRUE); } /* a function to match against pre-compiled regex's */ int lt_match_re(const char *string, regex_t re) { int status; status = regexec(&re, string, (size_t) 0, NULL, 0); if (status != 0) { return FALSE; } else { return TRUE; } } int lt_filelen(FILE *file) { int retval = 0; /* find out how long the file is */ fseek(file, 0, SEEK_END); /* seek end of file */ retval = ftell(file); /* get byte value */ fseek(file, 0, SEEK_SET); /* return to begin */ return retval; /* return size of file */ } short int lt_load_regex(char *file, char **dest, regex_t *re) { char line[LSIZE]; char tmp[LSIZE]; char count = 1; FILE *fileptr; short int retval; DIR *dir; struct stat *stbuf; char *fname; struct dirent *de; stbuf=malloc(sizeof(struct stat)); if(stat(file, stbuf)<0) { /* Could not stat, so, back out */ if(cf.debug) fprintf(stderr, "Could not stat %s\n", file); return FALSE; } if(S_ISDIR(stbuf->st_mode)) { dir=opendir(file); if( ! dir ) { if(cf.debug) fprintf(stderr, "Could not opendir %s\n", file); return FALSE; } while((de=readdir(dir))) { if(!strncmp(de->d_name, ".", 1)) continue; fname=malloc(strlen(file)+strlen(de->d_name)+2); sprintf(fname, "%s/%s", file, de->d_name); if(!lt_load_regex(fname, dest, re)) { if(cf.debug) fprintf(stderr, "error occured, bailing out\n"); free(fname); return FALSE; } free(fname); } return TRUE; } fileptr = fopen(file, "r"); if( ! fileptr ) { if(cf.debug) fprintf(stderr, "unable to open file: %s\n", file); /* oopsie; no such file; abort this loading, and return FALSE */ return FALSE; } /* we malloc enough space for 2 of these files just to be safe we don't * overflow as we add |'s and such to build the regexec string */ *dest = malloc(lt_filelen(fileptr) * 2); *dest[0] = '\0'; /* while we read the file, and don't have comments */ while(fgets(line, LSIZE, fileptr) != NULL) { if(lt_match(line, "^#|^$") == 0) { sscanf(line, "%[^\n]", tmp); if(count == 1) { strncat(*dest, tmp, strlen(tmp) + 1); count = 2; } else { strncat(*dest, "|", 2); strncat(*dest, tmp, strlen(tmp) + 1); } } } /* close off yee ole file pointer */ fclose(fileptr); /* if we got no valid regex's, then return false */ if(*dest[0] == '\0') { /* we had no strings, nevermind */ retval = FALSE; } else { retval = TRUE; /* assume those strings are valid */ /* see if we can compile the patern into a regex */ if (regcomp(re, *dest, REG_EXTENDED|REG_NOSUB) != 0) { /* oops; wouldn't compile.. nevermind */ return(FALSE); /* report error */ } } if(cf.debug) fprintf(stderr, "opened file: %s and got strings >%s<\n", file, *dest); return (retval); } void lt_loadstrings() { /* for all the regex's we want to load, hit em up here */ /* if you're adding one of these, see logtool.h, readconf.c and regex.c */ /* I need to get off my butt and init this in lt_set_regfile() in readconf.c instead of here, :) */ reg.include_check = lt_load_regex(reg.include_file, ®.include_strs, ®.include_reg); reg.exclude_check = lt_load_regex(reg.exclude_file, ®.exclude_strs, ®.exclude_reg); reg.green_check = lt_load_regex(reg.green_file, ®.green_strs, ®.green_reg); reg.brightgreen_check = lt_load_regex(reg.brightgreen_file, ®.brightgreen_strs, ®.brightgreen_reg); reg.yellow_check = lt_load_regex(reg.yellow_file, ®.yellow_strs, ®.yellow_reg); reg.brightyellow_check =lt_load_regex(reg.brightyellow_file, ®.brightyellow_strs, ®.brightyellow_reg); reg.blue_check = lt_load_regex(reg.blue_file, ®.blue_strs, ®.blue_reg); reg.brightblue_check = lt_load_regex(reg.brightblue_file, ®.brightblue_strs, ®.brightblue_reg); reg.cyan_check = lt_load_regex(reg.cyan_file, ®.cyan_strs, ®.cyan_reg); reg.brightcyan_check = lt_load_regex(reg.brightcyan_file, ®.brightcyan_strs, ®.brightcyan_reg); reg.magenta_check = lt_load_regex(reg.magenta_file, ®.magenta_strs, ®.magenta_reg); reg.brightmagenta_check = lt_load_regex(reg.brightmagenta_file, ®.brightmagenta_strs, ®.brightmagenta_reg); reg.brightred_check = lt_load_regex(reg.brightred_file, ®.brightred_strs, ®.brightred_reg); } /* our different event types defined: for EVENT_*. They are (currently) SYSLOG, SNORT, and IPTABLES */ /* Laurent Jacquot: I have got some lines not matching ^[A-Z] ... */ char syslog_format[256] = "^[A-Za-z][a-z][a-z] .[0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] .* .* .*$"; char snort_format[256] = "^[A-Za-z][a-z][a-z] .[0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] .* snort.*: .*[0-9] -> .*[0-9].*$"; char iptables_format[256] = "^[A-Za-z][a-z][a-z] .[0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] .*IN=.* OUT=.* SRC=.* DST=.* .*$"; regex_t syslog_freg; regex_t snort_freg; regex_t iptables_freg; void lt_regexinit() { regcomp(&syslog_freg, syslog_format, REG_EXTENDED|REG_NOSUB); regcomp(&snort_freg, snort_format, REG_EXTENDED|REG_NOSUB); regcomp(&iptables_freg, iptables_format, REG_EXTENDED|REG_NOSUB); lt_loadstrings(); } /* currently known event types: SNORT SYSLOG UNKNOWN */ short int lt_fmtcheck(char *tmp) { short int retval = -1; if(lt_match_re(tmp, syslog_freg) == TRUE) { retval = EVENT_SYSLOG; } if(lt_match_re(tmp, snort_freg) == TRUE) { retval = EVENT_SNORT; } if(lt_match_re(tmp, iptables_freg) == TRUE) { retval = EVENT_IPTABLES; } if(retval == -1) { retval = EVENT_UNKNOWN; } return retval; } logtool-1.2.8/src/tai64nfrac.c0000644000372000017500000000336507647506711015554 0ustar wouterwouter/* * logtool - a logfile parsing/monitoring/manipulation utility * * Copyright (C) Y2K (2000) A.L.Lambert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * NOTE: I borrowed some ideas from Russ Allbery when I * hacked this together, and as such, his name goes in this file. :) */ #include "includes.h" /* Read a TAI64N external format timestamp from stdin and write fractional seconds since epoch (TAI, not UTC) to stdout. Return the character after the timestamp. */ time_t t64nfrac(char *sline) { short int c; short int i = 1; unsigned long u; unsigned long seconds = 0; unsigned long nanoseconds = 0; unsigned long long test = 4611686018427387914; /* ULL; */ char line[LSIZE]; strcpy(line, sline); while ((c = line[i]) != '\0') { u = c - '0'; if (u >= 10) { u = c - 'a'; if (u >= 6) break; u += 10; } seconds <<= 4; seconds += nanoseconds >> 28; nanoseconds &= 0xfffffff; nanoseconds <<= 4; nanoseconds += u; ++i; } seconds -= test; /* 4611686018427387914ULL; */ return (seconds); } logtool-1.2.8/INSTALL0000644000372000017500000000130110117533262013660 0ustar wouterwouter This should be pretty simple. # type after me: ./configure # --optional-switches make # (and) watch for errors make install # (and) watch for errors again CAVEAT: If your 'make' is NOT compatible with GNU make, then you may get errors. Systems with a broken make frequenly provide GNU make as 'gmake'. This will compile, and dump the logtool binary in /usr/bin/logtool. It will dump the config files in /etc/logtool (you'll probably want to season those to suit, but they should be vaguely tolerable by default). For further information, please check out the documentation (in the ./doc subdirectory), and/or experiment until you get the hang of it. Good luck, and God bless. logtool-1.2.8/Makefile0000644000372000017500000000133710276711540014303 0ustar wouterwouter# Generated automatically from Makefile.in by configure. # This is just a bootstrap Makefile. The real one's are in the various subdir's. build_it: src/Makefile if [ ! -f ./config.cache ] ; then ./configure ; fi cd src ; $(MAKE) install: cd src ; $(MAKE) install clean: rm -f a.out core *~ *.o *.a cd conf ; rm -f a.out core *~ *.o *.a cd doc ; rm -f a.out core *~ *.o *.a cd scripts ; rm -f a.out core *~ *.o *.a cd src ; $(MAKE) clean cd dd ; rm -f *~ distclean: clean rm -f config.status config.cache config.log rm -Rf dd/tmp/ dd: clean if [ -d debian ] ; then mv -f debian debian.tmp ; fi ln -s dd debian dd/rules clean build binary rm -f debian if [ -d debian.tmp ] ; then mv -f debian.tmp debian ; fi logtool-1.2.8/build.distro0000755000372000017500000000161410276711524015173 0ustar wouterwouter#!/bin/sh exit 0 pwd=`pwd` builddir=`basename $pwd` ./configure --prefix=/usr # Really ugly stuff to build a CHANGES file from the .spec file echo -n "Building the CHANGES file: " echo "
" > CHANGES
true="no"

cat logtool.spec |
while read line ; do
	if [ "$line" = "%changelog" ] ; then
	true="yes"
	fi

	if [ "$true" = "yes" ] ; then
	echo "$line" >> CHANGES
	fi
done
echo "done"


exit 0

# Clean up the source tree of any old cruft
echo -n "Cleaning up prior to build: "
make clean

# Configure for a default build
echo -n "Configuring for default build: "
./configure

# Make a tarball
cd ../
echo -n "Building tarball: "
tar -zcf $builddir.tar.gz $builddir
echo "done"

# Build RPM's
echo -n "Building src and i386 RPM's: "
rpm -ta $builddir.tar.gz
echo "done"
cd -

# This is my little script to upload it to the webserver
# if [ -x ../putlt ] ; then
# ../putlt
# fi
logtool-1.2.8/README0000644000372000017500000001133407635553525013535 0ustar  wouterwouterLogtool A logfile parsing/manipulation tool for managing syslog/syslog-ng/etc
	generated logfiles.

	What:

	At it's heart, logtool is a command line program, to parse up logfiles 
into a more palatable format.  It will take anything resembling a standard 
syslog file (this includes syslog-ng, and probably most of the other variants
out there), and crunch it into one of the following formats for your viewing
pleasure: 

	ANSI 	(colorized for easy "at a glance" viewing)
	ASCII 	(for e-mail'ed reports, and term's that don't support color)
	CSV	(for importing into your favorite spreadsheet/database)
	HTML	(for generating web pages (duh?))
	RAW	(for no good reason other than an excuse to printf();)

	New as of the 1.2.x branch, logtool will also parse logfiles created 
by D.J.Bernstien's multilog and other similarly formatted logfiles, as well as
handle unknown formating.  It also knows some specizalized logfile formats
such as Snort, and IPtables, and will parse those into specialized colors as
well as do IP->Hostname resolution and other neat things.

	It can be configured to parse the data any one of several ways,
including stripping the host, and/or program fields, and modifying the time
display format of the log entry's.  New in the 1.2.x branch, it can also 
handle syslog-ng style hostname fields, and optionally strip the src@/kern@ 
for scree-space sake, as well as parse the Hostname/IP format to show only
hostname or IP address(es).  See logtool.conf for more details.

	Somewhat new in the 1.2.x branch, is the reliance on config file's
as the primary runtime configuration rather than command line switches. The
default logtool.conf is well commented, and you should have a look through it
to get comfortable with the options at your disposal.  Those of you who have
written scripts and such which rely on the old command-line syntax will be 
happy to know that backwards compatibility has been maintained in this regard, 
though you should update your scripts to use config file's as much as 
possible.

	Please check out the doc/* directory for more information on the
things you can/can't do with logtool (like how to do them :).


	Why?:

	For all my Linux/UNIX life, especially as a SysAdmin, I've been up to 
my neck in logfiles.  I'm also a shell script junkie, and I've been writing
scripts to make my life easier (for logfiles, and everything else) for years,
but when dealing with big logfiles (and it doesn't take much to become a "big"
file to a shell script based parsing routine), it's just too dang slow to do
it right.  Perl is a pain in the butt in terms of portability (yes, I know you
can run perl anywhere... anywhere you've installed a gazillion friggin perl
modules).  So what I really needed was a nice little C program to handle the
grunt work, and some shell scripts to interface to that program.  I looked 
around, but I didn't see any GNU tools to do precisely what I wanted, so
I wrote this one, and am now releasing it to the public, because (IMHO), there
should be a program like this in the world to let folks who have to muck with
logfiles have easier lives.


	Uses:

	I expect this program to have primarily two uses (although if it suits
other needs, use it for whatever you want).

	1.  As an engine for use by shell scripts to generate nice little
	    reports to e-mail people, or create webpages, and other similar 
	    uses.

	2.  As a logfile monitoring tool for network operations center like
	    environments, where it's nice to have logfile's scrolling across
	    the screen in easy to read color.  I've included a "redbeep" option
	    so that in such cases, "red" events will generate a Ctrl-G to catch
	    the attention of NOC personnel.

	Notes:

	This program _should_ compile/run on almost anything resembling UNIX,
although I have only tested with Linux.  Hopefully some of you will give it a
try on some of the other UNIX flavors out there.  It was written in plain old
C library function call's (no snprintf() or other things that are known to be 
pesky on some UNIX'es (Solaris anyone?)), and it compiles clean with -W -Wall 
passed to the compiler, so I assume it is something like reasonable code 
(I'm a self-taught programmer, so all bets are off if the compiler lied :).

	Especiall note, the 1.2.x code tree has changed a LOT from the 1.0 
tree.  It may no longer work on platforms it used to work on!  If you find 
your platform is one of these, please feel free to contact me (al@xjack.org)
and let me know the problem, and I'll work on fixing it for you (free of
charge even, can you beat that? :)

	Also, the documentation is not yet complete (nobody likes to write
documentation, me included), but what is there should be enough to get you
up to speed if you're at all familiar with UNIX or Linux.

	--A.L.Lambert 
logtool-1.2.8/TODO0000644000372000017500000000071307662466654013352 0ustar  wouterwouter	Anyone who wants to contribute code to this effort, please feel free
to chip in.  I'm more than happy to give credit where it's due, and I'm always
happy to have some help.


1.	Write some better default include/exclude/red/green/yellow REGEX's
	for the distribution package.	

2.	Write some better shell scripts to do the more common expected uses of
	this program.

3.	Work on any feature requests that come in after the initial release.
	(currently none)
logtool-1.2.8/USAGE0000644000372000017500000000034007222062475013426 0ustar  wouterwouter	Please have a look in the documentation directory.  If you are
installing from src, then it will be ./doc.  If you installed a binary
distribution (ie: RPM), then it will be in /usr/doc/logtool-%{version}.

	--A.L.Lambert

logtool-1.2.8/build0000644000372000017500000000000010276711555013655 0ustar  wouterwouterlogtool-1.2.8/config.h0000644000372000017500000000251307661624435014270 0ustar  wouterwouter/* config.h.  Generated automatically by configure.  */
/* config.h.in.  Generated automatically from configure.in by autoheader 2.13.  */

/* Define to empty if the keyword does not work.  */
/* #undef const */

/* Define to `unsigned' if  doesn't define.  */
/* #undef size_t */

/* Define if you have the ANSI C header files.  */
#define STDC_HEADERS 1

/* Define if you have the gethostbyaddr function.  */
#define HAVE_GETHOSTBYADDR 1

/* Define if you have the inet_addr function.  */
#define HAVE_INET_ADDR 1

/* Define if you have the regcomp function.  */
#define HAVE_REGCOMP 1

/* Define if you have the regexec function.  */
#define HAVE_REGEXEC 1

/* Define if you have the regfree function.  */
#define HAVE_REGFREE 1

/* Define if you have the strncasecmp function.  */
#define HAVE_STRNCASECMP 1

/* Define if we have setenv */
#define HAVE_SETENV 1

/* Define if you have the  header file.  */
#define HAVE_GETOPT_H 1

/* Define if you have the  header file.  */
#define HAVE_REGEX_H 1

/* Define if you have the  header file.  */
#define HAVE_SYSEXITS_H 1

/* Define if you have the  header file.  */
#define HAVE_TIME_H 1

/* Define if you have the  header file.  */
#define HAVE_UNISTD_H 1

/* Define if we disabled the resolver function or not */
/* #undef NO_RESOLVER */
logtool-1.2.8/config.h.in0000644000372000017500000000233207661622625014673 0ustar  wouterwouter/* config.h.in.  Generated automatically from configure.in by autoheader 2.13.  */

/* Define to empty if the keyword does not work.  */
#undef const

/* Define to `unsigned' if  doesn't define.  */
#undef size_t

/* Define if you have the ANSI C header files.  */
#undef STDC_HEADERS

/* Define if you have the gethostbyaddr function.  */
#undef HAVE_GETHOSTBYADDR

/* Define if you have the inet_addr function.  */
#undef HAVE_INET_ADDR

/* Define if you have the regcomp function.  */
#undef HAVE_REGCOMP

/* Define if you have the regexec function.  */
#undef HAVE_REGEXEC

/* Define if you have the regfree function.  */
#undef HAVE_REGFREE

/* Define if you have the strncasecmp function.  */
#undef HAVE_STRNCASECMP

/* Define if we have setenv */
#undef HAVE_SETENV

/* Define if you have the  header file.  */
#undef HAVE_GETOPT_H

/* Define if you have the  header file.  */
#undef HAVE_REGEX_H

/* Define if you have the  header file.  */
#undef HAVE_SYSEXITS_H

/* Define if you have the  header file.  */
#undef HAVE_TIME_H

/* Define if you have the  header file.  */
#undef HAVE_UNISTD_H

/* Define if we disabled the resolver function or not */
#undef NO_RESOLVER
logtool-1.2.8/logtool.patch0000644000372000017500000000330510037020023015320 0ustar  wouterwouterdiff -ruN logtool-1.2.6~/src/includes.h logtool-1.2.6/src/includes.h
--- logtool-1.2.6~/src/includes.h	2003-05-02 18:34:59.000000000 +0200
+++ logtool-1.2.6/src/includes.h	2004-04-13 15:07:47.000000000 +0200
@@ -40,6 +40,12 @@
 extern int h_errno;
 struct hostent *h;
 
+/* For stat(), opendir(), and friends */
+#include 
+#include 
+#include 
+#include 
+
 /* in here we work with the event-centric modules	*/
 #include "mods.h"	/* declare this before logtool.h */
 /* we use some structs from this in logtool.h (yeah, I know, lousy organization :) */
diff -ruN logtool-1.2.6~/src/regex.c logtool-1.2.6/src/regex.c
--- logtool-1.2.6~/src/regex.c	2003-10-07 23:08:23.000000000 +0200
+++ logtool-1.2.6/src/regex.c	2004-04-13 16:32:49.000000000 +0200
@@ -66,6 +66,38 @@
 	char count = 1;
 	FILE *fileptr;
 	short int retval;
+	DIR *dir;
+	struct stat *stbuf;
+	char *fname;
+	struct dirent *de;
+
+	stbuf=malloc(sizeof(struct stat));
+	if(stat(file, stbuf)<0) {
+		/* Could not stat, so, back out */
+		if(cf.debug) fprintf(stderr, "Could not stat %s\n", file);
+		return FALSE;
+	}
+
+	if(S_ISDIR(stbuf->st_mode)) {
+		dir=opendir(file);
+		if( ! dir ) {
+			if(cf.debug) fprintf(stderr, "Could not opendir %s\n", file);
+			return FALSE;
+		}
+		while((de=readdir(dir))) {
+			if(!strncmp(de->d_name, ".", 1)) continue;
+			fname=malloc(strlen(file)+strlen(de->d_name)+2);
+			sprintf(fname, "%s/%s", file, de->d_name);
+			if(!lt_load_regex(fname, dest, re)) {
+				if(cf.debug) fprintf(stderr,
+						"error occured, bailing out\n");
+				free(fname);
+				return FALSE;
+			}
+			free(fname);
+		}
+		return TRUE;
+	}
 
         fileptr = fopen(file, "r");
         if( ! fileptr ) {
logtool-1.2.8/configure0000755000372000017500000017741710276707473014601 0ustar  wouterwouter#! /bin/sh

# Guess values for system-dependent variables and create Makefiles.
# Generated automatically using autoconf version 2.13 
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.

# Defaults:
ac_help=
ac_default_prefix=/usr/local
# Any additions from configure.in:
ac_default_prefix=/usr

# Initialize some variables set by options.
# The variables have the same names as the options, with
# dashes changed to underlines.
build=NONE
cache_file=./config.cache
exec_prefix=NONE
host=NONE
no_create=
nonopt=NONE
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
target=NONE
verbose=
x_includes=NONE
x_libraries=NONE
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datadir='${prefix}/share'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
libdir='${exec_prefix}/lib'
includedir='${prefix}/include'
oldincludedir='/usr/include'
infodir='${prefix}/info'
mandir='${prefix}/man'

# Initialize some other variables.
subdirs=
MFLAGS= MAKEFLAGS=
SHELL=${CONFIG_SHELL-/bin/sh}
# Maximum number of lines to put in a shell here document.
ac_max_here_lines=12

ac_prev=
for ac_option
do

  # If the previous option needs an argument, assign it.
  if test -n "$ac_prev"; then
    eval "$ac_prev=\$ac_option"
    ac_prev=
    continue
  fi

  case "$ac_option" in
  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
  *) ac_optarg= ;;
  esac

  # Accept the important Cygnus configure options, so we can diagnose typos.

  case "$ac_option" in

  -bindir | --bindir | --bindi | --bind | --bin | --bi)
    ac_prev=bindir ;;
  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
    bindir="$ac_optarg" ;;

  -build | --build | --buil | --bui | --bu)
    ac_prev=build ;;
  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
    build="$ac_optarg" ;;

  -cache-file | --cache-file | --cache-fil | --cache-fi \
  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
    ac_prev=cache_file ;;
  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
    cache_file="$ac_optarg" ;;

  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
    ac_prev=datadir ;;
  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
  | --da=*)
    datadir="$ac_optarg" ;;

  -disable-* | --disable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    eval "enable_${ac_feature}=no" ;;

  -enable-* | --enable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "enable_${ac_feature}='$ac_optarg'" ;;

  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
  | --exec | --exe | --ex)
    ac_prev=exec_prefix ;;
  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
  | --exec=* | --exe=* | --ex=*)
    exec_prefix="$ac_optarg" ;;

  -gas | --gas | --ga | --g)
    # Obsolete; use --with-gas.
    with_gas=yes ;;

  -help | --help | --hel | --he)
    # Omit some internal or obsolete options to make the list less imposing.
    # This message is too long to be a string in the A/UX 3.1 sh.
    cat << EOF
Usage: configure [options] [host]
Options: [defaults in brackets after descriptions]
Configuration:
  --cache-file=FILE       cache test results in FILE
  --help                  print this message
  --no-create             do not create output files
  --quiet, --silent       do not print \`checking...' messages
  --version               print the version of autoconf that created configure
Directory and file names:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [$ac_default_prefix]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [same as prefix]
  --bindir=DIR            user executables in DIR [EPREFIX/bin]
  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
  --datadir=DIR           read-only architecture-independent data in DIR
                          [PREFIX/share]
  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
                          [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
  --includedir=DIR        C header files in DIR [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
  --infodir=DIR           info documentation in DIR [PREFIX/info]
  --mandir=DIR            man documentation in DIR [PREFIX/man]
  --srcdir=DIR            find the sources in DIR [configure dir or ..]
  --program-prefix=PREFIX prepend PREFIX to installed program names
  --program-suffix=SUFFIX append SUFFIX to installed program names
  --program-transform-name=PROGRAM
                          run sed PROGRAM on installed program names
EOF
    cat << EOF
Host type:
  --build=BUILD           configure for building on BUILD [BUILD=HOST]
  --host=HOST             configure for HOST [guessed]
  --target=TARGET         configure for TARGET [TARGET=HOST]
Features and packages:
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --x-includes=DIR        X include files are in DIR
  --x-libraries=DIR       X library files are in DIR
EOF
    if test -n "$ac_help"; then
      echo "--enable and --with options recognized:$ac_help"
    fi
    exit 0 ;;

  -host | --host | --hos | --ho)
    ac_prev=host ;;
  -host=* | --host=* | --hos=* | --ho=*)
    host="$ac_optarg" ;;

  -includedir | --includedir | --includedi | --included | --include \
  | --includ | --inclu | --incl | --inc)
    ac_prev=includedir ;;
  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
  | --includ=* | --inclu=* | --incl=* | --inc=*)
    includedir="$ac_optarg" ;;

  -infodir | --infodir | --infodi | --infod | --info | --inf)
    ac_prev=infodir ;;
  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
    infodir="$ac_optarg" ;;

  -libdir | --libdir | --libdi | --libd)
    ac_prev=libdir ;;
  -libdir=* | --libdir=* | --libdi=* | --libd=*)
    libdir="$ac_optarg" ;;

  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
  | --libexe | --libex | --libe)
    ac_prev=libexecdir ;;
  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
  | --libexe=* | --libex=* | --libe=*)
    libexecdir="$ac_optarg" ;;

  -localstatedir | --localstatedir | --localstatedi | --localstated \
  | --localstate | --localstat | --localsta | --localst \
  | --locals | --local | --loca | --loc | --lo)
    ac_prev=localstatedir ;;
  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
    localstatedir="$ac_optarg" ;;

  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
    ac_prev=mandir ;;
  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
    mandir="$ac_optarg" ;;

  -nfp | --nfp | --nf)
    # Obsolete; use --without-fp.
    with_fp=no ;;

  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c)
    no_create=yes ;;

  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
    no_recursion=yes ;;

  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
  | --oldin | --oldi | --old | --ol | --o)
    ac_prev=oldincludedir ;;
  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
    oldincludedir="$ac_optarg" ;;

  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
    ac_prev=prefix ;;
  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
    prefix="$ac_optarg" ;;

  -program-prefix | --program-prefix | --program-prefi | --program-pref \
  | --program-pre | --program-pr | --program-p)
    ac_prev=program_prefix ;;
  -program-prefix=* | --program-prefix=* | --program-prefi=* \
  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
    program_prefix="$ac_optarg" ;;

  -program-suffix | --program-suffix | --program-suffi | --program-suff \
  | --program-suf | --program-su | --program-s)
    ac_prev=program_suffix ;;
  -program-suffix=* | --program-suffix=* | --program-suffi=* \
  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
    program_suffix="$ac_optarg" ;;

  -program-transform-name | --program-transform-name \
  | --program-transform-nam | --program-transform-na \
  | --program-transform-n | --program-transform- \
  | --program-transform | --program-transfor \
  | --program-transfo | --program-transf \
  | --program-trans | --program-tran \
  | --progr-tra | --program-tr | --program-t)
    ac_prev=program_transform_name ;;
  -program-transform-name=* | --program-transform-name=* \
  | --program-transform-nam=* | --program-transform-na=* \
  | --program-transform-n=* | --program-transform-=* \
  | --program-transform=* | --program-transfor=* \
  | --program-transfo=* | --program-transf=* \
  | --program-trans=* | --program-tran=* \
  | --progr-tra=* | --program-tr=* | --program-t=*)
    program_transform_name="$ac_optarg" ;;

  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil)
    silent=yes ;;

  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
    ac_prev=sbindir ;;
  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
  | --sbi=* | --sb=*)
    sbindir="$ac_optarg" ;;

  -sharedstatedir | --sharedstatedir | --sharedstatedi \
  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
  | --sharedst | --shareds | --shared | --share | --shar \
  | --sha | --sh)
    ac_prev=sharedstatedir ;;
  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
  | --sha=* | --sh=*)
    sharedstatedir="$ac_optarg" ;;

  -site | --site | --sit)
    ac_prev=site ;;
  -site=* | --site=* | --sit=*)
    site="$ac_optarg" ;;

  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
    ac_prev=srcdir ;;
  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
    srcdir="$ac_optarg" ;;

  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
  | --syscon | --sysco | --sysc | --sys | --sy)
    ac_prev=sysconfdir ;;
  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
    sysconfdir="$ac_optarg" ;;

  -target | --target | --targe | --targ | --tar | --ta | --t)
    ac_prev=target ;;
  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
    target="$ac_optarg" ;;

  -v | -verbose | --verbose | --verbos | --verbo | --verb)
    verbose=yes ;;

  -version | --version | --versio | --versi | --vers)
    echo "configure generated by autoconf version 2.13"
    exit 0 ;;

  -with-* | --with-*)
    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "with_${ac_package}='$ac_optarg'" ;;

  -without-* | --without-*)
    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    eval "with_${ac_package}=no" ;;

  --x)
    # Obsolete; use --with-x.
    with_x=yes ;;

  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
  | --x-incl | --x-inc | --x-in | --x-i)
    ac_prev=x_includes ;;
  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
    x_includes="$ac_optarg" ;;

  -x-libraries | --x-libraries | --x-librarie | --x-librari \
  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
    ac_prev=x_libraries ;;
  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
    x_libraries="$ac_optarg" ;;

  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
    ;;

  *)
    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
      echo "configure: warning: $ac_option: invalid host type" 1>&2
    fi
    if test "x$nonopt" != xNONE; then
      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
    fi
    nonopt="$ac_option"
    ;;

  esac
done

if test -n "$ac_prev"; then
  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
fi

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

# File descriptor usage:
# 0 standard input
# 1 file creation
# 2 errors and warnings
# 3 some systems may open it to /dev/tty
# 4 used on the Kubota Titan
# 6 checking for... messages and results
# 5 compiler messages saved in config.log
if test "$silent" = yes; then
  exec 6>/dev/null
else
  exec 6>&1
fi
exec 5>./config.log

echo "\
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
" 1>&5

# Strip out --no-create and --no-recursion so they do not pile up.
# Also quote any args containing shell metacharacters.
ac_configure_args=
for ac_arg
do
  case "$ac_arg" in
  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c) ;;
  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
  esac
done

# NLS nuisances.
# Only set these to C if already set.  These must not be set unconditionally
# because not all systems understand e.g. LANG=C (notably SCO).
# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
# Non-C LC_CTYPE values break the ctype check.
if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi

# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -rf conftest* confdefs.h
# AIX cpp loses on an empty file, so make sure it contains at least a newline.
echo > confdefs.h

# A filename unique to this package, relative to the directory that
# configure is in, which we can look for to find out if srcdir is correct.
ac_unique_file=src/logtool.c

# Find the source files, if location was not specified.
if test -z "$srcdir"; then
  ac_srcdir_defaulted=yes
  # Try the directory containing this script, then its parent.
  ac_prog=$0
  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
  srcdir=$ac_confdir
  if test ! -r $srcdir/$ac_unique_file; then
    srcdir=..
  fi
else
  ac_srcdir_defaulted=no
fi
if test ! -r $srcdir/$ac_unique_file; then
  if test "$ac_srcdir_defaulted" = yes; then
    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
  else
    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
  fi
fi
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`

# Prefer explicitly selected file to automatically selected ones.
if test -z "$CONFIG_SITE"; then
  if test "x$prefix" != xNONE; then
    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
  else
    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
  fi
fi
for ac_site_file in $CONFIG_SITE; do
  if test -r "$ac_site_file"; then
    echo "loading site script $ac_site_file"
    . "$ac_site_file"
  fi
done

if test -r "$cache_file"; then
  echo "loading cache $cache_file"
  . $cache_file
else
  echo "creating cache $cache_file"
  > $cache_file
fi

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

ac_exeext=
ac_objext=o
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
    ac_n= ac_c='
' ac_t='	'
  else
    ac_n=-n ac_c= ac_t=
  fi
else
  ac_n= ac_c='\c' ac_t=
fi


# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:529: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="gcc"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

if test -z "$CC"; then
  # Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:559: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_prog_rejected=no
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
	continue
      fi
      ac_cv_prog_CC="cc"
      break
    fi
  done
  IFS="$ac_save_ifs"
if test $ac_prog_rejected = yes; then
  # We found a bogon in the path, so make sure we never use it.
  set dummy $ac_cv_prog_CC
  shift
  if test $# -gt 0; then
    # We chose a different compiler from the bogus one.
    # However, it has the same basename, so the bogon will be chosen
    # first if we set CC to just the basename; use the full file name.
    shift
    set dummy "$ac_dir/$ac_word" "$@"
    shift
    ac_cv_prog_CC="$@"
  fi
fi
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  if test -z "$CC"; then
    case "`uname -s`" in
    *win32* | *WIN32*)
      # Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:610: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="cl"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi
 ;;
    esac
  fi
  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
fi

echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:642: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

cat > conftest.$ac_ext << EOF

#line 653 "configure"
#include "confdefs.h"

main(){return(0);}
EOF
if { (eval echo configure:658: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  ac_cv_prog_cc_works=yes
  # If we can't run a trivial program, we are probably using a cross compiler.
  if (./conftest; exit) 2>/dev/null; then
    ac_cv_prog_cc_cross=no
  else
    ac_cv_prog_cc_cross=yes
  fi
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  ac_cv_prog_cc_works=no
fi
rm -fr conftest*
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
if test $ac_cv_prog_cc_works = no; then
  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:684: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross

echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:689: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
  ac_cv_prog_gcc=yes
else
  ac_cv_prog_gcc=no
fi
fi

echo "$ac_t""$ac_cv_prog_gcc" 1>&6

if test $ac_cv_prog_gcc = yes; then
  GCC=yes
else
  GCC=
fi

ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
echo "configure:717: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  echo 'void f(){}' > conftest.c
if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
  ac_cv_prog_cc_g=yes
else
  ac_cv_prog_cc_g=no
fi
rm -f conftest*

fi

echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
if test "$ac_test_CFLAGS" = set; then
  CFLAGS="$ac_save_CFLAGS"
elif test $ac_cv_prog_cc_g = yes; then
  if test "$GCC" = yes; then
    CFLAGS="-g -O2"
  else
    CFLAGS="-g"
  fi
else
  if test "$GCC" = yes; then
    CFLAGS="-O2"
  else
    CFLAGS=
  fi
fi




if test "`echo "$sysconfdir" | grep "prefix"`" ; then
sysconfdir=`echo $sysconfdir/logtool | sed s/'${prefix}'/""/g`
else
sysconfdir=$sysconfdir
fi


version=1.2.8

ac_aux_dir=
for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
  if test -f $ac_dir/install-sh; then
    ac_aux_dir=$ac_dir
    ac_install_sh="$ac_aux_dir/install-sh -c"
    break
  elif test -f $ac_dir/install.sh; then
    ac_aux_dir=$ac_dir
    ac_install_sh="$ac_aux_dir/install.sh -c"
    break
  fi
done
if test -z "$ac_aux_dir"; then
  { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
fi
ac_config_guess=$ac_aux_dir/config.guess
ac_config_sub=$ac_aux_dir/config.sub
ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.

# Find a good install program.  We prefer a C program (faster),
# so one script is as good as another.  But avoid the broken or
# incompatible versions:
# SysV /etc/install, /usr/sbin/install
# SunOS /usr/etc/install
# IRIX /sbin/install
# AIX /bin/install
# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
# AFS /usr/afsws/bin/install, which mishandles nonexistent args
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
echo "configure:791: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
    IFS="${IFS= 	}"; ac_save_IFS="$IFS"; IFS=":"
  for ac_dir in $PATH; do
    # Account for people who put trailing slashes in PATH elements.
    case "$ac_dir/" in
    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
    *)
      # OSF1 and SCO ODT 3.0 have their own names for install.
      # Don't use installbsd from OSF since it installs stuff as root
      # by default.
      for ac_prog in ginstall scoinst install; do
        if test -f $ac_dir/$ac_prog; then
	  if test $ac_prog = install &&
            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
	    # AIX install.  It has an incompatible calling convention.
	    :
	  else
	    ac_cv_path_install="$ac_dir/$ac_prog -c"
	    break 2
	  fi
	fi
      done
      ;;
    esac
  done
  IFS="$ac_save_IFS"

fi
  if test "${ac_cv_path_install+set}" = set; then
    INSTALL="$ac_cv_path_install"
  else
    # As a last resort, use the slow shell script.  We don't cache a
    # path for INSTALL within a source directory, because that will
    # break other packages using the cache if that directory is
    # removed, or if the path is relative.
    INSTALL="$ac_install_sh"
  fi
fi
echo "$ac_t""$INSTALL" 1>&6

# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
# It thinks the first close brace ends the variable substitution.
test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'

test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'

test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'


installprog="$INSTALL"
	
echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
echo "configure:847: checking whether ln -s works" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  rm -f conftestdata
if ln -s X conftestdata 2>/dev/null
then
  rm -f conftestdata
  ac_cv_prog_LN_S="ln -s"
else
  ac_cv_prog_LN_S=ln
fi
fi
LN_S="$ac_cv_prog_LN_S"
if test "$ac_cv_prog_LN_S" = "ln -s"; then
  echo "$ac_t""yes" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
echo "configure:868: checking whether ${MAKE-make} sets \${MAKE}" >&5
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftestmake <<\EOF
all:
	@echo 'ac_maketemp="${MAKE}"'
EOF
# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
if test -n "$ac_maketemp"; then
  eval ac_cv_prog_make_${ac_make}_set=yes
else
  eval ac_cv_prog_make_${ac_make}_set=no
fi
rm -f conftestmake
fi
if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  SET_MAKE=
else
  echo "$ac_t""no" 1>&6
  SET_MAKE="MAKE=${MAKE-make}"
fi


echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
echo "configure:896: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
  CPP=
fi
if test -z "$CPP"; then
if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
    # This must be in double quotes, not single quotes, because CPP may get
  # substituted into the Makefile and "${CC-cc}" will confuse make.
  CPP="${CC-cc} -E"
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp.
  cat > conftest.$ac_ext <
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:917: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP="${CC-cc} -E -traditional-cpp"
  cat > conftest.$ac_ext <
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:934: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP="${CC-cc} -nologo -E"
  cat > conftest.$ac_ext <
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:951: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP=/lib/cpp
fi
rm -f conftest*
fi
rm -f conftest*
fi
rm -f conftest*
  ac_cv_prog_CPP="$CPP"
fi
  CPP="$ac_cv_prog_CPP"
else
  ac_cv_prog_CPP="$CPP"
fi
echo "$ac_t""$CPP" 1>&6

echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
echo "configure:976: checking for ANSI C header files" >&5
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <
#include 
#include 
#include 
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:989: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  ac_cv_header_stdc=yes
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_header_stdc=no
fi
rm -f conftest*

if test $ac_cv_header_stdc = yes; then
  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat > conftest.$ac_ext <
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "memchr" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  ac_cv_header_stdc=no
fi
rm -f conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat > conftest.$ac_ext <
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "free" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  ac_cv_header_stdc=no
fi
rm -f conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
if test "$cross_compiling" = yes; then
  :
else
  cat > conftest.$ac_ext <
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
int main () { int i; for (i = 0; i < 256; i++)
if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
exit (0); }

EOF
if { (eval echo configure:1056: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  ac_cv_header_stdc=no
fi
rm -fr conftest*
fi

fi
fi

echo "$ac_t""$ac_cv_header_stdc" 1>&6
if test $ac_cv_header_stdc = yes; then
  cat >> confdefs.h <<\EOF
#define STDC_HEADERS 1
EOF

fi


for ac_func in inet_addr
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1083: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:1111: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.h <&6
echo $ac_n "checking for inet_addr in -lnsl""... $ac_c" 1>&6
echo "configure:1133: checking for inet_addr in -lnsl" >&5
ac_lib_var=`echo nsl'_'inet_addr | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lnsl  $LIBS"
cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  
                LIBS="-lnsl $LIBS"
        
else
  echo "$ac_t""no" 1>&6

                echo $ac_n "checking for inet_addr in -lm""... $ac_c" 1>&6
echo "configure:1174: checking for inet_addr in -lm" >&5
ac_lib_var=`echo m'_'inet_addr | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lm  $LIBS"
cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  
                        LIBS="-lm $LIBS"
                
else
  echo "$ac_t""no" 1>&6

                        echo "configure: warning: Warning: unable to find inet_addr - resolver disabled" 1>&2
                        cat >> confdefs.h <<\EOF
#define NO_RESOLVER 1
EOF

                        NO_RESOLVER="yes"
                
fi

        
fi


fi
done


for ac_func in gethostbyaddr
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1234: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:1262: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.h <&6
echo $ac_n "checking for gethostbyaddr in -lnsl""... $ac_c" 1>&6
echo "configure:1284: checking for gethostbyaddr in -lnsl" >&5
ac_lib_var=`echo nsl'_'gethostbyaddr | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lnsl  $LIBS"
cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  
                tvar="`echo $LIBS | grep lnsl`"
                if test "$tavr" != "" ; then
                  LIBS="-lnsl $LIBS"
                fi
        
else
  echo "$ac_t""no" 1>&6

                echo $ac_n "checking for gethostbyaddr in -lm""... $ac_c" 1>&6
echo "configure:1328: checking for gethostbyaddr in -lm" >&5
ac_lib_var=`echo m'_'gethostbyaddr | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lm  $LIBS"
cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  
                        tvar="`echo $LIBS | grep lm`"
                        if test "$tavr" != "" ; then
                          LIBS="-lm $LIBS"
                        fi
                
else
  echo "$ac_t""no" 1>&6

                        echo "configure: warning: Warning: unable to find gethostbyaddr - resolver disabled" 1>&2
                        cat >> confdefs.h <<\EOF
#define NO_RESOLVER 1
EOF

                        NO_RESOLVER="yes"
                
fi


        
fi



fi
done


for ac_hdr in unistd.h sysexits.h regex.h time.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:1394: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1404: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
  cat >> confdefs.h <&6
{ echo "configure: error: Fatal Error: required header file missing." 1>&2; exit 1; }

fi
done


for ac_hdr in getopt.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:1438: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1448: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
  cat >> confdefs.h <&6
fi
done


echo $ac_n "checking for working const""... $ac_c" 1>&6
echo "configure:1476: checking for working const" >&5
if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <j = 5;
}
{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
  const int foo = 10;
}

; return 0; }
EOF
if { (eval echo configure:1530: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_c_const=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_c_const=no
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_c_const" 1>&6
if test $ac_cv_c_const = no; then
  cat >> confdefs.h <<\EOF
#define const 
EOF

fi

echo $ac_n "checking for size_t""... $ac_c" 1>&6
echo "configure:1551: checking for size_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <
#if STDC_HEADERS
#include 
#include 
#endif
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
  rm -rf conftest*
  ac_cv_type_size_t=yes
else
  rm -rf conftest*
  ac_cv_type_size_t=no
fi
rm -f conftest*

fi
echo "$ac_t""$ac_cv_type_size_t" 1>&6
if test $ac_cv_type_size_t = no; then
  cat >> confdefs.h <<\EOF
#define size_t unsigned
EOF

fi


for ac_func in strncasecmp
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1587: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:1615: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.h <&6
{ echo "configure: error: Fatal Error: strncasecmp not available" 1>&2; exit 1; }

fi
done


for ac_func in setenv
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1645: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:1673: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.h <> confdefs.h <<\EOF
#define HAVE_SETENV 1
EOF


else
  echo "$ac_t""no" 1>&6
fi
done


for ac_func in regcomp regexec regfree
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1706: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:1734: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.h <&6
{ echo "configure: error: Fatal Error: regex library functions nonstandard/incomplete" 1>&2; exit 1; }

fi
done



 

trap '' 1 2 15
cat > confcache <<\EOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs.  It is not useful on other systems.
# If it contains results you don't want to keep, you may remove or edit it.
#
# By default, configure uses ./config.cache as the cache file,
# creating it if it does not exist already.  You can give configure
# the --cache-file=FILE option to use a different cache file; that is
# what configure does when it calls configure scripts in
# subdirectories, so they share the cache.
# Giving --cache-file=/dev/null disables caching, for debugging configure.
# config.status only pays attention to the cache file if you give it the
# --recheck option to rerun configure.
#
EOF
# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, don't put newlines in cache variables' values.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(set) 2>&1 |
  case `(ac_space=' '; set | grep ac_space) 2>&1` in
  *ac_space=\ *)
    # `set' does not quote correctly, so add quotes (double-quote substitution
    # turns \\\\ into \\, and sed turns \\ into \).
    sed -n \
      -e "s/'/'\\\\''/g" \
      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
    ;;
  *)
    # `set' quotes correctly as required by POSIX, so do not add quotes.
    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
    ;;
  esac >> confcache
if cmp -s $cache_file confcache; then
  :
else
  if test -w $cache_file; then
    echo "updating cache $cache_file"
    cat confcache > $cache_file
  else
    echo "not updating unwritable cache $cache_file"
  fi
fi
rm -f confcache

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'

# Any assignment to VPATH causes Sun make to only execute
# the first set of double-colon rules, so remove it if not needed.
# If there is a colon in the path, we need to keep it.
if test "x$srcdir" = x.; then
  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
fi

trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15

DEFS=-DHAVE_CONFIG_H

# Without the "./", some shells look in PATH for config.status.
: ${CONFIG_STATUS=./config.status}

echo creating $CONFIG_STATUS
rm -f $CONFIG_STATUS
cat > $CONFIG_STATUS </dev/null | sed 1q`:
#
# $0 $ac_configure_args
#
# Compiler output produced by configure, useful for debugging
# configure, is in ./config.log if it exists.

ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
for ac_option
do
  case "\$ac_option" in
  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
    echo "$CONFIG_STATUS generated by autoconf version 2.13"
    exit 0 ;;
  -help | --help | --hel | --he | --h)
    echo "\$ac_cs_usage"; exit 0 ;;
  *) echo "\$ac_cs_usage"; exit 1 ;;
  esac
done

ac_given_srcdir=$srcdir
ac_given_INSTALL="$INSTALL"

trap 'rm -fr `echo "logtool.spec src/config.h src/Makefile Makefile conf/logtool.conf doc/logtool.1 doc/logtool.txt config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
EOF
cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF
$ac_vpsub
$extrasub
s%@SHELL@%$SHELL%g
s%@CFLAGS@%$CFLAGS%g
s%@CPPFLAGS@%$CPPFLAGS%g
s%@CXXFLAGS@%$CXXFLAGS%g
s%@FFLAGS@%$FFLAGS%g
s%@DEFS@%$DEFS%g
s%@LDFLAGS@%$LDFLAGS%g
s%@LIBS@%$LIBS%g
s%@exec_prefix@%$exec_prefix%g
s%@prefix@%$prefix%g
s%@program_transform_name@%$program_transform_name%g
s%@bindir@%$bindir%g
s%@sbindir@%$sbindir%g
s%@libexecdir@%$libexecdir%g
s%@datadir@%$datadir%g
s%@sysconfdir@%$sysconfdir%g
s%@sharedstatedir@%$sharedstatedir%g
s%@localstatedir@%$localstatedir%g
s%@libdir@%$libdir%g
s%@includedir@%$includedir%g
s%@oldincludedir@%$oldincludedir%g
s%@infodir@%$infodir%g
s%@mandir@%$mandir%g
s%@CC@%$CC%g
s%@version@%$version%g
s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
s%@INSTALL_DATA@%$INSTALL_DATA%g
s%@installprog@%$installprog%g
s%@LN_S@%$LN_S%g
s%@SET_MAKE@%$SET_MAKE%g
s%@CPP@%$CPP%g

CEOF
EOF

cat >> $CONFIG_STATUS <<\EOF

# Split the substitutions into bite-sized pieces for seds with
# small command number limits, like on Digital OSF/1 and HP-UX.
ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
ac_file=1 # Number of current file.
ac_beg=1 # First line for current file.
ac_end=$ac_max_sed_cmds # Line after last line for current file.
ac_more_lines=:
ac_sed_cmds=""
while $ac_more_lines; do
  if test $ac_beg -gt 1; then
    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
  else
    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
  fi
  if test ! -s conftest.s$ac_file; then
    ac_more_lines=false
    rm -f conftest.s$ac_file
  else
    if test -z "$ac_sed_cmds"; then
      ac_sed_cmds="sed -f conftest.s$ac_file"
    else
      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
    fi
    ac_file=`expr $ac_file + 1`
    ac_beg=$ac_end
    ac_end=`expr $ac_end + $ac_max_sed_cmds`
  fi
done
if test -z "$ac_sed_cmds"; then
  ac_sed_cmds=cat
fi
EOF

cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
  case "$ac_file" in
  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
  *) ac_file_in="${ac_file}.in" ;;
  esac

  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.

  # Remove last slash and all that follows it.  Not all systems have dirname.
  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
    # The file is in a subdirectory.
    test ! -d "$ac_dir" && mkdir "$ac_dir"
    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
    # A "../" for each directory in $ac_dir_suffix.
    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
  else
    ac_dir_suffix= ac_dots=
  fi

  case "$ac_given_srcdir" in
  .)  srcdir=.
      if test -z "$ac_dots"; then top_srcdir=.
      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
  *) # Relative path.
    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
    top_srcdir="$ac_dots$ac_given_srcdir" ;;
  esac

  case "$ac_given_INSTALL" in
  [/$]*) INSTALL="$ac_given_INSTALL" ;;
  *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
  esac

  echo creating "$ac_file"
  rm -f "$ac_file"
  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
  case "$ac_file" in
  *Makefile*) ac_comsub="1i\\
# $configure_input" ;;
  *) ac_comsub= ;;
  esac

  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
  sed -e "$ac_comsub
s%@configure_input@%$configure_input%g
s%@srcdir@%$srcdir%g
s%@top_srcdir@%$top_srcdir%g
s%@INSTALL@%$INSTALL%g
" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
fi; done
rm -f conftest.s*

# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
# NAME is the cpp macro being defined and VALUE is the value it is being given.
#
# ac_d sets the value in "#define NAME VALUE" lines.
ac_dA='s%^\([ 	]*\)#\([ 	]*define[ 	][ 	]*\)'
ac_dB='\([ 	][ 	]*\)[^ 	]*%\1#\2'
ac_dC='\3'
ac_dD='%g'
# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
ac_uA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
ac_uB='\([ 	]\)%\1#\2define\3'
ac_uC=' '
ac_uD='\4%g'
# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
ac_eA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
ac_eB='$%\1#\2define\3'
ac_eC=' '
ac_eD='%g'

if test "${CONFIG_HEADERS+set}" != set; then
EOF
cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF
fi
for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
  case "$ac_file" in
  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
  *) ac_file_in="${ac_file}.in" ;;
  esac

  echo creating $ac_file

  rm -f conftest.frag conftest.in conftest.out
  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
  cat $ac_file_inputs > conftest.in

EOF

# Transform confdefs.h into a sed script conftest.vals that substitutes
# the proper values into config.h.in to produce config.h.  And first:
# Protect against being on the right side of a sed subst in config.status.
# Protect against being in an unquoted here document in config.status.
rm -f conftest.vals
cat > conftest.hdr <<\EOF
s/[\\&%]/\\&/g
s%[\\$`]%\\&%g
s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
s%ac_d%ac_u%gp
s%ac_u%ac_e%gp
EOF
sed -n -f conftest.hdr confdefs.h > conftest.vals
rm -f conftest.hdr

# This sed command replaces #undef with comments.  This is necessary, for
# example, in the case of _POSIX_SOURCE, which is predefined and required
# on some systems where configure will not decide to define it.
cat >> conftest.vals <<\EOF
s%^[ 	]*#[ 	]*undef[ 	][ 	]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
EOF

# Break up conftest.vals because some shells have a limit on
# the size of here documents, and old seds have small limits too.

rm -f conftest.tail
while :
do
  ac_lines=`grep -c . conftest.vals`
  # grep -c gives empty output for an empty file on some AIX systems.
  if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
  # Write a limited-size here document to conftest.frag.
  echo '  cat > conftest.frag <> $CONFIG_STATUS
  sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
  echo 'CEOF
  sed -f conftest.frag conftest.in > conftest.out
  rm -f conftest.in
  mv conftest.out conftest.in
' >> $CONFIG_STATUS
  sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
  rm -f conftest.vals
  mv conftest.tail conftest.vals
done
rm -f conftest.vals

cat >> $CONFIG_STATUS <<\EOF
  rm -f conftest.frag conftest.h
  echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
  cat conftest.in >> conftest.h
  rm -f conftest.in
  if cmp -s $ac_file conftest.h 2>/dev/null; then
    echo "$ac_file is unchanged"
    rm -f conftest.h
  else
    # Remove last slash and all that follows it.  Not all systems have dirname.
      ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
      # The file is in a subdirectory.
      test ! -d "$ac_dir" && mkdir "$ac_dir"
    fi
    rm -f $ac_file
    mv conftest.h $ac_file
  fi
fi; done

EOF
cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF

exit 0
EOF
chmod +x $CONFIG_STATUS
rm -fr confdefs* $ac_clean_files
test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1


echo "

Build was configured as follows:

Prefix:					$prefix
Configuration files wil be placed in:	$sysconfdir
Binaries will be placed in:		$prefix/bin
Using this install program:		$installprog
We will use the following compiler:	$CC
With the following CFLAGS:              $CFLAGS
With the following DEFS:                $DEFS
With the following LIBS:                $LIBS"

logtool-1.2.8/configure.in0000644000372000017500000000565310046512373015157 0ustar  wouterwouterAM_INIT_AUTOMAKE(logtool,1.2.8)
AM_PROG_CC_STDC

dnl Process this file with autoconf to produce a configure script.
AC_INIT(src/logtool.c)
dnl Checks for programs.
AC_PROG_CC
AC_PREFIX_DEFAULT(/usr)

dnl We want the sysconfdir to be damn near standard
AC_SUBST(sysconfdir)
if test "`echo "$sysconfdir" | grep "prefix"`" ; then
sysconfdir=`echo $sysconfdir/logtool | sed s/'${prefix}'/""/g`
else
sysconfdir=$sysconfdir
fi

AC_SUBST(version)
version=1.2.8

AC_PROG_INSTALL
AC_SUBST(installprog)
installprog="$INSTALL"
	
AC_PROG_LN_S
AC_PROG_MAKE_SET

AC_HEADER_STDC

AC_CHECK_FUNCS(inet_addr,
[],
[
        AC_CHECK_LIB(nsl, inet_addr,
        [
                LIBS="-lnsl $LIBS"
        ],
        [
                AC_CHECK_LIB(m, inet_addr,
                [
                        LIBS="-lm $LIBS"
                ],
                [
                        AC_MSG_WARN([Warning: unable to find inet_addr - resolver disabled])
                        AC_DEFINE(NO_RESOLVER)
                        NO_RESOLVER="yes"
                ])
        ])
])

AC_CHECK_FUNCS(gethostbyaddr,
[],
[
        AC_CHECK_LIB(nsl, gethostbyaddr,
        [
                tvar="`echo $LIBS | grep lnsl`"
                if test "$tavr" != "" ; then
                  LIBS="-lnsl $LIBS"
                fi
        ],
        [
                AC_CHECK_LIB(m, gethostbyaddr,
                [
                        tvar="`echo $LIBS | grep lm`"
                        if test "$tavr" != "" ; then
                          LIBS="-lm $LIBS"
                        fi
                ],
                [
                        AC_MSG_WARN([Warning: unable to find gethostbyaddr - resolver disabled])
                        AC_DEFINE(NO_RESOLVER)
                        NO_RESOLVER="yes"
                ])

        ])
]
[])

dnl Checks for header files.
AC_CHECK_HEADERS(unistd.h sysexits.h regex.h time.h,
[
],
[
	AC_MSG_ERROR([Fatal Error: required header file missing.])
])

dnl this isn't a fatal error, as we can use our own copy (we hope :)
AC_CHECK_HEADERS(getopt.h)

dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_TYPE_SIZE_T

dnl Checks for library functions.
AC_CHECK_FUNCS(strncasecmp,
[],
[
	AC_MSG_ERROR([Fatal Error: strncasecmp not available])
])

AC_CHECK_FUNCS(setenv, 
[
	AC_DEFINE(HAVE_SETENV)
],
[])

AC_CHECK_FUNCS(regcomp regexec regfree,
[],
[
	AC_MSG_ERROR([Fatal Error: regex library functions nonstandard/incomplete])
])


AC_CONFIG_HEADER(config.h) 

AC_OUTPUT(logtool.spec src/config.h src/Makefile Makefile conf/logtool.conf doc/logtool.1 doc/logtool.txt)

echo "

Build was configured as follows:

Prefix:					$prefix
Configuration files wil be placed in:	$sysconfdir
Binaries will be placed in:		$prefix/bin
Using this install program:		$installprog
We will use the following compiler:	$CC
With the following CFLAGS:              $CFLAGS
With the following DEFS:                $DEFS
With the following LIBS:                $LIBS"

logtool-1.2.8/install-sh0000755000372000017500000001272007227666177014666 0ustar  wouterwouter#!/bin/sh
#
# install - install a program, script, or datafile
# This comes from X11R5 (mit/util/scripts/install.sh).
#
# Copyright 1991 by the Massachusetts Institute of Technology
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
# the above copyright notice appear in all copies and that both that
# copyright notice and this permission notice appear in supporting
# documentation, and that the name of M.I.T. not be used in advertising or
# publicity pertaining to distribution of the software without specific,
# written prior permission.  M.I.T. makes no representations about the
# suitability of this software for any purpose.  It is provided "as is"
# without express or implied warranty.
#
# Calling this script install-sh is preferred over install.sh, to prevent
# `make' implicit rules from creating a file called install from it
# when there is no Makefile.
#
# This script is compatible with the BSD install script, but was written
# from scratch.  It can only install one file at a time, a restriction
# shared with many OS's install programs.


# set DOITPROG to echo to test this script

# Don't use :- since 4.3BSD and earlier shells don't like it.
doit="${DOITPROG-}"


# put in absolute paths if you don't have them in your path; or use env. vars.

mvprog="${MVPROG-mv}"
cpprog="${CPPROG-cp}"
chmodprog="${CHMODPROG-chmod}"
chownprog="${CHOWNPROG-chown}"
chgrpprog="${CHGRPPROG-chgrp}"
stripprog="${STRIPPROG-strip}"
rmprog="${RMPROG-rm}"
mkdirprog="${MKDIRPROG-mkdir}"

transformbasename=""
transform_arg=""
instcmd="$mvprog"
chmodcmd="$chmodprog 0755"
chowncmd=""
chgrpcmd=""
stripcmd=""
rmcmd="$rmprog -f"
mvcmd="$mvprog"
src=""
dst=""
dir_arg=""

while [ x"$1" != x ]; do
    case $1 in
	-c) instcmd="$cpprog"
	    shift
	    continue;;

	-d) dir_arg=true
	    shift
	    continue;;

	-m) chmodcmd="$chmodprog $2"
	    shift
	    shift
	    continue;;

	-o) chowncmd="$chownprog $2"
	    shift
	    shift
	    continue;;

	-g) chgrpcmd="$chgrpprog $2"
	    shift
	    shift
	    continue;;

	-s) stripcmd="$stripprog"
	    shift
	    continue;;

	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
	    shift
	    continue;;

	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
	    shift
	    continue;;

	*)  if [ x"$src" = x ]
	    then
		src=$1
	    else
		# this colon is to work around a 386BSD /bin/sh bug
		:
		dst=$1
	    fi
	    shift
	    continue;;
    esac
done

if [ x"$src" = x ]
then
	echo "install:	no input file specified"
	exit 1
else
	true
fi

if [ x"$dir_arg" != x ]; then
	dst=$src
	src=""
	
	if [ -d $dst ]; then
		instcmd=:
	else
		instcmd=mkdir
	fi
else

# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
# might cause directories to be created, which would be especially bad 
# if $src (and thus $dsttmp) contains '*'.

	if [ -f $src -o -d $src ]
	then
		true
	else
		echo "install:  $src does not exist"
		exit 1
	fi
	
	if [ x"$dst" = x ]
	then
		echo "install:	no destination specified"
		exit 1
	else
		true
	fi

# If destination is a directory, append the input filename; if your system
# does not like double slashes in filenames, you may need to add some logic

	if [ -d $dst ]
	then
		dst="$dst"/`basename $src`
	else
		true
	fi
fi

## this sed command emulates the dirname command
dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`

# Make sure that the destination directory exists.
#  this part is taken from Noah Friedman's mkinstalldirs script

# Skip lots of stat calls in the usual case.
if [ ! -d "$dstdir" ]; then
defaultIFS='	
'
IFS="${IFS-${defaultIFS}}"

oIFS="${IFS}"
# Some sh's can't handle IFS=/ for some reason.
IFS='%'
set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
IFS="${oIFS}"

pathcomp=''

while [ $# -ne 0 ] ; do
	pathcomp="${pathcomp}${1}"
	shift

	if [ ! -d "${pathcomp}" ] ;
        then
		$mkdirprog "${pathcomp}"
	else
		true
	fi

	pathcomp="${pathcomp}/"
done
fi

if [ x"$dir_arg" != x ]
then
	$doit $instcmd $dst &&

	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
else

# If we're going to rename the final executable, determine the name now.

	if [ x"$transformarg" = x ] 
	then
		dstfile=`basename $dst`
	else
		dstfile=`basename $dst $transformbasename | 
			sed $transformarg`$transformbasename
	fi

# don't allow the sed command to completely eliminate the filename

	if [ x"$dstfile" = x ] 
	then
		dstfile=`basename $dst`
	else
		true
	fi

# Make a temp file name in the proper directory.

	dsttmp=$dstdir/#inst.$$#

# Move or copy the file name to the temp name

	$doit $instcmd $src $dsttmp &&

	trap "rm -f ${dsttmp}" 0 &&

# and set any options; do chmod last to preserve setuid bits

# If any of these fail, we abort the whole thing.  If we want to
# ignore errors from any of these, just make sure not to ignore
# errors from the above "$doit $instcmd $src $dsttmp" command.

	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&

# Now rename the file to the real destination.

	$doit $rmcmd -f $dstdir/$dstfile &&
	$doit $mvcmd $dsttmp $dstdir/$dstfile 

fi &&


exit 0
logtool-1.2.8/logtool.spec.in0000644000372000017500000002434707643371061015615 0ustar  wouterwouter# This file is automagically generated by ./configure.  Don't mess with it
# by hand unless you know what you're doing.  --A.L.Lambert

Summary: A handy syslog file(s) manipulation/monitoring/parsing tool
Vendor: A.L.Lambert
Name: logtool
Version: @version@
Release: 1
Copyright: GPL
Group: Applications/Text
Source: %{name}-%{version}.tar.gz
Buildroot: /var/tmp/logtool

%description
	Logtool is a handy little tool for manipulation/monitoring/parsing
of syslog (and syslog-like) files.  It produces output in ANSI, ASCII, CSV,
HTML format, and is easily configured to your needs via the /etc/logtool/* 
files.  It is suitable for use in generating easy to read logfile reports, 
webpages, and online monitoring of logfiles.

	Please see the included documentation files (which are located in 
/usr/doc/%{name}-%{version}) for more details. 

%prep
%setup  
%build
# Make sure we clean up anything I might have fscked up and left laying around
# in the source tree.
make clean
# configure for a default install 
./configure 
# build the binaries
make

%install
# Until I get the hang of autoconf and friends, the stuff below is the same 
# thing as "make install" taking into account $RPM_BUILD_ROOT

make install DESTDIR=$RPM_BUILD_ROOT


%clean
# blow away the build dir structure
rm -rf $RPM_BUILD_ROOT

%post

%postun


%files
%defattr(-,root,root)
%doc README COPYING TODO INSTALL CHANGES USAGE CREDITS logtool.spec doc/* scripts/*
%config(noreplace) @sysconfdir@/*
@prefix@/bin/logtool
@prefix@/man/man1/logtool.1*


%changelog
* Fri Apr 04 2003 A.L.Lambert 
- Fixed some bugs in how duplicate suppression was handled and some misc stuff.
- it's better - you should upgrade. :)

* Tue Mar 18 2003 A.L.Lambert 
- 1.2.0 is getting ready for initial release!  WOOHOO!!!!
-
- Still probably a few days away as I write this, but we're about there.
-
- Changes are WAY too much to list in total, but a few highlights:
-	Now speaks TAI64 dates (IE: D.J.Bernstien's multilog and friends).
-	Now can optionally suppress duplicate messages.
-	Now can support and colorize unknown logfile formats
-	Now can do really cool things with snort and iptables syslog entries
-		(ip->hostname resolution, special colors, and more!)
-	Now has special options for a syslog-ng formated log.
-	Code architecture is VERY VERY VERY changed and better.
-		Light years better at error handling.
-		Nice facility to write more modules like snort and iptables.
-		Way more efficient (but not faster; too much new processing :)
-
- 	And much much more!!! Try it, you'll like it!! (I hope :)

* Fri Nov 22 2002 A.L.Lambert 
- Returning to active development of logtool to implement a few new ideas I've had.
-
- Somewhat major changes; added color options for:
-	Magenta
-	Blue
-	Cyan
-	Bright Cyan
-
- Rewrote regex.c a bit to make it easy for future allowances of new REGEX's
- Minor tweaks and other code stuff.
-
- Have begun adding hooks for specialized output modules for known event types
-	(no working code on this front yet).
-
- Preparing to write a ncurses module (no code on this fron yet either!)

* Mon Jun 11 2001 A.L.Lambert 
- Minor changes for 1.0.6 release as follows:
-
- Modified the autoconf stuff to (hopefully) be more cross-platform
-
- Added a fflush(stdin); to make logtool happier with scripts that do 
- line-by-line reading on platforms who's libc doesn't do this automatically
- for printf(); and friends.
-
- Probably a few little things I'm forgetting. :)


* Thu Feb 01 2001 A.L.Lambert 
- Tweaked the 1.0.5 release as follows:
-
- Added configure.in statements to make ./configure point to the propper
- paths in the documentation (config file stuff).

* Mon Jan 29 2001 A.L.Lambert 
- 1.0.5 release.  Not much new except the following:
-
-	Now uses GNU autoconf and friends to configure for build
-	Fixes a small compile time bug for ScoUnixware induced in 1.0.4
-	Not much else. :)

* Sat Jan 27 2001 A.L.Lambert 
- 1.0.4 release.  Only chage is a modification to the format check to allow
- for broken-ness in PAM syslog messages on RedHat 7.0

* Wed Jan 16 2001 A.L.Lambert 
- I think I have the configure stuff all tweaked out like it should be.
- No doubt I'm wrong on that count, but it's getting closer to release grade
- stuff.
-
- Wrote a manpage for logtool.  manpages are annoying to write/deal with.

* Sun Jan 14 2001 A.L.Lambert 
- Commenced converting to a GNU autoconf/configure build process for easier
- cross-platform portability.  Hopefully this will make our lives nicer in the
- long run.
-
- This spec file is even built using configure.  Isn't that neat. :)

* Thu Jan 11 2001 A.L.Lambert 
- 1.0.4 pre-release started.  Hopefully nothing major in this release.
-
- First change, modification of the lt_fmtcheck() function to fix some 
- format mismatch problems on RedHat 7.0.  See logtool/regex.c for the 
- specifics. (thanks to Laurent Jacquot for pointing this out)
-
- Fixed two minor compilation problems on AIX.  
- 	1.  Getopt returns int, and I was reading it as a char: fixed
-	2.  AIX defines 'regex', which clashed with the struct I will be 
-	    using to hold regex strings: fixed
- (thanks to Thanh Ma for pointing these two things out to me)

* Wed Jan 11 2001 A.L.Lambert 
- 1.0.3 release 'officially' declared ready to go.  No new changes since
- the comments below, just some e-mail feedback from the folks testing the
- changes indicating that everything seems to be working fine. 
-

* Tue Jan 10 2001 A.L.Lambert 
- Updated version to 1.0.3 to reflect changes below.  Still waiting to hear
- back from the folks that are testing these changes.  They should work, 
- but until I know for sure, the 1.0.3 release should be considered BETA, and
- subject to change without version number incrementation prior to public 
- release.
-
- Wrote a really ugly configure script to handle the SCO vs everything else
- differences. (at this point, it just copies the appropo logtail.*.c file to
- logtail.c, and initializes the main Makefile)
-
- Made some changes to the logtool/Makefile to build only the objects/binaries
- by default (reported problems with OpenBSD 2.8's 'make' not building library
- correctly).  Also added a "make lib" option so that anyone wishing to have
- the library can build it. (really, who needs the library for this?)
-
- Later that night:
- 
- Ying-Chieh Liao pointed out some "features" in the logtool/Makefile, which 
- I have now fixed. (see, I told you I might change it before the official
- release) ;)
-
- Report from Andreas ึstling on the OpenBSD changes looks good.  
-
- Sanitized e-mail addresses in this file, since it gets displayed on the 
- website (I'd hate to think some spammer snagged the e-mail addresses of
- the nice folks who've helped me out from my website).

* Fri Jan 05 2001 A.L.Lambert 
- Updated to fix the missing symlink to /usr/bin/lt.
- Included the changes suggested from Thomas Hagar listed below

* Fri Jan 05 2001 Thomas Hager 
- replaced cp with install in %install

* Thu Jan 04 2001 A.L.Lambert 
- Various fixes so's it will compile under the original cc-compiler from 
- SUN (Solaris 2.6).  Thanks to Christoph Krempe 
- for pointing out the problems, and working with me on fixes.  Christoph
- should also get credit for pointing out the bug in the includefile 
- functionality that was fixed below.
-
- It compiled
- It worked for me
- I shipped it. :P

* Fri Dec 29 2000 A.L.Lambert 
- Working on fixes for Solaris (why did I expect this?) for version 1.0.2
-
- So far, I've done the following:
- 	Tested with removing the strncasecmp() decl - seems to work fine
- 	Removed the getopt_long() and related stuff, and use only getopt()
-
-	Waiting on report back from Christoph Krempe on the success/failure
-	of these steps.

* Thu Dec 28 2000 A.L.Lambert 
- Big OOPS! The includefile functionality was broken!  I have no idea how I
- missed this the first time around, but it's fixed now. Updated version to 
- 1.0.1

* Tue Dec 26 2000 A.L.Lambert 
- Woohoo!  1.0 release is good to go (as far as I can tell)!
-
- Documentation is still a bit shabby, but it's better than some I've seen.
- Still some things in the TODO list that I'd like to get done Real Soon Now.
- 
- But all in all, all the features are in place, they all work flawlessly as
- far as I can tell (famous last words of a programmer :), and as they say in
- GNU land; "It works for me."
-
- Later that day:
-
- Modified the getopt.c stuff to allow for specification of an alternate 
- config file instead of being stuck with the system defaults.
- 
- Fixed a minor bug in the ansi.c module (color display thing)
-
- Updated CREDITS and a few things in doc/logtool.txt

* Mon Dec 25 2000 A.L.Lambert 
- Now have a working program!  WooHoo!!
-
- I lied about not messing with it till the 27'th.
-
- I think most all of the back-end code is done (cfg file reader, getopt, etc)
- ANSI, ASCII, RAW, and CSV output modules are completed (more/less), and
- everything test's OK, even with bizare/broken input.  Probably some buffer
- overlows in here somewhere, but this program is not/will not be SUID, so I
- don't think that's too big a deal (and will never happen unless users muss 
- up the config file really badly or overdo the REGEX string files).
-
- Still TODO
-	Write the HTML 
, and HTML  output modules
-	Change the way we do REGEX's (need to compile the paterns once, not 
-		every time).
-	Documentation, Documentation, Documentation.  :(
-	Clean up the code some more so I won't be quite so embarrassed when I 
-	release this thing.  :)

* Sun Dec 24 2000 A.L.Lambert 
- Came up with idea, and commenced work on getting this thing ready for 
- distribution
-	Code is about half written at this point, but should progress
-	relatively quickly (I type way too fast).
-
-	Anciliary stuff (Makefile's, .spec file, etc.) is pretty much done.
-	
-	Documentation is basically un-started (although this program ain't
-	likely to need a rocket scientist to run it).
-
-	I have to go to bed so's I can be fresh for Christmas, so no more work
-	will likely be getting done until around the 27'th.
logtool-1.2.8/logtool.spec0000644000372000017500000002433310276711537015205 0ustar  wouterwouter# This file is automagically generated by ./configure.  Don't mess with it
# by hand unless you know what you're doing.  --A.L.Lambert

Summary: A handy syslog file(s) manipulation/monitoring/parsing tool
Vendor: A.L.Lambert
Name: logtool
Version: 1.2.8
Release: 1
Copyright: GPL
Group: Applications/Text
Source: %{name}-%{version}.tar.gz
Buildroot: /var/tmp/logtool

%description
	Logtool is a handy little tool for manipulation/monitoring/parsing
of syslog (and syslog-like) files.  It produces output in ANSI, ASCII, CSV,
HTML format, and is easily configured to your needs via the /etc/logtool/* 
files.  It is suitable for use in generating easy to read logfile reports, 
webpages, and online monitoring of logfiles.

	Please see the included documentation files (which are located in 
/usr/doc/%{name}-%{version}) for more details. 

%prep
%setup  
%build
# Make sure we clean up anything I might have fscked up and left laying around
# in the source tree.
make clean
# configure for a default install 
./configure 
# build the binaries
make

%install
# Until I get the hang of autoconf and friends, the stuff below is the same 
# thing as "make install" taking into account $RPM_BUILD_ROOT

make install DESTDIR=$RPM_BUILD_ROOT


%clean
# blow away the build dir structure
rm -rf $RPM_BUILD_ROOT

%post

%postun


%files
%defattr(-,root,root)
%doc README COPYING TODO INSTALL CHANGES USAGE CREDITS logtool.spec doc/* scripts/*
%config(noreplace) /etc/logtool/*
/usr/bin/logtool
/usr/man/man1/logtool.1*


%changelog
* Fri Apr 04 2003 A.L.Lambert 
- Fixed some bugs in how duplicate suppression was handled and some misc stuff.
- it's better - you should upgrade. :)

* Tue Mar 18 2003 A.L.Lambert 
- 1.2.0 is getting ready for initial release!  WOOHOO!!!!
-
- Still probably a few days away as I write this, but we're about there.
-
- Changes are WAY too much to list in total, but a few highlights:
-	Now speaks TAI64 dates (IE: D.J.Bernstien's multilog and friends).
-	Now can optionally suppress duplicate messages.
-	Now can support and colorize unknown logfile formats
-	Now can do really cool things with snort and iptables syslog entries
-		(ip->hostname resolution, special colors, and more!)
-	Now has special options for a syslog-ng formated log.
-	Code architecture is VERY VERY VERY changed and better.
-		Light years better at error handling.
-		Nice facility to write more modules like snort and iptables.
-		Way more efficient (but not faster; too much new processing :)
-
- 	And much much more!!! Try it, you'll like it!! (I hope :)

* Fri Nov 22 2002 A.L.Lambert 
- Returning to active development of logtool to implement a few new ideas I've had.
-
- Somewhat major changes; added color options for:
-	Magenta
-	Blue
-	Cyan
-	Bright Cyan
-
- Rewrote regex.c a bit to make it easy for future allowances of new REGEX's
- Minor tweaks and other code stuff.
-
- Have begun adding hooks for specialized output modules for known event types
-	(no working code on this front yet).
-
- Preparing to write a ncurses module (no code on this fron yet either!)

* Mon Jun 11 2001 A.L.Lambert 
- Minor changes for 1.0.6 release as follows:
-
- Modified the autoconf stuff to (hopefully) be more cross-platform
-
- Added a fflush(stdin); to make logtool happier with scripts that do 
- line-by-line reading on platforms who's libc doesn't do this automatically
- for printf(); and friends.
-
- Probably a few little things I'm forgetting. :)


* Thu Feb 01 2001 A.L.Lambert 
- Tweaked the 1.0.5 release as follows:
-
- Added configure.in statements to make ./configure point to the propper
- paths in the documentation (config file stuff).

* Mon Jan 29 2001 A.L.Lambert 
- 1.0.5 release.  Not much new except the following:
-
-	Now uses GNU autoconf and friends to configure for build
-	Fixes a small compile time bug for ScoUnixware induced in 1.0.4
-	Not much else. :)

* Sat Jan 27 2001 A.L.Lambert 
- 1.0.4 release.  Only chage is a modification to the format check to allow
- for broken-ness in PAM syslog messages on RedHat 7.0

* Wed Jan 16 2001 A.L.Lambert 
- I think I have the configure stuff all tweaked out like it should be.
- No doubt I'm wrong on that count, but it's getting closer to release grade
- stuff.
-
- Wrote a manpage for logtool.  manpages are annoying to write/deal with.

* Sun Jan 14 2001 A.L.Lambert 
- Commenced converting to a GNU autoconf/configure build process for easier
- cross-platform portability.  Hopefully this will make our lives nicer in the
- long run.
-
- This spec file is even built using configure.  Isn't that neat. :)

* Thu Jan 11 2001 A.L.Lambert 
- 1.0.4 pre-release started.  Hopefully nothing major in this release.
-
- First change, modification of the lt_fmtcheck() function to fix some 
- format mismatch problems on RedHat 7.0.  See logtool/regex.c for the 
- specifics. (thanks to Laurent Jacquot for pointing this out)
-
- Fixed two minor compilation problems on AIX.  
- 	1.  Getopt returns int, and I was reading it as a char: fixed
-	2.  AIX defines 'regex', which clashed with the struct I will be 
-	    using to hold regex strings: fixed
- (thanks to Thanh Ma for pointing these two things out to me)

* Wed Jan 11 2001 A.L.Lambert 
- 1.0.3 release 'officially' declared ready to go.  No new changes since
- the comments below, just some e-mail feedback from the folks testing the
- changes indicating that everything seems to be working fine. 
-

* Tue Jan 10 2001 A.L.Lambert 
- Updated version to 1.0.3 to reflect changes below.  Still waiting to hear
- back from the folks that are testing these changes.  They should work, 
- but until I know for sure, the 1.0.3 release should be considered BETA, and
- subject to change without version number incrementation prior to public 
- release.
-
- Wrote a really ugly configure script to handle the SCO vs everything else
- differences. (at this point, it just copies the appropo logtail.*.c file to
- logtail.c, and initializes the main Makefile)
-
- Made some changes to the logtool/Makefile to build only the objects/binaries
- by default (reported problems with OpenBSD 2.8's 'make' not building library
- correctly).  Also added a "make lib" option so that anyone wishing to have
- the library can build it. (really, who needs the library for this?)
-
- Later that night:
- 
- Ying-Chieh Liao pointed out some "features" in the logtool/Makefile, which 
- I have now fixed. (see, I told you I might change it before the official
- release) ;)
-
- Report from Andreas ึstling on the OpenBSD changes looks good.  
-
- Sanitized e-mail addresses in this file, since it gets displayed on the 
- website (I'd hate to think some spammer snagged the e-mail addresses of
- the nice folks who've helped me out from my website).

* Fri Jan 05 2001 A.L.Lambert 
- Updated to fix the missing symlink to /usr/bin/lt.
- Included the changes suggested from Thomas Hagar listed below

* Fri Jan 05 2001 Thomas Hager 
- replaced cp with install in %install

* Thu Jan 04 2001 A.L.Lambert 
- Various fixes so's it will compile under the original cc-compiler from 
- SUN (Solaris 2.6).  Thanks to Christoph Krempe 
- for pointing out the problems, and working with me on fixes.  Christoph
- should also get credit for pointing out the bug in the includefile 
- functionality that was fixed below.
-
- It compiled
- It worked for me
- I shipped it. :P

* Fri Dec 29 2000 A.L.Lambert 
- Working on fixes for Solaris (why did I expect this?) for version 1.0.2
-
- So far, I've done the following:
- 	Tested with removing the strncasecmp() decl - seems to work fine
- 	Removed the getopt_long() and related stuff, and use only getopt()
-
-	Waiting on report back from Christoph Krempe on the success/failure
-	of these steps.

* Thu Dec 28 2000 A.L.Lambert 
- Big OOPS! The includefile functionality was broken!  I have no idea how I
- missed this the first time around, but it's fixed now. Updated version to 
- 1.0.1

* Tue Dec 26 2000 A.L.Lambert 
- Woohoo!  1.0 release is good to go (as far as I can tell)!
-
- Documentation is still a bit shabby, but it's better than some I've seen.
- Still some things in the TODO list that I'd like to get done Real Soon Now.
- 
- But all in all, all the features are in place, they all work flawlessly as
- far as I can tell (famous last words of a programmer :), and as they say in
- GNU land; "It works for me."
-
- Later that day:
-
- Modified the getopt.c stuff to allow for specification of an alternate 
- config file instead of being stuck with the system defaults.
- 
- Fixed a minor bug in the ansi.c module (color display thing)
-
- Updated CREDITS and a few things in doc/logtool.txt

* Mon Dec 25 2000 A.L.Lambert 
- Now have a working program!  WooHoo!!
-
- I lied about not messing with it till the 27'th.
-
- I think most all of the back-end code is done (cfg file reader, getopt, etc)
- ANSI, ASCII, RAW, and CSV output modules are completed (more/less), and
- everything test's OK, even with bizare/broken input.  Probably some buffer
- overlows in here somewhere, but this program is not/will not be SUID, so I
- don't think that's too big a deal (and will never happen unless users muss 
- up the config file really badly or overdo the REGEX string files).
-
- Still TODO
-	Write the HTML 
, and HTML 
output modules - Change the way we do REGEX's (need to compile the paterns once, not - every time). - Documentation, Documentation, Documentation. :( - Clean up the code some more so I won't be quite so embarrassed when I - release this thing. :) * Sun Dec 24 2000 A.L.Lambert - Came up with idea, and commenced work on getting this thing ready for - distribution - Code is about half written at this point, but should progress - relatively quickly (I type way too fast). - - Anciliary stuff (Makefile's, .spec file, etc.) is pretty much done. - - Documentation is basically un-started (although this program ain't - likely to need a rocket scientist to run it). - - I have to go to bed so's I can be fresh for Christmas, so no more work - will likely be getting done until around the 27'th. logtool-1.2.8/missing0000755000372000017500000001420207227666466014257 0ustar wouterwouter#! /bin/sh # Common stub for a few missing GNU programs while installing. # Copyright (C) 1996, 1997 Free Software Foundation, Inc. # Franc,ois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi case "$1" in -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing - GNU libit 0.0" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acinclude.m4' or \`configure.in'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`configure.in'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acconfig.h' or \`configure.in'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER([^):]*:\([^)]*\)).*/\1/p' configure.in` if test -z "$files"; then files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^):]*\)).*/\1/p' configure.in` test -z "$files" || files="$files.in" else files=`echo "$files" | sed -e 's/:/ /g'` fi test -z "$files" && files="config.h.in" touch $files ;; automake) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print \ | sed 's/^\(.*\).am$/touch \1.in/' \ | sh ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequirements for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0