JFIF       %%-))-969KKd       %%-))-969KKd! f%eK_.T  v_/n6q>e}&Cx@t7OuqySN%y%tz@ Un(quo{tS]\~LzǚPk;fϛϹ2y-=_z.NWW7DW@'4`3w3rr;hP8B%ַBe]`7Ҽo1e)弆O|4Wk*}7Su[9=U 9 |_+:@}@˵u@ g<4N<@=/ I(~}qq=y- u|. y'`3S+4$e= k4P]M^_Nou*R-,X0EI}m&LtVȱa|R\@ ʟ+YeIlY`XV^HV/c-eb du ̈́_2+DpV ` ^^->t7JydE]I 8:7#j̀iiVbp~o݃[}zwGF@-(RTJY@ Ty}X 1!2AQaq"3BR`r@PSb #4CTs0DU$EFcd?Lc4\K#E1$@CV8OƂZ5g;.141;%]6e laǃpv8)80D1ŌxLgWYc+z%:( w^PtdԣV Z:qDsh W) ͷ+~FO]"բ?eN 4)WREZ;T+}]:FRtI ѱއ>'s_[\qNhK ' ^qJv9 ]ʜ1FMzwF8ѯBIp-g`?si;|Hr%>jOh29-+-gQmBH?3P9e')>[k^OaxtLiS30ҿ6*o--I$ 1 z2+OЪ+i˺,_n3(~}StUMc \xSmGD0jMB06%') #1c6s/iaIɉgC%Yoi**MHЛ=rh ĭ總 E>Jў2+ct/^$[_kAOʕicR4qm#Lw!Squ/:e%~zMBfa|e7PUC|"/)CD\cy gڰF9(?\jU+>Cwl#>x^'a7C}LYX<@X`W8P hۂx͍q֜?de1qe* NDuTm-ߣ y+pUy*9aĺ:P4n$2&BTϵ@ a>v3uc,(uF0jˊ́a~32f2=ήZe[r!F !Bu)b FŌt%41N/֑41n1|> 1^;1=IĖEpq%"{/~M.QWDdUA6~z>kPh2Oi?Uc[`+l;՚':۾ږtoZjQ7\:Z3}~ &ڮRQH{mDq0TaM5i:5sC0x<]=Mp c!C<6]~vpxeH[AmY'iԖ_~ a(Ȕ@+a< w] wbk1#aD 9. ?p$ Qؒi-8S㨸f45t:ʙѾ.{mMshU1k\z^*#It@ v:%#iSZ.{.Vemm,Z3*;HtU8E.v'e ޴ 4WwLDe)jY*R'?wM֣ b+IfO('Y J$o޼ l.蕁~ Y Em>Y^m"r^4w}2PI7R1gV\wtVT׿w'*N{ZGN8qzrM/LO~ O~|ڞ櫮o{\dV斀AJmn E#HQg$!{XM'{u* 4O)>F.";l2z3IJ2?Fh7)rjrv@ AJlУ 0`StpGD&nƒpxΡ}P늿D@cEH҆2[9a}U/biEzu)xYR>߹q (yA~ُp \U\L\6~" U'>GJOP,ko:JGI*٢C8f8굟m#GV̐Cj]}N_]aJulE.+I&y5 6*TGHZRů}efjv"\3/3_hq՝g !ir,ܐv%~*lXccyo) 拏Qp_tT3!,Dur!CH7;9GQQmE:ÑCaƅ;zeij;d+% z#e%gdI9E5BB&۟S"=C(>{֠ ɫNUळiu>;P}حW]ouBmJS0ktRtDm+$ԫU_dq)$ ʃnLGSፑf'vlzP/_]QԂ]ȗ|W\;wTSf!m,ri{w了enP(`*.1i2.}e@;HA&_N᷸1|:Gjڒj~i/֬]1(N +^ bQq:›m*o5Y(.JPV[3ޭj֭j+i(uָ]kV)A/%X Fa?8'o>ꝣKks\_k)S%zDTRw#h#e#1Euk&,Yw+Ap"PIZ*j*Ug">m>|ڇ(#FXzCi9%J'H3Xwi-9s0S`R^֮ YLJz+q^i}i1jLK+ [ NzDSq[+Q'ݖl=s<[iIWz=%}[jɁ֠$$N7IUm83SVŭw)#0$g C26^ʓW<=B>{R)&繻8j3cbbce7TE1r\'}FūLO+KʢXm/=H 6FaRHI^Lȹ83g9CM93쑑nE)=q4I$s'ݠajm]"O>L4Vb;(eHm$֫ӆyYtYYr(<Ɠ2Fm "f֒;Tξu8jZR$b!E*9 yy+V:Dm Œ9@-f*l2#ٿPt#T҂ӵ&;AȃWlf xϜZكfj%bs ,/uN{,Gz*kkP M6f/0[I;S)ml-؉)~q9v`ǣ4gZJ}h&dﺥ#{}uDa7j(I'2OҒMF7 .Ey<$5;2ժTI %)TwG54Ŭ Kb6rG;uq\[8DJ'i$?Pq-ݗs\JGkYO2%}b\9;Tk⾜3%qSd( [O4i'jQՃ &F Ҧ T2!G{N j~:Cz J3|xd(6TZ a b5gfK\I)WYARA(RVE$G8at̖qWq{B:Q^g3QzcAZrH|GMcjb{+)r=>:de:¹[QOe@>ISP1nIq!:3G).!ŶB꠲#0Eb2"Lt4ƺKCGn9P=PeoX8@fղ Gi9k ^aHAV<)GG*k_aUΜWsX4ʷ\%m,W*F}<1E/&NJIʳ:PmeRuń%A<ᶧ2s^s-9$PHw]ZB#[>9Fm*>Ut.HugK9uaAF.%fW&J~$k^S:iގT9_5`_bR`ܒ(8Fa?jMc4Pŭ!VB7 W+߀ i>b٠,]?<{aXgpJ]璹نrV53-)p:,R%>#W۲4K{%L%]ͅP,7"[NI:ܴ- AJr)#"=k#Eoa PP$C>7m_t ڠcJZymA [qwDw|*3(FMۭ\KP-'1WK, suu;~ZaTnyi$A =46i֑AUU"l:gA ]"8&ד<{z&O!WF^XGhViWM\q(*p#Fk?p\Ym*J3B3'%jn+ IG{VcVL-f7 #/u}5bD7XMi!{#b$U]q\RGa ;OZXv^WZ\ܭ( lhSˎ6 V'h GY{49$r8AIȃ#V$HL/~l.]:>29:EkSO%N$Ϋkͯ⫝̸yˮ0mE+IVwuIu>Xj%6@[k)aqJz|؏!Υ֔RP.l@tⵅkZg'5nrqDU^kJBEBfrG)+J$"dB3#ٔk4yQCz9S\8'#/5cˑYO(4dhIM<6BߢJNDZFEgD6vnl|^kr;^hϨ1!ʌ:įZBᝋx|T+'!c t"YH=)"g6-t+.Ur$+ZzRG s*f9_QY4El>DI[}B=>v)iTg[?oWwۿlWG69k{Qx]-*$<-=W¹nUĂ}G4tZ]^Q8m!])SyR)vOR(_Aiϵei#{$hਧ.SLN}߬e}EgZwgAWPBcZÖ']P ;2/hy}1M9Fj'.ӖZy-,r ND|jlC)jqSʚV)]p3;❀[:tBH##HqhZr\j"tG-тtHtB24PJ:w;xI0$ wEQ#)FejK rSw|">Tҙ#2Xc8g,(L`S2 tM>5@<)A71iXSlHڛ9(y4KUu:xARdf5\Zq|m{ӭjI8%. ڟ5pxvqd(9P$#"8CQ NKFۘ;RTPE8^`WãRxL髍{}ġͭ緗Ҍ/<xcKOVy0\{Uk85A07)_uCuopN>~3e e޽ytYnDm3)ܠ&,![y3CcؽK+raޱX~aRbm<wE #+ԺQXfGq+h[71_A* [V٣sCEXb\fNiXNݔz NҲ wrG"+ kлYI`ϼUՄ o9Vc7^[Y"E]W>(GSkt]Gcx~hM`?WV8q w< `bJb̑ NNG[xr̈>Kþ7<7H56pIEKgoE`?4e)ޛ)7M(-4ot}LDG6"qycg~x{>8.,7W_ɦ/nG|MFU^VYpa",BBBH;GC#2JerK*ZIqbIphت݉)c繥ՅVtLnEcf62:;\Rw@{ S5Q $ϑTz;EzFO5Pn.NA<~ҌoXR|Ig$^]A|^_mmҷj8mbMbՅHmvI_MqƊFCq&Б%z>ΧKEAg4y;/0f[|@$SG,h5@0RȁцEH-qm%Kb%Dx:0XNHWIᰵ$G)|^ χ,m,#%6צIpO FDFUH5JKlI>Vxn;ĶY;dZkarnƭaeG< W#9+؄l?jEmDo<~W++0#π*<.ۘZ+H$VfF|J&#N ?*<<⢌՞\.#I: !#Sh-4'F |-[WQFH7 )d`JFCbFɞ9N9vՅW4xPOBHc2a"*90Iv5IGI<hI I*'Ƿ.-m1ȼѹKF2ٷ;*A*T6FDSKsipI tGx f$9 Ǐzf{kd@r:/?(i^b 3)_g;&IEWu̓*2t7qL Ti5, wdXr&Gwmŏy)IJD+iE:v6[=9ʰ;q` =}#q:<>~mFU631TqQ (t2/c~ iK'y˴TlxsF_$ {a8[yfc>Y͘k8&9x\Նڻ{I&7+ fv F=,ꌼcCA[c:麑î6B겦&|mFm㪈Rfw .xJês1?_UnuQGǪ?6wR5b-:q{wK  !1A2Qq"@PRa #03BCSbr4$T`c?K)o<rzѸUL<6K4F̘E¹?Q7 QZtʄSV9iE$m6vU>8_F!zaS# j_4Jzm_bȚ;/:Iq7A9Qڜp͖!QTaOSTQzqS5U{LHOWc;TWUA}YWqUNKURѾĴ:gfYnQ*dv?F6i1G6[H?W*!Wl 8OlE?U$jv<&Rا@TG"X޺51?Ikymc{TLʧA4Y+#a=[#j Ge;@֍Xًv_(uVgJjbէz;5$۱ʡ)zv|eS u̎b{ean<6\;CQ<@΍b{ZM%[*n,z{EZR++e`w޹bh9cWF2ǴU:RMWd架;UJcDtK_G@y5GāYzF 8cWb㖈qw4ecqMis,)',o=ߘq5e-0j.}xNGq?d;D5T Dbng2!zN%i`IJ4]JN Kv ./iLZFOii h=yn%wdԲ:d뉆2 ]|1jnvBV@XkxN_;J Kӯ$ΟVlXm x[0'id =qcamjdӚȹaE4rY26!۩PS#U v{-51~q<'x;Z *'Fg"pojg9l:5W媴txyyUU%`_58Mngv[+jz>XwbIt$]ɞ*{ &b^F=C4ЏZ+ F\pR]9c1b * @@K,\ϔ =0<9N{U^ozﺊ<˒D4p2 ,Ƿ˗:#]j*&*jFTܪTdF@x8׭CX2U&y({9b駴to90\DUaaƏ@J:tš#x]d0pUiJ!Џ_1Ke9s$\t%ZiW-]ZVp[!c8OڋGPmM 'ÈX$I"s)Ȍ[ڦT ׫wJsn$QӨ]dJ[;~ԕ$lŧt}7RU@&778ܷK "$4C^iQ􄆺h(Cg#P QҤ1 7~V=6~8:#7/N5qz=8ȂiEʀJpnx8.9@~1m3sE? :zqGY}:O#yw23$1%m}8`E毑s_PznQ[LF%D;S)י -YW < quTݪҒl>I£$qG,Ȑf=g + `~}m5dO+ipyOfv]ishu*8tx"4n7putfV]D`i=ZHWIwȩ<[.P\xӊF)jbKfzASi{*u#8 9p뚰 H@ff>,`2 L6b8 mw{Hn3|b3Fg1e6C<eH /_~B#L *t0xbS% 웞: Aɔ89hjd[OY墪9sŎzNZ:&Yiu%MGw=Y ]QӍ -u@'p[wK%suԘse^wbiɫ:f䲯4ֶCP JFE32 X;yVeAbFyyX%H ,vgb~Ksʊ&V φ 5f̅2K7ZVԎBLǑ=zv-yq,nȇ'(:8$(rH*!S RI.Lj"9\W>])|›\o?-tEs#678PI:e5n$i0ScudA F(ET lq{讬3 28xۆ1IPԲ v0r$0{[J*cyA 1OQ-3f5;׆!`;mV[g{*d$221VR8jk.aH)7c=BO>~ T77XӇʧ _NاVV:Gye)NKk Ǵ`ՏS=Wy\cu`}@8C2su XqC Պ̜xEU ڭ{$KόI@F؛NLOA$F[X2rĔG L\wE2J3S8IJ2e`A7),b +noĐ<{XA"Lj%W̮RI7=e0O {F 3t6ǽN7aNHmo!_5G/GGz`ǻwl${wzd2X,!a/@X{wh]S MARIJUANA
— DIOS — NO — CREA — NADA — EN — VANO —
Linux vps-ed8565de 5.10.0-32-cloud-amd64 #1 SMP Debian 5.10.223-1 (2024-08-10) x86_64
  SOFT : Apache/2.4.65 (Debian) PHP : 7.4.33
/sbin/
51.178.36.14

 
[ NAME ] [ SIZE ] [ PERM ] [ DATE ] [ ACT ]
+FILE +DIR
a2disconf 15.895 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
a2dismod 15.895 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
a2dissite 15.895 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
a2enconf 15.895 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
a2enmod 15.895 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
a2ensite 15.895 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
a2query 9.639 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
aa-remove-unknown 2.996 KB -rwxr-xr-x 2021-04-03 06:09 R E G D
aa-status 34.438 KB -rwxr-xr-x 2021-04-03 06:09 R E G D
aa-teardown 0.136 KB -rwxr-xr-x 2020-12-07 11:27 R E G D
accessdb 14.383 KB -rwxr-xr-x 2021-02-19 10:14 R E G D
add-shell 0.894 KB -rwxr-xr-x 2020-09-27 17:25 R E G D
addgnupghome 3.003 KB -rwxr-xr-x 2022-07-01 07:03 R E G D
addgroup 33.717 KB -rwxr-xr-x 2023-07-24 20:12 R E G D
adduser 33.717 KB -rwxr-xr-x 2023-07-24 20:12 R E G D
agetty 63.414 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
apache2 720.422 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
apache2ctl 7.06 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
apachectl 7.06 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
apparmor_parser 1.38 MB -rwxr-xr-x 2021-04-03 06:09 R E G D
apparmor_status 34.438 KB -rwxr-xr-x 2021-04-03 06:09 R E G D
applygnupgdefaults 2.165 KB -rwxr-xr-x 2022-07-01 07:03 R E G D
arp 66.086 KB -rwxr-xr-x 2025-05-30 20:08 R E G D
arpd 78.266 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
arptables 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
arptables-nft 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
arptables-nft-restore 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
arptables-nft-save 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
arptables-restore 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
arptables-save 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
badblocks 34.164 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
blkdeactivate 15.968 KB -rwxr-xr-x 2021-02-22 21:39 R E G D
blkdiscard 34.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
blkid 118.258 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
blkzone 74.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
blockdev 66.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
bridge 128.43 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
capsh 30.148 KB -rwxr-xr-x 2025-02-24 11:38 R E G D
cfdisk 102.586 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
cgdisk 210.328 KB -rwxr-xr-x 2021-02-09 05:35 R E G D
chcpu 46.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
check_forensic 0.93 KB -rwxr-xr-x 2011-04-26 15:10 R E G D
chgpasswd 66.047 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
chmem 62.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
chpasswd 58.047 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
chronyd 282.891 KB -rwxr-xr-x 2022-03-14 21:17 R E G D
chroot 46.938 KB -rwxr-xr-x 2020-09-24 08:36 R E G D
cpgr 60.18 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
cppw 60.18 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
cron 54.484 KB -rwxr-xr-x 2021-02-22 22:43 R E G D
ctrlaltdel 38.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
debugfs 233.656 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
delgroup 15.18 KB -rwxr-xr-x 2023-07-24 20:12 R E G D
deluser 15.18 KB -rwxr-xr-x 2023-07-24 20:12 R E G D
depmod 166.18 KB -rwxr-xr-x 2021-01-08 01:37 R E G D
devlink 166.469 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
dhclient 504.703 KB -rwxr-xr-x 2023-02-20 08:19 R E G D
dhclient-script 14.125 KB -rwxr-xr-x 2023-02-20 08:19 R E G D
dmsetup 166.867 KB -rwxr-xr-x 2021-02-22 21:39 R E G D
dmstats 166.867 KB -rwxr-xr-x 2021-02-22 21:39 R E G D
dpkg-fsys-usrunmess 15.104 KB -rwxr-xr-x 2023-09-13 21:38 R E G D
dpkg-preconfigure 3.577 KB -rwxr-xr-x 2021-06-10 17:17 R E G D
dpkg-reconfigure 4.344 KB -rwxr-xr-x 2021-06-10 17:17 R E G D
dumpe2fs 30.234 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
e2freefrag 14.227 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
e2fsck 339.656 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
e2image 38.234 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
e2label 110.406 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
e2mmpstatus 30.234 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
e2scrub 7.125 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
e2scrub_all 5.269 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
e2undo 22.227 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
e4crypt 26.227 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
e4defrag 34.148 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
ebtables 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ebtables-nft 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ebtables-nft-restore 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ebtables-nft-save 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ebtables-restore 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ebtables-save 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ethtool 520.008 KB -rwxr-xr-x 2020-10-28 21:37 R E G D
faillock 13.992 KB -rwxr-xr-x 2025-08-03 09:06 R E G D
fdformat 34.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
fdisk 150.273 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
filefrag 18.172 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
findfs 14.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
fixparts 74.32 KB -rwxr-xr-x 2021-02-09 05:35 R E G D
fsck 54.273 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
fsck.cramfs 42.258 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
fsck.ext2 339.656 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
fsck.ext3 339.656 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
fsck.ext4 339.656 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
fsck.minix 122.25 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
fsfreeze 14.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
fstab-decode 14.156 KB -rwxr-xr-x 2021-12-16 18:12 R E G D
fstrim 70.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
gdisk 210.328 KB -rwxr-xr-x 2021-02-09 05:35 R E G D
genl 82.289 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
getcap 14.148 KB -rwxr-xr-x 2025-02-24 11:38 R E G D
getpcaps 14.148 KB -rwxr-xr-x 2025-02-24 11:38 R E G D
getty 63.414 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
groupadd 86.766 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
groupdel 82.578 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
groupmems 62.086 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
groupmod 90.703 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
grpck 62.023 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
grpconv 57.898 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
grpunconv 57.898 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
grub-install 1.14 MB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-macbless 922.18 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-mkconfig 8.425 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-mkdevicemap 216.648 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-probe 938.492 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-reboot 4.727 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
grub-set-default 3.472 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
halt 1.02 MB -rwxr-xr-x 2025-06-26 00:44 R E G D
httxt2dbm 14.156 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
hwclock 102.352 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
iconvconfig 30.664 KB -rwxr-xr-x 2025-05-27 10:40 R E G D
ifconfig 81.961 KB -rwxr-xr-x 2025-05-30 20:08 R E G D
ifdown 86.078 KB -rwxr-xr-x 2020-11-04 06:37 R E G D
ifquery 86.078 KB -rwxr-xr-x 2020-11-04 06:37 R E G D
ifup 86.078 KB -rwxr-xr-x 2020-11-04 06:37 R E G D
init 1.66 MB -rwxr-xr-x 2025-06-26 00:44 R E G D
insmod 166.18 KB -rwxr-xr-x 2021-01-08 01:37 R E G D
installkernel 2.597 KB -rwxr-xr-x 2020-09-27 17:25 R E G D
invoke-rc.d 16.12 KB -rwxr-xr-x 2020-12-14 20:19 R E G D
ip 617.805 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
ip6tables 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ip6tables-apply 6.892 KB -rwxr-xr-x 2021-01-15 22:03 R E G D
ip6tables-legacy 96.813 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ip6tables-legacy-restore 96.813 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ip6tables-legacy-save 96.813 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ip6tables-nft 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ip6tables-nft-restore 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ip6tables-nft-save 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ip6tables-restore 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ip6tables-restore-translate 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ip6tables-save 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ip6tables-translate 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
ipmaddr 18.5 KB -rwxr-xr-x 2025-05-30 20:08 R E G D
iptables 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
iptables-apply 6.892 KB -rwxr-xr-x 2021-01-15 22:03 R E G D
iptables-legacy 96.813 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
iptables-legacy-restore 96.813 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
iptables-legacy-save 96.813 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
iptables-nft 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
iptables-nft-restore 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
iptables-nft-save 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
iptables-restore 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
iptables-restore-translate 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
iptables-save 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
iptables-translate 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
iptunnel 26.492 KB -rwxr-xr-x 2025-05-30 20:08 R E G D
isosize 30.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
killall5 26.227 KB -rwxr-xr-x 2021-12-16 18:12 R E G D
ldattach 34.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
ldconfig 967.789 KB -rwxr-xr-x 2025-05-27 10:40 R E G D
locale-gen 1.498 KB -rwxr-xr-x 2025-05-19 10:56 R E G D
logrotate 98.086 KB -rwxr-xr-x 2023-06-30 17:45 R E G D
logsave 14 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
losetup 110.336 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
lsmod 166.18 KB -rwxr-xr-x 2021-01-08 01:37 R E G D
make-ssl-cert 6.653 KB -rwxr-xr-x 2021-06-06 21:02 R E G D
mariadbd 23.44 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
mii-tool 27 KB -rwxr-xr-x 2025-05-30 20:08 R E G D
mke2fs 138.469 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
mkfs 14.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
mkfs.bfs 34.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
mkfs.cramfs 42.164 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
mkfs.ext2 138.469 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
mkfs.ext3 138.469 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
mkfs.ext4 138.469 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
mkfs.minix 110.234 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
mkhomedir_helper 22.016 KB -rwxr-xr-x 2025-08-03 09:06 R E G D
mkinitramfs 10.595 KB -rwxr-xr-x 2021-03-13 18:13 R E G D
mklost+found 14.148 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
mkswap 106.234 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
modinfo 166.18 KB -rwxr-xr-x 2021-01-08 01:37 R E G D
modprobe 166.18 KB -rwxr-xr-x 2021-01-08 01:37 R E G D
mysqld 23.44 MB -rwxr-xr-x 2025-05-30 06:25 R E G D
nameif 18.68 KB -rwxr-xr-x 2025-05-30 20:08 R E G D
newusers 94.641 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
nfnl_osf 18.148 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
nologin 14.148 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
pam-auth-update 20.201 KB -rwxr-xr-x 2025-08-03 09:06 R E G D
pam_getenv 2.822 KB -rwxr-xr-x 2025-07-22 19:53 R E G D
pam_timestamp_check 13.992 KB -rwxr-xr-x 2025-08-03 09:06 R E G D
phpdismod 7.107 KB -rwxr-xr-x 2020-05-11 13:22 R E G D
phpenmod 7.107 KB -rwxr-xr-x 2020-05-11 13:22 R E G D
phpquery 6.239 KB -rwxr-xr-x 2020-05-11 13:22 R E G D
pivot_root 14.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
plipconfig 14.422 KB -rwxr-xr-x 2025-05-30 20:08 R E G D
postalias 21.992 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
postcat 22.063 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
postconf 187.469 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
postdrop 18.117 KB -r-xr-sr-x 2024-03-09 15:38 R E G D
postfix 18.07 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
postfix-add-filter 4.899 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
postfix-add-policy 3.831 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
postkick 13.992 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
postlock 13.992 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
postlog 14.148 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
postmap 21.992 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
postmulti 30.383 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
postqueue 22.07 KB -r-xr-sr-x 2024-03-09 15:38 R E G D
postsuper 30.289 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
posttls-finger 38.086 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
poweroff 1.02 MB -rwxr-xr-x 2025-06-26 00:44 R E G D
pwck 58.016 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
pwconv 53.891 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
pwunconv 53.898 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
qemu-ga 595.32 KB -rwxr-xr-x 2025-09-08 21:30 R E G D
qemu-make-debian-root 3.217 KB -rwxr-xr-x 2025-09-02 15:58 R E G D
qmqp-sink 17.992 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
qmqp-source 22.008 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
qshape 12.548 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
rarp 37.117 KB -rwxr-xr-x 2025-05-30 20:08 R E G D
raw 14.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
readprofile 22.258 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
reboot 1.02 MB -rwxr-xr-x 2025-06-26 00:44 R E G D
remove-shell 0.94 KB -rwxr-xr-x 2020-09-27 17:25 R E G D
resize2fs 62.227 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
resolvconf 4.926 KB -rwxr-xr-x 2021-01-06 17:54 R E G D
rmail 13.992 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
rmmod 166.18 KB -rwxr-xr-x 2021-01-08 01:37 R E G D
rmt 58.961 KB -rwxr-xr-x 2024-01-20 09:59 R E G D
rmt-tar 58.961 KB -rwxr-xr-x 2024-01-20 09:59 R E G D
route 69.125 KB -rwxr-xr-x 2025-05-30 20:08 R E G D
rsyslogd 706.328 KB -rwxr-xr-x 2022-05-20 21:05 R E G D
rtacct 48.289 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
rtcwake 46.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
rtmon 78.242 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
runlevel 1.02 MB -rwxr-xr-x 2025-06-26 00:44 R E G D
runuser 70.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
sendmail 30.148 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
service 8.884 KB -rwxr-xr-x 2020-12-14 20:19 R E G D
setcap 14.148 KB -rwxr-xr-x 2025-02-24 11:38 R E G D
sfdisk 142.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
sgdisk 202.328 KB -rwxr-xr-x 2021-02-09 05:35 R E G D
shadowconfig 0.864 KB -rwxr-xr-x 2020-02-07 14:54 R E G D
shutdown 1.02 MB -rwxr-xr-x 2025-06-26 00:44 R E G D
slattach 45.18 KB -rwxr-xr-x 2025-05-30 20:08 R E G D
smtp-sink 34.93 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
smtp-source 30.016 KB -rwxr-xr-x 2024-03-09 15:38 R E G D
split-logfile 2.358 KB -rwxr-xr-x 2025-07-29 20:18 R E G D
sshd 867.633 KB -rwxr-xr-x 2025-05-08 11:03 R E G D
start-stop-daemon 43.195 KB -rwxr-xr-x 2023-09-13 21:38 R E G D
sudo_logsrvd 179.469 KB -rwxr-xr-x 2025-06-26 17:03 R E G D
sudo_sendlog 147 KB -rwxr-xr-x 2025-06-26 17:03 R E G D
sulogin 46.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
swaplabel 18.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
swapoff 22.219 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
swapon 50.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
switch_root 14.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
sysctl 30.227 KB -rwxr-xr-x 2021-04-06 07:17 R E G D
tarcat 0.914 KB -rwxr-xr-x 2024-01-20 09:59 R E G D
tc 557.914 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
tcptraceroute 1.557 KB -rwxr-xr-x 2022-12-29 07:27 R E G D
tcptraceroute.db 1.557 KB -rwxr-xr-x 2022-12-29 07:27 R E G D
telinit 1.02 MB -rwxr-xr-x 2025-06-26 00:44 R E G D
tipc 126.234 KB -rwxr-xr-x 2021-02-05 23:34 R E G D
traceroute 71.156 KB -rwxr-xr-x 2022-12-29 07:27 R E G D
tune2fs 110.406 KB -rwxr-xr-x 2024-10-03 14:08 R E G D
tzconfig 0.104 KB -rwxr-xr-x 2025-04-01 08:18 R E G D
unix_chkpwd 38 KB -rwxr-sr-x 2025-08-03 09:06 R E G D
unix_update 38 KB -rwxr-xr-x 2025-08-03 09:06 R E G D
update-ca-certificates 5.176 KB -rwxr-xr-x 2021-01-19 10:11 R E G D
update-grub 0.063 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
update-grub2 0.063 KB -rwxr-xr-x 2023-10-02 14:11 R E G D
update-icon-caches 0.582 KB -rwxr-xr-x 2024-07-19 13:30 R E G D
update-info-dir 1.66 KB -rwxr-xr-x 2021-01-08 21:54 R E G D
update-initramfs 6.744 KB -rwxr-xr-x 2021-01-14 18:04 R E G D
update-locale 2.991 KB -rwxr-xr-x 2025-05-19 10:56 R E G D
update-mime 9.182 KB -rwxr-xr-x 2021-02-25 18:24 R E G D
update-passwd 34.406 KB -rwxr-xr-x 2021-07-10 11:57 R E G D
update-pciids 1.712 KB -rwxr-xr-x 2020-12-24 17:49 R E G D
update-rc.d 16.918 KB -rwxr-xr-x 2020-12-14 20:19 R E G D
update-secureboot-policy 5.133 KB -rwxr-xr-x 2019-05-25 01:26 R E G D
useradd 139.523 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
userdel 94.703 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
usermod 135.336 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
uuidd 42.305 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
validlocale 1.731 KB -rwxr-xr-x 2025-05-19 10:55 R E G D
vigr 68.398 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
vipw 68.398 KB -rwxr-xr-x 2025-04-18 13:46 R E G D
visudo 230.477 KB -rwxr-xr-x 2025-06-26 17:03 R E G D
wipefs 46.227 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
xtables-legacy-multi 96.813 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
xtables-monitor 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
xtables-nft-multi 215.07 KB -rwxr-xr-x 2021-01-17 18:05 R E G D
zic 54.563 KB -rwxr-xr-x 2025-05-27 10:40 R E G D
zramctl 114.344 KB -rwxr-xr-x 2024-03-28 10:09 R E G D
REQUEST EXIT
©TheAlmightyZeus
#!/usr/bin/perl -w # # a2enmod by Stefan Fritsch # Licensed under Apache License 2.0 # # The coding style is "perltidy -pbp" use strict; use Cwd 'realpath'; use File::Spec; use File::Basename; use File::Path; use Getopt::Long; use 5.014; no if $] >= 5.017011, warnings => 'experimental::smartmatch'; my $quiet; my $force; my $maintmode; my $purge; Getopt::Long::Configure('bundling'); GetOptions( 'quiet|q' => \$quiet, 'force|f' => \$force, 'maintmode|m' => \$maintmode, 'purge|p' => \$purge ) or exit 2; my $basename = basename($0); $basename =~ /^a2(en|dis)(mod|site|conf)((?:-.+)?)$/ or die "$basename call name unknown\n"; my $act = $1; my $obj = $2; my $dir_suffix = $3; my @essential_module_list = qw(alias auth_basic authn_file authz_host authz_user autoindex deflate dir env filter logio mime negotiation setenvif unixd version watchdog); my $env_file = $ENV{APACHE_ENVVARS}; if (! $env_file) { if ($ENV{APACHE_CONFDIR}) { $env_file = "$ENV{APACHE_CONFDIR}/envvars"; } else { $env_file = "/etc/apache2$dir_suffix/envvars"; } } $ENV{LANG} = 'C'; read_env_file($env_file); $act .= 'able'; my ( $name, $dir, $sffx, $reload ); if ( $obj eq 'mod' ) { $obj = 'module'; $dir = 'mods'; $sffx = '.load'; $reload = 'restart'; } elsif ( $obj eq 'conf' ) { $obj = 'conf'; $dir = 'conf'; $sffx = '.conf'; $reload = 'reload'; } else { $dir = 'sites'; $sffx = '.conf'; $reload = 'reload'; } $name = ucfirst($obj); my $confdir = $ENV{APACHE_CONFDIR} || "/etc/apache2$dir_suffix"; my $availdir = $ENV{ uc("APACHE_${dir}_AVAILABLE") } || "$confdir/$dir-available"; my $enabldir = $ENV{ uc("APACHE_${dir}_ENABLED") } || "$confdir/$dir-enabled"; my $statedir = $ENV{ uc("APACHE_STATE_DIRECTORY") } || "/var/lib/apache2"; $statedir .= "/$obj"; my $choicedir = $act eq 'enable' ? $availdir : $enabldir; my $linkdir = File::Spec->abs2rel( $availdir, $enabldir ); my $request_reload = 0; my $request_htcacheclean; my $htc = "apache-htcacheclean$dir_suffix"; my $htc_service = "apache-htcacheclean"; # Service name for systemd my $apache_service = "apache2"; if (defined($dir_suffix) and $dir_suffix ne '') { # Uses '@instance.service' suffix instead of '-instance' suffix my $service_suffix = '@' . substr($dir_suffix, 1) . '.service'; $htc_service .= $service_suffix; $apache_service .= $service_suffix; } my $rc = 0; if ( !scalar @ARGV ) { my @choices = myglob('*'); print "Your choices are: @choices\n"; print "Which ${obj}(s) do you want to $act (wildcards ok)?\n"; my $input = <>; @ARGV = split /\s+/, $input; } my @objs; foreach my $arg (@ARGV) { $arg =~ s/${sffx}$//; my @glob = myglob($arg); if ( !@glob ) { error("No $obj found matching $arg!\n"); $rc = 1; } else { push @objs, @glob; } } foreach my $acton (@objs) { doit($acton) or $rc = 1; } my $htcstart = ""; my $apache_reload = ""; my $cmd = ($act eq "enable") ? "start" : "stop"; if (is_systemd()) { $htcstart = " systemctl $cmd $htc_service\n"; $apache_reload = " systemctl $reload $apache_service\n"; } else { $htcstart = " service $htc $cmd\n"; $apache_reload = " service apache2$dir_suffix $reload\n"; } info( "To activate the new configuration, you need to run:\n" . $apache_reload . ($request_htcacheclean ? $htcstart : "") ) if $request_reload; exit($rc); ############################################################################## sub myglob { my $arg = shift; my @glob = map { s{^$choicedir/}{}; s{$sffx$}{}; $_ } glob("$choicedir/$arg$sffx"); return @glob; } sub doit { my $acton = shift; my ( $conftgt, $conflink ); if ( $obj eq 'module' ) { if ( $act eq 'enable' && $acton eq 'cgi' && threaded() ) { print "Your MPM seems to be threaded. Selecting cgid instead of cgi.\n"; $acton = 'cgid'; } $conftgt = "$availdir/$acton.conf"; if ( -e $conftgt ) { $conflink = "$enabldir/$acton.conf"; } } my $tgt = "$availdir/$acton$sffx"; my $link = "$enabldir/$acton$sffx"; if ( !-e $tgt ) { if ( -l $link && !-e $link ) { if ( $act eq 'disable' ) { info("removing dangling symlink $link\n"); unlink($link); # force a .conf path. It may exist as dangling link, too $conflink = "$enabldir/$acton.conf"; if ( -l $conflink && !-e $conflink ) { info("removing dangling symlink $conflink\n"); unlink($conflink); } return 1; } else { error("$link is a dangling symlink!\n"); } } if ( $purge ) { switch_marker( $obj, $act, $acton ); # exit silently, we are purging anyway return 1; } error("$name $acton does not exist!\n"); return 0; } # handle module dependencies if ( $obj eq 'module' ) { if ( $act eq 'enable' ) { my @depends = get_deps("$availdir/$acton.load"); do_deps( $acton, @depends ) or return 0; my @conflicts = get_deps( "$availdir/$acton.load", "Conflicts" ); check_conflicts( $acton, @conflicts ) or return 0; } else { my @depending; foreach my $d ( glob("$enabldir/*.load") ) { my @deps = get_deps($d); if ( is_in( $acton, @deps ) ) { $d =~ m,/([^/]+).load$,; push @depending, $1; } } if ( scalar @depending ) { if ($force) { do_deps( $acton, @depending ) or return 0; } else { error( "The following modules depend on $acton ", "and need to be disabled first: @depending\n" ); return 0; } } } } elsif ( $act eq 'enable' ) { my @depends = get_deps("$availdir/$acton$sffx"); warn_deps( $acton, @depends ) or return 0; } if ( $act eq 'enable' ) { my $check = check_link( $tgt, $link ); if ( $check eq 'ok' ) { if ($conflink) { # handle .conf file my $confcheck = check_link( $conftgt, $conflink ); if ( $confcheck eq 'ok' ) { info("$name $acton already enabled\n"); return 1; } elsif ( $confcheck eq 'missing' ) { print "Enabling config file $acton.conf.\n"; add_link( $conftgt, $conflink ) or return 0; } else { error( "Config file $acton.conf not properly enabled: $confcheck\n" ); return 0; } } else { info("$name $acton already enabled\n"); return 1; } } elsif ( $check eq 'missing' ) { if ($conflink) { # handle .conf file my $confcheck = check_link( $conftgt, $conflink ); if ( $confcheck eq 'missing' ) { add_link( $conftgt, $conflink ) or return 0; } elsif ( $confcheck ne 'ok' ) { error( "Config file $acton.conf not properly enabled: $confcheck\n" ); return 0; } } print "Enabling $obj $acton.\n"; special_module_handling($acton); return add_link( $tgt, $link ) && switch_marker( $obj, $act, $acton ); } else { error("$name $acton not properly enabled: $check\n"); return 0; } } else { if ( -e $link || -l $link ) { special_module_handling($acton); if ($obj eq 'module' && grep {$_ eq $acton} @essential_module_list) { $force || essential_module_handling($acton); } remove_link($link); if ( $conflink && -e $conflink ) { remove_link($conflink); } switch_marker( $obj, $act, $acton ); print "$name $acton disabled.\n"; } elsif ( $conflink && -e $conflink ) { print "Disabling stale config file $acton.conf.\n"; remove_link($conflink); } else { info("$name $acton already disabled\n"); if ( $purge ) { switch_marker( $obj, $act, $acton ); } return 1; } } return 1; } sub get_deps { my $file = shift; my $type = shift || "Depends"; my $fd; if ( !open( $fd, '<', $file ) ) { error("Can't open $file: $!"); return; } my $line; while ( defined( $line = <$fd> ) ) { chomp $line; if ( $line =~ /^# $type:\s+(.*?)\s*$/ ) { my $deps = $1; return split( /[\n\s]+/, $deps ); } # only check until the first non-empty non-comment line last if ( $line !~ /^\s*(?:#.*)?$/ ); } return; } sub do_deps { my $acton = shift; foreach my $d (@_) { info("Considering dependency $d for $acton:\n"); if ( !doit($d) ) { error("Could not $act dependency $d for $acton, aborting\n"); return 0; } } return 1; } sub warn_deps { my $acton = shift; my $modsenabldir = $ENV{APACHE_MODS_ENABLED} || "$confdir/mods-enabled"; foreach my $d (@_) { info("Checking dependency $d for $acton:\n"); if ( !-e "$modsenabldir/$d.load" ) { warning( "Module $d is not enabled, but $acton depends on it, aborting\n" ); return 0; } } return 1; } sub check_conflicts { my $acton = shift; my $haderror = 0; foreach my $d (@_) { info("Considering conflict $d for $acton:\n"); my $tgt = "$availdir/$d$sffx"; my $link = "$enabldir/$d$sffx"; my $confcheck = check_link( $tgt, $link ); if ( $confcheck eq 'ok' ) { error( "Module $d is enabled - cannot proceed due to conflicts. It needs to be disabled first!\n" ); # Don't return immediately, there could be several conflicts $haderror++; } } if ($haderror) { return 0; } return 1; } sub add_link { my ( $tgt, $link ) = @_; # create relative link if ( !symlink( File::Spec->abs2rel( $tgt, dirname($link) ), $link ) ) { die("Could not create $link: $!\n"); } $request_reload = 1; return 1; } sub check_link { my ( $tgt, $link ) = @_; if ( !-e $link ) { if ( -l $link ) { # points to nowhere info("Removing dangling link $link"); unlink($link) or die "Could not remove $link\n"; } return 'missing'; } if ( -e $link && !-l $link ) { return "$link is a real file, not touching it"; } if ( realpath($link) ne realpath($tgt) ) { return "$link exists but does not point to $tgt, not touching it"; } return 'ok'; } sub remove_link { my ($link) = @_; if ( -l $link ) { unlink($link) or die "Could not remove $link: $!\n"; } elsif ( -e $link ) { error("$link is not a symbolic link, not deleting\n"); return 0; } $request_reload = 1; return 1; } sub threaded { my $result = ""; $result = qx{/usr/sbin/apache2ctl -V | grep 'threaded'} if -x '/usr/sbin/apache2ctl'; if ( $? != 0 ) { # config doesn't work if ( -e "$enabldir/mpm_prefork.load" ) { return 0; } elsif (-e "$enabldir/mpm_worker.load" || -e "$enabldir/mpm_event.load" ) { return 1; } else { error("Can't determine enabled MPM"); # do what user requested return 0; } } if ( $result =~ / no/ ) { return 0; } elsif ( $result =~ / yes/ ) { return 1; } else { die("Can't parse output from apache2ctl -V:\n$result\n"); } } sub info { print @_ if !$quiet; } sub error { print STDERR 'ERROR: ', @_; } sub warning { print STDERR 'WARNING: ', @_; } sub is_in { my $needle = shift; foreach my $e (@_) { return 1 if $needle eq $e; } return 0; } sub read_env_file { my $file = shift; -r $file or return; my @lines = qx{env - sh -c '. $file && env'}; if ($?) { die "Could not read $file\n"; } foreach my $l (@lines) { chomp $l; $l =~ /^(.*)?=(.*)$/ or die "Could not parse $file\n"; $ENV{$1} = $2; } } sub switch_marker { die('usage: switch_marker([module|site|conf], [enable|disable], $name)') if @_ != 3; my $which = shift; my $what = shift; my $name = shift; my $mode = "admin"; $mode = "maint" if $maintmode; #print("switch_marker $which $what $name\n"); # TODO: get rid of the magic string(s) my $state_marker_dir = "$statedir/$what" . "d" . "_by_$mode"; my $state_marker = "$state_marker_dir/$name"; if ( !-d $state_marker_dir ) { File::Path::mkpath("$state_marker_dir") || error( "Failed to create marker directory: '$state_marker_dir'\n"); } # XXX: swap find with perl alternative my @markers = qx{find "$statedir" -type f -a -name "$name"}; chomp(@markers); foreach (@markers) { unless ( unlink $_ ) { error("Failed to remove old marker '$_'!\n") && return 0; } } unless ($purge) { qx{touch "$state_marker"}; if ( $? != 0 ) { error("Failed to create marker '$state_marker'!\n") && return 0; } return 1; } } sub essential_module_handling { my $module = shift; print "WARNING: The following essential module will be disabled.\n"; print "This might result in unexpected behavior and should NOT be done\n"; print "unless you know exactly what you are doing!\n $module\n\n"; print "To continue type in the phrase 'Yes, do as I say!' or retry by passing '-f': "; my $input = ; chomp($input); if ($input ne 'Yes, do as I say!') { print("Aborting\n"); exit(1) } } sub special_module_handling { my $acton = shift; if ($obj ne 'module') { return; } given ($acton) { when ('ssl') { if ( $act eq 'enable' ) { info( "See /usr/share/doc/apache2/README.Debian.gz on " . "how to configure SSL and create self-signed " . "certificates.\n" ); } } when ('cache_disk') { $request_htcacheclean = 1; my $verb = "\u$act"; my $command; $verb =~ s/e$/ing/; if (-d "/run/systemd" and -x "/bin/systemctl") { info("$verb external service $htc_service\n"); $command = "systemctl $act $htc_service"; } else { info("$verb external service $htc\n"); $command = "update-rc.d $htc $act"; } my $res = system($command); if ($res == 0) { info("The service will be started on next reboot.\n") if $act eq 'enable'; } else { warning("'$command' failed\n"); } } } } sub is_systemd { my $init = readlink("/proc/1/exe") || ""; return scalar $init =~ /systemd/; } # vim: syntax=perl sw=4 sts=4 sr et