diff options
| author | Daniil Baturin <daniil@baturin.org> | 2019-09-01 06:19:31 +0700 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-09-01 06:19:31 +0700 | 
| commit | 3075c019effb570b595bc2acc2d33cf5f55b6675 (patch) | |
| tree | 05d26dfd75a8e0b618980838b229ca14223ed5a2 /src | |
| parent | 0e032f5df4f567195abc7562e8cf6b1164eeec7b (diff) | |
| parent | 86d1291ec5323e921a0f995211e223bf1f7dcdff (diff) | |
| download | vyos-1x-3075c019effb570b595bc2acc2d33cf5f55b6675.tar.gz vyos-1x-3075c019effb570b595bc2acc2d33cf5f55b6675.zip  | |
Merge pull request #123 from jestabro/current
[boot-config-loader] T1622: Add failsafe and back trace
Diffstat (limited to 'src')
| -rwxr-xr-x | src/helpers/vyos-boot-config-loader.py | 101 | 
1 files changed, 101 insertions, 0 deletions
diff --git a/src/helpers/vyos-boot-config-loader.py b/src/helpers/vyos-boot-config-loader.py new file mode 100755 index 000000000..06c95765f --- /dev/null +++ b/src/helpers/vyos-boot-config-loader.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2019 VyOS maintainers and contributors +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 or later as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program.  If not, see <http://www.gnu.org/licenses/>. +# +# + +import os +import sys +import subprocess +import traceback + +from vyos.configsession import ConfigSession, ConfigSessionError +from vyos.configtree import ConfigTree + +STATUS_FILE = '/tmp/vyos-config-status' +TRACE_FILE = '/tmp/boot-config-trace' + +session = ConfigSession(os.getpid(), 'vyos-boot-config-loader') +env = session.get_session_env() + +default_file_name = env['vyatta_sysconfdir'] + '/config.boot.default' + +if len(sys.argv) < 1: +    print("Must be called with argument.") +    sys.exit(1) +else: +    file_name = sys.argv[1] + +def write_config_status(status): +    with open(STATUS_FILE, 'w') as f: +        f.write('{0}\n'.format(status)) + +def trace_to_file(trace_file_name): +    with open(trace_file_name, 'w') as trace_file: +        traceback.print_exc(file=trace_file) + +def failsafe(): +    try: +        with open(default_file_name, 'r') as f: +            config_file = f.read() +    except Exception as e: +        print("Catastrophic: no default config file " +              "'{0}'".format(default_file_name)) +        sys.exit(1) + +    config = ConfigTree(config_file) +    if not config.exists(['system', 'login', 'user', 'vyos', +                          'authentication', 'encrypted-password']): +        print("No password entry in default config file;") +        print("unable to recover password for user 'vyos'.") +        sys.exit(1) +    else: +        passwd = config.return_value(['system', 'login', 'user', 'vyos', +                                      'authentication', +                                      'encrypted-password']) + +    cmd = ("useradd -s /bin/bash -G 'users,sudo' -m -N -p '{0}' " +           "vyos".format(passwd)) +    try: +        subprocess.check_call(cmd, shell=True) +    except subprocess.CalledProcessError as e: +        sys.exit("{0}".format(e)) + +    with open('/etc/motd', 'a+') as f: +        f.write('\n\n') +        f.write('!!!!!\n') +        f.write('There were errors loading the initial configuration;\n') +        f.write('please examine the errors in {0} and correct.' +                '\n'.format(TRACE_FILE)) +        f.write('!!!!!\n\n') + +try: +    with open(file_name, 'r') as f: +        config_file = f.read() +except Exception as e: +    write_config_status(1) +    failsafe() +    trace_to_file(TRACE_FILE) +    sys.exit("{0}".format(e)) + +try: +    session.load_config(file_name) +    session.commit() +    write_config_status(0) +except ConfigSessionError as e: +    write_config_status(1) +    failsafe() +    trace_to_file(TRACE_FILE) +    sys.exit(1)  | 
