7h_&SrSSKrSSKJr SSKJr SSKJrJrJ r J r SSK r SSK J r SSKJr "SS 5r"S S 5r"S S 5rg)zCommon fixperms classesN)quote)Path)S_IMODES_ISREGS_ISDIRS_ISLNK)Args)IDCachec\rSrSrSrS\S\S\S\\S\ S\ \\44 S jr S \S \ \ S -\ S -4S \ \ \ 4SS 4Sjr S\S\ RS\ S\ 4SjrS\S\ RS\ S -4SjrS$S\S\4SjjrS$S\S\4SjjrS%SjrS%SjrS\ RSS \ -4SjrS\ RS\4SjrS\SS 4S!jrS\4S"jrS#rg )&PermMap zBase class for fixpermsidsargsuser all_docroots docroot_chmod docroot_chowncX lURRR5UlX@lURUl[ U5UlXlX0l URRU5nURUl URUlURUS5RnURUS5R n [#SSU4X45Ul[&R(R+UR,5Ul[0R2"SUR.5(dSUR.<35e[0R6"UR,5Ul/Ulg)Nrz \/home\d*\/z: unexpected homedir: )rskipcopyrloggerlogHardLinkTracker hard_linksrrgetpwnampw_uiduidpw_gidgidgetgrnamgr_gidRule docroot_permsospathrealpathpw_dirhomedirrematch ValueErrorescapehome_reperm_map) selfrrrrrrpwuserdoc_uiddoc_gids "/usr/lib/fixperms/fixperms_base.py__init__PermMap.__init__s# IINN'') (;;)$/ ""4(====,,}Q/077,,}Q/077!"t]&;g=OPww'' 6 xx 55v%;DLL;KLM Myy/ &( regexmodesNchownreturncjURR[URU3X#55 g)z9Add a fixperms path rule. ^HOMEDIR is automatically addedN)r0appendr$r/r1r9r:r;s r5add_rulePermMap.add_rule+s* TT\\N5'":EIJr8r'statrr!cX4s=:XaS:Xag US:Xa UROUnUS:Xa UROUnURUR4XV4:XagURR(d[R "XU5 URRUR5nURRUR5n URRU5n URRU5n URRS[U5UU U U 5 g![ a%nURRU5 SnAgSnAff=f)zRuns os.lchownNz+Changed ownership of %s from %s:%s to %s:%s)st_uidst_gidrnoopr&lchownOSErrorrerrorr uid_label gid_labeldebugr) r1r'rBrr!tgt_uidtgt_gidexcold_user old_groupnew_user new_groups r5rHPermMap.lchown5s     !$$++!$$++ KK %'); ; yy~~  $S)88%%dkk2HH&&t{{3 88%%g.HH&&w/   9 $K       s# s2D33 E"=EE"modecUcg[UR5nXC:Xag[UR5(agURR(d[ R "X5 URRS[U5[U5SS[U5SS5 g![a%nURRU5 SnAgSnAff=f)z*Runs os.chmod if the path is not a symlinkNz Changed mode of %s from %s to %s) rst_moderrrGr&chmodrIrrJrMroct)r1r'rBrVorigrPs r5lchmodPermMap.lchmodPs < t||$ <  4<< yy~~ $  . $K IabM IabM   s# sB-- C7CC ignore_skipsc## URX5Hn[R"U5nXC4v M! g![a&nURR U5 SnAMOSnAff=f7f)z8os.walk/os.lstat to yield a path and all of its contentsN)_walkr&lstatrIrrJ)r1r'r_entryrBrPs r5walk PermMap.walkksXZZ3E xx+  4 s# s+A+8 A+ A(A#A+#A((A+top_dirc## U(dURU5(agUv [RRU5(dg[R"U5Hup4nUHEn[RR X65nU(dURU5(aMAUv MG /nUHVn [RR X95nU(d)URU5(aUR U5 MRUv MX U(dMUV s/sH oU;dM U PM sn USS&M gs sn f7fN) should_skipr&r'isdirrdjoinr>) r1rfr_dirpathdirnames filenamesfilenamer' skip_dirsdirnamexs r5ra PermMap._walkus 0 0 9 9  ww}}W%% ,.GGG,< (Gy%ww||G6t'7'7'='=J&I#ww||G5#(8(8(>(>$$T*J $ y*2I(Qy6Hq(I -=Js%B#D?)A+D?D? D:)D:/D?cXUR5 URR5 g)z8To be called from fixperms_main.py - processes this userN)fixpermsrhandle)r1s r5run PermMap.runs   r8cURUR5HupURX5 M g![a&nURR U5 SnAMGSnAff=f)z5Iterate over a user's files and chown/chmod as neededN)rdr* check_pathrIrrJ)r1rBr'rPs r5ruPermMap.fixpermssQ))DLL1JD $+2 $s## $s8 A(A##A(new_modecjUcgURR(aURS-nX#-$U$)z2Get a new file mode including old mode's exec bitsNI)r preserve_execrY)r1rBr| exec_bitss r5with_exec_bitsPermMap.with_exec_bitss4   99 " " u,I' 'r8c.UR[U55nURupE[UR5(aJUR X5nUR S:a(URRX!URU5 gOW[UR5(aUnO:[UR5(aSnOURRSU5 gUbURX!U5 UR"X!/URQ76 g)z"Chown and chmod files as necessaryrNz#Skipping unexpected path type at %s) find_rulestrr:rrYrst_nlinkraddr;rrrwarningr]rH)r1rBr'rule file_modedir_moder|s r5rzPermMap.check_paths~~c$i("jj 4<< **4;H}}q ##D HE!T\\ " "H T\\ " "H HH  BD I    KKH - D,,r8r$c[U[5(deXR;a UR$URH'nUR R U5(dM%Us $ [SU35e)z+Find the matching ``Rule`` for a given pathzNo matching rule for ) isinstancerrr%r0r9r,r-)r1r'rs r5rPermMap.find_rulesj$$$$$ $$ $%% %MMDzz%% "0788r8czURH+nX:Xa g[U5RU5(dM+ g g)z:Determine if a path should be skipped based on --skip argsTF)rris_relative_to)r1r'rs r5riPermMap.should_skips5IID|Dz((..  r8) rrr%r!rr/r*rrr0rrr)F)r<N)__name__ __module__ __qualname____firstlineno____doc__r r rlistinttupler6r@r& stat_resultrHr]boolrdrarwrurrzrri__static_attributes__r8r5r r sl!) )) ) 3i )  )S#X)8KKS4Zt+,KS#X K  K 3 bnn 3 S 6  nn Dj  6DJSJJ,! $2>>TCZ-r~~-S-(9c9f9r8r c j\rSrSrSrS\4SjrS\S\RS\ \ \ 4S\ S -4S jr S r S rg ) rzMTracks and handles hard links discovered while walking through a user's filesr0cHXl0Ul0Ul0Ul0Ulgrh)r0chownsstatsr:paths)r1r0s r5r6HardLinkTracker.__init__s# 24 02 %' +- r8r'rBr;rVNc~URnX RU'XPR;aURURU5 OU/URU'XPR;a6UupgURUupUS:XaUnUS:XaU nXg/URU'OX0RU'UbX@R U'gg)zYUsed to add a hard link found during the fixperms run which might be unsafe to operate onrDN)st_inorrr>rr:) r1r'rBr;rVinumrr!prev_uidprev_gids r5rHardLinkTracker.adds{{ 4 ::  JJt  # #D ) $vDJJt  ;; HC!%T!2 Hbyby!$ DKK  %KK   #JJt  r8c URR5HupUR[URU5:XatURUSnUR R "X2/URUQ76 UR RX2URRUS55 MURUH2nUR RRS[U55 M4 M g)zbIf self.hard_links was populated with any items, handle any that are safe, or log any that are notrNz*%s is hardlinked and not owned by the user)ritemsrlenrr0rHrr]r:getrrJr)r1rrBr's r5rvHardLinkTracker.handles****,JD}}DJJt$4 55zz$'* $$TD$++d2CD $$Td1KL 4( !!''@$K)-r8)rr:rr0r)rrrrrr r6rr&rrrrrvrrr8r5rrsS..$$nn$S#X $ Dj $8r8rcN\rSrSrSrS\S\\S-\S-4S\\\44SjrSr g) r$izFixperms path ruler9r:Nr;c[R"U5Ul[U[5(de[U[5(deX lX0lg)zFixperms path rule Args: regex (str): regular expression file tuple[(int | None), (int | None)]: (file, dir) modes if matched chown tuple[int, int]: if a matching file/dir is found, chown to this UID/GID. Use -1 to make no change. N)r+compiler9rrr:r;r?s r5r6 Rule.__init__sDZZ& %''''%''''  r8)r;r:r9) rrrrrrrrr6rrr8r5r$r$s@S4Zt+,S#X r8r$)rr&shlexrpathlibrrBrrrrr+ fixperms_clir fixperms_idsr r rr$rr8r5rsB 33  zzz99xr8