#!/usr/bin/env python3
import argparse
import json
import os.path
import shlex
import subprocess
import time
from pkg_resources import parse_version
import socket


def parse_args():
    parser = argparse.ArgumentParser(add_help=False, description='Работа с политиками ALD Pro')
    parser.add_argument('-v', '--version', action='version',
                    version='%(prog)s 1.0', help="Показать версию программы")
    parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS,
                    help='Показать справку')
    parser._optionals.title = 'Опциональные аргументы'

    group = parser.add_mutually_exclusive_group(required=True)

    group.add_argument("--iud", help="Форсирование установки, обновления или удаления подсистем, можно использовать с ключом action", action='store_true')
    parser.add_argument("--action", help="Дополнительный ключ, для переопределения pillar action", choices=['install', 'update', 'remove'])
    group.add_argument("--subsystem_settings", help="Форсирование применения параметров подсистем, требует указания имени подсистемы", choices=['cups', 'dhcp', 'smb', 'os', 'repo', 'audit'])

    args = parser.parse_args()

    iud = args.iud
    subsystem_settings = args.subsystem_settings
    action = args.action

    return iud, subsystem_settings, action


def run_command_with_show_stdout(command):
    quoted_cmd = shlex.quote(command)
    retcode = subprocess.call(shlex.split(quoted_cmd), shell=True)
    if retcode != 0:
        raise Exception('Произошла ошибка. Пожалуйста, попробуйте выполнить команду повторно. \n')

def run():
    iud, subsystem_settings, action = parse_args()

# Форсированное применение политик

    if iud == True:
        print('Форсированная установка/обновление/удаление подсистемы')
    if iud == True and action == None:
        run_command_with_show_stdout(
            'aldpro-salt-call state.apply utils.build_deploy_pillar queue=True --log-file=/var/log/aldpro-salt/subsystem.log')
        time.sleep(30)
        run_command_with_show_stdout(
            'aldpro-salt-call state.apply orch.subsystem queue=True --log-file=/var/log/aldpro-salt/subsystem.log --state-output=terse --state-verbose=False')
    elif iud == True and action != None:
        run_command_with_show_stdout(
            'aldpro-salt-call state.apply utils.build_deploy_pillar queue=True pillar=\'{"aldpro_deploy_data":{"action":"'+ action +'","force":true}}\' --log-file=/var/log/aldpro-salt/subsystem.log')
        time.sleep(30)
        run_command_with_show_stdout(
            'aldpro-salt-call state.apply orch.subsystem queue=True pillar=\'{\"aldpro_deploy_data\":{\"action\":\"'+ action +'\"}}\' --log-file=/var/log/aldpro-salt/subsystem.log --state-output=terse --state-verbose=False')

    if subsystem_settings != None:
        print('Форсированное применение параметров подсистемы')
        subsystem_settings_command1 = 'aldpro-salt-call aldpro_subsystems.build_' + subsystem_settings + '_role_pillar --log-file=/var/log/aldpro-salt/subsystem.log'
        run_command_with_show_stdout(
            subsystem_settings_command1)
        subsystem_settings_command2 = 'aldpro-salt-call state.apply roles.' + subsystem_settings + ' queue=True --log-file=/var/log/aldpro-salt/subsystem.log'
        run_command_with_show_stdout(
            subsystem_settings_command2)


if __name__ == '__main__':
    run()