a }|g$@s\dZddlmZddlZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z z8ddlmZdd lmZdd lmZdd lmZd ZWneyd ZYn0eeZergdngZddddZddddZeee e dddZ!ddddZ"ddddZ#e e ddd Z$e e d!d"d#Z%d'e e ee&e e'e e fd$d%d&Z(dS)(zk This compat module handles various platform specific calls that do not fall into one particular category. )absolute_importN)Optional)Tuple)errors)os)error)shell) GetStdHandle)STD_OUTPUT_HANDLEFT)z /usr/sbinz/usr/local/binz/usr/local/sbin)returncCststdkrtddS)z On Windows, raise if current shell does not have the administrative rights. Do nothing on Linux. :raises .errors.Error: If the current shell does not have administrative rights on Windows. rzAError, certbot must be run on a shell with administrative rights.N) POSIX_MODE shellwin32Z IsUserAnAdminrErrorrr7/usr/lib/python3.9/site-packages/certbot/compat/misc.py+raise_for_non_administrative_windows_rights!srcCsTtrdSd}z"tt}|r,|||BWn tyNtjdddYn0dS)zR On Windows, ensure that Console Virtual Terminal Sequences are enabled. NzFailed to set console modeT)exc_info)r r r ZSetConsoleModeZGetConsoleMode pywinerrorloggerdebug)Z"ENABLE_VIRTUAL_TERMINAL_PROCESSINGhrrrprepare_virtual_console,s r)timeoutpromptr cCsfzDttjggg|\}}}|s8td|r0|nd|dWSty`tjYS0dS)a( Read user input to return the first line entered, or raise after specified timeout. :param float timeout: The timeout in seconds given to the user. :param str prompt: The prompt message to display to the user. :returns: The first line entered by the user. :rtype: str z,Timed out waiting for answer to prompt '{0}'rN)selectsysstdinrrformatreadlineOSError)rrZrlist_rrrreadline_with_timeout@s  r#z C:\CertbotzC:\Certbot\libzC:\Certbot\log)ZconfigZworkZlogsz/etc/letsencryptz/var/lib/letsencryptz/var/log/letsencrypt) folder_typer cCstjdkrt|St|S)z Return the relevant default folder for the current OS :param str folder_type: The type of folder to retrieve (config, work or logs) :returns: The relevant default folder. :rtype: str nt)rnameLINUX_DEFAULT_FOLDERSWINDOWS_DEFAULT_FOLDERS)r$rrrget_default_folderis r))pathr cCs.tjdkr|Stj|\}}||ddS)z Replace unsupported characters in path for current OS by underscores. :param str path: the path to normalize :return: the normalized path :rtype: str r%:r")rr&r* splitdrivereplace)r*drivetailrrr.underscores_for_unsupported_characters_in_pathzs r0)cmd_name shell_cmdenvr c Csntd||tr0tj|dtjtjdd|d}n$dd|g}tj|tjtjdd|d}|j|j}}|j||fS)a# Run a command: - on Linux command will be run by the standard shell selected with subprocess.run(shell=True) - on Windows command will be run in a Powershell shell This function returns the exit code, and does not log the result and output of the command. :param str cmd_name: the user facing name of the hook being run :param str shell_cmd: shell command to execute :param dict env: environ to pass into subprocess.run :returns: `tuple` (`int` returncode, `str` stderr, `str` stdout) zRunning %s command: %sTF)rstdoutstderruniversal_newlinescheckr3zpowershell.exez-Command)r4r5r6r7r3) rinfor subprocessrunPIPEr4r5 returncode)r1r2r3proclineouterrrrrexecute_command_statuss  rA)N))__doc__Z __future__rZloggingrr9rtypingrrZcertbotrZcertbot.compatrZ pywintypesrrZwin32com.shellrr Z win32consoler r r ImportErrorZ getLogger__name__rZSTANDARD_BINARY_DIRSrrfloatstrr#r(r'r)r0dictintrArrrrsH