mirror of
https://github.com/ArchiveBox/ArchiveBox.git
synced 2025-05-13 22:54:27 -04:00
check python encoding in SHELL_CONFIG validation
This commit is contained in:
parent
e0eb3119b7
commit
0ef3a0913b
6 changed files with 29 additions and 29 deletions
|
@ -559,7 +559,6 @@ DYNAMIC_CONFIG_SCHEMA: ConfigDefaultDict = {
|
||||||
'CAN_UPGRADE': {'default': lambda c: False}, # can_upgrade(c)},
|
'CAN_UPGRADE': {'default': lambda c: False}, # can_upgrade(c)},
|
||||||
|
|
||||||
'PYTHON_BINARY': {'default': lambda c: sys.executable},
|
'PYTHON_BINARY': {'default': lambda c: sys.executable},
|
||||||
'PYTHON_ENCODING': {'default': lambda c: sys.stdout.encoding.upper()},
|
|
||||||
'PYTHON_VERSION': {'default': lambda c: '{}.{}.{}'.format(*sys.version_info[:3])},
|
'PYTHON_VERSION': {'default': lambda c: '{}.{}.{}'.format(*sys.version_info[:3])},
|
||||||
|
|
||||||
'DJANGO_BINARY': {'default': lambda c: inspect.getfile(django)},
|
'DJANGO_BINARY': {'default': lambda c: inspect.getfile(django)},
|
||||||
|
|
|
@ -25,7 +25,6 @@ from .util import enforce_types
|
||||||
from .config import (
|
from .config import (
|
||||||
ConfigDict,
|
ConfigDict,
|
||||||
OUTPUT_DIR,
|
OUTPUT_DIR,
|
||||||
PYTHON_ENCODING,
|
|
||||||
VERSION,
|
VERSION,
|
||||||
ANSI,
|
ANSI,
|
||||||
IS_TTY,
|
IS_TTY,
|
||||||
|
@ -184,7 +183,7 @@ class TimedProgress:
|
||||||
@enforce_types
|
@enforce_types
|
||||||
def progress_bar(seconds: int, prefix: str='') -> None:
|
def progress_bar(seconds: int, prefix: str='') -> None:
|
||||||
"""show timer in the form of progress bar, with percentage and seconds remaining"""
|
"""show timer in the form of progress bar, with percentage and seconds remaining"""
|
||||||
chunk = '█' if PYTHON_ENCODING == 'UTF-8' else '#'
|
chunk = '█' if (sys.stdout or sys.__stdout__).encoding.upper() == 'UTF-8' else '#'
|
||||||
last_width = TERM_WIDTH()
|
last_width = TERM_WIDTH()
|
||||||
chunks = last_width - len(prefix) - 20 # number of progress chunks to show (aka max bar width)
|
chunks = last_width - len(prefix) - 20 # number of progress chunks to show (aka max bar width)
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -146,7 +146,6 @@ BUILD_TIME=2024-05-15 03:28:05 1715768885
|
||||||
VERSIONS_AVAILABLE=None
|
VERSIONS_AVAILABLE=None
|
||||||
CAN_UPGRADE=False
|
CAN_UPGRADE=False
|
||||||
PYTHON_BINARY=/opt/archivebox/.venv/bin/python3.10
|
PYTHON_BINARY=/opt/archivebox/.venv/bin/python3.10
|
||||||
PYTHON_ENCODING=UTF-8
|
|
||||||
PYTHON_VERSION=3.10.14
|
PYTHON_VERSION=3.10.14
|
||||||
DJANGO_BINARY=/opt/archivebox/.venv/lib/python3.10/site-packages/django/__init__.py
|
DJANGO_BINARY=/opt/archivebox/.venv/lib/python3.10/site-packages/django/__init__.py
|
||||||
DJANGO_VERSION=5.0.6 final (0)
|
DJANGO_VERSION=5.0.6 final (0)
|
||||||
|
@ -307,7 +306,6 @@ BUILD_TIME = "2024-05-15 03:28:05 1715768885"
|
||||||
VERSIONS_AVAILABLE = null
|
VERSIONS_AVAILABLE = null
|
||||||
CAN_UPGRADE = false
|
CAN_UPGRADE = false
|
||||||
PYTHON_BINARY = "/opt/archivebox/.venv/bin/python3.10"
|
PYTHON_BINARY = "/opt/archivebox/.venv/bin/python3.10"
|
||||||
PYTHON_ENCODING = "UTF-8"
|
|
||||||
PYTHON_VERSION = "3.10.14"
|
PYTHON_VERSION = "3.10.14"
|
||||||
DJANGO_BINARY = "/opt/archivebox/.venv/lib/python3.10/site-packages/django/__init__.py"
|
DJANGO_BINARY = "/opt/archivebox/.venv/lib/python3.10/site-packages/django/__init__.py"
|
||||||
DJANGO_VERSION = "5.0.6 final (0)"
|
DJANGO_VERSION = "5.0.6 final (0)"
|
||||||
|
|
|
@ -19,7 +19,6 @@ from plugantic.base_check import BaseCheck
|
||||||
from plugantic.base_binary import BaseBinary, BaseBinProvider, env, apt, brew
|
from plugantic.base_binary import BaseBinary, BaseBinProvider, env, apt, brew
|
||||||
from plugantic.base_hook import BaseHook
|
from plugantic.base_hook import BaseHook
|
||||||
|
|
||||||
PYTHON_ENCODING = sys.__stdout__.encoding.upper()
|
|
||||||
|
|
||||||
###################### Config ##########################
|
###################### Config ##########################
|
||||||
|
|
||||||
|
@ -172,6 +171,19 @@ class CheckPipEnvironment(BaseCheck):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def check(settings, logger) -> List[Warning]:
|
def check(settings, logger) -> List[Warning]:
|
||||||
|
# hard errors: check python version
|
||||||
|
if sys.version_info[:3] < (3, 10, 0):
|
||||||
|
print('[red][X] Python version is not new enough: {sys.version} (>3.10 is required)[/red]', file=sys.stderr)
|
||||||
|
print(' See https://github.com/ArchiveBox/ArchiveBox/wiki/Troubleshooting#python for help upgrading your Python installation.', file=sys.stderr)
|
||||||
|
raise SystemExit(2)
|
||||||
|
|
||||||
|
# hard errors: check django version
|
||||||
|
if int(django.VERSION[0]) < 5:
|
||||||
|
print('[red][X] Django version is not new enough: {django.VERSION[:3]} (>=5.0 is required)[/red]', file=sys.stderr)
|
||||||
|
print(' Upgrade django using pip or your system package manager: pip3 install --upgrade django', file=sys.stderr)
|
||||||
|
raise SystemExit(2)
|
||||||
|
|
||||||
|
# soft errors: check that lib/pip virtualenv is setup properly
|
||||||
errors = []
|
errors = []
|
||||||
|
|
||||||
LIB_PIP_BINPROVIDER.setup()
|
LIB_PIP_BINPROVIDER.setup()
|
||||||
|
@ -186,28 +198,6 @@ class CheckPipEnvironment(BaseCheck):
|
||||||
# logger.debug("[√] CheckPipEnvironment: data/lib/pip virtualenv is setup properly")
|
# logger.debug("[√] CheckPipEnvironment: data/lib/pip virtualenv is setup properly")
|
||||||
return errors
|
return errors
|
||||||
|
|
||||||
# check python version
|
|
||||||
if sys.version_info[:3] < (3, 10, 0):
|
|
||||||
print('[red][X] Python version is not new enough: {sys.version} (>3.10 is required)[/red]', file=sys.stderr)
|
|
||||||
print(' See https://github.com/ArchiveBox/ArchiveBox/wiki/Troubleshooting#python for help upgrading your Python installation.', file=sys.stderr)
|
|
||||||
raise SystemExit(2)
|
|
||||||
|
|
||||||
# check django version
|
|
||||||
if int(django.VERSION[0]) < 5:
|
|
||||||
print('[red][X] Django version is not new enough: {django.VERSION[:3]} (>=5.0 is required)[/red]', file=sys.stderr)
|
|
||||||
print(' Upgrade django using pip or your system package manager: pip3 install --upgrade django', file=sys.stderr)
|
|
||||||
raise SystemExit(2)
|
|
||||||
|
|
||||||
# check python locale
|
|
||||||
if PYTHON_ENCODING not in ('UTF-8', 'UTF8'):
|
|
||||||
print(f'[red][X] Your system is running python3 scripts with a bad locale setting: {PYTHON_ENCODING} (it should be UTF-8).[/red]', file=sys.stderr)
|
|
||||||
print(' To fix it, add the line "export PYTHONIOENCODING=UTF-8" to your ~/.bashrc file (without quotes)', file=sys.stderr)
|
|
||||||
print(' Or if you\'re using ubuntu/debian, run "dpkg-reconfigure locales"', file=sys.stderr)
|
|
||||||
print('')
|
|
||||||
print(' Confirm that it\'s fixed by opening a new shell and running:', file=sys.stderr)
|
|
||||||
print(' python3 -c "import sys; print(sys.stdout.encoding)" # should output UTF-8', file=sys.stderr)
|
|
||||||
raise SystemExit(2)
|
|
||||||
|
|
||||||
|
|
||||||
USER_IS_NOT_ROOT_CHECK = CheckUserIsNotRoot()
|
USER_IS_NOT_ROOT_CHECK = CheckUserIsNotRoot()
|
||||||
PIP_ENVIRONMENT_CHECK = CheckPipEnvironment()
|
PIP_ENVIRONMENT_CHECK = CheckPipEnvironment()
|
||||||
|
|
|
@ -32,6 +32,9 @@ class ShellConfig(BaseConfigSet):
|
||||||
PUID: int = Field(default=os.getuid())
|
PUID: int = Field(default=os.getuid())
|
||||||
PGID: int = Field(default=os.getgid())
|
PGID: int = Field(default=os.getgid())
|
||||||
|
|
||||||
|
PYTHON_ENCODING: str = Field(default=(sys.__stdout__ or sys.stdout or sys.__stderr__ or sys.stderr).encoding.upper().replace('UTF8', 'UTF-8'))
|
||||||
|
|
||||||
|
|
||||||
@model_validator(mode='after')
|
@model_validator(mode='after')
|
||||||
def validate_not_running_as_root(self):
|
def validate_not_running_as_root(self):
|
||||||
attempted_command = ' '.join(sys.argv[:3])
|
attempted_command = ' '.join(sys.argv[:3])
|
||||||
|
@ -52,6 +55,16 @@ class ShellConfig(BaseConfigSet):
|
||||||
print(f' docker exec -it --user=archivebox <container id> /bin/bash -c "archivebox {attempted_command}"', file=sys.stderr)
|
print(f' docker exec -it --user=archivebox <container id> /bin/bash -c "archivebox {attempted_command}"', file=sys.stderr)
|
||||||
raise SystemExit(2)
|
raise SystemExit(2)
|
||||||
|
|
||||||
|
# check python locale
|
||||||
|
if self.PYTHON_ENCODING != 'UTF-8':
|
||||||
|
print(f'[red][X] Your system is running python3 scripts with a bad locale setting: {self.PYTHON_ENCODING} (it should be UTF-8).[/red]', file=sys.stderr)
|
||||||
|
print(' To fix it, add the line "export PYTHONIOENCODING=UTF-8" to your ~/.bashrc file (without quotes)', file=sys.stderr)
|
||||||
|
print(' Or if you\'re using ubuntu/debian, run "dpkg-reconfigure locales"', file=sys.stderr)
|
||||||
|
print('')
|
||||||
|
print(' Confirm that it\'s fixed by opening a new shell and running:', file=sys.stderr)
|
||||||
|
print(' python3 -c "import sys; print(sys.stdout.encoding)" # should output UTF-8', file=sys.stderr)
|
||||||
|
raise SystemExit(2)
|
||||||
|
|
||||||
return self
|
return self
|
||||||
|
|
||||||
SHELL_CONFIG = ShellConfig()
|
SHELL_CONFIG = ShellConfig()
|
||||||
|
|
|
@ -38,6 +38,7 @@ def run(cmd, *args, input=None, capture_output=True, timeout=None, check=False,
|
||||||
pgid = None
|
pgid = None
|
||||||
try:
|
try:
|
||||||
if isinstance(cmd, (list, tuple)) and cmd[0].endswith('.py'):
|
if isinstance(cmd, (list, tuple)) and cmd[0].endswith('.py'):
|
||||||
|
PYTHON_BINARY = sys.executable
|
||||||
cmd = (PYTHON_BINARY, *cmd)
|
cmd = (PYTHON_BINARY, *cmd)
|
||||||
|
|
||||||
with Popen(cmd, *args, start_new_session=start_new_session, text=text, **kwargs) as process:
|
with Popen(cmd, *args, start_new_session=start_new_session, text=text, **kwargs) as process:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue