#!/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 = 'Опциональные аргументы'



# Форсированное применение
    parser.add_argument("--gp", help="Форсированное применение групповых политик с очисткой кэша и формированием нового pillar, может использоваться с ключами verbose и noupdate", action='store_true')
    parser.add_argument("--swp", help="Форсированное применение политик ПО с очисткой кэша и формированием нового pillar, может использоваться с ключами verbose и noupdate", action='store_true')
    parser.add_argument("--audit", help="Форсированное применение правил сбора событий", action='store_true')
    parser.add_argument("--verbose", help="Детальный вывод результата выполняемой команды", action='store_true')
    parser.add_argument("--noupdate", help="Применение команды без очистки кэша и формирования pillar", action='store_true')


# Работа с таймером заданий
    parser.add_argument("--gp_timer", help="Проверка таймера применения групповых политик", action='store_true')
    parser.add_argument("--swp_timer", help="Проверка таймера применения политик ПО", action='store_true')
    parser.add_argument("--audit_timer", help="Проверка таймера применения правил сбора событий", action='store_true')
    parser.add_argument("--user_session_timer", help="Проверка таймера очистки неактивных сессий", action='store_true')
    parser.add_argument("--client_update_timer", help="Проверка таймера применения политики обновлений клиентa ALD Pro", action='store_true')

# Просмотр pillar
    parser.add_argument("--gp_host_pillar", help="Просмотр pillar ГПО компьютера, требует указания FQDN компьютера (по умолчанию будет использован FQDN компьютера с которого запускается команда)", nargs='?', const=socket.gethostname())
    parser.add_argument("--gp_user_pillar", help="Просмотр pillar ГПО пользователя, требует указания имени пользователя")
    parser.add_argument("--swp_pillar", help="Просмотр pillar политик ПО", action='store_true')
    parser.add_argument("--audit_pillar", help="Просмотр pillar правил сбора событий", action='store_true')

# Обновление policy manager
    parser.add_argument("--pm","--policy_manager", help="Получить данные из ldap и обновить policy-manager", action='store_true')

    args = parser.parse_args()

    gp = args.gp
    swp = args.swp
    audit = args.audit

    gp_timer = args.gp_timer
    swp_timer = args.swp_timer
    audit_timer = args.audit_timer
    user_session_timer = args.user_session_timer
    client_update_timer = args.client_update_timer

    gp_host_pillar = args.gp_host_pillar
    gp_user_pillar = args.gp_user_pillar
    swp_pillar = args.swp_pillar
    audit_pillar = args.audit_pillar
    
    verbose = args.verbose
    noupdate = args.noupdate
    
    pm  = args.pm
    policy_manager = args.pm

    return gp, swp, audit, gp_timer, swp_timer, audit_timer, user_session_timer, client_update_timer, gp_host_pillar, gp_user_pillar, swp_pillar, audit_pillar, verbose, noupdate, pm, policy_manager


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():
    gp, swp, audit, gp_timer, swp_timer, audit_timer, user_session_timer, client_update_timer, gp_host_pillar, gp_user_pillar, swp_pillar, audit_pillar, verbose, noupdate, pm, policy_manager = parse_args()

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

    if gp == True and verbose == True and noupdate == True:
        print('Форсированное применение групповых политик')
        run_command_with_show_stdout(
            'aldpro-salt-call gp_sum.build_and_run_gp verbose=True')
    elif gp == True and noupdate == True:
        print('Форсированное применение групповых политик')
        run_command_with_show_stdout(
            'aldpro-salt-call gp_sum.build_and_run_gp')
    elif gp == True and verbose == True:
        print('Форсированное применение групповых политик')
        run_command_with_show_stdout(
            'aldpro-salt-call gp_sum.build_and_run_gp force=True verbose=True')
    elif gp == True:
        print('Форсированное применение групповых политик')
        run_command_with_show_stdout(
            'aldpro-salt-call gp_sum.build_and_run_gp force=True')
    
    if swp == True and verbose == True and noupdate == True:
        print('Форсированное применение политик ПО')
        run_command_with_show_stdout(
            'aldpro-salt-call swp_sum.build_and_run_swp verbose=True')
    elif swp == True and noupdate == True:
        print('Форсированное применение политик ПО')
        run_command_with_show_stdout(
            'aldpro-salt-call swp_sum.build_and_run_swp')
    elif swp == True and verbose == True:
        print('Форсированное применение политик ПО')
        run_command_with_show_stdout(
            'aldpro-salt-call swp_sum.build_and_run_swp force=True verbose=True')
    elif swp == True:
        print('Форсированное применение политик ПО')
        run_command_with_show_stdout(
            'aldpro-salt-call swp_sum.build_and_run_swp force=True')

    if audit == True:
        print('Форсированное применение правил сбора событий')
        run_command_with_show_stdout(
            'aldpro-salt-call state.apply policies.audit-policies queue=True') 

# Работа с таймером заданий 
    if gp_timer == True:
        print('Таймер заданий ГП')
        run_command_with_show_stdout(
            'aldpro-salt-call next_fire_time.get build_and_run_gp')
    if swp_timer == True:
        print('Таймер заданий политик ПО')
        run_command_with_show_stdout(
            'aldpro-salt-call next_fire_time.get build_and_run_swp')
    if audit_timer == True:
        print('Таймер заданий сбора событий')
        run_command_with_show_stdout(
            'aldpro-salt-call next_fire_time.get build_audit_role_pillar')
    if user_session_timer == True:
        print('Таймер заданий очистки неактивных сессий')
        run_command_with_show_stdout(
            'aldpro-salt-call next_fire_time.get purge_inactive_sessions')
    if client_update_timer == True:
        print('Таймер заданий обновлений клиентa  ALD Pro')
        run_command_with_show_stdout(
            'aldpro-salt-call next_fire_time.get update_policy') 

# Работа с pillar
    if gp_host_pillar != None:
        gp_host_pillar_command = 'aldpro-salt-call pillar.get aldpro-hosts:' + gp_host_pillar +''
        print('Просмотр pillar ГПO компьютера')
        run_command_with_show_stdout(
            gp_host_pillar_command) 
    if gp_user_pillar != None:
        gp_user_pillar_command = 'aldpro-salt-call pillar.get aldpro-users:'+ gp_user_pillar +''
        print('Просмотр pillar ГПO пользователя')
        run_command_with_show_stdout(
            gp_user_pillar_command)
    if swp_pillar == True:
        print('Просмотр pillar политик ПO')
        run_command_with_show_stdout(
            'aldpro-salt-call pillar.get aldpro-software')
    if audit_pillar == True:
        print('Просмотр pillar правил сбора событий')
        run_command_with_show_stdout(
            'aldpro-salt-call aldpro_subsystems.build_audit_role_pillar')

# Обновление policy manager

    if pm == True or policy_manager == True:
        print('Обновление policy manager')
        run_command_with_show_stdout(
            'aldpro-salt-call patch_gp.run_update')


if __name__ == '__main__':
    run()
