apps.py 3.9 KB

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