mirror of
https://github.com/esphome/esphome.git
synced 2024-11-10 01:07:45 +01:00
Dump full parsed config to json-config api call (#4373)
This commit is contained in:
parent
d4a8df04b8
commit
e847766514
3 changed files with 30 additions and 14 deletions
|
@ -339,7 +339,7 @@ def command_config(args, config):
|
||||||
_LOGGER.info("Configuration is valid!")
|
_LOGGER.info("Configuration is valid!")
|
||||||
if not CORE.verbose:
|
if not CORE.verbose:
|
||||||
config = strip_default_ids(config)
|
config = strip_default_ids(config)
|
||||||
safe_print(yaml_util.dump(config))
|
safe_print(yaml_util.dump(config, args.show_secrets))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
@ -665,6 +665,9 @@ def parse_args(argv):
|
||||||
parser_config.add_argument(
|
parser_config.add_argument(
|
||||||
"configuration", help="Your YAML configuration file(s).", nargs="+"
|
"configuration", help="Your YAML configuration file(s).", nargs="+"
|
||||||
)
|
)
|
||||||
|
parser_config.add_argument(
|
||||||
|
"--show-secrets", help="Show secrets in output.", action="store_true"
|
||||||
|
)
|
||||||
|
|
||||||
parser_compile = subparsers.add_parser(
|
parser_compile = subparsers.add_parser(
|
||||||
"compile", help="Read the configuration and compile a program."
|
"compile", help="Read the configuration and compile a program."
|
||||||
|
|
|
@ -25,10 +25,10 @@ import tornado.netutil
|
||||||
import tornado.process
|
import tornado.process
|
||||||
import tornado.web
|
import tornado.web
|
||||||
import tornado.websocket
|
import tornado.websocket
|
||||||
|
import yaml
|
||||||
from tornado.log import access_log
|
from tornado.log import access_log
|
||||||
|
|
||||||
from esphome import const, platformio_api, util, yaml_util
|
from esphome import const, platformio_api, util, yaml_util
|
||||||
from esphome.core import EsphomeError
|
|
||||||
from esphome.helpers import get_bool_env, mkdir_p, run_system_command
|
from esphome.helpers import get_bool_env, mkdir_p, run_system_command
|
||||||
from esphome.storage_json import (
|
from esphome.storage_json import (
|
||||||
EsphomeStorageJSON,
|
EsphomeStorageJSON,
|
||||||
|
@ -40,7 +40,7 @@ from esphome.storage_json import (
|
||||||
from esphome.util import get_serial_ports, shlex_quote
|
from esphome.util import get_serial_ports, shlex_quote
|
||||||
from esphome.zeroconf import DashboardImportDiscovery, DashboardStatus, EsphomeZeroconf
|
from esphome.zeroconf import DashboardImportDiscovery, DashboardStatus, EsphomeZeroconf
|
||||||
|
|
||||||
from .util import password_hash, friendly_name_slugify
|
from .util import friendly_name_slugify, password_hash
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -1021,6 +1021,14 @@ class SecretKeysRequestHandler(BaseHandler):
|
||||||
self.write(json.dumps(secret_keys))
|
self.write(json.dumps(secret_keys))
|
||||||
|
|
||||||
|
|
||||||
|
class SafeLoaderIgnoreUnknown(yaml.SafeLoader):
|
||||||
|
def ignore_unknown(self, node):
|
||||||
|
return f"{node.tag} {node.value}"
|
||||||
|
|
||||||
|
|
||||||
|
SafeLoaderIgnoreUnknown.add_constructor(None, SafeLoaderIgnoreUnknown.ignore_unknown)
|
||||||
|
|
||||||
|
|
||||||
class JsonConfigRequestHandler(BaseHandler):
|
class JsonConfigRequestHandler(BaseHandler):
|
||||||
@authenticated
|
@authenticated
|
||||||
@bind_config
|
@bind_config
|
||||||
|
@ -1030,16 +1038,18 @@ class JsonConfigRequestHandler(BaseHandler):
|
||||||
self.send_error(404)
|
self.send_error(404)
|
||||||
return
|
return
|
||||||
|
|
||||||
try:
|
args = ["esphome", "config", settings.rel_path(configuration), "--show-secrets"]
|
||||||
content = yaml_util.load_yaml(filename, clear_secrets=False)
|
|
||||||
json_content = json.dumps(
|
rc, stdout, _ = run_system_command(*args)
|
||||||
content, default=lambda o: {"__type": str(type(o)), "repr": repr(o)}
|
|
||||||
)
|
if rc != 0:
|
||||||
self.set_header("content-type", "application/json")
|
self.send_error(422)
|
||||||
self.write(json_content)
|
return
|
||||||
except EsphomeError as err:
|
|
||||||
_LOGGER.warning("Error translating file %s to JSON: %s", filename, err)
|
data = yaml.load(stdout, Loader=SafeLoaderIgnoreUnknown)
|
||||||
self.send_error(500)
|
self.set_header("content-type", "application/json")
|
||||||
|
self.write(json.dumps(data))
|
||||||
|
self.finish()
|
||||||
|
|
||||||
|
|
||||||
def get_base_frontend_path():
|
def get_base_frontend_path():
|
||||||
|
|
|
@ -390,8 +390,11 @@ def _load_yaml_internal(fname):
|
||||||
loader.dispose()
|
loader.dispose()
|
||||||
|
|
||||||
|
|
||||||
def dump(dict_):
|
def dump(dict_, show_secrets=False):
|
||||||
"""Dump YAML to a string and remove null."""
|
"""Dump YAML to a string and remove null."""
|
||||||
|
if show_secrets:
|
||||||
|
_SECRET_VALUES.clear()
|
||||||
|
_SECRET_CACHE.clear()
|
||||||
return yaml.dump(
|
return yaml.dump(
|
||||||
dict_, default_flow_style=False, allow_unicode=True, Dumper=ESPHomeDumper
|
dict_, default_flow_style=False, allow_unicode=True, Dumper=ESPHomeDumper
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue