apps.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. __package__ = 'archivebox.builtin_plugins.systempython'
  2. import os
  3. import sys
  4. import inspect
  5. from typing import List, Dict, Any, Callable, ClassVar
  6. from pathlib import Path
  7. import django
  8. from django.apps import AppConfig
  9. from django.core.checks import Tags, Warning, register
  10. from django.utils.functional import classproperty
  11. from django.db.backends.sqlite3.base import Database as sqlite3
  12. from django.core.checks import Tags, Error, register
  13. from pydantic import InstanceOf, Field
  14. from pydantic_pkgr import SemVer, BinProvider, BinProviderName, ProviderLookupDict, BinName, Binary, EnvProvider, NpmProvider
  15. from plugantic.base_plugin import BasePlugin, BaseConfigSet, BaseBinary, BaseBinProvider, BaseExtractor, BaseReplayer
  16. from plugantic.base_check import BaseCheck
  17. from pkg.settings import env, apt, brew
  18. from builtin_plugins.pip.apps import pip
  19. class PythonBinary(BaseBinary):
  20. name: BinName = 'python'
  21. binproviders_supported: List[InstanceOf[BinProvider]] = [pip, apt, brew, env]
  22. provider_overrides: Dict[BinProviderName, ProviderLookupDict] = {
  23. 'apt': {
  24. 'subdeps': \
  25. lambda: 'python3 python3-minimal python3-pip python3-virtualenv',
  26. 'abspath': \
  27. lambda: sys.executable,
  28. 'version': \
  29. lambda: '{}.{}.{}'.format(*sys.version_info[:3]),
  30. },
  31. }
  32. class SqliteBinary(BaseBinary):
  33. name: BinName = 'sqlite'
  34. binproviders_supported: List[InstanceOf[BaseBinProvider]] = Field(default=[pip])
  35. provider_overrides: Dict[BinProviderName, ProviderLookupDict] = {
  36. 'pip': {
  37. 'abspath': \
  38. lambda: Path(inspect.getfile(sqlite3)),
  39. 'version': \
  40. lambda: SemVer(sqlite3.version),
  41. },
  42. }
  43. class DjangoBinary(BaseBinary):
  44. name: BinName = 'django'
  45. binproviders_supported: List[InstanceOf[BaseBinProvider]] = Field(default=[pip])
  46. provider_overrides: Dict[BinProviderName, ProviderLookupDict] = {
  47. 'pip': {
  48. 'abspath': \
  49. lambda: inspect.getfile(django),
  50. 'version': \
  51. lambda: django.VERSION[:3],
  52. },
  53. }
  54. class BasicReplayer(BaseReplayer):
  55. name: str = 'basic'
  56. class CheckUserIsNotRoot(BaseCheck):
  57. label: str = 'CheckUserIsNotRoot'
  58. tag = Tags.database
  59. @staticmethod
  60. def check(settings, logger) -> List[Warning]:
  61. errors = []
  62. if getattr(settings, "USER", None) == 'root' or getattr(settings, "PUID", None) == 0:
  63. errors.append(
  64. Error(
  65. "Cannot run as root!",
  66. id="core.S001",
  67. hint=f'Run ArchiveBox as a non-root user with a UID greater than 500. (currently running as UID {os.getuid()}).',
  68. )
  69. )
  70. logger.debug('[√] UID is not root')
  71. return errors
  72. class SystemPythonPlugin(BasePlugin):
  73. name: str = 'builtin_plugins.systempython'
  74. app_label: str = 'systempython'
  75. verbose_name: str = 'System Python'
  76. configs: List[InstanceOf[BaseConfigSet]] = []
  77. binaries: List[InstanceOf[BaseBinary]] = [PythonBinary(), SqliteBinary(), DjangoBinary()]
  78. extractors: List[InstanceOf[BaseExtractor]] = []
  79. replayers: List[InstanceOf[BaseReplayer]] = [BasicReplayer()]
  80. checks: List[InstanceOf[BaseCheck]] = [CheckUserIsNotRoot()]
  81. PLUGIN = SystemPythonPlugin()
  82. DJANGO_APP = PLUGIN.AppConfig
  83. # CONFIGS = PLUGIN.configs
  84. # BINARIES = PLUGIN.binaries
  85. # EXTRACTORS = PLUGIN.extractors
  86. # REPLAYERS = PLUGIN.replayers
  87. # PARSERS = PLUGIN.parsers
  88. # DAEMONS = PLUGIN.daemons
  89. # MODELS = PLUGIN.models
  90. # CHECKS = PLUGIN.checks