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 # adduser: a utility to add users to the system # addgroup: a utility to add groups to the system # Copyright (C) 1997, 1998, 1999 Guy Maor # Copyright (C) 1995 Ted Hajek # Ian A. Murdock # Bugfixes and other improvements Roland Bauerschmidt # General scheme of the program adapted by the original debian 'adduser' # program by Ian A. Murdock . # # 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # #################### # See the usage subroutine for explanation about how the program can be called #################### use warnings; use strict; use Debian::AdduserCommon; use Getopt::Long; my $version = "3.118+deb11u1"; ################### # return values use constant RET_OK => 0; # OK use constant RET_OBJECT_ALREADY_EXISTS => 1; # the user or group does already exist, so the requested action cannot be performed use constant RET_INVALID_CHARS_IN_NAME => 1; # the provided name contains invalid characters use constant RET_ADDUSER_ABORTED => 1; # the program was aborted (eg via Ctrl+C) use constant RET_INVALID_CALL => 1; # getopt returned with "false" BEGIN { local $ENV{PERL_DL_NONLAZY}=1; eval 'use Locale::gettext'; if ($@) { *gettext = sub { shift }; *textdomain = sub { "" }; *LC_MESSAGES = sub { 5 }; } eval { require POSIX; import POSIX qw(setlocale); }; if ($@) { *setlocale = sub { return 1 }; } eval { require I18N::Langinfo; import I18N::Langinfo qw(langinfo YESEXPR NOEXPR); }; if ($@) { *langinfo = sub { return shift; }; *YESEXPR = sub { "^[yY]" }; *NOEXPR = sub { "^[nN]" }; } } setlocale(LC_MESSAGES, ""); textdomain("adduser"); my $yesexpr = langinfo(YESEXPR()); my %config; # configuration hash my @defaults = ("/etc/adduser.conf"); my $nogroup_id = getgrnam("nogroup") || 65534; $0 =~ s+.*/++; our $verbose = 1; # should we be verbose? my $allow_badname = 0; # should we allow bad names? my $ask_passwd = 1; # ask for a passwd? my $disabled_login = 0; # leave the new account disabled? our $configfile = undef; our $found_group_opt = undef; our $found_sys_opt = undef; our $ingroup_name = undef; our $new_firstuid = undef; our $new_gecos = undef; our $new_gid = undef; our $new_lastuid = undef; our $new_uid = undef; our $no_create_home = undef; our $special_home = undef; our $special_shell = undef; our $add_extra_groups = 0; # Global variables we need later my $existing_user = undef; my $existing_group = undef; my $new_name = undef; my $make_group_also = 0; my $home_dir = undef; my $undohome = undef; my $undouser = undef; my $undogroup = undef; my $shell = undef; my $first_uid = undef; my $last_uid = undef; my $dir_mode = undef; my $perm = undef; our @names; # Parse options, sanity checks unless ( GetOptions ("quiet|q" => sub { $verbose = 0 }, "force-badname" => \$allow_badname, "help|h" => sub { &usage(); exit RET_OK }, "version|v" => sub { &version(); exit RET_OK }, "system" => \$found_sys_opt, "group" => \$found_group_opt, "ingroup=s" => \$ingroup_name, "home=s" => \$special_home, "gecos=s" => \$new_gecos, "shell=s" => \$special_shell, "disabled-password" => sub { $ask_passwd = 0 }, "disabled-login" => sub { $disabled_login = 1; $ask_passwd = 0 }, "uid=i" => \$new_uid, "firstuid=i" => \$new_firstuid, "lastuid=i" => \$new_lastuid, "gid=i" => \$new_gid, "conf=s" => \$configfile, "no-create-home" => \$no_create_home, "add_extra_groups" => \$add_extra_groups, "debug" => sub { $verbose = 2 } ) ) { &usage(); exit RET_INVALID_CALL; } # everyone can issue "--help" and "--version", but only root can go on dief (gtx("Only root may add a user or group to the system.\n")) if ($> != 0); if( defined($configfile) ) { @defaults = ($configfile); } # detect the right mode my $action = $0 eq "addgroup" ? "addgroup" : "adduser"; if (defined($found_sys_opt)) { $action = "addsysuser" if ($action eq "adduser"); $action = "addsysgroup" if ($action eq "addgroup"); } # explicitly set PATH, because super (1) cleans up the path and makes adduser unusable; # this is also a good idea for sudo (which doesn't clean up) $ENV{"PATH"}="/bin:/usr/bin:/sbin:/usr/sbin"; $ENV{"IFS"}=" \t\n"; ############################ # checks related to @names # ############################ while (defined(my $arg = shift(@ARGV))) { push (@names, $arg); } if ( (! defined $names[0]) || length($names[0]) == 0 || @names > 2) { dief (gtx("Only one or two names allowed.\n")); } if (@names == 2) { # must be addusertogroup dief (gtx("Specify only one name in this mode.\n")) if ($action eq "addsysuser" || $found_group_opt); $action = "addusertogroup"; $existing_user = shift (@names); $existing_group = shift (@names); } else { # 1 parameter, must be adduser $new_name = shift (@names); } ################################### # check for consistent parameters # ################################### if ($action ne "addgroup" && defined($found_group_opt) +defined($ingroup_name) +defined($new_gid) > 1 ) { dief (gtx("The --group, --ingroup, and --gid options are mutually exclusive.\n")); } if ((defined($special_home)) && ($special_home !~ m+^/+ )) { dief (gtx("The home dir must be an absolute path.\n")); } if (defined($special_home) && $verbose) { printf gtx("Warning: The home dir %s you specified already exists.\n"),$special_home if (!defined($no_create_home) && -d $special_home); printf gtx("Warning: The home dir %s you specified can't be accessed: %s\n"), $special_home, $! if (defined($no_create_home) && ! -d $special_home); } if ($found_group_opt) { if ($action eq "addsysuser") { $make_group_also = 1; } elsif ($found_sys_opt) { $action = "addsysgroup"; } else { $action = "addgroup"; } } $ENV{"VERBOSE"} = $verbose; $ENV{"DEBUG"} = $verbose; # preseed configuration data and then read the config file preseed_config(\@defaults,\%config); &checkname($new_name) if defined $new_name; $SIG{'INT'} = $SIG{'QUIT'} = $SIG{'HUP'} = 'handler'; ##### # OK, we've processed the arguments. $action equals one of the following, # and the appropriate variables have been set: # # $action = "adduser" # $new_name - the name of the new user. # $ingroup_name | $new_gid - the group to add the user to # $special_home, $new_uid, $new_gecos - optional overrides # $action = "addgroup" # $new_name - the name of the new group # $new_gid - optional override # $action = "addsysgroup" # $new_name - the name of the new group # $new_gid - optional override # $action = "addsysuser" # $new_name - the name of the new user # $make_group_also | $ingroup_name | $new_gid | 0 - which group # $special_home, $new_uid, $new_gecos - optional overrides # $action = "addusertogroup" # $existing_user - the user to be added # $existing_group - the group to add her to ##### ################# ## addsysgroup ## ################# if ($action eq "addsysgroup") { # Check if requested group already exists and we can exit safely my $ret = existing_group_ok($new_name, $new_gid); if ($ret == 3) { print STDERR "$0: " if $verbose; printf STDERR (gtx("The group `%s' already exists as a system group. Exiting.\n"), $new_name) if $verbose; exit RET_OK; } if ($ret == 1) { print STDERR "$0: " if $verbose; printf STDERR (gtx("The group `%s' already exists and is not a system group. Exiting.\n"), $new_name); exit RET_OBJECT_ALREADY_EXISTS; } if ($ret == 2) { print STDERR "$0: " if $verbose; printf STDERR (gtx("The group `%s' already exists, but has a different GID. Exiting.\n"), $new_name); exit RET_OBJECT_ALREADY_EXISTS; } dief (gtx("The GID `%s' is already in use.\n"),$new_gid) if (defined($new_gid) && defined(getgrgid($new_gid))); if (!defined($new_gid)) { $new_gid = &first_avail_gid($config{"first_system_gid"}, $config{"last_system_gid"}); if ($new_gid == -1) { print STDERR "$0: "; printf STDERR gtx("No GID is available in the range %d-%d (FIRST_SYS_GID - LAST_SYS_GID).\n"),$config{"first_system_gid"},$config{"last_system_gid"}; dief (gtx("The group `%s' was not created.\n"),$new_name); } } printf (gtx("Adding group `%s' (GID %d) ...\n"),$new_name,$new_gid) if $verbose; &invalidate_nscd("group"); my $groupadd = &which('groupadd'); &systemcall($groupadd, '-g', $new_gid, $new_name); &invalidate_nscd("group"); print (gtx("Done.\n")) if $verbose; exit RET_OK; } ############## ## addgroup ## ############## if ($action eq "addgroup") { dief (gtx("The group `%s' already exists.\n"),$new_name) if (defined getgrnam($new_name)); dief (gtx("The GID `%s' is already in use.\n"),$new_gid) if (defined($new_gid) && defined(getgrgid($new_gid))); if (!defined($new_gid)) { $new_gid = &first_avail_gid($config{"first_gid"}, $config{"last_gid"}); if ($new_gid == -1) { print STDERR "$0: "; printf STDERR gtx("No GID is available in the range %d-%d (FIRST_GID - LAST_GID).\n"),$config{"first_gid"},$config{"last_gid"}; dief (gtx("The group `%s' was not created.\n"),$new_name); } } printf (gtx("Adding group `%s' (GID %d) ...\n"),$new_name,$new_gid) if $verbose; &invalidate_nscd("group"); my $groupadd = &which('groupadd'); &systemcall($groupadd, '-g', $new_gid, $new_name); &invalidate_nscd("group"); print (gtx("Done.\n")) if $verbose; exit RET_OK; } #################### ## addusertogroup ## #################### if ($action eq "addusertogroup") { dief (gtx("The user `%s' does not exist.\n"),$existing_user) if (!defined getpwnam($existing_user)); dief (gtx("The group `%s' does not exist.\n"),$existing_group) if (!defined getgrnam($existing_group)); if (&user_is_member($existing_user, $existing_group)) { printf gtx("The user `%s' is already a member of `%s'.\n"), $existing_user,$existing_group if $verbose; exit RET_OK; # not really an error } printf gtx("Adding user `%s' to group `%s' ...\n"),$existing_user,$existing_group if $verbose; &invalidate_nscd(); my $gpasswd = &which('gpasswd'); &systemcall($gpasswd, '-a',$existing_user,$existing_group); &invalidate_nscd(); print (gtx("Done.\n")) if $verbose; exit RET_OK; } ################ ## addsysuser ## ################ if ($action eq "addsysuser") { if (existing_user_ok($new_name, $new_uid) == 1) { # a user with this name already exists; it's a problem when it's not a system user my $tmp_u = getpwnam($new_name); if (($tmp_u >= $config{"first_system_uid"}) and ($tmp_u <= $config{"last_system_uid"})) { printf (gtx("The system user `%s' already exists. Exiting.\n"), $new_name) if $verbose; exit RET_OK } warnf (gtx("The user `%s' already exists, but is not a system user. Exiting.\n"), $new_name); exit RET_OBJECT_ALREADY_EXISTS; } if (existing_user_ok($new_name, $new_uid) == 2) { warnf (gtx("The user `%s' already exists with a different UID. Exiting.\n"), $new_name); exit RET_OBJECT_ALREADY_EXISTS; } if (!$ingroup_name && !defined($new_gid) && !$make_group_also) { $new_gid = $nogroup_id; } check_user_group(1); if (!defined($new_uid) && $make_group_also) { $new_uid = &first_avail_uid($config{"first_system_uid"}, $config{"last_system_uid"}); if ($new_uid == -1) { print STDERR "$0: "; printf STDERR gtx("No UID/GID pair is available in the range %d-%d (FIRST_SYS_UID - LAST_SYS_UID).\n"),$config{"first_system_uid"},$config{"last_system_uid"}; dief (gtx("The user `%s' was not created.\n"),$new_name); } $new_gid = &first_avail_gid($config{"first_system_gid"}, $config{"last_system_gid"}); $ingroup_name = $new_name; } elsif (!defined($new_uid) && !$make_group_also) { $new_uid = &first_avail_uid($config{"first_system_uid"}, $config{"last_system_uid"}); if ($new_uid == -1) { print STDERR "$0: "; printf STDERR gtx("No UID is available in the range %d-%d (FIRST_SYS_UID - LAST_SYS_UID).\n"),$config{"first_system_uid"},$config{"last_system_uid"}; dief (gtx("The user `%s' was not created.\n"),$new_name); } if (defined($new_gid)) { $ingroup_name = getgrgid($new_gid); } elsif ($ingroup_name) { $new_gid = getgrnam($ingroup_name); } else { dief (gtx("Internal error")); } } else { if (defined($new_gid)) { $ingroup_name = getgrgid($new_gid); } elsif ($ingroup_name) { $new_gid = getgrnam($ingroup_name); } elsif ($make_group_also){ $new_gid=$new_uid; $ingroup_name=$new_name; } else { dief (gtx("Internal error")); } } printf (gtx("Adding system user `%s' (UID %d) ...\n"),$new_name,$new_uid) if $verbose; &invalidate_nscd(); # if we reach this point, and the group does already exist, we can use it. if ($make_group_also && !getgrnam($new_name)) { printf (gtx("Adding new group `%s' (GID %d) ...\n"),$new_name,$new_gid) if $verbose; $undogroup = $new_name; my $groupadd = &which('groupadd'); &systemcall($groupadd, '-g', $new_gid, $new_name); &invalidate_nscd("group"); } printf gtx("Adding new user `%s' (UID %d) with group `%s' ...\n"),$new_name,$new_uid,$ingroup_name if $verbose; $home_dir = $special_home || &homedir($new_name, $ingroup_name); $shell = $special_shell || '/usr/sbin/nologin'; $undouser = $new_name; my $useradd = &which('useradd'); &systemcall($useradd, '-d', $home_dir, '-g', $ingroup_name, '-s', $shell, '-u', $new_uid, $new_name); if(!$disabled_login) { my $usermod = &which('usermod'); &systemcall($usermod, '-p', '*', $new_name); } my $chage = &which('chage'); print "$chage -M 99999 $new_name\n" if ($verbose > 1); # do _not_ use systemcall() here, since systemcall() dies on # non-zero exit code and we need to do special handling here! if (system($chage, '-M', '99999', $new_name)) { if( ($?>>8) ne 15 ) { &cleanup(sprintf((gtx("`%s' returned error code %d. Exiting.\n")), "$chage -M 99999 $new_name", $?>>8)) if ($?>>8); &cleanup(sprintf((gtx("`%s' exited from signal %d. Exiting.\n")), "$chage -M 99999 $new_name", $?&255)); } else { printf STDERR (gtx("%s failed with return code 15, shadow not enabled, password aging cannot be set. Continuing.\n"), $chage); } } &invalidate_nscd(); if(defined($new_gecos)) { &ch_gecos($new_gecos); } create_homedir (0); exit RET_OK; } ############# ## adduser ## ############# if ($action eq "adduser") { if (!$ingroup_name && !defined($new_gid)) { if ($config{"usergroups"} =~ /yes/i) { $make_group_also = 1; } else { $new_gid = $config{"users_gid"}; } } check_user_group(0); $first_uid = $new_firstuid || $config{"first_uid"}; $last_uid = $new_lastuid || $config{"last_uid"}; printf (gtx("Adding user `%s' ...\n"),$new_name) if $verbose; if (!defined($new_uid) && $make_group_also) { $new_uid = &first_avail_uid($first_uid, $last_uid); if ($new_uid == -1) { print STDERR "$0: "; printf STDERR gtx("No UID/GID pair is available in the range %d-%d (FIRST_UID - LAST_UID).\n"),$first_uid,$last_uid; dief (gtx("The user `%s' was not created.\n"),$new_name); } $new_gid = &first_avail_gid($config{"first_gid"}, $config{"last_gid"}); $ingroup_name = $new_name; } elsif (!defined($new_uid) && !$make_group_also) { $new_uid = &first_avail_uid($first_uid, $last_uid); if ($new_uid == -1) { print STDERR "$0: "; printf STDERR gtx("No UID is available in the range %d-%d (FIRST_UID - LAST_UID).\n"),$config{"first_uid"},$config{"last_uid"}; dief (gtx("The user `%s' was not created.\n"),$new_name); } if (defined($new_gid)) { $ingroup_name = getgrgid($new_gid); } elsif ($ingroup_name) { $new_gid = getgrnam($ingroup_name); } else { dief (gtx("Internal error")); } } else { if (defined($new_gid)) { $ingroup_name = getgrgid($new_gid); } elsif ($ingroup_name) { $new_gid = getgrnam($ingroup_name); } elsif ($make_group_also){ $new_gid=$new_uid; $ingroup_name=$new_name; } else { dief (gtx("Internal error")); } } &invalidate_nscd(); if ($make_group_also) { printf (gtx("Adding new group `%s' (%d) ...\n"),$new_name,$new_gid) if $verbose; $undogroup = $new_name; my $groupadd = &which('groupadd'); &systemcall($groupadd, '-g', $new_gid, $new_name); &invalidate_nscd(); } printf gtx("Adding new user `%s' (%d) with group `%s' ...\n"),$new_name,$new_uid,$ingroup_name if $verbose; $home_dir = $special_home || &homedir($new_name, $ingroup_name); $shell = $special_shell || $config{"dshell"}; $undouser = $new_name; my $useradd = &which('useradd'); &systemcall($useradd, '-d', $home_dir, '-g', $ingroup_name, '-s', $shell, '-u', $new_uid, $new_name); &invalidate_nscd(); create_homedir (1); # copy skeleton data # useradd without -p has left the account disabled (password string is '!') my $yesexpr = langinfo(YESEXPR()); if ($ask_passwd) { for (;;) { my $passwd = &which('passwd'); # do _not_ use systemcall() here, since systemcall() dies on # non-zero exit code and we need to do special handling here! system($passwd, $new_name); my $ok = $?>>8; if ($ok != 0) { my $answer; # hm, error, should we break now? print (gtx("Permission denied\n")) if ($ok == 1); print (gtx("invalid combination of options\n")) if ($ok == 2); print (gtx("unexpected failure, nothing done\n")) if ($ok == 3); print (gtx("unexpected failure, passwd file missing\n")) if ($ok == 4); print (gtx("passwd file busy, try again\n")) if ($ok == 5); print (gtx("invalid argument to option\n")) if ($ok == 6); # Translators: [y/N] has to be replaced by values defined in your # locale. You can see by running "locale noexpr" which regular # expression will be checked to find positive answer. print (gtx("Try again? [y/N] ")); chop ($answer=); last if ($answer !~ m/$yesexpr/o); } else { last; ## passwd ok } } } else { if(!$disabled_login) { my $usermod = &which('usermod'); &systemcall($usermod, '-p', '*', $new_name); } } if (defined($new_gecos)) { &ch_gecos($new_gecos); } else { my $noexpr = langinfo(NOEXPR()); for (;;) { my $chfn = &which('chfn'); &systemcall($chfn, $new_name); # Translators: [y/N] has to be replaced by values defined in your # locale. You can see by running "locale yesexpr" which regular # expression will be checked to find positive answer. print (gtx("Is the information correct? [Y/n] ")); chop (my $answer=); last if ($answer !~ m/$noexpr/o); } } if ( ( $add_extra_groups || $config{"add_extra_groups"} ) && defined($config{"extra_groups"}) ) { printf (gtx("Adding new user `%s' to extra groups ...\n"), $new_name); foreach my $newgrp ( split ' ', $config{"extra_groups"} ) { if (!defined getgrnam($newgrp)) { warnf (gtx("The group `%s' does not exist.\n"),$newgrp); next; } if (&user_is_member($new_name, $newgrp)) { printf gtx("The user `%s' is already a member of `%s'.\n"), $new_name,$newgrp if $verbose; next; } printf gtx("Adding user `%s' to group `%s' ...\n"),$new_name,$newgrp if $verbose; &invalidate_nscd(); my $gpasswd = &which('gpasswd'); &systemcall($gpasswd, '-M', join(',', get_group_members($newgrp), $new_name), $newgrp); &invalidate_nscd(); } } if ($config{"quotauser"}) { printf (gtx("Setting quota for user `%s' to values of user `%s' ...\n"), $new_name, $config{quotauser}); my $edquota = &which('edquota'); &systemcall($edquota, '-p', $config{quotauser}, $new_name); } &systemcall('/usr/local/sbin/adduser.local', $new_name, $new_uid, $new_gid, $home_dir) if (-x "/usr/local/sbin/adduser.local"); exit RET_OK; } # # we never go here # # calculate home directory sub homedir { my $dir = $config{"dhome"}; $dir .= '/' . $_[1] if ($config{"grouphomes"} =~ /yes/i); $dir .= '/' . substr($_[0],0,1) if ($config{"letterhomes"} =~ /yes/i); $dir .= '/' . $_[0]; return $dir; } # create_homedir -- create the homedirectory # parameter # 1: $copy_skeleton: # if 0 -> don't copy the skeleton data # if 1 -> copy the files in /etc/skel to the newly created home directory # return values: # none sub create_homedir { my ($copy_skeleton) = @_; if ($no_create_home) { printf gtx("Not creating home directory `%s'.\n"), $home_dir if $verbose; } elsif (-e $home_dir) { printf gtx("The home directory `%s' already exists. Not copying from `%s'.\n"), $home_dir,$config{skel} if $verbose && !$no_create_home; my @homedir_stat = stat($home_dir); my $home_uid = $homedir_stat[4]; my $home_gid = $homedir_stat[5]; if (($home_uid != $new_uid) || ($home_gid != $new_gid)) { warnf gtx("Warning: The home directory `%s' does not belong to the user you are currently creating.\n"), $home_dir; } undef @homedir_stat; undef $home_uid; undef $home_gid; } else { printf gtx("Creating home directory `%s' ...\n"),$home_dir if $verbose; $undohome = $home_dir; &mktree($home_dir) || &cleanup(sprintf(gtx("Couldn't create home directory `%s': %s.\n"), $home_dir, $!)); chown($new_uid, $new_gid, $home_dir) || &cleanup("chown $new_uid:$new_gid $home_dir: $!\n"); $dir_mode = get_dir_mode($make_group_also); chmod ($dir_mode, $home_dir) || &cleanup("chmod $dir_mode $home_dir: $!\n"); if ($config{"skel"} && $copy_skeleton) { printf gtx("Copying files from `%s' ...\n"),$config{skel} if $verbose; open(my $FIND, "cd $config{skel}; find . -print |") || &cleanup(sprintf(gtx("fork for `find' failed: %s\n"), $!)); while (<$FIND>) { chop; next if ($_ eq "."); next if ($_ =~ qr/$config{skel_ignore_regex}/ ); ©_to_dir($config{"skel"}, $_, $home_dir, $new_uid, $new_gid, ($config{"setgid_home"} =~ /yes/i)); } } } } # mktree: create a directory and all parent directories, we don't care about the rights and so on # parameters: # tree: the path # return values: # none sub mktree { my($tree) = @_; my($done, @path); my $default_dir_mode = 0755; $tree =~ s:^/*(.*)/*$:$1:; # chop off leading & trailing slashes @path = split(/\//, $tree); $done = ""; while (@path) { $done .= '/' . shift(@path); -d $done || mkdir($done, $default_dir_mode) || return 0; } return 1; } # existing_user_ok: check if there's already a user present on the system which satisfies the requirements # parameter: # new_name: the name of the user to check # new_uid : the UID of the user # return values: # 0 if the the user doesn't exist # 1 if the user already exists with the specified uid (or $new_uid wasn't specified) # 2 if the user already exists, but $new_uid doesn't matches its uid sub existing_user_ok { my($new_name,$new_uid) = @_; my ($dummy1,$dummy2,$uid); if (($dummy1,$dummy2,$uid) = getpwnam($new_name)) { if( defined($new_uid) && $uid == $new_uid ) { return 1; } if (! defined($new_uid)) { return 1; } # TODO: do we really need this code? Range check shouldn't performed here if( $uid >= $config{"first_system_uid"} && $uid <= $config{"last_system_uid" } ) { return 2; } } else { return 0; } } # existing_group_ok: check if there's already a group which satiesfies the requirements # parameter: # new_name: the name of the group # new_gid : the UID of the group # return values: # 0 if the group doesn't exist # 1 if the group already exists with the specified gid (or $new_gid wasn't specified) # 2 if the group already exists, but $new_gid doesn't match its gid # 3 if the group already exists inside the system range sub existing_group_ok { my($new_name,$new_gid) = @_; my ($dummy1,$dummy2,$gid); if (($dummy1,$dummy2,$gid) = getgrnam($new_name)) { # TODO: is this check required? There shouldn't be any gid outside of our allowed range anyways ... if( $gid >= $config{"first_system_gid"} && $gid <= $config{"last_system_gid" } ) { return 3; } if (! defined($new_gid)) { return 1; } if ($gid == $new_gid) { return 1; } else { return 2; } } else { return 0; } } # check_user_group: ??? # parameters: # system: 0 if the user isn't a system user, 1 otherwise # return values: # sub check_user_group { my ($system) = @_; if( !$system || !existing_user_ok($new_name, $new_uid) ) { if( defined getpwnam($new_name) ) { if( $system ) { dief (gtx("The user `%s' already exists, and is not a system user.\n"),$new_name); } else { dief (gtx("The user `%s' already exists.\n"),$new_name); } } dief (gtx("The UID %d is already in use.\n"),$new_uid) if (defined($new_uid) && getpwuid($new_uid)); } if ($make_group_also) { if( !$system || !existing_group_ok($new_name, $new_uid) ) { dief (gtx("The group `%s' already exists.\n"),$new_name) if (defined getgrnam($new_name)); dief (gtx("The GID %d is already in use.\n"),$new_uid) if (defined($new_uid) && defined(getgrgid($new_uid))); } } else { dief (gtx("The group `%s' does not exist.\n"),$ingroup_name) if ($ingroup_name && !defined(getgrnam($ingroup_name))); dief (gtx("The GID %d does not exist.\n"),$new_gid) if (defined($new_gid) && !defined(getgrgid($new_gid))); } } # copy_to_dir : # parameters: # fromdir # file # todir # newi # newg # sgiddir # return values: # none sub copy_to_dir { my($fromdir, $file, $todir, $newu, $newg, $sgiddir) = @_; if (-l "$fromdir/$file") { my $target=readlink("$fromdir/$file") or &cleanup("readlink: $!\n"); my $curgid="$)"; my $curuid="$>"; my $error=""; $)="$newg"; $>="$newu"; symlink("$target", "$todir/$file") or $error="$!"; $>="$curuid"; $)="$curgid"; if( "$error" ne "" ) { &cleanup("symlink: $!\n"); } return; } elsif (-f "$fromdir/$file") { open (FILE, "$fromdir/$file") || &cleanup("open $fromdir/$file: $!"); open (NEWFILE, ">$todir/$file") || &cleanup("open >$todir/$file: $!"); (print NEWFILE ) || &cleanup("print $todir/$file: $!"); close FILE; close(NEWFILE) || &cleanup("close $todir/$file "); } elsif (-d "$fromdir/$file") { mkdir("$todir/$file", 700) || &cleanup("mkdir: $!"); } else { &cleanup(sprintf((gtx("Cannot deal with %s.\nIt is not a dir, file, or symlink.\n")), "$fromdir/$file")); } chown($newu, $newg, "$todir/$file") || &cleanup("chown $newu:$newg $todir/$file: $!\n"); $perm = (stat("$fromdir/$file"))[2] & 07777; $perm |= 02000 if (-d "$fromdir/$file" && ($perm & 010) && $sgiddir); chmod($perm, "$todir/$file") || &cleanup("chmod $todir/$file: $!\n"); } # checkname: perform some sanity checks # parameters: # none # return values: # none (exits on error) sub checkname { my ($name) = @_; if ($name !~ /^[_.A-Za-z0-9][-\@_.A-Za-z0-9]*\$?$/) { printf STDERR (gtx("%s: To avoid problems, the username should consist only of letters, digits, underscores, periods, at signs and dashes, and not start with a dash (as defined by IEEE Std 1003.1-2001). For compatibility with Samba machine accounts \$ is also supported at the end of the username\n"), $0); exit RET_INVALID_CHARS_IN_NAME;; } if ($name !~ qr/$config{"name_regex"}/) { if ($allow_badname) { print (gtx("Allowing use of questionable username.\n")) if ($verbose); } else { printf STDERR (gtx("%s: Please enter a username matching the regular expression configured via the NAME_REGEX configuration variable. Use the `--force-badname' option to relax this check or reconfigure NAME_REGEX.\n"), $0); exit RET_INVALID_CHARS_IN_NAME; } } } # first_avail_uid: return the first available uid in given range # parameters: # min, max: the range # return values: # -1 if no free uid is available # otherwise the choosen uid sub first_avail_uid { my ($min, $max) = @_; printf (gtx("Selecting UID from range %d to %d ...\n"),$min,$max) if ($verbose > 1); my $t = $min; while ($t <= $max) { return $t if (!defined(getpwuid($t))); $t++; } return -1; # nothing available } # first_avail_gid: return the first available gid in given range # parameters: # min, max: the range # return values: # -1 if no free gid is available # otherwise the choosen gid sub first_avail_gid { my ($min, $max) = @_; printf (gtx("Selecting GID from range %d to %d ...\n"),$min,$max) if ($verbose > 1); my $t = $min; while ($t <= $max) { return $t if (!defined(getgrgid($t))); $t++; } return -1; # nothing available } sub ch_gecos { my $chfn = &which('chfn'); my $gecos = shift; if($gecos =~ /,/) { my($gecos_name,$gecos_room,$gecos_work,$gecos_home,$gecos_other) = split(/,/,$gecos); &systemcall($chfn, '-f', $gecos_name, '-r', $gecos_room, $new_name); &systemcall($chfn,'-w',$gecos_work,$new_name) if(defined($gecos_work)); &systemcall($chfn,'-h',$gecos_home,$new_name) if(defined($gecos_home)); &systemcall($chfn,'-o',$gecos_other,$new_name) if(defined($gecos_other)); } else { &systemcall($chfn, '-f', $gecos, $new_name); } } # user is member of group? sub user_is_member { my($user, $group) = @_; for (split(/ /, (getgrnam($group))[3])) { return 1 if ($user eq $_); } return 0; } sub cleanup { my ($msg) = @_; printf (gtx("Stopped: %s\n"),$msg); if ($undohome) { printf (gtx("Removing directory `%s' ...\n"),$undohome); &systemcall('rm', '-rf', $undohome); } if ($undouser) { printf (gtx("Removing user `%s' ...\n"),$undouser); &systemcall('userdel', $undouser); } if ($undogroup) { printf (gtx("Removing group `%s' ...\n"),$undogroup); &systemcall('groupdel', $undogroup); } # do we need to invalidate the nscd cache here, too? exit RET_ADDUSER_ABORTED; } sub handler { my($sig) = @_; # Translators: the variable %s is INT, QUIT, or HUP. # Please do not insert a space character between SIG and %s. &cleanup(sprintf(gtx("Caught a SIG%s.\n"), $sig)); } sub version { printf (gtx("adduser version %s\n\n"), $version); print gtx("Adds a user or group to the system. Copyright (C) 1997, 1998, 1999 Guy Maor Copyright (C) 1995 Ian Murdock , Ted Hajek \n"); print gtx( "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, /usr/share/common-licenses/GPL, for more details. "); } sub usage { printf gtx( "adduser [--home DIR] [--shell SHELL] [--no-create-home] [--uid ID] [--firstuid ID] [--lastuid ID] [--gecos GECOS] [--ingroup GROUP | --gid ID] [--disabled-password] [--disabled-login] [--add_extra_groups] USER Add a normal user adduser --system [--home DIR] [--shell SHELL] [--no-create-home] [--uid ID] [--gecos GECOS] [--group | --ingroup GROUP | --gid ID] [--disabled-password] [--disabled-login] [--add_extra_groups] USER Add a system user adduser --group [--gid ID] GROUP addgroup [--gid ID] GROUP Add a user group addgroup --system [--gid ID] GROUP Add a system group adduser USER GROUP Add an existing user to an existing group general options: --quiet | -q don't give process information to stdout --force-badname allow usernames which do not match the NAME_REGEX configuration variable --help | -h usage message --version | -v version number and copyright --conf | -c FILE use FILE as configuration file\n\n"); } sub get_dir_mode { my $setgid = shift; # no longer make home directories setgid per default (closes: #64806) $setgid = 0 unless $config{"setgid_home"} =~ /yes/i; my $dir_mode = $config{"dir_mode"}; if(!defined($dir_mode) || ! ($dir_mode =~ /[0-7]{3}/ || $dir_mode =~ /[0-7]{4}/)) { $dir_mode = $setgid ? 2755 : 0755; } else { $dir_mode = $config{"dir_mode"}; if($setgid && (length($dir_mode) == 3 || $dir_mode =~ /^[0-1|4-5][0-7]{3}$/)) { $dir_mode += 2000; } } return oct($dir_mode); } # Local Variables: # mode:cperl # cperl-indent-level:4 # End: # vim:set ai et sts=4 sw=4 tw=0: