Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Home Assistant command line scripts."""
2 
3 from __future__ import annotations
4 
5 import argparse
6 import asyncio
7 from collections.abc import Sequence
8 import importlib
9 import logging
10 import os
11 import sys
12 
13 from homeassistant import runner
14 from homeassistant.bootstrap import async_mount_local_lib_path
15 from homeassistant.config import get_default_config_dir
16 from homeassistant.requirements import pip_kwargs
17 from homeassistant.util.package import install_package, is_installed, is_virtual_env
18 
19 # mypy: allow-untyped-defs, disallow-any-generics, no-warn-return-any
20 
21 
22 def run(args: list[str]) -> int:
23  """Run a script."""
24  scripts = []
25  path = os.path.dirname(__file__)
26  for fil in os.listdir(path):
27  if fil == "__pycache__":
28  continue
29 
30  if os.path.isdir(os.path.join(path, fil)):
31  scripts.append(fil)
32  elif fil != "__init__.py" and fil.endswith(".py"):
33  scripts.append(fil[:-3])
34 
35  if not args:
36  print("Please specify a script to run.")
37  print("Available scripts:", ", ".join(scripts))
38  return 1
39 
40  if args[0] not in scripts:
41  print("Invalid script specified.")
42  print("Available scripts:", ", ".join(scripts))
43  return 1
44 
45  script = importlib.import_module(f"homeassistant.scripts.{args[0]}")
46 
47  config_dir = extract_config_dir()
48 
49  loop = asyncio.get_event_loop()
50 
51  if not is_virtual_env():
52  loop.run_until_complete(async_mount_local_lib_path(config_dir))
53 
54  _pip_kwargs = pip_kwargs(config_dir)
55 
56  logging.basicConfig(stream=sys.stdout, level=logging.INFO)
57 
58  for req in getattr(script, "REQUIREMENTS", []):
59  if is_installed(req):
60  continue
61 
62  if not install_package(req, **_pip_kwargs):
63  print("Aborting script, could not install dependency", req)
64  return 1
65 
66  asyncio.set_event_loop_policy(runner.HassEventLoopPolicy(False))
67 
68  return script.run(args[1:])
69 
70 
71 def extract_config_dir(args: Sequence[str] | None = None) -> str:
72  """Extract the config dir from the arguments or get the default."""
73  parser = argparse.ArgumentParser(add_help=False)
74  parser.add_argument("-c", "--config", default=None)
75  parsed_args = parser.parse_known_args(args)[0]
76  return (
77  os.path.join(os.getcwd(), parsed_args.config)
78  if parsed_args.config
80  )
str async_mount_local_lib_path(str config_dir)
Definition: bootstrap.py:669
str get_default_config_dir()
Definition: config.py:135
dict[str, Any] pip_kwargs(str|None config_dir)
Definition: requirements.py:88
int run(list[str] args)
Definition: __init__.py:22
str extract_config_dir(Sequence[str]|None args=None)
Definition: __init__.py:71
bool is_installed(str requirement_str)
Definition: package.py:40
bool install_package(str package, bool upgrade=True, str|None target=None, str|None constraints=None, int|None timeout=None)
Definition: package.py:99