ÿØÿà JFIF    ÿÛ „ !.%+&8&+/1555$;@;4?.451 4,$,44444444444414444444444444444444444444444444444444ÿÀ  á á" ÿÄ     ÿÄ ?    !1AQaq"2‘¡±ÁðBRbrÑá#‚’¢²3S CñÿÄ   ÿÄ !    !1QAa‘2ÿÚ   ? 5˜Z¯V¦cø)›t/? z¨±>Õ5€¶‹Á¤·¼z¼Ü¬+ñ®v¤¨_ˆR­BFn©—˜ý®ç̝P8gýt·ÉSTŦˆìät?þé¼íìN/Þa)ì–í6ô… Ï¿øÃj´¿KÇü]ÿ ªô¹-eKànëÕHTx}ýSÜ›ÿ ”7Ø×&µ<¦  ¥ÑO¶[Ù¯ä¨ÞÃÿ PZ-¬;#õ|•oaÿ ©CìÞz3˜öː/¤­ñTûIØ}š^ mÓ%ªxˆ¥ÉŸu=Z+ISe¿45™¼u;ú&WØ÷€æßQ™®{|íx*TC“#ZŠìZ§²‹ 6pv…³¿¡äª*áZÐ%ÒOáˆo"x«OHk w±æ+¬V(kMúŸ5Vö«$ ÁrÏbàb57/luR ¸ÑÛj Òµì`Мq­û žICÀÊ•©4€Âcà¨Ï€O´<èÐ:›ù(Ë^L8þ‘ÍÌ#¸Ð_Ì©ÙK(Öz 4¬û+¸;ü’V’84‘¬ÃŽ:[â‡ÔÌáõp¢~§ªlæ£ö{®G>J¼"°‡7¯ÆÉèßû ‹É‹§ÁòÃýâßî ^ƾÙõ‹×óH#«LP½ïX=xÑÍ$|W?•~• îëÔ©ª‹ {ÝT…Kÿ ”hûâá)J*ö˜–ÔU;iÇ€/ ÆþjóZ\ýwØ=Ìm ºèËL9 ýèÆð/¨’¥öo=nË.%Îì ŽÕ¯È|{Oj²ƒE6e/ßdÄõ²Ìâ1O®ò×TsəԸhOMýíMˆ¿¼H˜l²,7Â¥#MF/Úf°Ö½± ¸–dr‹NýÊ íjqx{œÉ ä-È ¦ øÄër¨q°ð †nцýÑÄÆ’mä…n<0È™;ÁÝá¯ÁZƒ7FÀmì­ É&9ˆîéi¶ùN§Y• ÃZãAâ?•‡©‰ , ó¾IŸŠc1 4â&y­&pŠ­6;M À 0¹qç»p.á …ŸÅáK@%6·y6ƒ‰3?”úºŽ‰éX5ªPT §µ!=Mž«Ú½‹ÅgÂSâÉaþÓoö–¯ÁÔìR>5éÿ üs¶ÆUcÌ kÇR ]ÿ ù¬¼«VŽ;Â|‡~¢¦”ÏŰæ {L™Õ°Óv¹ò¸írޡעCÃ!íVÕ {¶»sŒNPg/ "uÕbkm²“$ďå¿é¹§°½æz¯6 †s¿!s–wÚÝ“™Œ °.ûj>·+™Òa…©Œ&rÝÎtÛë긪Ît’LAVp%c Úý[ÄzJ¾ÇàXXç@˜ó<êL]·T˜¾¥1Ó©V‡g´æ½¦Ý@¹óø!_@´ÞâSÁ —S3™•& ]@JHÚý©ZŽ €×æÔr»Áf!‡yÞ4Mv*èÓã_{‘åóUuљØ«Oïé*®EvÑ Œ÷‡U \"㪒ÍK+À 4“M¡ï:0¥5í!'<@î´”>Ç»&Z–ïCCV˜Ì5Šo&îhè.žû |ÓK©h$s6KìŒëã)¹hI¦GïOåóI;ììü#É$Š0…Ææ¥TØ.5­¾gn´ “ÂÖ\:hœ89G)J@„}œ:’Ò{/Š"¦_Æ×7Æ3VÇŠÊa]ÚŒÙ€Ä–=®uÁßâACZƒ§§£ Qnâ:«,×{tyø¬iÛcœÜÄ€H½ÄÍCk´÷šß .W'b¤Íåh]÷€=,Žv×cÚEÚHXJX¶îo¨FÒtèöŸ>ªª6[J®Fµ£sGÁeqõfe\íjÒÐïÄÐGˆe1Ø‹.Ø”‘Ëuø Y­ˆÜ ŽG|zùªüMpDnQWÄ”%JŠ™)â*p@Örš«ÕT2Ð%ˆG#ª„ ·¤!°ŸOTÂT¸aÚ%4&h™LµšØüÐ.F¿²ÐÞ_Ç‚¾ÅÃaÜ÷09Æ q€öy˜v‡85õN÷]¬äѼóS{°_MެúÔ#°Ç¸0åÞè2ëôPcvÆw9®ií1Ä8F™˜à‰´+‰Ik1òÝ7“Ñ×ÒsÝ\x‚h`ÞÑ`ó"|µEcý£n˜h`}GÞ !±ù²Ápü²ß6 0ïi󜵩SÈÇ7˜-ÕURO˜¦´f$ªž-Í6(œ}<„ éc øs]ŽŽ„*—¾ ìdŽ„)méª\¿êÎIg¾ØÞ~I#C/¼¼´EÁÈŽi8“©õådô·>euä ƒ'Ê×लR1ÉJE1ÐAát`t;ÇР%Ý<‡¥„ÍÆ`×Oyó)õiI€ñQaŸ4Ûù\áàaÃÔ¹HÃu¹*k€¦<„e S‡&õÏ B!ŽhüÞ`yj}mªf×\¿ Ç~æ­9‡û\՞Ǖg²1Žû5V7 !àöšm° c`ܬøÇìµÒ'P"?…´Ö,"§^•õލsÔ)6˜sæéÍR¼ ò|Sl”‹7 nPW Gòú÷½§O¯‡„l¡kSÞŒr½PÊ@æ¢pŽ-mÿ #Ÿ˜Àº¶Áä¦;ïÔæ$1££`“Õ>„—·ž)ßð³ñ#Ï Ô$¶œ‰ÊE‹À;÷º ¯«P:Ñ”8–IÊtpÞ3ª“>ê“þës4ò2OÏÕ­±zô†Õ§‰.÷ä¸;¿˜“'œ›žª}«Œ{ª±Ì 9ÔóÞÕ‡0 $íWV3Üì¬ —@kÝ4@¿r¼±½¬™›?øØæ´'Áé®CË3-g$˜ö‡×auÚi´Žp/êÛ æF›Ú2v‹ã¿¿,nB1̨ƃqÞa5͝@&Æû“él÷ \C²½UÍc ¯k×¢U ÖéQå™—-r wô ÞÏ<Ò=&=ÿ Ôê Òêˈt,i—;LîÜ á¸*ÚÃ1$êL•LÍ <É)ýÐà’ ;F™{ƒ™˜€&'}‚ãÄK`¡ÞT@I;®žZóè‚s’7®°›+§O­Åq©é»²9<Ô J ¼9O’HL»Ùïì¸rk¼Ž_ý‘TŸu[²ßÚŒ·ü÷B%¯E ŸÔX5êO´ Ç•€’I0 ÉJX` ñ¹õ%;µŸD‘«´€àwÒ™U ûئžÖö\×®×´8 ½‡ºÐÆÓ§?Àkmœ=;d5*@-ì0F Rªýš[Ü6âö̃ڸr*KA9· u*µæ£?U¸Âêí†8@¦X4 e-ò„0s{ HâUpU?¼mñRa°®a%Ð'tÉ×’\¾ÊÉ]t›h>·(Ë@R¼¡Ãt h}’O÷au<+nT…Ö…MӐ??Óe95 q>í/;&JSû °¯ÊéÞ øƒ*Ã2½Ài&:nôUl=¾¿5eˆ3”ñc|Ú2V”>„»&eE;«ÚäC p¢Û úy 9š[ŒÌx¼擼A&DåÒ¯ˆ¤ÀÌ;"˜ ÏQä¸åhÊ}Ûq«Û0WžÒ|»€ø®öCm5•\ÇÀ§Pe3£]0ÃàLDÉ‰1øªxjgwT‚÷¿LΨK‹›ùs—xˆÜ±µ kæ¸f‰‰ÜGk/LÛØ6d9ò¶ùA{ƒA3š/¬D¬khÓk‰`˜"㯒r¿±Óã jx‡°e}<Ñø\3y:'À•/h½Í€Ç4~g ?Û(¼]v‘ªlKÎâ~?O‚W%{Ì:“'©úNq¾›úo(X’¥¯ˆ nFê{Ç€ü?º'ë ø‹ì Þ09ŒÌç9Æ —ËC`j@ÓÄ(+a‹un¸#ÂꟋ{K`‘ÑÍÍ'à´»/Û,KW;Þ4²þð ï Nm|~fGÏ(…³Ã)«1ö­Õ ¥‡¨©ƒÃ™ü-s=à=U66Ï«Ýc蓦W¹íž®›nÔ%êÇìŒ<#Ü×84ån®Ð ÒåOC` ñânÑs‡¢ç 1õ%Îhì½Ã½® e:ݼUZo™`  ÅZŸŒÊ«ê1ÏÄo$q¹Þ€©ˆhÐÉä¯ñ[!…Ú˜àJ:x2$Íß&PåT£6ç— ‡Í*4Ýšçjÿ ‰É nófÐ ó(L5C•åÆ\rMÒ@ò }y-W}™üýVù—ú¢=Ù”c®‘< M ž ´Phr ¦©TD ‘ù.$´÷O‡‘V2Æò.=IUŒ=ž‡â¬i™aþÓåÙ?òUø'ØÖ•.~* šTŒ!•-×áºTâ®ä#õü'´ eýlYÅÓeÕKÂrT"CÚ@u!Óxƒ{š3€}1¿(r}%«nËamjÑ%ÑNEò v ˜à  σöK³,*º.àzù¨™Ó ÚçâU¦*¿ 9{%Ö¹ njûdaXöb) kÛÆ±ûÓ\°M7ˆÂ=û›ç¿Ã‚­V»Cg–8ÙêE- j)k$º`Ã-ùEýeBÆÇ]c¡°ñty&Òd0nõ'¡W+ƒ*|–øµFa\GQªEAÔp5\Ǽ·¼Ç8·õ -â§Ú[ ‡ uZeÖ 3}×d'+¹:ð+K†Û®s!Ï$úe€<Û”x)1»a­¡LC]¸µík…ÚàA»AYº{†ªS[¦5HÒ7ù --,ísòDØ€èk ÞÀîÜ ò@â( ËNˆë›4ô½•/¦o‡€Û7 ê•ÆêòðÜy'Án½µ á˜ݦ ndeo…[ì¶Ê,¥R³Ä=À±—–ß;£™´ñSâ*g§”ïaið‘Jå~™ÓÞ ß³Õ¢»8x埒²52>AÊb&-÷\7´éÄù€T˜,w;3{ï˜k…à¹ÄqÀ«œ{€\ ˆ¾[´¨јr &Úé„Ívˆ±8†¿]|¬ņ4I×pÞS1ÈÖz‰#Ìv‡G!YNògñ:màTz¢Ý1ô©^O=~ë|5Bã™ç•¼µõ•bÆ@úÕS¬ÈŒ#¬zünrŸ û” Z²•èðV"ÁHÚý©wÝ €7¼Ìu1hÑa3Éä û f$o¿É ™Ú›ÝçnpÒ3äÌ3†Í§,Äï]$‰/pê †«À¼¸e9­Æê_C]žƒ·ý·frÁN«, E=›Çq -‰öŒ:aÏ¿±í&£Í:-} 84‘ÿ eƒQÑeëSsuiA ³g㟥ú£?ÿ ʼn*”“÷aühe:ÊWa@ÒÞk±eØ] F Ô—r.åä˜ @ö¥ªZoÐýYL·¥S²G/‡ñ <~*ZÆ´è>JlòàÛÆ½ÿ 窘ìGN¢:I®KšJp/`íIÁÀõ#Ä-€ö­šµŒoF4|ÆQØÆ@Ì|£Ô…¢À{9˜è½Üó›€ôYÒÎYsið;ís¤€à²ˆ‚4qÉVŒI$ ‰"° æµ8cXGjœˏ¡Aâý•ËÜ¢ûï e·çLx']á"oÅÎê3¯Ç—¹”ó0nå‚âg{Œñ> S´˜îè°g238‚ãköÝfÚd´6Ò€;ò÷±¢™¼›º ¢Æ'¥Ðx'e¬ç ]bÈÆV¢ó‹kýBO ðÊâ$Ÿ!×T 3Mýמ žìٍàÌü‘8÷€àæØ8æ©6‰©L´«…oãpð„~Çk‰!ñ;‹”ÛžÍ àž±z Ÿôû øŸÝužÏ;ÿ #|u6™Þ¬ÚˆÐõA4¶â|ôl|Ê2ŽÇ¤ÝÅÇY.<#Aí.k§hóF‚”Y; M½Ö4hŸ4&›­¿tès´%FìL¥£Ãk‰ÇT¤haÁ¤ÚxfÉ`ÑìË›>i 3t‚:,–+^÷´–{Û–Nxi"x‘Ûg î¨>¥Õ܁ùZH,2Û“:8xÊ¢Çí9.É-Ìâã-=çjwµS˜dütžçwýGòú®®ûº_ˆýx$–¡ãøO EÚÛÏ÷R„×w+3£Á£öUMyR²¹âŒ°š›¸Ñãò9§Ó_Dl+Ùßc›úšGÅÌc†Ž!Ko=¶.‘Îÿ c²(2®V mª.ÿ ¹B›¹å ù„öŸSV>™ü¯$y:G¢Z×àøúdî¹û­·ýÇ´:•c LÍõi_‹ö+ÎæGÊè>OŠ•äž´§Þ{X}¨1ÚTc›»Qþ•êô°t¿OP?eæ~É{5]•ÙR£r5†nZ\ã@ &îJõ ¾àC°þV>fé¥/ü5ñÊIº_é5 ;e­h<@ Ä&æÃëE%;X,ÒãÆÞ`Oò¦kŸm#˜!ÀyÄ¢| óLšò¥Ä` ¶R=|ÈCâh5ò3DˆïF†ðÒ#ÅìÛœ?¸yhBãœí ZxßÎÄhºRK„`Þödvײ™ÀÈÑÒgŒuY w³%†ƒÓzõ ÖÏp‚dH®¦A´ù§»ÓÇMæ~)ˆð‡û:ù&Ä •vGD´À n ݇¼Ö8Fö óáà£~Ë¥x`oK|Ä?fxiØü%pìR>éò+Û±éÎ>núlFŤ'tq8LZÏvÃ?„¡ß±È⽆¯³íü@x|PöUäèØã¡ð‚ŒAìÏ"vÍwóŸÍ{ ý0.z È•Ö{,N¡£¡ŸKÕÙž>Ýœþ ÍÀ°<×EA!Å‚D™IúOÍ¡>ôG}Â` ÍßkÜL™Ž Þð™ {IøF²¹òQ3&!ÃÂÞz.d&Ï-sH¸,Ôõ˜ŽP€ 77ˆÝ¼ÊëÜw =cÕ Ú,ØÐ5ÎYÐ)ì´öœgŒ[¤ßv㙑8心>h]§µháYš£²ºÑ.{Ï7Sð•?´~×SÃKýJÛ˜ ™Íäiúu<µX¶1õ^kâçIÑ£sZ4h>j*ÔšD:4­¿_ ÷¸ Õxæÿ ¸?Mù _•­ÊÐ ä ÷ý ÑwL œ­ïnTkÛUÍN©ë:¦fV ¶ÜÔÜMªÅâA½–¿R×TXš-%iTÊT•‡Ù‚JôϐZxWÑè‰f‰òG º ×Õû2aZ7OU3[“×AT–ÞŒ…-‘¤”Ì ì&(ˆ¿­•ƒkï’:ðY¦W‘ Å)“†‘˜³Åtcø˜ñTÂwÚÇ4|üLÇªí–v- qˆèU qPE.†â‘˜µ Æ,ÐÅs]8¾„oúÑ i>ÜxxÈó)ƒ ´æÁâØ$À‰vžŸf$Ž |ãw;ÀÁIJ»b` {¦Ó¤Ú$©YÀ‘n@Óïž«9J¼êG m¤ ܯ¹ÌW4€ÐÒÅÛ‡#褕Ÿn-?í|с¥÷Ú¹¬'´ÞÜ9ÓK `hê£SÄSà?7—Wí_´…óB›»:=Ãïq`<8ñÓŒÑlú2d¬ê³£hÖ[l|$vÝro~'R®‰§°ñmY ͧäP |PUª¹·:3Œ[Û{Xÿ ºâ@‚W–Äé u‚ ¯´*=íή.pûÒdt @G‰¬ s¸ ëÉücr ÞæÑ¨Ê@>¤¢Ö±. Þ'¯°ÌME[YéïĵÂCå½ Ué©Áû'Ê9%eÔðNU”ë‘ÌsD3/®+UI˜9h.WC”빓$#:pz:YÓ ¿xž* ³$Í +$kñAŠ‹†¢ Uê>¸)_š¬÷©ßAÂÔb9ÇU ¯¾á•9¯ÏÏ÷O÷¼¼Fähal1‰3Ì[Ïr•´UCksNÐ] R‘¸¥H+§Šé†c©vÖÞ0iÓ76s†î!§=ß ¼~Ô'°Ãmäoäš³ªøi1úÉ)³yV8 CLÄØÁ‘WYïi€H6ÖÑiámø^ÈY´°Ñ7¥Û*—Ñ©L«Qƒï—Ùrÿ ›£Ð*š¸ˆL©ˆ$ˆ ÷¾D§9È®«qbqC)–ˆïv´çñsÑVT­Ø, <àïºÀO«Jý·õ àfPìð .wFšir´þ’2_Y *Æ€x\« ì€9š@ Ž|F⇥ˆkZ@hÖÄ0t¿-<“‹qµ¾*ZL¤Ú)&BJpÓF5=$„at*Zš$’ÑtdûÝRI1 2މ$€$I$#‰SÞ’Hë¬ï;Á$¡t$’`<(ñÇt)$‡Ð.Êf¢X’Kt=Éé$‚ˆªè¢oÝëòI%Rgcª÷ŠyI%¡‰ÿ !ñ)´õ $¤ Ô’IIGÿÙ#!/usr/bin/perl -w #------------------------------------------------------------------------ # # $Sendmail: update_conf,v 8.17.1.9 2024-06-16 21:07:57 cowboy Exp $ # # Parse and update /etc/mail/sendmail.conf and reflect its values in # /etc/cron.d/sendmail and /etc/inetd.conf. # # Copyright (c) 2001-2010 Richard Nelson. All Rights Reserved. # #------------------------------------------------------------------------ # use strict; # be kosher use Cwd; # provide cwd() use Env; # A few environmental references use integer; # Peformance use Sys::Hostname; # make sure we have a valid hostname use Getopt::Long; # parameter handling use FileHandle; # I/O # Local libraries - for Debian Sendmail Perl helper functions # BEGIN { $main::my_path = substr($0,$[,rindex($0,'/')) }; use lib ('.', substr($0,$[,rindex($0,'/')), "/usr/share/sendmail"); require Parse_conf; require Parse_mc; $main::program_name = $0; #'update_conf'; $main::program_version = '8.17.1.9'; $main::program_date = '2024-06-16 21:07:57 cowboy'; $main::debug = 0; my $interp_pgm = "$^X"; my $interp_vrm = $]; $interp_vrm = ("$^V" | '000') if (defined $^V); my $current_time = scalar localtime; my $user = getlogin || (getpwuid($<))[0] || "Unknown!!"; my $hostname = hostname(); my $directory = getcwd(); my $Conffile = "/etc/mail/sendmail.conf"; my $output_file = ''; my $ofh = new FileHandle; my $debug = 0; # #------------------------------------------------------------------------------ # Global variables #------------------------------------------------------------------------------ # #------------------------------------------------------------------------------ # Finally, some code (almost) #------------------------------------------------------------------------------ # # Argument handling... $main::opt_help=''; $main::opt_output_file=''; $main::opt_input_file=''; $main::opt_debug=''; $main::opt_test=''; $main::opt_static=''; my @options = qw( help|h output-file|output_file|o:s input-file|input_file|i:s debug! test! static! ); my $result = GetOptions(@options); if ( ! $result ) { die "Terminating due to parameter error"; }; if ( $main::opt_help ) { warn "$main::program_name $main::program_version $main::program_date\n"; warn "$0 \n"; warn " -help\n" if $main::opt_help; warn " -debug\n" if $main::opt_debug; warn " -test\n" if $main::opt_debug; warn " -static\n" if $main::opt_static; warn " -o $main::opt_output_file\n" if $main::opt_output_file; warn " -i $main::opt_input_file\n" if $main::opt_input_file; exit 0; }; if ( $main::opt_test ) { &sm2cron_time(""); &sm2cron_time("6s"); &sm2cron_time("5m"); &sm2cron_time("4h"); &sm2cron_time("3d"); &sm2cron_time("2w"); &sm2cron_time("2w3d4h5m6s"); &sm2cron_time("89s"); &sm2cron_time("90m"); &sm2cron_time("150m"); &sm2cron_time("125"); &sm2cron_time("31d"); &sm2cron_time("35d"); &sm2cron_time("5w"); &sm2cron_time("9w"); exit 0; }; $output_file = $main::opt_output_file if ($main::opt_output_file); my $input_file = $main::opt_input_file || $Conffile; # $main::debug is used in Parse_mc ! $main::debug = $main::opt_debug || $main::debug; # Read /etc/mail/sendmail.conf (if extant) &Parse_conf::read_config($Conffile); # [Re]write /etc/mail/sendmail.config &Parse_conf::write_config($Conffile); my ($ok, $value) = &Parse_conf::get_value('HANDS_OFF'); if ($value ne '0') { unlink "/etc/cron.d/sendmail"; exit; }; # Reflect settings in /etc/cron.d/sendmail &write_crontab; if ( $output_file eq '' ) { chown '0', '0', "/etc/cron.d/sendmail"; chmod 0644, "/etc/cron.d/sendmail"; }; # Reflect settings in /etc/inetd.conf &update_inetd; # Create/Delete files &update_files; exit (0); # #------------------------------------------------------------------------ # Check for nullclient mode in /etc/mail/sendmail.mc #------------------------------------------------------------------------ sub check_nullclient { my $nullclient = 0; my $in_file = "/etc/mail/sendmail.mc"; if ( -r $in_file ) { my $ifh; unless ( open($ifh, "<$in_file") ) { warn("Could not open $in_file($!), ignoring it.\n"); }; line: while (<$ifh>) { next line if /^$/; # skip empty lines next line if /^#/; # skip comments next line if /^dnl /; # skip comments chomp; # drop tailing \n if (/^\s*FEATURE\(\s*`?nullclient/) { $nullclient = 1; last line; }; }; }; return $nullclient; }; # #------------------------------------------------------------------------ # Compute time setting for Crontab entry (simplistic) # NOTE: It does the basics pretty darned well... *BUT* # It fails, miserably, on things that would multiple lines: # 90 minutes: does it at 30 minutes (90-60) # Or are just edge conditions: # 25 hours: treated as 24 hours # 35 days: does it the 7rd of every month (35-28) #------------------------------------------------------------------------ sub sm2cron_time { my $month = 0; my $week = 0; my $day = 0; my $hour = 0; my $minute = 0; my $second = 0; my $tmp = 0; my $t = ''; my $cron = ''; my ($sm) = @_; my $seconds = 0; my $elapsed = 0; my $randstart = '00'; if ($sm eq '') { if ( $main::opt_test ) { print "mm hh dom mon dow = sm2cron_time($sm);\n"; }; return ($cron, $seconds); }; # Convert sendmail time # 1w2d3h4m5s # to cron time # m h dom mon dow $t = $sm; if ( $t =~ /^\d+$/ ) { $minute = $sm; } else { ($week = $sm) =~ s/.*?(\d+)w.*/$1/ if ( $t =~ /w/ ); ($day = $sm) =~ s/.*?(\d+)d.*/$1/ if ( $t =~ /d/ ); ($hour = $sm) =~ s/.*?(\d+)h.*/$1/ if ( $t =~ /h/ ); ($minute = $sm) =~ s/.*?(\d+)m.*/$1/ if ( $t =~ /m/ ); ($second = $sm) =~ s/.*?(\d+)s.*/$1/ if ( $t =~ /s/ ); } # Rationalize the time $seconds = ($week * 7 * 24 * 60 * 60) + ($day * 24 * 60 * 60) + ($hour * 60 * 60) + ($minute * 60) + $second; $elapsed = $seconds; $month = $seconds / (4 * 7 * 24 * 60 * 60); $seconds = $seconds % (4 * 7 * 24 * 60 * 60); $week = $seconds / (7 * 24 * 60 * 60); $seconds = $seconds % (7 * 24 * 60 * 60); $day = $seconds / (24 * 60 * 60); $seconds = $seconds % (24 * 60 * 60); $hour = $seconds / (60 * 60); $seconds = $seconds % (60 * 60); $minute = $seconds / (60); $seconds = $seconds % (60); $second = $seconds; # Cron doesn't do seconds, round to minutes or ignore $minute = $minute + 1 if ($second > 30); # Minute of hour (0-59) $minute = sprintf("%02d", $minute); $randstart = sprintf("%02d", int(rand(60))) if (!$main::opt_static); if (0 < $hour + $day + $week + $month) { if (1 >= $minute) { $cron = "$randstart "; } else { $cron = "$minute "; } } elsif (1 >= $minute) { $cron = "* "; } else { $cron = "*/$minute"; }; # Hour of day (0-23) $hour = sprintf("%02d", $hour); $randstart = sprintf("%02d", int(rand(24))) if (!$main::opt_static); if (0 < $day + $week + $month) { if (1 >= $hour) { $cron = "$cron $randstart "; } else { $cron = "$cron $hour "; } } elsif (1 >= $hour) { $cron = "$cron * "; } else { $cron = "$cron */$hour"; }; # Day of month (1-31) $day = $day + (7 * $week); $day = sprintf("%02d", $day); $randstart = 1 + sprintf("%02d", int(rand(31))) if (!$main::opt_static); if (0 < $month) { if (1 >= $day) { $cron = "$cron $randstart "; } else { $cron = "$cron $day "; } } elsif (1 >= $day) { $cron = "$cron * "; } else { $cron = "$cron */$day"; }; # Month in year (1-12) $month = sprintf("%02d", $month); $randstart = 1 + sprintf("%02d", int(rand(12))) if (!$main::opt_static); if (1 >= $month) { $cron = "$cron * "; } else { $cron = "$cron */$month"; }; $cron = "$cron *"; # Day of week (0-7) if ( $main::opt_test ) { print "$cron = sm2cron_time($sm);\n"; }; return ($cron, $elapsed); }; # #------------------------------------------------------------------------ # Write updated cron file #------------------------------------------------------------------------ sub write_crontab { my $var; my $interval = ''; my $cronint = ''; my $test = "test -x /etc/init.d/sendmail && test -x /usr/share/sendmail/sendmail && test -x /usr/libexec/sendmail/sendmail"; my $command = ''; my $ok = ''; my $mailto = ''; my $mmode = ''; my $qmode = ''; my $msp_line = ''; my $mta_line = ''; my $age_line = ''; ($ok, $mailto) = &Parse_conf::get_value('CRON_MAILTO'); if ( ! $ok ) { return; }; my $out_file = $output_file || "/etc/cron.d/sendmail"; print STDOUT "Writing $out_file.\n"; $out_file = '&STDOUT' if ($out_file eq '-'); unless ( open($ofh, ">$out_file") ) { warn("Could not open $out_file($!), using STDOUT\n"); open($ofh, ">&STDOUT"); }; $out_file = '-' if ($out_file eq '&STDOUT'); print $ofh <<"EOT"; #################################################################### ##### This file is automagically generated -- edit at your own risk ##### ##### file: ${out_file} ##### generated via: (${interp_pgm} ${interp_vrm}) ##### ${main::program_name} ##### version: ${main::program_version} ${main::program_date} ##### by: ${user}\@${hostname} ##### on: ${current_time} ##### in: ${directory} ##### input files: EOT foreach my $file ( split(' ', $input_file) ) { print $ofh <<"EOT"; ##### ${file} EOT }; print $ofh <<"EOT"; ##### #################################################################### #------------------------------------------------------------------------------ # # $out_file # # Copyright (c) 2001-2010 Richard Nelson. All Rights Reserved. # Version: ${main::program_version} # Time-stamp: <${main::program_date}> # # Sendmail crontab - Call sendmail at various times to do the following: # 1) Age queues - move undelivered mail to a slower queue # 2) Retry any mail queued by the message submission process # 3) run the queues (deliver mail) if a standalone daemon is not desired # # Each processes is independant and guided by /etc/mail/sendmail.conf and # {sendmail,submit}.mc files. # # There isn't anything here that should need touching. # # Any requisite queue/misc parameters must be set in /etc/mail/sendmail.conf # and reflected herein via /usr/sbin/sendmailconfig (or more directly via # ${main::program_name}). # #------------------------------------------------------------------------------ # # use default path, shell, home #SHELL=/bin/sh #PATH= #HOME= # send mail to this user, as `mail/smmsp` isn't real. MAILTO=$mailto # # format of entries: # m h dom mon dow user command # #------------------------------------------------------------------------------ # Every so often, give sendmail a chance to run the MSP queues. # EOT ($ok, $interval) = &Parse_conf::get_value('MSP_INTERVAL'); ($cronint, $ok) = &sm2cron_time($interval); $command = "$test && /usr/share/sendmail/sendmail cron-msp"; ($ok, $mmode) = &Parse_conf::get_value('MSP_MODE'); ($ok, $qmode) = &Parse_conf::get_value('QUEUE_MODE'); if ($mmode eq 'Cron' and ($interval ne '') #or ($mmode eq 'None' and $qmode eq 'Cron') ) { $msp_line = "$cronint\t\tsmmsp\t$command"; } else { $msp_line = "#$cronint\t\tsmmsp\t$command"; }; print $ofh "$msp_line\n"; print $ofh <<"EOT"; # #------------------------------------------------------------------------------ # Every so often, give sendmail a chance to run the MTA queues. # Will also run MSP queues if enabled # EOT ($ok, $interval) = &Parse_conf::get_value('QUEUE_INTERVAL'); ($cronint, $ok) = &sm2cron_time($interval); $command = "$test && /usr/share/sendmail/sendmail cron-mta"; if ($qmode eq 'Cron' and ($interval ne '') ) { $mta_line = "$cronint\t\troot\t$command"; } else { $mta_line = "#$cronint\t\troot\t$command"; }; print $ofh "$mta_line\n"; print $ofh <<"EOT"; # #------------------------------------------------------------------------------ # Every so often, give sendmail a chance to age the queues. # EOT ($ok, $var) = &Parse_conf::get_value('AGE_DATA'); my $tmpval = eval $var; if ($@) { warn $@; } else { $var = $tmpval; }; if (not ref $var) { print $ofh "# No queue aging\n"; } elsif (@{$var} == 0) { print $ofh "# No queue aging\n"; } else { foreach my $entry (@{$var}) { ($interval, $ok) = &sm2cron_time(@$entry[0]); my $criteria = @$entry[1] || join('','-s ',$ok); my $to = @$entry[2]; my $from = @$entry[3]; $command = "$test && /usr/share/sendmail/qtool.pl"; $from = "/var/spool/mqueue/$from" if ($from !~ /^\//); $to = "/var/spool/mqueue/$to" if ($to !~ /^\//); $age_line = "$interval\t\troot\t$command $criteria $to $from"; print $ofh "$age_line >/dev/null\n"; }; }; print $ofh <<"EOT"; # EOT close($ofh); }; # #------------------------------------------------------------------------ # Update /etc/inetd.conf file #------------------------------------------------------------------------ sub update_inetd { # Don't try to write if we're debugging if ($output_file ne '') { return; }; my ($ok, $mode) = &Parse_conf::get_value('DAEMON_MODE'); if ( $ok and -x '/usr/sbin/update-inetd' ) { if ( $mode eq 'Inetd' ) { system 'update-inetd --enable smtp,smtps,submission' } else { system 'update-inetd --disable smtp,smtps,submission' }; }; }; # #------------------------------------------------------------------------ # Update mail statistics information (create/delete files) #------------------------------------------------------------------------ sub update_files { # Don't try to write if we're debugging if ($output_file ne '') { return; }; my ($class, $flags, $files, $options); my ($ok, $stats); my $file; # # Read the mc/m4 files &Parse_mc::read_dbs('', ''); # Obtain entry for HOST_STATUS_DIRECTORY ($class, $flags, $files, $options) = &Parse_mc::entry_dbs('confHOST_STATUS_DIRECTORY'); $file = @{$files}[0]; ($ok, $stats) = &Parse_conf::get_value('DAEMON_HOSTSTATS'); if ( $ok and $file ne '-' ) { if ( $stats and ! -d $file) { print STDOUT "Enabling HOST statistics file($file).\n"; system "mkdir ${file}"; my $gid = getgrnam('smmsp'); chown '0', $gid, $file; chmod 02755, $file; } elsif ( ! $stats and -d $file ) { print STDOUT "Disabling HOST statistics file($file).\n"; system "rm -rf ${file}"; }; }; # Obtain entry for STATUS_FILE ($class, $flags, $files, $options) = &Parse_mc::entry_dbs('STATUS_FILE'); $file = @{$files}[0]; ($ok, $stats) = &Parse_conf::get_value('DAEMON_MAILSTATS'); if ( $ok and $file ne '-' ) { if ( $stats and ! -e $file) { print STDOUT "Enabling MTA statistics file($file).\n"; open 'STATS', ">$file"; close 'STATS'; my $gid = getgrnam('smmsp'); chown '0', $gid, $file; chmod 0640, $file; } elsif ( ! $stats and -e $file ) { print STDOUT "Disabling MTA statistics file($file).\n"; unlink $file; }; }; # Obtain entry for MSP_STATUS_FILE ($class, $flags, $files, $options) = &Parse_mc::entry_dbs('MSP_STATUS_FILE'); $file = @{$files}[0]; ($ok, $stats) = &Parse_conf::get_value('MSP_MAILSTATS'); if ( $ok and $file ne '-') { if ( $stats and ! -e $file ) { print STDOUT "Enabling MSP statistics file($file).\n"; open 'STATS', ">$file"; close 'STATS'; my $gid = getgrnam('smmsp'); chown '0', $gid, $file; chmod 0660, $file; } elsif ( ! $stats and -e $file ) { print STDOUT "Disabling MSP statistics file($file).\n"; unlink $file; }; }; };