dbfdg 3 whL+@s ddlZddlZddlZddlZddlmZddlmZddlmZddlmZddlm Z ddlm Z dd lm Z dd lm Z dd lm Z dd lmZmZmZd*ddZddZddZddZd+ddZe jddZddZddZddZd d!Zd"d#Zd$d%Zd,d&d'Zd(d)Z dS)-N)errors)config) constants) http_utils) log_utils)platform_utils)utils)serverid) ipv6_support) urlencodeURLError HTTPErrorFcCsd}ytj}|dkr(|s$tjddStjdj|}tj|}t j |j }t j |}|ddkrtj |stjdn |stj|tjd|dWn2tk r}z|stj||WYdd}~XnXdS)Nz1Error unregistering server: cannot find server idz&/unregister_server.plain?server_id={0}successtruezServer was unregisteredzError unregistering server: message)r get_serveridrlogerrorr get_registration_urlformatrurlopenr nstrread data_as_dict rm_serveridloginforprint_cln_http_error)Zsilenturl server_idresponsecontentreser#*/usr/libexec/kcare/python/kcarectl/auth.py unregisters*      r%cCstdtj}|dkrdStjtj}ddl}|dkrF|jd|jjtdd}tdd}tj |j |j j tj |j |jj tj |j |j j xDt jd t|\}}}|dkr|rtj|t||jdqWdS) NzHRegister auto-retry has been enabled, the system can be registered laterrz /dev/nullrza+<ii )printosforksetsidsysexitstdoutflushopendup2filenostdinstderrtimesleep _try_registerr set_server_id_set_auth_token)rpidr-sisocoder auth_tokenr#r#r$_register_retry.s,       r@cCs&|dk r"tjd| r"td||S)Nz ^[\w.-]+$zInvalid value received: %s)rematch ValueError)valuer#r#r$_validate_urlsafe_encodingHs rEcCsyNtj|}|jjtjd}tjtj|j }t |dt |jdt |fSt t fk r~}ztj||dSd}~Xn$tk rtjjd|dSXdS)Nr>rz)Exception while trying to register URL %s)NNN)NNN)rrheadersgetrAUTH_TOKEN_HEADERr rrrintrErr rr Exceptionkcarelog exception)rrr?r!r"r#r#r$r8Ns   r8c Cs6y tdWn tk r,tjjdYnXtj}td|fd|fg}djt j |}t |\}}}|dkrt j |t|tjddS|dkrtjd nv|d krtjd nb|d krtjd nN|dkrtjdn:|dkrtjdn&|dkr tjdntjdj||r,t|dS|p4dS)NTz9Exception while trying to unregister URL before register.hostnamekeyz{0}/register_server.plain?{1}rzServer RegisteredrzAccount Lockedr(z Invalid Keyz}You have reached maximum registered servers for this key. Please go to your CLN account, remove unused servers and try again.z[IP is not allowed. Please change allowed IP ranges for the key in KernelCare Key tab in CLNzEThis IP was already used for trial, you cannot use it for trial againzfThis IP was banned. Please contact support for more information at https://www.kernelcare.com/support/zUnknown Error {0})r%rJrrKrLr get_hostnamer rr rr8r r9r:rrr@)rNretryrMqueryrr>rr?r#r#r$register\s>         rWcCs tjtjS)N)r try_to_readrAUTH_TOKEN_DUMP_PATHr#r#r#r$_get_auth_tokensrZcCs|sdStjtj|dS)N)r atomic_writerrY)r?r#r#r$r:sr:cOsv|jdd}|jddrt}ntj}tj|r@tj|f||Stj|tt|d}t j |ddtj|f||S)Nmethod check_licenseT)r\)count) pop_check_auth_retryrcheck_urlopen_retry is_local_url urlopen_base http_requestget_http_auth_stringrZr rU)rargskwargsr\checkrequestr#r#r$ urlopen_auths   rkcCs.tj}|r*tjtjtjdj|dSdS)Nz{0}:{1}Z kernelcare)r rr rbase64 b64encodebstrr)rr#r#r$rfsrfcCs8t|tr&|jdkrt|S|jdkSt|tr4dSdS)NiT)rorp) isinstancerr>_handle_forbiddenr )r"stater#r#r$ras     racCsd|kr dStjrtj}tjd}|r8|dj|7}y&tjt j |ddj }tj |}Wn0t k r}ztj||dddSd}~XnX| s|jd  rtjjd j|dS|d dkrd|d<tjd dStdS)aIn case of 403 error we should check what's happen. Case #1. We are trying to register unlicensed machine and should try to register trial. Case #2. We have a valid license but access restrictions on server are not consistent yet and we had to try later. licenseTz /check.plainz?server_id={0}F) retry_on_500)r/Nr>zUnexpected CLN response: {0}01z$Unable to access server. Retrying...)rvrw)rCHECK_CLN_LICENSE_STATUSr rr rrr rrrrrr rrrGrKerrorr_register_trial)rsrrr infoexr#r#r$rrs*   rrcCstj}|rtjdj|}ytj|}tj|j }tj |}| sT|j d rft dj|dSt |d}|dkrt ddStdd}|dkrt d|SWqtk r}ztj||dSd}~XqXntSdS) Nz/check.plain?server_id={0}r>zUnexpected CLN response: {0}rrzKey-based valid license found) key_checkedz No valid key-based license found)r rr rrrrr rrrrGr)rI_get_license_info_by_ipr rr)rrrr r!r>Z license_typer"r#r#r$ license_infos,     rc Cstjd}y*tj|}tj|j}tj|}|djdkrt |d}|dkrnt dj |ddS|dkr|d}tj |d j d }t d j ||d S|d kr|dkr|d}tj |d j d }t d j |||dko|dkr6d|krt dj |dnt dn|jdd}t dj |Wnftk rh} ztj| |WYdd} ~ Xn8tk r} zt dj | |jWYdd} ~ XnXdS)Nz /check.plainrrr>rzValid license found for IP {0}iprZ expire_datez%Y-%m-%dz?You have a trial license for the IP {0} that will expire on {1}r(z0Your trial license for the IP {0} expired on {1}rOzThe IP {0} hasn't been licensedz This server hasn't been licensedrz"Error retrieving license info: {0}z1Unexpected CLN response, cannot find {0} key: {1})r rrrr rrrlowerrIr)rparse_response_datestrftimerGr rrKeyErrorstrip) r}rrr r!r>rZ expires_strrr"rNr#r#r$r~s<       &r~cCs>tjjtjd}tjj|r dSytjtj d}t j t j |j }y|djdkrt j|ddd|ddkrtj|d |d tjd j|d dS|dd krt j|dddtjd n tjdWn.tk r}ztj|WYdd}~XnXWn0tk r8}ztj|jWYdd}~XnXdS)Nztrial-requestedz /trial.plainrrrT) ensure_dirZexpiredrcreatedz3Requesting trial license for IP {0}. Please wait...ZnazInvalid LicenserrS)r*pathjoinr PATCH_CACHEexistsrrr rr rrrrr[rAlreadyTrialedExceptionrrr KcareErrorUnableToGetLicenseExceptionrrr>)Z trial_markrr!Zker"r#r#r$rzs*     rz)F)F)r)!rlr*rAr6rrrrrrrr r r py23r r rr%r@rEr8rWcachedrZr:rkrfrarrrr~rzr#r#r#r$s6           (  ) #