
    h                        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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 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 m!Z!m)Z)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZM e6rd dlNZNer	 ddlOmPZP ddlQmRZR ereSZTdZUdZVdZW G d deX      ZYy#  Y xY w)    )print_functionunicode_literalsN)datetime   )ANYWINEXEMACOSPY2TYPE_CHECKINGE	EnvParamsunicode)BAD_CFGAuthSrv)bos)ensure_cert)HAVE_FFMPEGHAVE_FFPROBEHAVE_MUTAGEN)HAVE_ARGON2)TcpSrv)	HAVE_AVIFr   r   	HAVE_HEIFHAVE_PIL	HAVE_VIPS	HAVE_WEBP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load_ipu	lock_filemin_exmpodfusionpybinstart_log_thrsstart_stackmonub64enc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 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 Z d Z!d*d Z"d! Z#d*d"Z$d# Z%d$ Z&d% Z'd& Z(d' Z)y()+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
                  rt        nd | _        d | _        d| _	        d| _
        d| _        d| _        d| _        d| _        t        j                          | _        t        j$                         | _        d| _        d| _        d| _        t        j                          | _        d| _        d| _        d| _        t7        t8        j:                  j=                  | j                  j>                  d      d      | _         |jB                  s|jD                  dk\  rFd|_#        d|_$        d|_%        d|_&        |jN                  xs d	|_'        |jP                  xs d
|_(        |jF                  s|jD                  dk\  r1d|_"        d|_)        d|_*        d|_+        d|_,        d|_-        d|_.        |jD                  r#d|_/        d|_0        d|_1        d|_2        d|_3        | ji                         stk        tl              i | _7        tq        | j                   jr                        | _:        tq        | j                   jv                        | _<        tq        | j                   jz                        | _>        tq        | j                   j~                        | _@        tq        | j                   j                  d      | _B        tq        | j                   j                        | _C        tq        | j                   j                        | _E        dd|j                  z
  z  | _G        dj                  |j                        | _I        dj                  |j                        | _J        |j                  r| j                  n| j                  | _N        |jN                  r| j                  |       t        j                         }t        | j                        }|g|_S        |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|_]        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                  r,|j                  r d }| j                  d|d       tk        |      t               }|j                  xs g D ]P  }|j                  d!      D cg c]  }|j                          }}|j                  |D cg c]  }|s|	 c}       R ||_g        |j                  r>t        | j                  |j                  d      \  }}t        |d"|       t        |d#|       d$j                         D ]4  }t        |d%|      s| j                  dd&|d't        ||             6 |j                  s|j                  rd|_p        d|_q        d|_r        |j                  r|j                  r| j                  d(       | j                   j                  s| j                  d)       d|_t        |j                  r| j                          d*|j                  dz  d  d d }d+t        |j                  dz           }d,j                  ||      |_v        |j\                  r)d|_x        |j                  j                  d-d      |_y        n|j                  |_x        |j                  j                  d.|j                        |_y        |j                  j                  d.|j                        xs |j                  |_|        |j                  r$t        j                  |j                        |_}        t        | j                   | j                  | j                  /      | _        |j                  r| j                  j                          |j                  d0k(  rt	        j                  d       |jP                  r| j                  j                          t        s| j                          | j                  dd1j                  | j                   j                               t        |       | _        | j                  j                  s(| j                   j                  rd| j                   _        t        |       | _        | j                          | j                   j                   j                  d!      D ci c]  }|d }}t"        s|j%                  d2d        t&        s|j%                  d3d        t(        rt*        s|j%                  d4d        |j,                  j                  d!      D cg c]1  }|j                         j/                         j                  d5d      3 }}|D ci c]  }|d   |d    c}|_        t1        |j3                               | j                   _        d | _        d}|j`                  s d6j=                  | j                   j                         xs d7}| j                  d8d9j                  |             d3| j                   j                   v rt6        sd:}| j                  d8|d       | j                   j                   rt9        |       | _        nVd}d;}|j                  d<t8        j:                  j;                  t<                    }t>        rd=}| j                  d8|d       |j@                  s)|j`                  rd>}| j                  d8|d       d|_        |j@                  s-t(        rt*        sd?}| j                  d8|d       d|_        d}|r!t        r| j                  d8d@tB        z   d       |j@                  sMt        jD                  dA|jF                  j/                               s#dB}tk        ||jF                  fz        i |_        tI        |jJ                  |jL                  |jN                        |_        d}|jP                  s|dCz  }|jR                  s|dDz  }|jT                  s|jV                  r!ddElm} d | _        ||jT                  rdFndGz  }|j\                  rddHlm} d | _        |jT                  s|jV                  s|j\                  rtc        | jd                  dI       |jf                  rxti        jj                         }ti        jl                  d        ddJlm}  ||       | _        ti        jl                  |       | jn                  js                          |dKz  }|jt                  s||_        d| _        d | _        d | _        | j}                         rddLlm}  nddMlm}   | |       | _        dNj                         D ]&  }	 t        j                          t        ||      _        ( y c c}w c c}w c c}w c c}w c c}w #  Y GxY w)ON F   r           iphash   Tzcpp-%Y-%m%d-%H%M%S.txt.xzz**,*,ln,p,rr@   
      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))iobufrM   )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 %sz{ERROR: user-changeable passwords is incompatible with IdP/identity-providers; you must disable either --chpw or --idp-h-usr,ipu_iuipu_nmzah_salt fk_salt dk_saltshow_z
effective z is idpseszyabcdefghijklmnopqrstuvwxz{0}{1} {0} {1}z	 @ --namez--name)dargscfgzmax clients: {}vipspilff=, z(None available)thumbzdecoder preference: {}z[disabling webp thumbnails because either libwebp is not available or your Pillow is too oldzneed 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FtpdfFTftpdstart_tftpd)SMBs)BrokerMp)	BrokerThrzipu_iu ftp_ipa_nm tftp_ipa_nm)argsrX   argvr   no_ansi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	log_mutexcdaycmontstackr-   ospathjoinrY   rG   sssrj   ssno_dav	no_logues	no_readmelolsunpostno_delno_mvhardlink	vague_403nihdotpartno_thumb
no_mtag_ff	no_robotsforce_js_process_config	Exceptionr   bansr+   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	getLoggerr,   handlerssetLevelDEBUG
_check_envstackmonr:   log_thrsr9   	use_fpooljno_fpoolr   getattr
bit_lengthrN   rM   
th_ram_maxchpw	idp_h_usrsetchpw_nosplitstripupdateipur3   setattrah_cliah_gen	idp_storeno_sesshrsetup_dbshr1setup_share_dbthemeintvnamedoctitlereplacenamebnamelog_fkrecompiler   asrvcgenexitsysdbg_ls
_setlimitsncr   tcpsrvsrvign_ebind_allno_fastbootr   up2k_feature_testth_decr   popr   r   r   au_unpklowerlistkeysthumbsrvr   r   basenamer8   r   no_acoder"   matchq_mp3minth_poke	th_maxage	ac_maxage
https_only	http_onlyftpftpsftpdrc   tftptftpdrg   r*   
start_ftpdsmbsocketgetdefaulttimeoutsetdefaulttimeoutsmbdri   startzmszc_ngenmdnsssdpcheck_mp_enable	broker_mprk   
broker_thrrl   brokermutex)!selfrm   rX   rn   printedlglhtrL   r   argzizi2zi3zsnochxzsliunmbrichkdecszlsswant_ffmsgr  rc   rg   stori   Brokers!                                    E/jellyfin/media/venv/lib/python3.12/site-packages/copyparty/svchub.py__init__zSvcHub.__init__f   s$    	
	&&||#4	%NN,",,.
")		bggll466::x@!D88tvv{DGDK!DN!DNgg<!<DGgg.DG77dffkDFDKDKDJ 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 DM
 	>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 NAHHVQ"A,u,,$" 	/B&(hhsm417794C4KKC-q1-.	/ 88dhh$7FBD(B'D(B'+113 	QBt"./WT2=N!OP	Q ;;$++DNDKDH>>dnnMM% yyMM% 	88!4::>#$Ra('DJJN(;<%,,R5
88DJ MM11+rBDMDJ--h

CZZ''$**=K
;;**T[[1DK DIItxxtzzB	99IINN99HHQK77IIOO*11$)),,?@Tl{{499#:#:$(DII!J	"ii..44S9:1::HHVT"HHUD!,HHT4  :>9K9KC9PQA	!''Q/QQ,01q!ad
1		,		}}		$))**+A/AAHHW6==a@A		(((s#+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DL4<<H3JC~~3JC88tyy"DI$((3+C99$DJ88tyyDII4??M288**,C$$T*!D	DI$$S)IIOO3JCxxDH		 !57Tl 2779 	B*3..*:b!'	_ 5-H ; R1Fs4   =-%2
-2
%
7$6< A@#A@@A@
c                 &    d| j                   _        y NT)rm   r   r  s    r(  _db_onfail_seszSvcHub._db_onfail_ses  s    		    c                 &    d| j                   _        y )Nr   )rm   r   r,  s    r(  _db_onfail_idpzSvcHub._db_onfail_idp  s    		r.  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
        rU   zsessions-dbzses-dbzselect count(*) from usrT   zidp-dbzunknown cachetypez.dbzgconfig option --%s (the %s) was configured to [%s] which is invalid; must be a filepath ending with .dbrK   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; rE   N.lockTcreating newopening r@   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_DBrm   ses_db_create_session_dbr-  
VER_IDP_DBidp_db_create_idp_dbr0  r   endswithr   r   r$   r   r   getsizerangesqlite3connectcursorexecutefetchallfetchone
_verify_dbr   closeunlink)r  which
native_verdb_pathdescpathoptsanchk_q	createfunfailfunr  db_lockcreatetriessverdbcurerrexr  s                      r(  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)rK   zcreated new sessions-dbr   rD  r   r  rW  schcmds       r(  r:  zSvcHub._create_session_db  s8    
  	CKK	23r.  c                 `    g d}|D ]  }|j                  |        | j                  dd       y)N)r[  z"create table us (un text, gs text)r\  r]  rK   zcreated new idp-dbr   r^  r_  s       r(  r=  zSvcHub._create_idp_db  s8    
  	CKK	-.r.  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   rU   zIWill now disable sessions and instead use plaintext passwords in cookies.rT   z^Each IdP-volume will not become available until its associated user sends their first request.r2  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',?)rD   )
connectionrD  rE  lenr   r4   r   getpidr   timecommitrH  )r  rW  rJ  rN  rL  rM  rU  rK  rV  zilownerconsr  varsr!  vs                   r(  rG  zSvcHub._verify_db'  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) NrK   z&sqlite3 not available; disabling --shrr   rD   /zYconfig error: --shr must be the name of a virtual toplevel directory to put shares insider2  Tr3  r4  z shares-db r   r6  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
rd  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 okrj  rk  re  rf  rg  rh  ri  )rm   r$   r   r   r   r   r   shr_dbr   r   r?  rA  rB  rC  rD  rE  VER_SHARES_DBrF  r5   rm  r4   rn  r   ro  rp  rH  )r  alr  rL  rR  rS  r  rU  rV  rW  rY  rq  rr  sch1sch2ra  rt  r!  ru  s                      r(  r   zSvcHub.setup_share_dbZ  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                          y y y )N   r   r   )ro  sleephasattrr   restart_ftpdr   restart_tftpdr,  s    r(  r   zSvcHub.start_ftpd  sM    

24 4!$**  +5!r.  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   rb   rK   zstarted FTPd)
r  r   rc   r   r   existsrm   certr   r   )r  rc   s     r(  r  zSvcHub.restart_ftpd  s_    tV$99ww~~diinn-$)),J	(r.  c                 ^    t        | d      sy ddlm} | j                  ry  ||       | _        y )Nr   r   rf   )r  r   rg   )r  rg   s     r(  r  zSvcHub.restart_tftpd  s'    tW% ::4[
r.  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 startrK   )ro  r  rm   r   r  num_workersr   nsrvr   r   r@  say	ign_ebindr   r   r   sigterm)r  expectedfailed_r  s        r(  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r.  c                 D    | j                  t        j                  d        y N)signal_handlersignalSIGTERMr,  s    r(  r  zSvcHub.sigterm  s    FNND1r.  c                    | xj                   dz  c_         | j                   | j                  j                  k7  ry | j                  }t	        |j
                  s|j                  rdnd      D ]%  }t        j                  d       | j                  s% n | j                  j                  r'| j                  d| j                  j                         n| j                  dd       | j                          y )Nr   rI   r   gQ?zqr-coderK   zworkers OK
)r   r  r  rm   r@  r   r   ro  r  r   r   qrr   after_httpsrv_up)r  arr  s      r(  r  zSvcHub.cb_httpsrv_up  s    1??dkk555YYRVVrwwrA6 	AJJtyy	
 ;;>>HHY/HHV^,r.  c                 d    | j                   j                          t        | j                  d       y )Nz	sd-notify)r   	init_volsr*   	sd_notifyr,  s    r(  r  zSvcHub.after_httpsrv_up  s     		t~~{+r.  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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)rZ   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 images with pillow (rarely useful)zpillow-avifz-read .avif images with pillow (rarely useful)psutilz(improved plugin cleanup  (rarely useful)dependenciesrD   r@   r  foundmissingz%7s: %s [36m(%s)r^   c              3   &   K   | ]	  }|d      ywr   N .0r  s     r(  	<genexpr>z'SvcHub._feature_test.<locals>.<genexpr>;       *!*   c              3   &   K   | ]	  }|d      ywr  r  r  s     r(  r  z'SvcHub._feature_test.<locals>.<genexpr><  r  r  z	OK: [32mz[0mNG: [35mz#[0m, see --deps (this is fine btw)zoptional-dependenciesrJ   )r$   r   r   r   r   r   r   r   r%   r   r   r   r#   rm   depsr   appendr   )r  fokfngt_ffto_checkverbosehavefeatwhatlstr  sgotr  soksngs                  r(  r   zSvcHub._feature_test  s   G8%GHx!AB JK'HI(D+M$MN9d-F&FG9&VW($STw GH'VW'VW
 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/r.  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                  s]d
dl
m} |sT| j                   j                  s=d| j                   _	        d}| j                  d|t        t        t               fz  d
       y y y y )NzbWARNING: --no-bauth disables support for the Android app; you may want to use --bauth-last insteadrK   rE   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
)rm   no_bauthr   
bauth_lasti
startswithr   r   r   r   dxmlr  r'   r)   r1   )r  rz  r  have_tcpr  zbr  s          r(  r   zSvcHub._check_envI  s5   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 (   r.  c           
      D   | 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        |||       : |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 ]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>                  sd|_         n|j@                  dk(  rd |_        |jB                  j                         |_!        |jD                  j                         |_"        |jF                  j                         |_#        |jH                  j                         |_$        tK        |jL                  xs |jN                  d      |_(        tK        |jR                  xs |jN                  d      |_*        tW        jX                  t[        j                  d      d      }t]        ||j^                        |_/        tW        jX                  ta        j                  d      d      }t]        ||jb                        |_1        tW        jX                  te        j                  d      d      }t]        ||jf                  ji                  dd            |_3        t]        ||jj                  ji                  dd            |_5        dD ]E  }t        | j                   |      }|st        | j                   |t;        j<                  |             G dD ]  }t        | j                   |      }d|v rd|ji                  dd      z   }d|v r|ji                  dd      dz   }d|v r|ji                  dd      dz   }|ji                  dd      ji                  dd      }t        | j                   |t;        j<                  d|d              	 | j                   jl                  j                  d
      \  }}to        |      | j                   _8        to        |      | j                   _9        	 | j                   jt                  j                  d
      \  }}to        |      | j                   _;        to        |      | j                   _<        |jz                  rd"nd#|_>        |j~                  j                  d$      |_?        t        |j~                        d%k(  r1dj                  |j~                  D cg c]  }|d&z  	 c}      |_?        |j                  }|j                  d      }
t        |
      d'vrd(}	t        |	      t        |
      d%k  rd)||g}
d}|
D ]4  }t        |      }|dk  s|d*kD  rt        d+      ||k  rt        d,      |}6 dj                  |
      |_C        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 #  t        d | j                   jl                  d      xY w#  t        d!| j                   jt                  d      xY wc c}w )-Nz#zm_on zm_off zs_on zs_off acao acamr5  rP   z	acao acamr   acaoz//:zKfound URL in --rp-loc; it should be just the location, for example /foo/barrw  rD   gư>.rL   zlo hist dbpath ssl_logidp_adm_setz.dav_ua1 sus_urls nonsus_urls ua_nodoc ua_nozipnotftp_lsf^$T)no_hashno_idxog_ua	srch_excl)idp_gsep][-\z\\z\^zinvalid --rm-retry [zinvalid --mv-retry [falsetrue#rE   r@   )r   rE   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)Erm   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
expanduserr   r   sus_urlsr   xff_hdrr   	idp_h_grp	idp_h_keyr0   ftp_ipaipa
ftp_ipa_nmtftp_ipatftp_ipa_nmr.   fromkeysr    r7   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lstriprm  r   u2szr   )r  rz  nsnvsr  r  vdr  r  r  r!  vlvsar  r   expptnzf1zf2r  r  s                         r(  r   zSvcHub._process_configj  sw   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	
 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-		. ># 	/AQBtAt$Arzz"~.	/ !!#& 	;AQBtAt$Arzz#(S.9:	; {{BJZZ4BKZZ%%'
||))+||))+||))+$RZZ%92664@%bkk&;RVVTB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WWhhsms86!yAA,s8a<B-C 	BRBAvd KLLCx STTC	 ((3-m )% & )" '#4 I 5/|	O9K9KMNN	O9K9KMNN !;so   >ff #f 
f%f*f/<f4f4f9Af><gg!gAg %Ag5 'h%g25%hc                     |dv ry |j                  dd      j                  dd      j                  dd      }t        j                  d|z   d	z         S )
N)any0rD   r5  rD   r  z\.rP   |z^(?:))r   r   r   )r  txtr  s      r(  _ipa2rezSvcHub._ipa2re  sP    ""[[b!))#u5==c3Gzz&2++,,r.  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   rK   zfailed to read rlimits from osrJ   z"got bogus rlimits from os ({}, {})   z!rlimit denied; max open files: {}rE   z)max open files: {} (wanted {} for -nc {})r@   )resourcer   	getrlimitRLIMIT_NOFILEr   r   r   rm   r   r   	setrlimit)r  r"  r  softhardr  wantnew_softs           r(  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   nowrq   strrm   r   r   strftime)r  dtfnfss       r(  _lognamezSvcHub._logname;  sd    \\$''" 	5BrBRxZZBKKO4	5
 	r.  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{}.{}wtutf-8r   )encodingerrorspresetT)r7  r8  w
free_umaskFi  quotez"{}"z[+] opened logfile [{}]
zt0: {:.3f}
argv: {}

{}r5  rD   end)r3  r   r>  rm   r   r   r   r  r   r   makedirsdirnamelzmaopenno_logflushcodecsr   fchmodfilenor8   rn   r  shlexr<  writer   t0r   rr   rs   print)r  r  base_fnr1  sel_fndo_xzctrrA  r  rD  rn   r  r%  r  s                 r(  r   zSvcHub._setup_logfileE  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   zmFr  netmonzsig-hsrv-up2z
svchub-sigr   皙?)r   runr   rm   r*   rR  r  r  SIGINTr  r   r  SIGUSR1r  stop_thrru   ro  r  shutdownrw   )r  sigssigs      r(  rT  z
SvcHub.runt  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   rQ  Fr<   Tr	  rK   zmdns startup failed;
rE   r  r>   r
  zssdp startup failed;
)r  r   rm   r	  r=   stopr*   rT  r   r5   r
  r?   )r  r=   r?   s      r(  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                 N   d}| j                   5  | j                  dd       | j                  j                  |rdnd       |r!| j                  j                  |       |dz  }n| j                  dd       | j
                  j                          d d d        |S # 1 sw Y   |S xY w)Nzconfig has been reloadedrK   zreloading config	   r!  z ; volumes are now reinitializingzreload done)r{   r   r   reloadr   r  )r  rescan_all_volsr   r  s       r(  r`  zSvcHub.reload  s    & 	!HHV/0II$QA.		  177/KK 	! 	! s   BBB$c                     | j                   j                  5  | j                   j                  d       d d d        | j                  j	                          y # 1 sw Y   $xY wr+  )r   r  load_sessionsr  reload_sessionsr,  s    r(  _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)ru   r}   waitrx   r`  rX  r,  s    r(  rW  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 sigkillrS  ztaskkill /f /pid {})ro  r  rJ  r   r   systemr   rn  killr  SIGKILL)r  delays     r(  kill9zSvcHub.kill9  sb    4<JJu45JJsOII+22299;?@GGBIIK0r.  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)targetrm   rS  r   T)rv   r~   ry   Threadprr  ro  r  rm  r   r  rV  rx   ru   r}   
notify_all)r  rZ  frames      r(  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   OPYTHATrF   r	  g      ?r
  r     g?rE   rK   zwaiting for thumbsrv (10sec)...r   )ac              3   :   K   | ]  }|j                   s|  y wr  )is_aliver  s     r(  r  z"SvcHub.shutdown.<locals>.<genexpr>#  s     <1Q<s   z	nailed itz%[31m[ error during shutdown ]
{}[0mz]0;\rD   )filer>  [0mr=  )%rv   ru   r}   rr  rq  r	  r  r*   r\  ro  r
  r  rX  r   r   r  maxr  r   r@  r  rw   r   rm  nextr   r   r5   rm   wintitlerJ  r   stderrflushrr   rH  r   )r  rettasksslpr  zfs         r(  rX  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           
      r   | 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  }|rE| j                  j                  s/t!        |t"              r
d|d|d}nd|vr
d|d|d}n||d}d|v r|dz  }d|v r|dz  }| j                   j%                  d|d|d	d
|d       | j                  j&                  s| j                   j)                          |j                  | j*                  k7  s|j                  | j,                  k7  r| j/                  |       d d d        y # 1 sw Y   y xY w)Nd   [3mr{  [@z [21z] 
)rr   r   r   r-  rq   r   yearmonthdayhourminutesecondmicrosecondr   rm   ro   
isinstancer   rH  rC  r  r   r   _set_next_day)r  srcr%  rL   r0  rf  s         r(  r   zSvcHub._log_disabled9  s[   yy^^ 	'dgg&B3'3*c1BII=$,,.	" B **a%23S9C1_12C8C+,c2C}y }y IIOO"c3?@99((		!vv"bhh$))&;""2&9	' 	' 	's   F
F--F6c                    | j                   rT| j                  rH| j                  | j                         k7  r+| j                  j	                          | j                  d       |j                  | _         |j                  | _        y )NrD   )	r   rr   rs   r3  rH  r   r  r  r   )r  r0  s     r(  r  zSvcHub._set_next_day[  sT    99t'8'8DMMO'KIIOO#FF	HH	r.  c           	      b   | j                   5  t        j                  | j                        }|j                  | j
                  k7  s|j                  | j                  k7  ru| j                  rdnd}|j                  |j                  d            }t        |d       | j                  |       | j                  r| j                  j                  |       d}| j                  r7d}d|v rt        j                   d|      }d|v rHt        j                   d|      }n1|r/t#        |t$              r
d	|d
|d}nd|vr
d|d
|d}n||d}| j&                  |j(                  |j*                  |j,                  |j.                  | j0                  z  fz  }||||fz  }	 t        |d       | j                  rK| j                  j                  |       | j>                  j@                  s| j                  jC                          ddd       y# t2        $ rb 	 t        |j5                  dd      j7                         d       n2#  t        |j5                  dd      j7                         d       Y nxY wY t8        $ r(}|j:                  t:        j<                  k7  r Y d}~d}~ww xY w# 1 sw Y   yxY w)z#handles logging from all componentsz{}
z[36m{}[0m
z%Y-%m-%drD   r=  z[36m%s [33m%-21s [0m%s
z%s %-21s %s
r  r  r  r{  r  r6  r   asciiN)"r   r   r-  rq   r  r   r  r   ro   r   r/  rJ  r  rr   rH  r&   subr  r   r   r  r  r  r  r   UnicodeEncodeErrorencodedecodeOSErrorerrnoEPIPErm   rC  r  )	r  r  r%  rL   r0  r  fmtrf  rY  s	            r(  r   zSvcHub._log_enabledc  s&   ^^ .	&dgg&Bvv"bhh$))&;#||V1FYYr{{:67bb!""2&99IIOOB'8C||%S=!++b#.CS=!++b#.Ca%23S9C1_12C8C+,c2C				$,,.	" B S#&C	cr" yy		$yy,,IIOO%].	& .	&D & KK#**Wi8??ArJK#**Wi8??ArJ 88u{{* +O.	& .	&s[   FJ%H(AJ%	J"+H>=J">-I-+J"0J%2J":JJ%J""J%%J.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   rJ  r  r  r  )r  rw  karY  s       r(  rq  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;)rE   rE   z-need python 3.3 or newer for multiprocessing;r   )foobarr   r  z2multiprocessing is not supported on your platform;rD   )
r	   r   environgetr   version_infor6   Queueputr   )r  r  s     r(  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)rm   r   r6   	cpu_countr   r  r  r   r   set_start_methodAttributeErrorr  )r  rX  s     r(  r  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                  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   rD   c              3   F   K   | ]  }|t         j                  v s|  y wr  )string	printabler  s     r(  r  z#SvcHub.sd_notify.<locals>.<genexpr>  s     Aa10@0@+@As   !!r  s   READY=1)r   getenvr   r  r   r   r  AF_UNIX
SOCK_DGRAMrB  sendallr5   )r  r  addrr  scks        r(  r  zSvcHub.sd_notify  s    	,?+B2;Ds#d12hA4AAAHH[!$--0A0ABCKKKK
#	,HH[&(+s   B= B"B= =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{}
{}r6  r   r  )ro  r   r   r   r)   r/   r  r2   compressr;   r  )r  tdr  r  s       r(  
log_stackszSvcHub.log_stacks  s    YY[4;;&8HHX}33B78iik__Xxz2YYw	*]]2R[(2r.  N)rF   )r   )*__name__
__module____qualname____doc__r)  r-  r0  r   r:  r=  rG  r   r   r  r  r  r  r  r  r   r   r   r  r   r3  r   rT  r]  r`  re  rW  rm  r  rX  r   r  r   rq  r  r  r  r  r  r.  r(  rB   rB   [   s    AF
  Z#x1fdL!)	!.2 $,
30jNB`D-&8P-^#JI6&
		1(,EN 'D0&d 4,&r.  rB   )Z
__future__r   r   argparser  r   r   r   rG  r  r  r  r   ry   ro  r   r)  r   r   r	   r
   r   r   r   r   authsrvr   r   r   r  r   mtagr   r   r   pwhashr   r   r   th_srvr   r   r   r   r   r   r   r   utilr   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   rA  r	  r=   r
  r?   xranger@  r;  r8  ry  objectrB   r  r.  r(  <module>r     s    7    	 	     
    T S S %   9 9  	 	 	        @  E 
JV Js   D   D