
    io                     B   d dl mZmZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlmZ ddlmZmZmZmZmZmZmZmZ ddlmZmZmZmZmZ ddl m Z  ddl!m"Z" dd	l#m$Z$ dd
l%m&Z&m'Z'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z.m/Z/m0Z0m&Z&m'Z'm1Z1m2Z2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZX e=rd dlYZYer	 ddlZm[Z[ ddl\m]Z] ere^Z_dZ`dZadZb G d dec      Zdy#  Y xY w)    )print_functionunicode_literalsN)datetime   )ANYWINEXEMACOSPY2TYPE_CHECKINGE	EnvParamsunicode)BAD_CFGAuthSrvderive_argsn_du_who	n_ver_who)bos)ensure_cert)ramdisk_chk)HAVE_FFMPEGHAVE_FFPROBEHAVE_MUTAGEN)HAVE_ARGON2)TcpSrv)	
H_PIL_AVIF
H_PIL_HEIF
H_PIL_WEBPr   r   HAVE_PILHAVE_RAW	HAVE_VIPSThumbSrv)Up2k)!DEF_EXPDEF_MTEDEF_MTH
FFMPEG_URLHAVE_PSUTILHAVE_SQLITE3HAVE_ZMQRE_ANSIURL_BUGUTCVERSIONSDaemonGardaHLogHMaccasODictalltracebuild_netmap	expat_vergziphtml_escapeload_iprload_ipu	lock_filemin_exmpodfusionpybinstart_log_thrsstart_stackmontermsizeub64encumktransMDNSSSDPd   c                      e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd.dZd/dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d0d"Z$d# Z%d$ Z&d1d%Z'd& Z(d1d'Z)d( Z*d) Z+d* Z,d+ Z-d, Z.y-)2SvcHuba  
    Hosts all services which cannot be parallelized due to reliance on monolithic resources.
    Creates a Broker which does most of the heavy stuff; hosted services can use this to perform work:
        hub.broker.<say|ask>(destination, args_list).

    Either BrokerThr (plain threads) or BrokerMP (multiprocessing) is used depending on configuration.
    Nothing is returned synchronously; if you want any value returned from the call,
    put() can return a queue (if want_reply=True) which has a blocking get() with the response.
    c                 %   || _         || _        || _        |j                  | _        |j                  | _        |j
                  | _        |j                  rt        nd | _        d | _	        d| _
        d| _        d| _        d| _        d| _        d| _        t!        j"                         | _        t!        j&                         | _        d| _        d| _        d| _        d | _        t!        j"                         | _        d| _        d| _        d| _        t;        t<        j>                  jA                  | j                  jB                  d      d      | _"        |jF                  s|jH                  dk\  rFd|_%        d|_&        d|_'        d|_(        |jR                  xs d	|_)        |jT                  xs d
|_*        |jJ                  s|jH                  dk\  r8d|_$        d|_+        d|_,        d|_-        d|_.        d|_/        d|_0        d|_1        |jH                  r#d|_2        d|_3        d|_4        d|_5        d|_6        | jo                         stq        tr              i | _:        tw        | j                   jx                        | _=        tw        | j                   j|                        | _?        tw        | j                   j                        | _A        tw        | j                   j                        | _C        tw        | j                   j                  d      | _E        tw        | j                   j                        | _F        tw        | j                   j                        | _H        dd|j                  z
  z  | _J        dj                  |j                        | _L        dj                  |j                        | _M        |j                  r| j                  n| j                  | _Q        |jR                  r| j                  |       t        j                         }t        | j                        }|g|_V        |j                  t        j                         | j                          |j                  rt        |j                  d       |j                  r!t        | j                  |j                  d       |j                  sY|j                  dk7  rJd|_`        d}d}t        r|dz  }d}n|dz  }| j                  d|j                  |j                        |       |j                  sE|j                  dk7  r6d}| j                  d|j                  |j                        d       d|_`        |j                  j                  d      D 	cg c]  }	|	st        |	j                                 c}	|_b        |j                  r=|j                  |j                  vr%|j                  j                  |j                         dD ]  \  }
}t        ||      }|dk  rd}| j                  d|||
fz  d       d}d|dz
  j                         z  }||k7  sOd|dz
  j                         dz
  z  }d}| j                  d||
|||fz  d        |j                  |j                  kD  r.d}| j                  d||j                  |j                  fz  d       d}|j                  dk  rd}n|j                  dk  rd}|r$d }| j                  d||j                  |fz  d       |j                  rI|j                  r=d!|j                  j                  d      vr d"}| j                  d|d       tq        |      t               }|j                  xs g D ]P  }|j                  d      D 	cg c]  }	|	j                          }}	|j                  |D 	cg c]  }	|	s|		 c}	       R ||_r        |j                  r>t        | j                  |j                  d      \  }}t        |d#|       t        |d$|       |j                  r.t        | j                  |j                  d      }t        |d%|       d&j                         D ]4  }t        |d'|      s| j                  dd(|d)t        ||             6 |j                  s|j                  rd|_{        d|_|        d|_}        |j                  r|j                  r| j                  d*       | j                   j                  s| j                  d+       d|_        |j                  r| j                          d,|j                  dz  d  d d }d-t        |j                  dz           }d.j                  ||      |_        |j                  rd/|_        |j                  rd/|_        t        |j
                        |_        |j                  r|j                  d/k(  rd0|_        t        |j                        |_        |jb                  r+d|_        |j                  j                  d1d      |_        n|j                  |_        |j                  j                  d2|j                        |_        |j                   j                  d2|j                        xs |j                  |_        d3j                         D ]*  }t        ||      d4k(  st        |||j"                         , |j$                  r't'        j(                  |j$                        |_        t+        | j                   | j                  | j                  5      | _        t/        | j,                         |j0                  r| j,                  j1                          |j2                  d6k(  rt5        j2                  d       |jT                  r| j,                  j7                          t        s| j9                          | j                  dd7j                  | j                   j:                               t=        |       | _        | j>                  j@                  s(| j                   jB                  rd| j                   _        tG        |       | _        | jK                          | j                   jL                  j                  d      D ci c]  }|j                         d }}tN        s|jQ                  d8d        tR        s|jQ                  d9d        tT        s|jQ                  d:d        tV        rtX        s|jQ                  d;d        |jZ                  j                  d      D 	cg c]1  }	|	j                         j]                         j                  d<d      3 }}	|D 	ci c]  }	|	d   |	d    c}	|_        t_        |ja                               | j                   _        d | _        d}|jf                  sd=jA                  | j                   jL                        xs d>}| j                  d?d@j                  |             | j                   jL                  rte        |       | _        nVd}dA}|j                  dBt<        j>                  jg                  th                    }tj        rdC}| j                  d?|d       |jl                  s)|jf                  rdD}| j                  d?|d       d|_        |jl                  s-tV        rtX        sdE}| j                  d?|d       d|_        d}|r!t        r| j                  d?dFtn        z   d       |jl                  sNt'        jp                  dG|jr                  j]                               sdH}tq        ||jr                  fz        t        |jt                  j                  d      |jv                  j                  d      z         }|jZ                  jy                         D ci c]  \  }}|j                  dI      d   |vs||! c}}|_        t{        |j|                  |j~                  |j                        |_        d}|j                  s|dJz  }|j                  s|dKz  }|j                  rddLlm} d | _        |j                  s|j                  r!ddMlm}  d | _        ||j                  rdNndOz  }|j                  rddPlm}! d | _        |j                  s'|j                  s|j                  s|j                  rt        | j                  dQ       |j                  rxt        j                         }"t        j                  d        ddRlm}#  |#|       | _        t        j                  |"       | j                  j                          |dSz  }|j                  s||_        d| _        d | _        d | _        | j                         rddTlm}$ nddUlm}$  |$|       | _        dVj                         D ]&  }	 t!        j"                         t        ||      _        ( |j                  r;|j                  j                         D ]  }t!        j"                         |_         y y c c}	w c c}	w c c}	w c c}w c c}	w c c}	w c c}}w #  Y xY w)WN F   r           iphash   Tzcpp-%Y-%m%d-%H%M%S.txt.xzz**,*,ln,p,rrI   
      z%02d:%02d:%02d.%0{}dz%04d-%04d-%06d.%0{}dr   zmultithreading enabled with -j {}, so disabling fpool -- this can reduce upload performance on some filesystems, and make some antivirus-softwares zS(especially Microsoft Defender) stress your CPU and HDD severely during big uploadsz,consume more resources (CPU/HDD) than normalrootzFWARNING: ignoring --use-fpool because multithreading (-j{}) is enabled)c,))iobufrW   )zs-rd-szs_rd_sz)zs-wr-szs_wr_szi   zZWARNING: expect very poor performance because you specified a very low value (%d) for --%szjWARNING: expect poor performance because --%s is not a power-of-two; consider using %d or %d instead of %dzYWARNING: --s-rd-sz (%d) is larger than --iobuf (%d); this may lead to reduced performanceg)\(?zgenerate thumbnailsz(generate audio waveforms or spectrogramszFWARNING: --th-ram-max is very small (%.2f GiB); will not be able to %spwzERROR: user-changeable passwords is not compatible with your current configuration. Choose one of these options to fix it:
 option1: disable --chpw
 option2: remove all use of IdP features; --idp-*
 option3: change --auth-ord to something like pw,idp,ipuipu_iuipu_nmipr_uzah_salt fk_salt dk_saltshow_z
effective z is idpseszyabcdefghijklmnopqrstuvwxz{0}{1} {0} {1}noallz	 @ --namez--namezshr_site up_sitez--site)dargscfgzmax clients: {}vipspilrawff=, z(None available)thumbzdecoder preference: {}zneed either Pillow, pyvips, or FFmpeg to create thumbnails; for example:
{0}{1} -m pip install --user Pillow
{0}{1} -m pip install --user pyvips
{0}apt install ffmpegz%                                     z_copyparty.exe cannot use Pillow or pyvips; need ffprobe.exe and ffmpeg.exe to create thumbnailsz-setting --no-acode because --no-thumb (sorry)zDsetting --no-acode because either FFmpeg or FFprobe is not availablezdownload FFmpeg to fix it:[0m z^(0|[qv][0-9]|[0-9]{2,3}k)$zinvalid mp3 transcoding quality [%s] specified; only supports [0] to disable, a CBR value such as [192k], or a CQ/CRF value such as [v2].dDSftpdFtpdfFTftpdstart_tftpd)SMBs)BrokerMp)	BrokerThrzipu_nm ftp_ipa_nm tftp_ipa_nm)argsre   argvr   no_ansiflolog_utcr-   tzlogflogf_base_fnis_dutstop_reqstoppingstopped
reload_req	threadingLockreload_mutex	Condition	stop_condnsigsretcode
httpsrv_upqr_tsz	log_mutexcdaycmontstackr2   ospathjoinrf   rP   sssr{   ssno_dav	no_logues	no_readmelolsunpostno_delno_mvreflinkdav_auth	vague_403nihdotpartno_thumb
no_mtag_ff	no_robotsforce_js_process_config	Exceptionr   bansr0   ban_pwgpwdban_pwcgpwcban_404g404ban_403g403ban_422g422gmalban_urlgurllog_tdeclog_divformatlog_efmtlog_dfmtq_log_disabled_log_enabledlog_setup_logfilelogging	getLoggerr1   handlerssetLevelDEBUG
_check_envstackmonrA   log_thrsr@   	use_fpooljno_fpoolr   p_nodavsplitintstripdav_portpappendgetattr
bit_lengthrX   rW   
th_ram_maxchpwhave_idp_hdrsauth_ordsetchpw_noupdateipur:   setattriprr9   ah_cliah_gen	idp_storeno_sesshrsetup_dbshr1setup_share_dbthemeno_stack	stack_whoniddu_whor   du_iwhoverver_whor   ver_iwhovnamedoctitlereplacenamebnamesitelog_fkrecompiler   asrvr   cgenexitsysdbg_ls
_setlimitsncr   tcpsrvsrvign_ebind_allno_fastbootr#   up2k_feature_testth_decr!   popr   r    r   r   au_unpklowerlistkeysthumbsrvr"   basenamer?   r   no_acoder'   matchq_mp3th_r_ffath_r_ffvitemsminth_poke	th_maxage	ac_maxage
https_only	http_onlysftpsftpdrr   ftpftpsftpdrt   tftptftpdrx   r/   
start_ftpdsmbsocketgetdefaulttimeoutsetdefaulttimeoutsmbdrz   startzmszc_ngenmdnsssdpcheck_mp_enable	broker_mpr|   
broker_thrr}   brokermutexr]   values)%selfr~   re   r   printedlglhtrU   xr   argzizi2zi3zsnochzsliunmr   brichkdecszlsswant_ffmsgzssvr/  rr   rt   rx   storz   Brokers%                                        C/home/ubuntu/myenv/lib/python3.12/site-packages/copyparty/svchub.py__init__zSvcHub.__init__m   s#    	
	&&||88#4	%NN,",,.
")		bggll466::x@!D88tvv{DGDK!DN!DNgg<!<DGgg.DG77dffkDFDKDKDJDL DM!DNDH66DL DM"DO!DN DM##%G$$ 	$))**+	$))++,	$))++,	$))++,	$))++U3	$))++,	$))++,	a$--/0.55dmmD.55dmmD)-4%%T5F5F77( $((^d
GMM"==4==!,==488T]]A6~~$&&A+ DM fAAjjCCHHVQXXdff-q1}}1XAHHVQXXdff-H3 DM040B0B30GM11AGGIM==T]]$&&8FFMM$--(
 	>ID#
 s#BEzpb$Z3Q**,,CSyR!V//1A56 AdCb%9!91=	>  <<$**$kAHHVQ$,,

!;;Q???T!&B__q ;BXAHHVQ$//2!66:99++DMM<O<OPS<T0T TAHHVQ"A,u,,$" 	/B&(hhsm417794C4KKC-q1-.	/ 88dhh$7FBD(B'D(B'88488TXXt4CD'3'+113 	QBt"./WT2=N!OP	Q ;;$++DNDKDH>>d00MM% yyMM% 	88!4::>#$Ra('DJJN(;<%,,R5
==!DN88DK,88, DL!$,,/88DJ MM11+rBDMDJ--h

CZZ''$**=K
$**, 	-BtR H,b$)),	- ;;**T[[1DK DIItxxtzzB	DII99IINN99HHQK77IIOO*11$)),,?@Tl{{499#:#:$(DII!J	&*ii&6&6&<&<S&AB	1BBHHVT"HHUD!HHUD!,HHT4  :>9K9KC9PQA	!''Q/QQ,01q!ad
1		,		}}		$))**+A/AAHHW6==a@Ayy ( Bjj277+;+;E+BC{C#+}}ACHHWcQH' DM}}kXCHHWcQH' DMGvHHWBZOQRS}}8894::;K;K;MN _TZZM 122dmm))#.1D1DS1IIJC!%!3!3!5AaPS9S1DL 4<<H3JC~~3JC99$DJ88tyy"DI$((3+C99$DJ99DII4??M288**,C$$T*!D	DI$$S)IIOO3JCxxDH		 !57Tl 2779 	B*3..*:b!'	
 88jj'') ,$>>+, m NP 5-p C R1P~sX   7AK?AK
AK	2AK
:AK
AK<6AK8AK@(AK"AAK"I#AK(K(AK,c                 &    d| j                   _        y NT)r~   r   r9  s    rS  _db_onfail_seszSvcHub._db_onfail_ses  s    		    c                 &    d| j                   _        y )Nr   )r~   r   rW  s    rS  _db_onfail_idpzSvcHub._db_onfail_idp  s    		rY  c           
         |dk(  r;t         }| j                  j                  }d}d}d}| j                  }| j                  }nK|dk(  r;t
        }| j                  j                  }d}d}d}| j                  }| j                  }nt        d      |j                  d      s*d	}	| j                  d
|	|||fz  d       t        t              t        s- |        |dk(  rd}	n|dk(  rd}	| j                  d
d	d       y|dz   }
	 t        j                  j!                  |       }|rdnd}	| j                  d
|	d|d|       t#        d      D ]  }d}	 t%        j&                  |      }|j)                         }	 d}	|j+                  |	      j-                         d   d   }||kD  rd}	t        |	|||fz        |j+                  |      j/                          | j1                  |||||||      }|r&d}d| j                  _        | j                  d
|d        y y#  d}Y xY w#  |r  ||      }Y [xY w# t        $ r}|s||kD  r d}| j                  d
|||fz  d       	 j5                          n#  Y nxY w	 j5                          n#  Y nxY w	 t        j6                  |
       n#  Y nxY wt        j6                  |       Y d}~~d}~ww xY w)zc
        the "non-mission-critical" databases; if something looks broken then just nuke it
        r`   zsessions-dbzses-dbzselect count(*) from usr_   zidp-dbzunknown cachetypez.dbzgconfig option --%s (the %s) was configured to [%s] which is invalid; must be a filepath ending with .dbrT   r   z;disabling sessions, will use plaintext passwords in cookieszHdisabling idp-db, will be unable to remember IdP-volumes after a restartz WARNING: sqlite3 not available; rN   N.lockTcreating newopening rI   r   select v from kv where k='sver'zJthis version of copyparty only understands %s v%d and older; the db is v%dc   z+%s is unusable; deleting and recreating: %r)VER_SESSION_DBr~   ses_db_create_session_dbrX  
VER_IDP_DBidp_db_create_idp_dbr[  r   endswithr   r   r)   r   r   getsizerangesqlite3connectcursorexecutefetchallfetchone
_verify_dbr   closeunlink)r9  which
native_verdb_pathdescpathoptsanchk_q	createfunfailfunrC  db_lockcreatetriessverdbcurerrexr=  s                      rS  r   zSvcHub.setup_db  s    E>'Jii&&G DG0H//I))Ge^#Jii&&GDG0H++I))G/00&zBHHVR7D'"::A>G$$I~R%_HHVRI1M G#	11F  &^9r49:1X ,	#ED*#__W-iik*:B;;r?335a8;Dj(i'dJ-E(EFFKK)224 oo$j E'+DII$HHVS!,3,	#	F"*$S>D  #D:-AdBZ3IIKHHJIIg&		'""##s     H %H37AH!?H3H!H0.H33	K<"K	I0/K	0I42K	8J	K		JK	J'&K	'J+)K		Kc                 `    g d}|D ]  }|j                  |        | j                  dd       y)N)create table kv (k text, v int)z*create table us (un text, si text, t0 int)create index us_un on us(un)zcreate index us_si on us(si)zcreate index us_t0 on us(t0)!insert into kv values ('sver', 1)rT   zcreated new sessions-dbr   ro  r   r9  r  schcmds       rS  re  zSvcHub._create_session_db6  s8    
  	CKK	23rY  c                 `    g d}|D ]  }|j                  |        | j                  dd       y)N)r  z"create table us (un text, gs text)r  r  rT   zcreated new idp-dbr   r  r  s       rS  rh  zSvcHub._create_idp_dbE  s8    
  	CKK	-.rY  c                    |j                   }	 |j                  d      j                         }	t        |	      dkD  r
t	               |	d   d   }
|dk(  rd}n|dk(  rd}n
t	               t        |dz         sd	}||||
||fz  S d
t        j                         fdt        t        j                         dz        ff}|
r|D ]  \  }}|j                  d||f        n|D ]  \  }}|j                  d||f        ||k  r$|j                  d       |j                  d|f       |j                          |j                          |j                          y#  d}
Y xY w)Nselect v from kv where k='pid'r   r   r`   zIWill now disable sessions and instead use plaintext passwords in cookies.r_   z^Each IdP-volume will not become available until its associated user sends their first request.r]  aO  the %s [%s] is already in use by another copyparty instance (pid:%d). This is not supported; please provide another database with --%s or give this copyparty-instance its entirely separate config-folder by setting another path in the XDG_CONFIG_HOME env-var. You can also disable this safeguard by setting env-var PRTY_NO_DB_LOCK=1. %spidts  update kv set v=? where k=?insert into kv values(?, ?)delete from kv where k='sver'insert into kv values('sver',?)rM   )
connectionro  rp  lenr   r;   r   getpidr   timecommitrs  )r9  r  ru  ry  rw  rx  r  rv  r  zilownerconsr=  varsrJ  rP  s                   rS  rr  zSvcHub._verify_dbR  sh    ^^	++>?HHJC3x!|k!F1IE E>^De^sD+7*+ bAgugt<<<		$tSt1C-D&EF C19Aq6BC  C19Aq6BC *KK78KK9J=I
				

?	Es   ?E Ec           	      T   | j                   }t        s| j                  ddd       d|_        y |j                  j	                  d      |_        d|j                  v s|j                  s d}| j                  d|d       t        |      d|j                  d|_        |j                  dd  |_        | j                   j                  }|dz   }	 t        j                  j                  |       }|rd	nd
}| j                  d|d|       d}	 t        j                  |      }|j                         }	|sed}|	j                  |      j                         d   d   }|t         kD  rd}t        |t         |fz        |	j                  d      j#                          	 |	j                  d      j                         }t'        |      dkD  r
t               |d   d   }t)        |      s'd}|||fz  }| j                  d|d       t        |      ddg}g d}|s3t         }||z   D ]  }|	j                  |        | j                  dd       |dk(  r;|D ]  }|	j                  |        |	j                  d       | j                  dd       |t         k  r(|	j                  d       |	j                  dt         f       dt        j*                         fdt-        t/        j.                         dz        ff}|r|D ]  \  }}|	j                  d||f        n|D ]  \  }}|	j                  d||f        |j1                          |	j3                          |j3                          y #  d}Y {xY w# t
        $ r)}
d}| j                  d|||
t%               fz  d        d }
~
ww xY w#  d}Y xY w) NrT   z&sqlite3 not available; disabling --shrr   rM   /zYconfig error: --shr must be the name of a virtual toplevel directory to put shares insider]  Tr^  r_  z shares-db r   ra  zQthis version of copyparty only understands shares-db v%d and older; the db is v%dzselect count(*) from shzcould not open shares-db; will now panic...
the following database must be repaired or deleted before you can launch copyparty:
%s

ERROR: %s

additional details:
%s
r  ag  the shares-db [%s] is already in use by another copyparty instance (pid:%d). This is not supported; please provide another database with --shr-db or give this copyparty-instance its entirely separate config-folder by setting another path in the XDG_CONFIG_HOME env-var. You can also disable this safeguard by setting env-var PRTY_NO_DB_LOCK=1. Will now panic.r  zTcreate table sh (k text, pw text, vp text, pr text, st int, un text, t0 int, t1 int))z!create table sf (k text, vp text)zcreate index sf_k on sf(k)zcreate index sh_k on sh(k)zcreate index sh_t1 on sh(t1)z!insert into kv values ('sver', 2)zcreated new shares-dbzupdate sh set st = 0zshares-db schema upgrade okr  r  r  r  r  r  r  )r~   r)   r   r   r   r   r   shr_dbr   r   rj  rl  rm  rn  ro  rp  VER_SHARES_DBrq  r<   r  r;   r  r   r  r  rs  )r9  alr=  rw  r}  r~  rC  r  r  r  r  r  r  sch1sch2r  r  rJ  rP  s                      rS  r   zSvcHub.setup_share_db  s   YYHHVEqIBF c""&&=kAHHVQ"A, !'
 66#&&*
 ))""G#	11F  &^9b':;	)B))+C6{{2//1!4Q7-'lB#B-)>$>??56??A	++>?HHJC3x!|k!F1IE ! zAWe$$AHHVQ"A, /c


  Dd{ !C !HHV4519 !C !KK./HHV:;-KK78KK9M;KL		$tSt1C-D&EF C19Aq6BC  C19Aq6BC 					

Y	F   	 AAHHVQ'2vx!88!<		Es1    M! BM+ ?N  !M(+	N4$NN N'c                 "   t        j                  d       t        | d      r| j                  s| j	                          t        | d      r| j
                  s| j                          t        | d      r| j                  s| j                          y y y )N   r"  r%  r'  )	r  sleephasattrr"  restart_sftpdr%  restart_ftpdr'  restart_tftpdrW  s    rS  r(  zSvcHub.start_ftpd  si    

24!$** 4 4!$**  +5!rY  c                     t        | d      sy ddlm} | j                  ry  ||       | _        | j                  j                          | j	                  dd       y )Nr"  r   rq   rT   zstarted SFTPd)r  r"  rr   runr   )r9  rr   s     rS  r  zSvcHub.restart_sftpd  sC    tW% ::4[


)rY  c                 (   t        | d      sy ddlm} | j                  ry t        j                  j                  | j                  j                        s t        | j                  | j                          ||       | _        | j                  dd       y )Nr%  r   rs   rT   zstarted FTPd)
r  r%  rt   r   r   existsr~   certr   r   )r9  rt   s     rS  r  zSvcHub.restart_ftpd  s_    tV$99ww~~diinn-$)),J	(rY  c                 ^    t        | d      sy ddlm} | j                  ry  ||       | _        y )Nr'  r   rw   )r  r'  rx   )r9  rx   s     rS  r  zSvcHub.restart_tftpd  s'    tW% ::4[
rY  c                    t        j                  | j                  j                  rdnd       | j                  j
                  | j                  j                  z  }|| j                  z
  }|sy | j                  j                  rV| j                  j                  s?t        | j                  j
                        D ]  }| j                  j                  d        y | j                  j                  r| j                  j                  ry d}|j                  ||      }| j                  d|d       d| _        | j!                          y )Nr      cb_httpsrv_upz{}/{} workers failed to startrT   )r  r  r~   r	  r6  num_workersr  nsrvr   r  rk  say	ign_ebindr   r   r   sigterm)r9  expectedfailed_r=  s        rS  thr_httpsrv_upzSvcHub.thr_httpsrv_up  s    

		//1Q7;;**T[[-=-==DOO+99"";;??t{{667 5AKKOOO45994;;??+HHVX&ArY  c                 D    | j                  t        j                  d        y N)signal_handlersignalSIGTERMrW  s    rS  r  zSvcHub.sigterm5  s    FNND1rY  c                 $    | j                          y r  )
_sticky_qrrW  s    rS  	sticky_qrzSvcHub.sticky_qr8  s    rY  c                 ~    t        dt        j                  d       |rt        j                  j                          y y )Nz[s[J[r[urM   fileend)printr  stderrflush)r9  r  s     rS  _unsticky_qrzSvcHub._unsticky_qr;  s+    (szzrBJJ rY  c           	         t               }| j                  |k(  r|sy d}| j                  r| j                  d       nt        j                  | j                         |x\  }}| _        | j
                  j                  j                  dd      \  }}|j                  dd      \  }}t        |j                  d            }	|	dz  dz   |k  rdnd}
|
}| j                  j                  dk(  rd	}ni|
r<|	|
z   dz  t        |      z   dz   |kD  r"|
dz  }
|
r|	|
z   dz  t        |      z   dz   |kD  r"|	|
z   dz  t        |      z   dz   |kD  r|dz   |z   }d	}|	dz  }	|}
d|z   |	z
  }|
rd|
z  }||j                  dd|z         z   }|rd
||dz   |	|
z   dz  |fz  }||z   }dd|	z  |	fz  }d||dz
  |||fz  }|s| j                  dd|d|d|d       | j                  |t        j                  d	       y )NF
r   r`  rI      rN   r   rM   z%s[%d;%dH%s[0m%s[%dAz%s[s[1;%dr[%dH%s%s[uqrzsticky-qrcode r>  rV   rS   r  )rB   r   r  atexitregisterr  r  r   r  r~   qr_pinr   r   prr  r  )r9  forcesztwthzs1r  urlcolrnllplp0shrC  r=  s                  rS  r  zSvcHub._sticky_qr@  s   Z;;"E;;e$OOD--.!!B++..&&tQ/RIIc1%	T$ q&1*r/Qq99q C"r'QS1A5:a "r'QS1A5:R1}s3x'!+b04Z"_aVb[rBbjjtby11B*dBFR"WM3-OOCBYD2Ir?*2aaR5MMHHTr2rBAF

+rY  c                    | j                   j                  }| j                  j                  }|r't	        j
                  |       | j                  d|       | j                  j                  r%| j                  | j                   j                         | j                  j                  r5| j                  | j                   j                  t        j                         | j                  j                  }d|t        |j                  d            fz  }|r_t	        j
                  |       | j                  rn=| j                  j                   r| j#                  d       n| j                  d|       |r_| j                  j$                  }|r6t	        j
                  |       | j                  ry | j#                          |r5y y )Nqr-coder  r  r  T)r  r  r~   qr_waitr  r  r   	qr_stdoutr  	qr_stderrr  r  qr_everyr  r   r   r  r  qr_winch)r9  r  w8rN  s       rS  _qr_thrzSvcHub._qr_thrk  s+   [[^^YYJJrNHHY#99GGDKKNN#99GGDKKNNG4YYb#bhhtn"566JJrN}}yy%C(  YYJJrN}}OO	 rY  c                    | xj                   dz  c_         | j                   | j                  j                  k7  ry | j                  }t	        |j
                  s|j                  s|j                  rdnd      D ]K  }t        j                  d       |j                  s|j                  r| j                  s=n|j
                  sK n | j                  j                  rB| j                  j                  r| j                          | j                  j                  s,| j                  j                   s| j                  j"                  rt%        | j&                  d       n| j                  j                  s&| j)                  d| j                  j                         | j                  j*                  r%| j-                  | j                  j                         | j                  j.                  rH| j-                  | j                  j                  t0        j2                         n| j)                  dd	       | j5                          y )
Nr   rR   r   gQ?r  r  r  rT   zworkers OK
)r   r6  r  r~   rk  r!  r#  r$  r  r  r%  r  r  r  r  r  r  r  r/   r  r   r  r  r  r  r  after_httpsrv_up)r9  arr  s      rS  r  zSvcHub.cb_httpsrv_up  s`   1??dkk555YYRWW"''rqA 	AJJtFFbggtyy277	
 ;;>>yy yy  DII$6$6$)):L:Lt||T*yy''HHY799&&GGDKKNN+99&&GGDKKNNG<HHV^,rY  c                 d    | j                   j                          t        | j                  d       y )Nz	sd-notify)r  	init_volsr/   	sd_notifyrW  s    rS  r  zSvcHub.after_httpsrv_up  s     		t~~{+rY  c                    g }g }d}t         ddft        ddft        ddft        dd	ft        d
|dz   ft
        d|dz   ft        ddft        ddft        ddft        ddft        ddft        ddfg}t        r|t        ddfgz  }| j                  j                  }|r| j!                  dd       |D ]I  \  }}}|r|n|}	|	j#                  ||f       |s#|rdnd}
|rd nd!}d"}| j!                  d||||fz  |
       K |r| j!                  dd       y d#j%                  d$ |D              }d#j%                  d% |D              }d}|r|d&|z   z  }|r|r|d#z  }|d'|z   z  }|d(z  }| j!                  d)|d*       y )+Nz6transcode audio, create spectrograms, video thumbnailssqlitez sessions and file/media indexingpillowzimage thumbnails (plenty fast)rg   z(image thumbnails (faster, eats more ram)zpillow-webpzcreate thumbnails as webp filesffmpegz , good-but-slow image thumbnailsffprobez, read audio/media tagsmutagenz.read audio tags (ffprobe is better but slower)argon2z-secure password hashing (advanced users only)pyzmqz%send zeromq messages from event-hookszpillow-heifz+read .heif pics with pillow (rarely useful)zpillow-avifz+read .avif pics with pillow (rarely useful)rawpyzread RAW imagespsutilz(improved plugin cleanup  (rarely useful)dependenciesrM   rI   r  foundmissingz%7s: %s [36m(%s)rl   c              3   &   K   | ]	  }|d      ywr   N .0r>  s     rS  	<genexpr>z'SvcHub._feature_test.<locals>.<genexpr>       *!*   c              3   &   K   | ]	  }|d      ywr  r  r  s     rS  r  z'SvcHub._feature_test.<locals>.<genexpr>  r  r  z	OK: [32mz[0mNG: [35mz#[0m, see --deps (this is fine btw)zoptional-dependenciesrS   )r)   r   r!   r   r   r   r   r   r*   r   r   r    r   r(   r~   depsr   r   r   )r9  fokfngt_ffto_checkverbosehavefeatwhatlstr@  sgotr=  soksngs                  rS  r  zSvcHub._feature_test  s   G8%GHx!AB JK(IJ(D+M$MN9d-F&FG9&VW($STw GH(UV(UVw 12
 h(RS H ))..HH^R( ( 	ED$#3CJJd|$QA"&wI*dD$-?)?D	E HH^R(ii*c**ii*c**#%%AT	&,,A	55(!Q/rY  c                    | j                   }| j                   j                  r>d}| j                  d|d       | j                   j                  r| j                  ddd       d}|j                  D ]  }|j                  d      rd} |sMd}d}|j                         D ]  }t        ||d      st        ||d       d}! |rd	}| j                  d|d       | j                   j                  sZd
dl
m} |sR| j                   j                  s<d| j                   _	        d}| j                  d|t        t        t               fz  d
       t        j                   s|j"                  st$        j&                  j)                  d      sd}|j*                  s"d|_        d}| j                  dd|d|d
       |j,                  d
k(  rd|_        | j                  dd|d       |j,                  r#d|}| j                  d|d
       t/        |      |j0                  r#d|}| j                  d|d
       t/        |      y y y y )NzbWARNING: --no-bauth disables support for the Android app; you may want to use --bauth-last insteadrT   rN   z0WARNING: ignoring --bauth-last due to --no-bauthF)zunix:zfd:Tzz zm zm4 zm6 zmv zmvv zs zsv zvzonot listening on any ip-addresses (only unix-sockets and/or FDs); cannot enable zeroconf/mdns/ssdp as requestedr   )DXML_OKzWARNING:
Disabling WebDAV support because dxml selftest failed. Please report this bug;
%s
...and include the following information in the bug-report:
%s | expat %s
PRTY_UNSAFE_STATEa  because runtime config is currently being stored in an untrusted emergency-fallback location. Please fix your environment so either XDG_CONFIG_HOME or ~/.config can be used instead, or disable this safeguard with --unsafe-state or env-var PRTY_UNSAFE_STATE=1.znA consequence of this misconfiguration is that passwords will now be sent in the HTTP-header of every request!zWARNING:
Will disable sessions r`  r   zWARNING:
Disabling --idp-store z!ERROR: Cannot enable --idp-store zERROR: Cannot enable shares )r~   no_bauthr   
bauth_lasti
startswithr   r   r   r   dxmlr  r,   r.   r6   r   scfgunsafe_stater   environgetr   r   r   r   )r9  r  r=  have_tcprC  zbr  t2s           rS  r   zSvcHub._check_env  s   YY99tAHHVQ"yy##!SUVW$$ 	 B==!12	  B2Bhhj 2r5)BE*B  FA&yy%yy'''+DII$ EAHHVQ'8Y[)I%I1M OOJJNN#67 VA99 	 FAr!RTUV||q  !LaP||>?AQ'm#vv9:<Q'm#  8 $ rY  c                    | j                   }|j                  xs |j                  |_        |j                  xs |j                  |_        |j                  xs |j
                  |_        |j                  xs |j
                  |_        d}|j                  d      D ]Y  }t        ||      j                  d      }|D cg c]  }|j                          }}|D cg c]  }|s|	 }}t        |||       [ d}|j                  d      D ]+  }t        ||      }|D ci c]  }|d }}t        |||       - d}|j                  d      D ]8  }t        ||      }|D cg c]  }|j                          }}t        |||       : d}|j                  d      D ]<  }t        ||      xs g }|D cg c]  }|j                          }}t        |||       > |j                  }d|v sd	|v rd
}	t        |	      |j                  d      x|_        }|rd|z   nd|_        |r|dz   nd|_        |rd|z   dz   nd|_        |j$                  rd|_        |j(                  j                  d      }
|
D cg c]  }|j                          }
}|
D cg c]  }|s|	 }
}|
|_        |
|
D cg c]  }d|z   	 c}z   |_        t-        |j(                        |_        t-        |j*                        |_        dj                  d      D ]g  }t        ||      }|s|D cg c]>  }t2        j4                  j7                  t2        j4                  j9                  |            @ }}t        |||       i dj                  d      D ]Z  }t        ||      }|st2        j4                  j7                  t2        j4                  j9                  |            }t        |||       \ dj                  d      D ]s  }t        ||      }|j                  d      D cg c]  }|j                          }}|D cg c]  }|s|j                          }}t        ||dz   t-        |             u dj                  d      D ]s  }t        ||      }|j                  d      D cg c]  }|j                          }}|D cg c]  }|s|j;                          }}t        ||dz   t-        |             u d}|j                  d      D ]C  }t        ||      }|r|dk(  rt        ||d        $t        ||t=        j>                  |             E dj                  d      D ]I  }t        ||      }|r|dk(  rt        ||d        $t        ||t=        j>                  d|z   dz                K |j@                  jC                  d      r8tE        |j@                  dd  d      5 }|jG                         |_$        d d d        n#|j@                  jK                  d      dz   |_$        |jL                  sd|_'        n|jN                  dk(  rd |_&        d}|j                  d      D ]>  }t        ||tQ        t        ||            j                         j                                @ |jR                  xs g D cg c]  }|j                          c}|_)        i |_*        |jV                  xs g D ]b  }	 |d d }|dd  j                  |      \  }}}|j                         }||jT                  v r||jT                  |   |<   n||i|jT                  |<   d d}d}|jX                  }|r.|d d d k7  rt        d!|z         ||dd" z  }||d"d# z  }|d#d  }|r.t[        ||      |_.        t_        |j`                  xs |jb                  xs |jd                  d$      |_3        t_        |jh                  xs |jb                  xs |jd                  d$      |_5        t_        |jl                  xs |jb                  xs |jd                  d$      |_7        |jp                  xs g D cg c]  }|j                  d       c}D ci c]  }|d   d|d"   |d%    c}|_9        tu        jv                  ty        j                  d      d$      }t{        ||j|                        |_>        tu        jv                  t        j                  d      d$      }t{        ||j                        |_@        tu        jv                  t        j                  d      d$      }t{        ||j                  j                  dd            |_B        t{        ||j                  j                  dd            |_D        d&D ]E  }t        | j                   |      }|st        | j                   |t=        j>                  |             G d'D ]  }t        | j                   |      }d|v rd|j                  dd      z   }d(|v r|j                  d(d      d(z   }d)|v r|j                  d)d      d)z   }|j                  d*d+      j                  dd,      }t        | j                   |t=        j>                  d(|d              	 | j                   j                  j                  d      \  }}t        |      | j                   _G        t        |      | j                   _H        	 | j                   j                  j                  d      \  }}t        |      | j                   _J        t        |      | j                   _K        |j                  rd/nd0|_M        |j                  j                  d1      |_N        t        |j                        d#k(  r1dj                  |j                  D cg c]  }|d"z  	 c}      |_N        | j                   j                  r?t        | j                   j                  d$d$      }d2|d3| j                   j                  d4}n| j                   j                  }|| j                   _U        |j                  }|j                  d      D cg c]  }|j                          }
}t        |
      d5vrd6}	t        |	      t        |
      d#k  rd7||g}
d}|
D ]4  }t        |      }|dk  s|d8kD  rt        d9      ||k  rt        d:      |}6 dj                  |
      |_V        t        |       y$c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w # 1 sw Y   :xY wc c}w #  t        d|d      xY wc c}w c c}w #  t        d-| j                   j                  d      xY w#  t        d.| j                   j                  d      xY wc c}w c c}w );Nz#zm_on zm_off zs_on zs_off acao acamr`  rV   z	acao acamr   acaozihead oheadz//:zKfound URL in --rp-loc; it should be just the location, for example /foo/barr  rM   gư>rn   rU   zlo hist dbpath ssl_logzidp_adm stats_u_setsmsgz7dav_ua1 sus_urls nonsus_urls ua_nodav ua_nodoc ua_noziprc   tftp_lsf^$@rbutf-8   
zLfika idp_h_grp idp_h_key pw_hdr pw_urlp xf_host xf_proto xf_proto_fb xff_hdrzinvalid --idp-hm-usr []|z0invalid --idp-chsub; expected another | but got rI   rN   Tr   )no_hashno_idxog_ua	srch_excl)idp_gsep[-\z\\z\^zinvalid --rm-retry [zinvalid --mv-retry [falsetrue#z	<a href="z">z</a>)r   rN   zginvalid --u2sz; must be either one number, or a comma-separated list of three numbers (min,default,max)1i  z)invalid --u2sz; minimum is 1, max is 2047z1invalid --u2sz; values must be equal or ascending)Yr~   zm_onz_onzs_onzm_offz_offzs_offr   r   r   r   r  rp_locr   RSRRSSRSrsp_jtrrsp_slp	th_covers
th_coversdr   th_covers_setth_coversd_setr   r   
expandvars
expanduserupperr   r   banmsgr  openreadbanmsg_bencodesus_urlsr   str	idp_h_usridp_hm_usr_p
idp_hm_usr	idp_chsubrD   idp_chsub_trr5   sftp_ipaipaiparsftp_ipa_nmftp_ipa
ftp_ipa_nmtftp_ipatftp_ipa_nmsftp_key
sftp_key2ur3   fromkeysr%   r>   mter&   mthr$   exp_mdr   exp_lgrm_retryfloatrm_re_trm_re_rmv_retrymv_re_tmv_re_r	localtimejs_utctcolorlstripr  r   name_urlr8   r   	name_htmlu2szr   r   )r9  r  nsnvsr>  rC  vdrG  r=  rE  rJ  vlvsaru   zs0sephnr  zs2rk  rl  expptnzf1zf2rA  r@  s                               rS  r   zSvcHub._process_config  s   YY88&rww88&rwwII)	II)	2# 	AQ%%c*B%'(!'')(B(%1!%B%B2		 # 	AQB"$%B"a%%B%B2	
 # 	AQB%'(!'')(B(B2	
 # 	AQ%2B%'(!'')(B(B2	
 II19q]AA,773<qa"C""#q3::!BJll  %"%&Qqwwy&&#Qq##41sQw44r||,.3 	AQBEGH"''$$RWW%7%7%:;HBHB2	 *//4 	#AQBWW''(:(:2(>?Ar"		# #((- 	.AQB&(hhsm417794C4&)/Q1779/C/BF
CH-		. c" 	.AQB&(hhsm417794C4&)/Q1779/C/BF
CH-		. G# 	/AQBtAt$Arzz"~.	/ !!#& 	;AQBtAt$Arzz#(S.9:	; 99$biimT* 'affh' ' ))**73e;BK{{BJZZ4BK[# 	@AB3wr1~.446<<>?	@ ,.<<+=2>a	>==&B 
	FC	F"1g"12w}}S1CXXZ(/2BOOB',+.*BOOB'
	F \\"1v} RUW WXX2a7NC2a7NCABB  #3,%bkk&FRVV&FrwwM$RZZ%D266%DRWWdK%bkk&FRVV&FrwwM -/KK,=2>qaggcl>
 tQqT"AaD(

 nnW]]3/6#rvv&nnW]]3/6#rvv&nnW]]3/6S"))"3"3C"=>	S"))"3"3C"=>	< 	7A$))Q'C		1bjjo6	7
  
	?A$))Q'CczCKKR00czkk#r*S0czkk#r*S0++dF+33C?CDIIq"**s_"=>
	?	Oyy))//4HC %c
DII %c
DII	Oyy))//4HC %c
DII %c
DII  "||G	II$$S)	ryy>Q		 :1Q :;BI99TYY//t<B*,diinn=BB 		WW"$((3-0Qqwwy00s86!yAA,s8a<B-C 	BRBAvd KLLCx STTC	 ((3-B_ )% & ) )" '#4 I 5/
 5/&' ' ?Fs DEE& ?
H	O9K9KMNN	O9K9KMNN !; 1s   >tt	#t	
tt1t1tt"t"(t'At,t1+t63t6t;2u :u u%uAuu+%u0Au5 ,Av .w!w
uu(5%v%wc                     |dv ry |j                  dd      j                  dd      j                  dd      }t        j                  d|z   d	z         S )
N)any0rM   r`  rM   rn   z\.rV   r3  z^(?:))r   r   r   )r9  txtrC  s      rS  _ipa2rezSvcHub._ipa2re  sP    ""[[b!))#u5==c3Gzz&2++,,rY  c                    	 dd l }t        |j                  |j                              D cg c]  }|dkD  rt	        |      nd c}\  }}|r|s&d}| j                  d|j                  ||      d       y | j                  j                  dz  }t        ||      }||k  ry 	 dd l }|j                  |j                  ||f       |}||k  rmd
}| j                  d|j                  ||| j                  j                        d	       t        | j                  j                  |dz        | j                  _        y y c c}w #  | j                  ddd       Y y xY w#  d}| j                  d|j                  |      d	       Y y xY w)Nr   i   rT   zfailed to read rlimits from osrS   z"got bogus rlimits from os ({}, {})r  z!rlimit denied; max open files: {}rN   z)max open files: {} (wanted {} for -nc {})rI   )resourcer  	getrlimitRLIMIT_NOFILEr   r   r   r~   r  r  	setrlimit)r9  r  r>  softhardr=  wantnew_softs           rS  r  zSvcHub._setlimits  sb   		 h001G1GHI a%A[0JD$ 44AHHVQXXdD115yy||atT?d?
	x55$7GHD $;;AHHVQXXdD$)),,?Ctyy||TQY7DIIL ?	HHV=qA(	3AHHVQXXd^Q/s(   *D= D8D= !$E 8D= =E&E?c                     t        j                  | j                        }t        | j                  j
                        }dD ]-  }d|z   }||v s|j                  ||j                  |            }/ |S )NYmdHMS%)r   nowr   rZ  r~   r   r   strftime)r9  dtfnfss       rS  _lognamezSvcHub._logname  sd    \\$''" 	5BrBRxZZBKKO4	5
 	rY  c                    | j                         x}x}}|j                         j                  d      }|| j                  j                  k7  rXd}t
        j                  j                  |      r7|dz  }dj                  ||      }t
        j                  j                  |      r7|}	 t        j                  t
        j                  j                  |             	 |r,dd l}|j                  |dddd      }d	| j                  _        nt        |ddd
      }t!        | j                  dd      r$t        j"                  |j%                         d       t&        g| j(                  z   }
t+        t,        d      r#|
D cg c]  }t-        j.                  |       }
}n|
D cg c]  }dj                  |       }
}dj                  |      }||z  }d}|j1                  |j                  | j2                  j4                  dj7                  |
      |             || _        || _        t=        |d       y #  Y \xY w#  dd l}	|	j                  |ddd
      }Y ?xY wc c}w c c}w )Nz.xzr   r   z{}.{}wtr0  r   )encodingerrorspresetT)r  r  w
free_umaskFi  quotez"{}"z[+] opened logfile [{}]
zt0: {:.3f}
argv: {}

{}r`  rM   r  )r  r  ri  r~   r   r   r   r  r   r   makedirsdirnamelzmarU  no_logflushcodecsr   fchmodfilenor?   r   r  shlexr  writer   t0r   r   r   r  )r9  r:  base_fnr  sel_fndo_xzctrr  r<  r  r   r>  rN  r=  s                 rS  r   zSvcHub._setup_logfile(  s    $//"v
##E*C ''..(q C0 ''..( 	LL,-	JYYr4')TUYV(,		%"dWYG 499lE2IIbiik5)w"5'",01qEKKN1D1.23FMM!$3D3)0043(
$&&))SXXd^W=>	#cr?		JRwyIB 23s$   (2H1 =H9 ;II1H69Ic                 J   | j                   j                          t        | j                  dd      rNt        | j                  dd      st        | j                  dd      r t	        | j                   j
                  d       t	        | j                  d       t        j                  t        j                  g}t        s|j                  t        j                         |D ]"  }t        j                  || j                         $ t        rt	        | j                  d       	 | j                  s"t!        j"                  d	       | j                  s"| j%                          | j&                  s#t!        j"                  d
       | j&                  s"y y | j                          y #  Y UxY w)Nz_chkr   zmFrC  netmonzsig-hsrv-up2z
svchub-sigr   皙?)r  r  r   r~   r/   r  r  r  SIGINTr  r   r   SIGUSR1r  stop_thrr   r  r  shutdownr   )r9  sigssigs      rS  r  z
SvcHub.runW  s   499gq)DIItU+wtyy$/N4;;%%x0t""N3v~~.KK' 	4CMM#t223	4 4==,/--JJqM --
 MMOll

3 ll MMOs   -F F"c                    | xj                   dz  c_         t        | j                  dd      rf	 ddlm} | j                  r| j                  j                  d        || | j                         | _        t        | j                  j                  d       t        | j                  d
d      rf	 ddl
m} | j                  r| j                  j                           || | j                         | _
        t        | j                  j                  d       y y #  | j                  ddt               z   d	       Y xY w#  | j                  ddt               z   d	       Y y xY w)Nr   r  FrE   Tr1  rT   zmdns startup failed;
rN   rC  rG   r2  zssdp startup failed;
)r0  r   r~   r1  rF   stopr/   r  r   r<   r2  rH   )r9  rF   rH   s      rS  start_zeroconfzSvcHub.start_zeroconf|  s    499dE*	I&99IINN4( t||4	tyy}}f- 499dE*	I'99IINN$!$5	tyy}}f- +I!9FH!DaHI!9FH!DaHs   A%D +A$D6  D36 Ec                    d}| j                   5  | j                  dd       | j                  j                  |rdnd       t	        | j                         |r!| j
                  j                  |       |dz  }n| j                  dd       |dz  }| j                  j                          d d d        |S # 1 sw Y   |S xY w)	Nz/users, volumes, and volflags have been reloadedrT   zreloading config	   r  z ; volumes are now reinitializingzreload donezR

changes to global options (if any) require a restart of copyparty to take effect)r   r   r   reloadr   r  r6  )r9  rescan_all_volsr  r=  s       rS  r  zSvcHub.reload  s    = 
	!HHV/0II$QA.		"		  177/ggAKK 
	! 
	! s   BB44B>c                     | j                   j                  5  | j                   j                  d       d d d        | j                  j	                          y # 1 sw Y   $xY wrV  )r   r7  load_sessionsr6  reload_sessionsrW  s    rS  _reload_sessionszSvcHub._reload_sessions  sD    YY__ 	*II##D)	*##%	* 	*s   AAc                    | j                   sb| j                  5  | j                  j                  d       d d d        | j                  rd| _        | j	                  dd       | j                   sb| j                          y # 1 sw Y   LxY w)Ni)#  FT)r   r   waitr   r  r  rW  s    rS  r  zSvcHub.stop_thr  si    -- *##D)* "'D$' -- 	* *s   B  B	c                 ^   |dkD  r5t        j                  |       t        d       t        j                  d       t        r7t	        j
                  dj                  t	        j                                      y t	        j                  t	        j                         t        j                         y )Ng{Gz?z component stuck; issuing sigkillr  ztaskkill /f /pid {})r  r  r  r   r   systemr   r  killr  SIGKILL)r9  delays     rS  kill9zSvcHub.kill9  sb    4<JJu45JJsOII+22299;?@GGBIIK0rY  c                    | j                   r{| j                  dk  rV	 t        j                  | j                  d      j                          t        j                  d       | j                          n| xj                  dz  c_        y t        s|t        j                  k(  rd| _        nd| _        | j                  5  | j                  j                          d d d        y #  Y xY w# 1 sw Y   y xY w)Nr   )zOMBO BREAKER)targetr~   r  r   T)r   r   r   Threadr  r.  r  r  r  r   r  r  r   r   r   
notify_all)r9  r  frames      rS  r  zSvcHub.signal_handler  s    ==zzQ$$DGG:KLRRTJJsO 



a
#/"DO DM^^ 	(NN%%'	( 	(	( 	(s   AC  <C' C$'C0c                    | j                   ry d| _         d| _        | j                  5  | j                  j                          d d d        d}	 | j	                  d       g }d}| j
                  rF|j                  t        | j
                  j                  d             t        j                         dz   }| j                  rF|j                  t        | j                  j                  d             t        j                         dz   }| j                  j                          | j                  j                          | j                  j                          t        | d      rPt!        |t        j                         dz         }|j                  t        | j"                  j                  d             | j$                  rs| j$                  j                          t'        d	      D ]K  }t        j(                  d
       | j$                  j+                         r n|dk(  s:| j-                  dd       M t        | d      r<t!        t        j                         |z
  d      }t        | j.                  |dz   f       t        j                         |k  rAt1        d |D        d       sn-t        j(                  d
       t        j                         |k  rA| j-                  dd       | j2                  }	 | j8                  j:                  r:t=        dt>        j@                  d       t>        j@                  jC                          | j	                  dd       | jD                  r| jD                  jG                          d| _        t?        jH                  |       y # 1 sw Y   TxY w#  | j	                  dj5                  t7                             xY w# | j8                  j:                  r:t=        dt>        j@                  d       t>        j@                  jC                          | j	                  dd       | jD                  r| jD                  jG                          d| _        t?        jH                  |       w xY w)NTr   OPYTHATrO   r1  g      ?r2  r-     g?rN   rT   zwaiting for thumbsrv (10sec)...r   )ac              3   :   K   | ]  }|j                   s|  y wr  )is_aliver  s     rS  r  z"SvcHub.shutdown.<locals>.<genexpr>  s     <1Q<s   z	nailed itz%[31m[ error during shutdown ]
{}[0mz]0;\rM   r  [0mr  )%r   r   r   r  r  r1  r   r/   r  r  r2  r6  r  r  r  r  maxr-  r  rk  r  r   r   r  nextr   r   r<   r~   wintitler  r  r  r  r   rs  r  )r9  rettasksslpr~  zfs         rS  r  zSvcHub.shutdown  s   == ^^ 	(NN%%'	( 9	GGIECyyVDIINNF;<iikC'yyVDIINNF;<iikC'KK  "KK  "II tV$#tyy{S01VDIINNF;<}}&&(s LAJJt$}},,.Av)JKL tV$s*A.tzzb3h[1))+#<<dC

4 	 ))+# HHV[),,C
 yy!!oCJJB?

  "GGI2G&yy		!DLHHSM{	( 	(`	GGBII&(STyy!!oCJJB?

  "GGI2G&yy		!DLHHSMs2   NGN" B3N" N" N"+OO B'Q7c                    | j                   sy | j                  5  t        j                  | j                        }| j
                  |j                  |j                  dz  |j                  z   |j                  dz  |j                  z   dz  |j                  z   |j                  | j                  z  fz  }| j                  dk(  rGd}|s
d|v r5|dz  }n/t        |t               r
d|d|d}nd|vr
d|d|d}n||d}d|v rY|dz  }nS|sd	}n|dk(  rd
}n|dk(  rd}n
|dk(  rd}nd	}d|v rt#        j$                  d|      }d|v rt#        j$                  d|      }| j                   j'                  ||||fz         | j(                  j*                  s| j                   j-                          |j                  | j.                  k7  s|j                  | j0                  k7  r| j3                  |       d d d        y # 1 sw Y   y xY w)Nd   r   z@%s [%-21s] %s
r  [3m[z@%s  LOG [%-21s] %s
z@%s CRIT [%-21s] %s
rN   z@%s WARN [%-21s] %s
rS   z@%s  BTW [%-21s] %s
rM   )r   r   r   r  r   r   yearmonthdayhourminutesecondmicrosecondr   r   
isinstancer   r+   subr  r~   r  r  r   r   _set_next_day)r9  srcrN  rU   r  r  fmts          rS  r   zSvcHub._log_disabled  s   yy^^ -	'dgg&B3'3*c1BII=$,,.	" B xx1}(}y(3'23S9C1_12C8C+,c2CS=9$C1C!V1C!V1C!V1C1CS=!++b#.CS=!++b#.CIIOOC2sC.0199((		!vv"bhh$))&;""2&[-	' -	' -	's   GG88Hc                    | j                   rT| j                  rH| j                  | j                         k7  r+| j                  j	                          | j                  d       |j                  | _         |j                  | _        y )NrM   )	r   r   r   r  rs  r   r  r  r   )r9  r  s     rS  r  zSvcHub._set_next_dayQ  sT    99t'8'8DMMO'KIIOO#FF	HH	rY  c           	      d   | j                   5  t        j                  | j                        }|j                  | j
                  k7  s|j                  | j                  k7  r| j                  j                  rM|j                  | j                  j                        }|d| j                  j                  d      d   | _        | j                  rdnd}|j                  |j                  d            }t        |d       | j!                  |       | j"                  r| j"                  j%                  |       | j                  rT|sd}n|d	k(  rd
}n|dk(  rd}n
|dk(  rd}nd}d|v rt'        j(                  d|      }d|v rKt'        j(                  d|      }n4d}|sn/t+        |t,              r
d|d|d}nd|vr
d|d|d}n||d}| j                  |j.                  |j0                  |j2                  |j4                  | j6                  z  fz  }||||fz  }	 t        |d       | j"                  rK| j"                  j%                  |       | j                  jD                  s| j"                  jG                          ddd       y# t8        $ rb 	 t        |j;                  dd      j=                         d       n2#  t        |j;                  dd      j=                         d       Y nxY wY t>        $ r(}|j@                  t@        jB                  k7  r Y d}~d}~ww xY w# 1 sw Y   yxY w)z#handles logging from all componentsr`  z{}
z[36m{}[0m
z%Y-%m-%drM   r  z%s %-21s  LOG: %s
r   z%s %-21s CRIT: %s
rN   z%s %-21s WARN: %s
rS   z%s %-21s  BTW: %s
r  z[36m%s [33m%-21s [0m%s
r  r  r  r  r0  r   asciiN)$r   r   r  r   r  r   r  r   r~   log_dater  r   r   r   r   r  r  r   r  r+   r  r  r   r  r  r  r  r   UnicodeEncodeErrorrX  decodeOSErrorerrnoEPIPEr  r  )	r9  r  rN  rU   r  rC  r  r  r  s	            rS  r   zSvcHub._log_enabledY  s   ^^ =	&dgg&Bvv"bhh$))&;99%%TYY%7%78B/14==3F3Fs3KB3O$PDM#||V1FYYr{{:67bb!""2&99IIOOB'||/C!V/C!V/C!V/C/CS=!++b#.CS=!++b#.C<3'23S9C1_12C8C+,c2C				$,,.	" B S#&C	cr" yy		$yy,,IIOO%{=	& =	&b & KK#**Wi8??ArJK#**Wi8??ArJ 88u{{* +m=	& =	&s[   HL&J	)AL&		L#+J?>L#?-K.,L#1L&3L#;LL&L##L&&L/c                     	 | j                   5  t        |i | d d d        y # 1 sw Y   y xY w# t        $ r(}|j                  t        j                  k7  r Y d }~y d }~ww xY wr  )r   r  r  r  r  )r9  r  kar  s       rS  r  z	SvcHub.pr  sU    	  qB      	xx5;;& '	s(   / #/ ,/ / 	A AA c                    t         r t        j                  j                  d      syt        j
                  dk  ry	 t        j                  d      }|j                  d       |j                         d   dk7  r
t               	 y
#  Y y	xY w)NPRTY_FORCE_MPz$multiprocessing is wonky on mac osx;)rN   rN   z-need python 3.3 or newer for multiprocessing;r   )foobarr   r  z2multiprocessing is not supported on your platform;rM   )
r	   r   r!  r"  r  version_infor=   Queueputr   )r9  r>  s     rS  check_mp_supportzSvcHub.check_mp_support  sv    89&B	H((1+AEE.!uuwqzU"k! #
 	HGs   AB Bc                    | j                   j                  dk(  ry	 t        j                         dk  r)t        j
                  j                  d      s
t               	 t        j                  dd       | j                         }|sy| j                  d|       | j                  dd       y#  | j                  dd       Y yxY w# t        $ r Y \w xY w)	Nr   Fr
  svchubz/only one CPU detected; multiprocessing disabledspawnTz)cannot efficiently use multiple CPU cores)r~   r   r=   	cpu_countr   r!  r"  r   r   set_start_methodAttributeErrorr  )r9  r  s     rS  r3  zSvcHub.check_mp_enable  s    99;;!	||~"2::>>/+Jk!
	.
 ##%HHXs#HHXJK#	HHXPQ
  		s   A B+ C +C	CCc                    	 t         j                  j                  d      }|sy t        |      }|j	                  d      rd|dd  z   }dj                  d |D              }| j                  d|       t        j                  t        j                  t        j                        }|j                  |       |j                  d       y #  | j                  dt                      Y y xY w)	NNOTIFY_SOCKETr.   r   rM   c              3   F   K   | ]  }|t         j                  v s|  y wr  )string	printabler  s     rS  r  z#SvcHub.sd_notify.<locals>.<genexpr>  s     Aa10@0@+@As   !!r  s   READY=1)r   r!  r"  r   r  r   r   r*  AF_UNIX
SOCK_DGRAMrm  sendallr<   )r9  r$  addrr=  scks        rS  r  zSvcHub.sd_notify  s    	,0B2;Ds#d12hA4AAAHH[!$--0A0ABCKKKK
#	,HH[&(+s   !C B"C C%c                    t        j                          | j                  z
  }|dk  r"| j                  ddj                  |             y t        j                          | _        dj                  t        t                     }|j                  dd      }t        j                  |      }t        |      j                  d      }| j                  d|       y )Ni,  stackszcooldown {}z{}
{}r0  r   r   )r  r   r   r   r.   r4   rX  r7   compressrC   r  )r9  tdrC  r$  s       rS  
log_stackszSvcHub.log_stacks  s    YY[4;;&8HHX}33B78iik__Xxz2YYw	*]]2R[(2rY  N)T)F)rO   )r   )/__name__
__module____qualname____doc__rT  rX  r[  r   re  rh  rr  r   r(  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r  r  r  r   r  r  r  r  r  r  r  r  r   r  r   r  r  r3  r  r&  r  rY  rS  rK   rK   b   s    e,N  Z#x1fdL
!*)	!.2
),V6 8,
40l5$nYv-&8P-^#JI6&
		1(,EN1'f?&B 4,&rY  rK   )e
__future__r   r   argparser  r  r   r   r   r  r  r*  r  r  r   r  r   rT  r   r   r	   r
   r   r   r   r   authsrvr   r   r   r   r   r   r  r   fsutilr   mtagr   r   r   pwhashr   r  r   th_srvr   r   r   r   r    r!   r"   r  r#   utilr$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rl  r1  rF   r2  rH   xrangerk  rf  rc  r  objectrK   r  rY  rS  <module>r5     s    7     	 	     
    T S S G G    9 9  
 
 
 " " " " " " " " "H  E 
HV Hs   8D D