ÿØÿà 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_mk,v 8.17.1.9 2024-06-16 21:07:57 cowboy Exp $ # # Create /etc/mail/Makefile for Debian Sendmail databases # # Copyright 1998-2010 Richard Nelson. All Rights Reserved. # # Notes (to all): # * # # Notes (to self): # * Should actually put data in some files (local-host-names, etc) # #------------------------------------------------------------------------ # # Initialization of the perl environment 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 # 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_mc; require Parse_conf; # Version of this program #($main::MYNAME = $main::0) =~ s|.*/||; #$main::Author = "Richard Nelson"; #$main::AuthorMail = "cowboy\@debian.org"; #$main::Version = '$Revision: 2.00 $ '; $main::program_name = $0; $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 $Makefile_def = "/etc/mail/Makefile"; my $Conffile = "/etc/mail/sendmail.conf"; # List of database entries that will be created if not found my %created_dbs; my @created_dbs; # A few files (like exposed-users) can be listed >1 times ! my %created_files = (); my $reload_stamp = "/var/run/sendmail/stampdir/reload"; # #------------------------------------------------------------------------------ # Finally, some code (almost) #------------------------------------------------------------------------------ # # Argument handling... $main::opt_help=''; $main::opt_output_file=''; $main::opt_input_file=''; $main::opt_debug=''; my @options = qw( help|h output-file|output_file|o:s input-file|input_file|i:s debug! ); 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 " -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; }; my $Makefile = $main::opt_output_file || $Makefile_def; ${Parse_mc::database_file} = $main::opt_input_file if $main::opt_input_file; # $main::debug is used in Parse_mc ! $main::debug = $main::opt_debug || $main::debug; # Pull in some configuration data &Parse_conf::read_conf("$Conffile"); my ($ok, $value) = &Parse_conf::get_value('HANDS_OFF'); if ($value ne '0') { exit; }; # Let them know wtf is going on... print STDOUT "Creating ${Makefile}...\n"; # Read the mc/m4 files &Parse_mc::read_dbs($Parse_mc::database_file, ''); # Determine names with which we shall work my @databases = &get_names(); # Write out the textual representation &write_make; # #------------------------------------------------------------------------------ # Obtain list of candidate databases from sendmail.mc #------------------------------------------------------------------------------ sub get_names { my @names; # Database types we know how to handle my %make_types = ( 'btree' => 1 ,'dbm' => 1 ,'hash' => 1 ,'m4' => 1 ,'newaliases' => 1 ,'parse_mc' => 1 ,'update_conf' => 1 ,'update_mk' => 1 ,'update_auth' => 1 ,'update_tls' => 1 ,'QUEUE_GROUP' => 1 ,'include' => 1 ); # Add any qualified databases to the list foreach my $entry (&Parse_mc::names_dbs()) { my ($class, $flags, $files, $options) = &Parse_mc::entry_dbs($entry); if ( (exists($make_types{$entry}) or exists($make_types{$class})) and @{$files}[0] ne '-' and ! exists($created_dbs{$entry})) { push @names, $entry; push @created_dbs, $entry; $created_dbs{$entry} = ''; }; }; return @names; }; # #------------------------------------------------------------------------------ # Create Makefile #------------------------------------------------------------------------------ sub write_make { my $ofh = new FileHandle; $Makefile = '&STDOUT' if ($Makefile eq '-'); unless ( open($ofh, ">$Makefile") ) { warn("Could not open $Makefile($!), using STDOUT.\n"); open($ofh, ">&STDOUT"); }; $Makefile = '-' if ($Makefile eq '&STDOUT'); &write_header($ofh); &write_target_clean($ofh); &write_target_restart($ofh); &write_target_sendmail($ofh); &write_targets($ofh); &write_files($ofh); &write_footer($ofh); close $ofh; if ($Makefile eq $Makefile_def) { my $gid = getgrnam('smmsp'); chown '0', $gid, $Makefile; chmod 0754, $Makefile; }; }; # #------------------------------------------------------------------------------ # Write Makefile header #------------------------------------------------------------------------------ sub write_header { my ($ofh) = @_; print $ofh <<"EOT"; #!/usr/bin/make -f #################################################################### ##### This file is automagically generated -- edit at your own risk ##### ##### Copyright (c) 1998-2010 Richard Nelson. All Rights Reserved. ##### ##### file: ${Makefile} Makefile for Sendmail databases ##### 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: ${Parse_mc::database_file} ##### ##### Usage: ##### 1) Make all targets upto date - use one of the following: ##### A) \`(cd /etc/mail && make)\` ##### B) \`make -f ${Makefile}\` ##### C) \`${Makefile}\` ##### 2) Force update of - Add to one of the ##### prior commands ie, \`${Makefile} access\`. Most ##### any reasonable value is accepted. ##### #################################################################### SHELL=/bin/sh # # targets that will be routed to the /etc/init.d/sendmail script # NOTE: newaliases and clean removed due to extant rules # INIT = start stop restart restart-if-running \\ reload-if-running reload force-reload \\ hoststat purgestat mailstats mailq runq control \\ status debug .SUFFIXES: .PRECIOUS: $Makefile # # all, the default target, will update everything # .PHONY: all all: sendmail $reload_stamp # # route to the /etc/init.d/sendmail script # .PHONY: \$(INIT) \$(INIT): FORCE /etc/init.d/sendmail \$\@ EOT }; # #------------------------------------------------------------------------------ # Write Makefile 'CLEAN' target #------------------------------------------------------------------------------ sub write_target_clean { my ($ofh) = @_; my @names; %created_files = (); foreach my $entry (@databases) { next if ($entry eq 'QUEUE_GROUP' or $entry eq 'Makefile' or $entry eq 'auth' or $entry eq 'tls' or $entry eq 'include' ); my ($class, $flags, $files, $options) = &Parse_mc::entry_dbs($entry); foreach my $file (@{$files}) { next if ( $file eq '-' or exists($created_files{$file}) ); $created_files{$file} = ''; my $dbname; if ($class eq 'parse_mc' or $class eq 'update_mk' or $class eq 'm4') { $dbname = "/etc/mail/$entry"; } elsif ($class eq 'update_conf') { $dbname = "/etc/cron.d/sendmail"; } elsif ($class eq 'btree' or $class eq 'hash' or $class eq 'newaliases') { $dbname = "$file.db"; } else { $dbname = $file; }; push @names, $dbname; }; }; print $ofh <<"EOT"; # # clean target, remove {sendmail,submit}.cf and generated databases # EOT print $ofh ".PHONY: clean\n", "clean: FORCE\n", "\trm -f ",join(";\n\trm -f ", @names),";\n"; }; # #------------------------------------------------------------------------------ # Write Makefile 'RESTART' target #------------------------------------------------------------------------------ sub write_target_restart { my ($ofh) = @_; my $file; print $ofh <<"EOT"; # # restart target, check to see if sendmail needs to be restarted # .PHONY: noreload norestart noreload norestart: FORCE \@su smmsp -s /bin/sh -c "touch $reload_stamp" .PHONY: should_reload should_restart should_reload should_restart: FORCE \@rm -f $reload_stamp; \@\$(MAKE) -sf $Makefile $reload_stamp; EOT # Spew secondary target of actual restart %created_files = (); my @right; foreach my $entry (sort &Parse_mc::restart_dbs()) { if (! exists($created_dbs{$entry})) { push @created_dbs, $entry; $created_dbs{$entry} = ''; }; my ($class, $flags, $files, $options) = &Parse_mc::entry_dbs($entry); foreach my $file (@{$files}) { next if ( $file eq '-' or exists($created_files{$file}) ); $created_files{$file} = ''; my $dbname = $file; $dbname =~ s/\.mc$/\.cf/; push @right, "$dbname"; }; }; print $ofh "$reload_stamp: \\\n\t", join(" \\\n\t", @right), "\n", "\t\@if [ ! -f \$\@ ]; then \\\n", "\t\techo 'A forced reload...'; \\\n", "\telse \\\n", "\t\techo 'The following file(s) have changed:'; \\\n", "\t\techo ' \$?'; \\\n", "\t\tfi;\n", "\t\@echo '** ** You should issue ", "\`/etc/init.d/sendmail reload\` ** **';\n"; }; # #------------------------------------------------------------------------------ # Write Sendmail dependancies #------------------------------------------------------------------------------ sub write_target_sendmail { my ($ofh) = @_; print $ofh <<"EOT"; # # sendmail targets, depend upon *ALL* relevant files/databases # .PHONY: sendmail sendmail: sendmail_files sendmail_dbs EOT my (@smfiles, @smdbs); %created_files = (); foreach my $entry (@created_dbs) { my ($class, $flags, $files, $options) = &Parse_mc::entry_dbs($entry); foreach my $file (@{$files}) { next if $file eq '-'; next if $file eq 'ldap'; # ALIAS hack if ($class eq 'parse_mc' or $class eq 'update_mk' or $class eq 'm4') { push @smfiles, "$file" if (!exists($created_files{$file})); $created_files{$file} = ''; push @smdbs, "/etc/mail/$entry"; } elsif ($class eq 'update_conf') { push @smdbs, "/etc/cron.d/sendmail"; } elsif ($class eq 'btree' or $class eq 'hash' or $class eq 'newaliases') { push @smfiles, "$file" if (!exists($created_files{$file})); $created_files{$file} = ''; push @smdbs, "$file.db"; } else { push @smfiles, "$file" if (!exists($created_files{$file})); $created_files{$file} = ''; }; }; }; print $ofh ".PHONY: sendmail_files\n", "sendmail_files: \\\n\t", join(" \\\n\t", @smfiles), "\n\n"; print $ofh ".PHONY: sendmail_dbs\n", "sendmail_dbs: \\\n\t", join(" \\\n\t", @smdbs), "\n"; }; # #------------------------------------------------------------------------------ # Write Makefile individual targets #------------------------------------------------------------------------------ sub write_targets { my ($ofh) = @_; my $file; print $ofh <<"EOT"; # # Individual database targets # # # Default db type is hash (Must be in /etc/mail, or # fully qualify the dataset for this target to work) # %.db: % FORCE \@echo 'Updating \$\@...'; \@if [ -x /usr/sbin/makemap ]; then \\ /usr/sbin/makemap hash \$\@.new.db < \$<; \\ chown root:smmsp \$\@.new.db; \\ chmod 0640 \$\@.new.db; \\ mv -f \$\@.new.db \$\@; \\ fi; EOT # Spew primary target of foreach my $entry (@databases) { my ($class, $flags, $files, $options) = &Parse_mc::entry_dbs($entry); my @names; my $left = ''; my $right = ''; my $sleft = ''; my $dbname = ''; print $ofh "\n"; # Create short name(s) for database entries $sleft .= "$entry "; if ($class eq 'newaliases' or $class eq 'parse_mc' or $class eq 'update_mk' or $class eq 'update_conf' or $class eq 'update_auth' or $class eq 'update_tls' ) { $sleft = 'makefile make ' if ($class eq 'update_mk'); $sleft .= 'cron ' if ($class eq 'update_conf'); $sleft .= "$class "; }; foreach my $file (@{$files}) { next if $file eq '-'; next if $file eq 'ldap'; # ALIAS hack if ($entry eq 'QUEUE_GROUP' or $entry eq 'include') { $dbname = ''; $sleft = lc "${entry}s"; $left = lc "${entry}s"; } elsif ($class eq 'parse_mc' or $class eq 'update_mk' or $class eq 'm4') { $dbname = "/etc/mail/$entry"; } elsif ($class eq 'update_conf') { $dbname = "/etc/cron.d/sendmail"; } elsif ($class eq 'btree' or $class eq 'hash' or $class eq 'newaliases') { $dbname = "$file.db"; } else { $dbname = $file; $file = "" if ($class eq 'update_tls' or $class eq 'update_auth'); }; $left .= "$dbname "; $right .= " $file"; # Create short name(s) for database entries if ($class ne 'parse_mc' and $class ne 'update_mk' and $class ne 'update_conf' and $class ne 'update_auth' and $class ne 'update_tls' and $entry ne 'QUEUE_GROUP' and $entry ne 'include' ) { my $dbsname = "$dbname"; $dbsname =~ s/\/etc\/mail\///; $sleft .= "$dbsname " if ($entry ne $dbsname); if ($file ne $dbname) { $dbsname =~ s/\.db//; $sleft .= "$dbsname " if ($entry ne $dbsname); }; }; }; # Spew out a phony entry suitable for FORCE print $ofh '.PHONY: ', $sleft, "\n"; print $ofh $sleft,": FORCE\n" if ($entry ne 'QUEUE_GROUP' and $entry ne 'include'); if ($class eq 'update_mk') { print $ofh "\t\@touch $right;\n", "\t\@\$(MAKE) -sf $Makefile $left;\n"; } elsif ($entry ne 'QUEUE_GROUP' and $entry ne 'include') { print $ofh "\t\@rm -f $left;\n", "\t\@\$(MAKE) -sf $Makefile $left;\n"; }; # # Spew out the whole enchilada for this database if ($entry eq 'sendmail.cf' or $entry eq 'databases') { my ($iclass, $iflags, $ifiles, $ioptions) = &Parse_mc::entry_dbs('include'); $right .= ' '; $right .= join(' ', @{$ifiles}); }; print $ofh $left, ':', $right, "\n"; next if ($entry eq 'QUEUE_GROUP' or $entry eq 'include'); print $ofh "\t\@echo 'Updating $entry ...';\n"; if ($class eq 'newaliases') { print $ofh "\t\@if [ -x /usr/sbin/sendmail ]; then \\\n"; print $ofh "\t\t/usr/sbin/sendmail -bi || true; \\\n"; } elsif ($class eq 'parse_mc' or $class eq 'update_conf' or $class eq 'update_mk' or $class eq 'update_auth' or $class eq 'update_tls' ) { print $ofh "\t\@if [ -x /usr/share/sendmail/${class} ]; then \\\n"; print $ofh "\t\t/usr/share/sendmail/${class} || true; \\\n" } elsif ($class eq 'btree' or $class eq 'hash') { print $ofh "\t\@if [ -x /usr/sbin/makemap ]; then \\\n"; }; foreach my $file (@{$files}) { next if ( $file eq 'ldap' ); # ALIAS hack my $dbname = $file; my $newname = $file; my $uid = 'root'; $uid = 'smmta' if ($entry eq 'authinfo' or $entry eq 'access_db' or $entry eq 'QUEUE_GROUP' or $class eq 'newaliases'); my $mode = '0644'; $mode = '0640' if ($entry eq 'authinfo' or $entry eq 'access_db'); $mode = '0640' if ($class eq 'btree' or $class eq 'hash'); $mode = '0644' if ($class eq 'm4'); $mode = '0754' if ($class eq 'update_mk'); $mode = '02750' if ($entry eq 'QUEUE_GROUP'); if ($class eq 'btree' or $class eq 'hash') { $dbname .= '.db'; $newname .= '.new.db'; if (index($flags, '-o') == -1) { print $ofh "\t\t/usr/sbin/makemap $class $newname \\\n", "\t\t\t< $file; \\\n", "\t\tchown $uid:smmsp $newname; \\\n", "\t\tchmod $mode $newname; \\\n", "\t\tmv -f $newname $dbname; \\\n"; } else { print $ofh "\t\tif [ -s $file ]; then \\\n", "\t\t/usr/sbin/makemap $class $newname \\\n", "\t\t\t< $file; \\\n", "\t\tchown $uid:smmsp $newname; \\\n", "\t\tchmod $mode $newname; \\\n", "\t\tmv -f $newname $dbname; \\\n", "\t\tfi; \\\n"; }; } elsif ($class eq 'newaliases') { $newname .= '.db'; print $ofh "\t\tif [ -f $newname ]; then \\\n", "\t\t\tchown $uid:smmsp $newname; \\\n", "\t\t\tchmod $mode $newname; \\\n", "\t\t\tfi; \\\n"; } elsif ($class eq 'parse_mc' or $class eq 'update_mk') { $newname = "/etc/mail/$entry"; print $ofh "\t\tchown $uid:smmsp $newname; \\\n", "\t\tchmod $mode $newname; \\\n"; } elsif ($class eq 'm4') { my $oldname = $dbname; $dbname =~ s/\.mc$/\.cf/; $newname =~ s/\.mc$/\.cf\.new/; my $lead = "\t"; my $leadh = "\t\@"; my $lead2 = "\t\t"; my $trail = ""; if ($entry eq 'submit.cf') { $lead = "\t\t"; $leadh = "\t\t"; $lead2 = "\t\t\t"; $trail = "\\"; }; print $ofh "\t\@rm -f ${dbname}.errors\n"; print $ofh "\t\@if [ -f /usr/share/sendmail/cf/feature/msp.m4 ]; ", "then \\\n" if ($entry eq 'submit.cf'); print $ofh "${leadh}m4 $file > $newname \\\n", "${lead2}2> ${dbname}.errors || true; $trail\n", "${leadh}echo \"### ${oldname} ###\" \\\n", "${lead2}>> $newname; $trail\n", "${leadh}sed -e 's/^/# /' $file \\\n", "${lead2}>> $newname; $trail\n", "${leadh}chown $uid:smmsp $newname; $trail\n", "${leadh}chmod $mode $newname; $trail\n", "${leadh}mv -f $newname $dbname; $trail\n", "${leadh}if [ -s ${dbname}.errors ]; then \\\n", "${lead2}chown $uid:smmsp ${dbname}.errors; \\\n", "${lead2}cat ${dbname}.errors; \\\n", "${lead}else \\\n", "${lead2}rm -f ${dbname}.errors; \\\n", "${lead2}fi; $trail\n"; print $ofh "${lead}fi;\n" if ($entry eq 'submit.cf'); }; }; if ($class eq 'newaliases' or $class eq 'parse_mc' or $class eq 'update_conf' or $class eq 'update_mk' or $class eq 'update_auth' or $class eq 'update_tls' or $class eq 'btree' or $class eq 'hash' ) { print $ofh "\t\tfi;\n"; }; }; }; # #------------------------------------------------------------------------------ # Write Makefile file targets (create any missing files) #------------------------------------------------------------------------------ sub write_files { my ($ofh) = @_; print $ofh <<"EOT"; # # Individual file targets - create any requisite files # EOT %created_files = (); foreach my $entry (@created_dbs) { my ($class, $flags, $files, $options) = &Parse_mc::entry_dbs($entry); # These are done above... next if ($entry eq 'databases' or $entry eq 'auth' or $entry eq 'tls' or $entry eq 'Makefile' or $entry eq 'include' ); foreach my $file (@{$files}) { next if ( $file eq '-' or exists($created_files{$file}) ); $created_files{$file} = ''; my $uid = 'root'; $uid = 'smmta' if ($entry eq 'authinfo' or $entry eq 'access_db' or $entry eq 'QUEUE_GROUP' or $class eq 'newaliases'); my $mode = '0644'; $mode = '0640' if ($entry eq 'authinfo' or $entry eq 'access_db'); $mode = '0640' if ($class eq 'btree' or $class eq 'hash'); $mode = '0644' if ($class eq 'm4'); $mode = '0754' if ($class eq 'update_mk'); $mode = '02750' if ($entry eq 'QUEUE_GROUP'); print $ofh "\n$file:\n", "\t\@echo 'Creating $file';\n"; if ($entry eq 'QUEUE_GROUP') { print $ofh "\t\@install -d", " -o $uid -g smmsp -m $mode $file;\n", "\t\@chown $uid:smmsp $file;\n", "\t\@chmod $mode $file;\n"; } elsif ($entry eq 'sendmail.cf') { print $ofh "\t\@/usr/sbin/sendmailconfig", " --no-reload;\n"; } elsif ($entry eq 'submit.cf') { print $ofh "\t\@cp /usr/share/sendmail/", "cf/debian/submit.mc \\\n", "\t\t$file;\n", "\t\@chown $uid:smmsp $file;\n", "\t\@chmod $mode $file;\n"; } elsif ($entry eq 'access_db') { print $ofh "\t\@cp /usr/share/sendmail/", "examples/db/access \\\n", "\t\t$file;\n", "\t\@chown $uid:smmsp $file;\n", "\t\@chmod $mode $file;\n"; } elsif ($file eq '/etc/mail/aliases') { print $ofh "\t\@ln -s ../aliases /etc/mail/aliases\n"; } elsif ($class eq 'update_conf' or $class eq 'update_auth' or $class eq 'update_tls') { print $ofh "\t\@/usr/share/sendmail/${class};\n"; } # FIXME: come back and create real data # where needed (local-host-names, etc) elsif (index($flags, '-o') == -1) { print $ofh "\t\@touch $file;\n", "\t\@chown $uid:smmsp $file;\n", "\t\@chmod $mode $file;\n"; } elsif (index($flags, '-o') != -1) { print $ofh "\t# Optional file...\n"; }; }; }; }; # #------------------------------------------------------------------------------ # Write Makefile footer #------------------------------------------------------------------------------ sub write_footer { my ($ofh) = @_; print $ofh <<"EOT"; # # FORCE target, allow one to override dependancies # .PHONY: FORCE FORCE: ; EOT };