#!/usr/bin/python
# -*- coding: UTF-8 -*-

import json
import argparse
import os
import re
import sys
import subprocess

ROOTFLAG_FILE_PATH='/OSM/conf/unroot_flag'

cmd_list_all = ['ls', 'getfacl', 'chmodrecover', 'chownrecover', 'setfaclrecover', 'start', 'stop', 'filerecover', 'du']

#文件和目录，增加后，支持使用ls和getfacl命令查询文件的大小和权限
cmd_list_query = [
    '/OSM/data/omm/pms/',
    '/OSM/data/omm/pms/data',
    '/OSM/data/omm/pms/export',
    '/OSM/data/omm/pms/data/historyFile',
    '/OSM/data/omm/pms/data/PerfData',
    '/OSM/coffer_log/log/pms/logs',
    '/OSM/coffer_data/omm/export_import',
    '/OSM/coffer_data/omm/export_import/chs',
    '/OSM/coffer_data/omm/perf',
    '/etc/passwd',
    '/etc/group',
    '/etc/shadow',
    '/startup_disk/conf/conf_local/kmcm_primary_file.dat',
    '/startup_disk/conf/conf_local/kmcm_standby_file.dat'
]

#文件和目录，增加后，支持使用du命令查询目录占用空间
cmd_list_du = [
    '/OSM/data/omm/pms/data',
    '/OSM/data/omm/pms/export',
    '/OSM/data/omm/pms/data/historyFile',
    '/OSM/data/omm/pms/data/PerfData',
    '/OSM/coffer_log/log/pms/logs',
    '/OSM/coffer_data/omm/export_import',
    '/OSM/coffer_data/omm/perf',
    '/OSM/coffer_data/omm/export_import/chs'
]

#文件和目录，增加后，支持使用chmod命令修改文件的权限
#'path':表示目录或者文件路径
#'nootPermit':表示root环境下将会被修改的权限
#'nootExeUser':表示root环境使用哪个用户的权限去执行chmod
#'unRootPermit':表示非root环境下将会被修改的权限
#'unRootExeUser':表示root环境使用哪个用户的权限去执行chmod
cmd_list_chmod = [
    {'path':'/ISM/agent/snmp/conf', 'nootPermit':'750', 'nootExeUser':'daemon', 'unRootPermit':'750', 'unRootExeUser':'daemon'},
    {'path':'/ISM/agent/snmp/conf/snmpagent', 'nootPermit':'750', 'nootExeUser':'daemon', 'unRootPermit':'750', 'unRootExeUser':'daemon'},
    {'path':'/ISM/snmp/snmpServerDaemon.sh', 'nootPermit':'550', 'nootExeUser':'root', 'unRootPermit':'550', 'unRootExeUser':'root'},
    {'path':'/ISM/snmp/snmp_manage_ip.sh', 'nootPermit':'550', 'nootExeUser':'root', 'unRootPermit':'550', 'unRootExeUser':'root'},
    {'path':'/ISM/snmp/snmp_monitor.sh', 'nootPermit':'550', 'nootExeUser':'root', 'unRootPermit':'550', 'unRootExeUser':'root'},
    {'path':'/ISM/snmp/snmpagent.sh', 'nootPermit':'550', 'nootExeUser':'root', 'unRootPermit':'550', 'unRootExeUser':'root'},
    {'path':'/ISM/snmp/start_agent.sh', 'nootPermit':'550', 'nootExeUser':'root', 'unRootPermit':'550', 'unRootExeUser':'root'},
    {'path':'/ISM/snmp/start_snmpagent.sh', 'nootPermit':'550', 'nootExeUser':'root', 'unRootPermit':'550', 'unRootExeUser':'root'},
    {'path':'/ISM/snmp/stop_agent.sh', 'nootPermit':'550', 'nootExeUser':'root', 'unRootPermit':'550', 'unRootExeUser':'root'},
    {'path':'/ISM/snmp/stop_snmpagent.sh', 'nootPermit':'550', 'nootExeUser':'root', 'unRootPermit':'550', 'unRootExeUser':'root'},
    {'path':'/OSM/data/omm/pms', 'nootPermit':'750', 'nootExeUser':'root', 'unRootPermit':'750', 'unRootExeUser':'OceanStorOAMUser'},
    {'path':'/OSM/data/omm/pms/export', 'nootPermit':'750', 'nootExeUser':'root', 'unRootPermit':'750', 'unRootExeUser':'OceanStorOAMUser'},
    {'path':'/OSM/data/omm/pms/data', 'nootPermit':'750', 'nootExeUser':'root', 'unRootPermit':'750', 'unRootExeUser':'OceanStorOAMUser'},
    {'path':'/OSM/data/omm/pms/data/PerfData', 'nootPermit':'750', 'nootExeUser':'root', 'unRootPermit':'750', 'unRootExeUser':'OceanStorOAMUser'},
    {'path':'/OSM/data/omm/pms/data/abnormal', 'nootPermit':'750', 'nootExeUser':'root', 'unRootPermit':'750', 'unRootExeUser':'OceanStorOAMUser'},
    {'path':'/OSM/data/omm/pms/data/historyFile', 'nootPermit':'750', 'nootExeUser':'root', 'unRootPermit':'750', 'unRootExeUser':'OceanStorOAMUser'},
    {'path':'/OSM/data/omm/pms/data/temp', 'nootPermit':'750', 'nootExeUser':'root', 'unRootPermit':'750', 'unRootExeUser':'OceanStorOAMUser'},
    {'path':'/OSM/data/omm/pms/data/tempPath', 'nootPermit':'750', 'nootExeUser':'root', 'unRootPermit':'750', 'unRootExeUser':'OceanStorOAMUser'},
    {'path':'/OSM/script/oam_pms.sh', 'nootPermit':'550', 'nootExeUser':'root', 'unRootPermit':'550', 'unRootExeUser':'root'},
    {'path':'/OSM/script/pms_repair.sh', 'nootPermit':'550', 'nootExeUser':'root', 'unRootPermit':'550', 'unRootExeUser':'root'},
    {'path':'/OSM/script/pms_common.sh', 'nootPermit':'550', 'nootExeUser':'root', 'unRootPermit':'550', 'unRootExeUser':'root'},
    {'path':'/OSM/script/pmslun.sh', 'nootPermit':'550', 'nootExeUser':'root', 'unRootPermit':'550', 'unRootExeUser':'root'},
    {'path':'/OSM/coffer_data/omm/export_import', 'nootPermit':'775', 'nootExeUser':'root', 'unRootPermit':'750', 'unRootExeUser':'root'},
    {'path':'/OSM/coffer_data/omm/perf', 'nootPermit':'750', 'nootExeUser':'root', 'unRootPermit':'750', 'unRootExeUser':'root'},
    {'path':'/OSM/conf/disk_auth/current_cert/', 'nootPermit':'700', 'nootExeUser':'root', 'unRootPermit':'750', 'unRootExeUser':'root'},
    {'path':'/OSM/conf/disk_auth/default_cert/', 'nootPermit':'700', 'nootExeUser':'root', 'unRootPermit':'750', 'unRootExeUser':'root'},
    {'path':'/startup_disk/conf/conf_local/disk_auth/current_cert/', 'nootPermit':'700', 'nootExeUser':'root', 'unRootPermit':'750', 'unRootExeUser':'root'},
    {'path':'/startup_disk/conf/conf_local/disk_auth/', 'nootPermit':'700', 'nootExeUser':'root', 'unRootPermit':'750', 'unRootExeUser':'root'},
    {'path':'/OSM/conf/disk_auth/current_cert/26_Default_CACert.crt', 'nootPermit':'600', 'nootExeUser':'root', 'unRootPermit':'640', 'unRootExeUser':'root'},
    {'path':'/OSM/conf/disk_auth/default_cert/HDA_DefaultCACert.crt', 'nootPermit':'600', 'nootExeUser':'root', 'unRootPermit':'640', 'unRootExeUser':'root'},
    {'path':'/startup_disk/conf/conf_local/disk_auth/current_cert/26_Default_CACert.crt', 'nootPermit':'600', 'nootExeUser':'root', 'unRootPermit':'640', 'unRootExeUser':'root'}
]

#文件和目录，增加后，支持使用chown命令修改文件的权限
#'path':表示目录或者文件路径
#'nootPermit':表示root环境下将会被修改的权限
#'nootExeUser':表示root环境使用哪个用户的权限去执行chown
#'unRootPermit':表示非root环境下将会被修改的权限
#'unRootExeUser':表示root环境使用哪个用户的权限去执行chown
cmd_list_chown = [
    {'path':'/ISM/agent/snmp/conf', 'nootPermit':'daemon:daemon', 'nootExeUser':'root', 'unRootPermit':'daemon:daemon', 'unRootExeUser':'root'},
    {'path':'/ISM/agent/snmp/conf/snmpagent', 'nootPermit':'daemon:daemon', 'nootExeUser':'root', 'unRootPermit':'daemon:daemon', 'unRootExeUser':'root'},
    {'path':'/ISM/snmp/snmpServerDaemon.sh', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'root:root', 'unRootExeUser':'root'},
    {'path':'/ISM/snmp/snmp_manage_ip.sh', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'root:root', 'unRootExeUser':'root'},
    {'path':'/ISM/snmp/snmp_monitor.sh', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'root:root', 'unRootExeUser':'root'},
    {'path':'/ISM/snmp/snmpagent.sh', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'root:root', 'unRootExeUser':'root'},
    {'path':'/ISM/snmp/start_agent.sh', 'nootPermit':'root:daemon', 'nootExeUser':'root', 'unRootPermit':'root:daemon', 'unRootExeUser':'root'},
    {'path':'/ISM/snmp/start_snmpagent.sh', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'root:root', 'unRootExeUser':'root'},
    {'path':'/ISM/snmp/stop_agent.sh', 'nootPermit':'root:daemon', 'nootExeUser':'root', 'unRootPermit':'root:daemon', 'unRootExeUser':'root'},
    {'path':'/ISM/snmp/stop_snmpagent.sh', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'root:root', 'unRootExeUser':'root'},
    {'path':'/OSM/data/omm/pms', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'OceanStorOAMUser:OceanStorCommonGroup', 'unRootExeUser':'root'},
    {'path':'/OSM/data/omm/pms/export', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'OceanStorOAMUser:OceanStorCommonGroup', 'unRootExeUser':'root'},
    {'path':'/OSM/data/omm/pms/data', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'OceanStorOAMUser:OceanStorOAMGroup', 'unRootExeUser':'root'},
    {'path':'/OSM/data/omm/pms/data/PerfData', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'OceanStorOAMUser:OceanStorOAMGroup', 'unRootExeUser':'root'},
    {'path':'/OSM/coffer_bin/jre', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'root:OceanStorOAMGroup', 'unRootExeUser':'root'},
    {'path':'/OSM/coffer_bin/pmsdata', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'OceanStorOAMUser:OceanStorOAMGroup', 'unRootExeUser':'root'},
    {'path':'/OSM/coffer_bin/pms', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'root:OceanStorOAMGroup', 'unRootExeUser':'root'},
    {'path':'/OSM/script/oam_pms.sh', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'root:OceanStorCommonGroup', 'unRootExeUser':'root'},
    {'path':'/OSM/script/pms_repair.sh', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'root:OceanStorCommonGroup', 'unRootExeUser':'root'},
    {'path':'/OSM/script/pms_common.sh', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'root:OceanStorCommonGroup', 'unRootExeUser':'root'},
    {'path':'/OSM/script/pmslun.sh', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'root:OceanStorCommonGroup', 'unRootExeUser':'root'},
    {'path':'/OSM/coffer_data/omm/export_import', 'nootPermit':'root:UTOPUSERS', 'nootExeUser':'root', 'unRootPermit':'root:OceanStorOAMGroup', 'unRootExeUser':'root'},
    {'path':'/OSM/coffer_data/omm/perf', 'nootPermit':'root:UTOPUSERS', 'nootExeUser':'root', 'unRootPermit':'OceanStorOAMUser:OceanStorCommonGroup', 'unRootExeUser':'root'},
    {'path':'/OSM/conf/disk_auth/current_cert/', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'root:OceanStorCommonGroup', 'unRootExeUser':'root'},
    {'path':'/OSM/conf/disk_auth/default_cert/', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'root:OceanStorCommonGroup', 'unRootExeUser':'root'},
    {'path':'/startup_disk/conf/conf_local/disk_auth/current_cert/', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'root:root', 'unRootExeUser':'root'},
    {'path':'/startup_disk/conf/conf_local/disk_auth/', 'nootPermit':'root:root', 'nootExeUser':'root', 'unRootPermit':'root:root', 'unRootExeUser':'root'}
]

#文件和目录，增加后，支持使用setfacl命令修改文件的权限
#'path':表示目录或者文件路径
#'nootPermit':表示root环境下将会被修改的权限
#'nootExeUser':表示root环境使用哪个用户的权限去执行setfacl
#'unRootPermit':表示非root环境下将会被修改的权限
#'unRootExeUser':表示root环境使用哪个用户的权限去执行setfacl
cmd_list_setfacl = [
    {'path':'/OSM/coffer_data/omm/export_import', 'nootPermit':'-b', 'nootExeUser':'root', 'unRootPermit':'u:ibc_os_hs:rwx', 'unRootExeUser':'root'},
    {'path':'/OSM/coffer_data/omm/export_import', 'nootPermit':'-b', 'nootExeUser':'root', 'unRootPermit':'u:OceanStorApp_dataUser:rwx', 'unRootExeUser':'root'},
    {'path':'/OSM/coffer_data/omm/export_import', 'nootPermit':'-b', 'nootExeUser':'root', 'unRootPermit':'u:OceanStorOAMUser:rwx', 'unRootExeUser':'root'},
    {'path':'/OSM/coffer_data/omm/export_import', 'nootPermit':'-b', 'nootExeUser':'root', 'unRootPermit':'u:OceanStorInfraUser:rwx', 'unRootExeUser':'root'},
    {'path':'/OSM/coffer_data/omm/export_import', 'nootPermit':'-b', 'nootExeUser':'root', 'unRootPermit':'u:OceanStorMgrUser:rwx', 'unRootExeUser':'root'},
    {'path':'/OSM/conf/disk_auth/current_cert/', 'nootPermit':'-b', 'nootExeUser':'root', 'unRootPermit':'u:OceanStorApp_dataUser:r-x', 'unRootExeUser':'root'},
    {'path':'/OSM/conf/disk_auth/default_cert/', 'nootPermit':'-b', 'nootExeUser':'root', 'unRootPermit':'u:OceanStorApp_dataUser:r-x', 'unRootExeUser':'root'},
    {'path':'/startup_disk/conf/conf_local/disk_auth/current_cert/', 'nootPermit':'-b', 'nootExeUser':'root', 'unRootPermit':'u:OceanStorApp_dataUser:r-x', 'unRootExeUser':'root'},
    {'path':'/startup_disk/conf/conf_local/disk_auth/', 'nootPermit':'-b', 'nootExeUser':'root', 'unRootPermit':'u:OceanStorApp_dataUser:r-x', 'unRootExeUser':'root'},
    {'path':'/OSM/conf/disk_auth/current_cert/26_Default_CACert.crt', 'nootPermit':'-b', 'nootExeUser':'root', 'unRootPermit':'u:OceanStorApp_dataUser:r--', 'unRootExeUser':'root'},
    {'path':'/OSM/conf/disk_auth/default_cert/HDA_DefaultCACert.crt', 'nootPermit':'-b', 'nootExeUser':'root', 'unRootPermit':'u:OceanStorApp_dataUser:r--', 'unRootExeUser':'root'},
    {'path':'/startup_disk/conf/conf_local/disk_auth/current_cert/26_Default_CACert.crt', 'nootPermit':'-b', 'nootExeUser':'root', 'unRootPermit':'u:OceanStorApp_dataUser:r--', 'unRootExeUser':'root'}
]

#文件和目录，增加后，支持停止或者拉起进程的监控
#'process':进程名
#'start':拉起进程的方式
#'stop':停止进程的方式
cmd_list_process = [
    {'process':'alarm', "start":'sh snm.sh -s /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/alarm_snm_config.xml', 'stop':'sh snm.sh -t /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/alarm_snm_config.xml'},
    {'process':'eagent', "start":'sh snm.sh -s /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/eagent_snm_config.xml', 'stop':'sh snm.sh -t /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/eagent_snm_config.xml'},
    {'process':'info_collector', "start":'sh snm.sh -s /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/info_collector_snm_config.xml', 'stop':'sh snm.sh -t /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/info_collector_snm_config.xml'},
    {'process':'msg_server', "start":'sh snm.sh -s /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm_infra/conf/snm_config/msg_server_snm_config.xml', 'stop':'sh snm.sh -t /OSM/component/omm_infra/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/msg_server_snm_config.xml'},
    {'process':'omsync', "start":'sh snm.sh -s /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/omsync_snm_config.xml', 'stop':'sh snm.sh -t /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/omsync_snm_config.xml'},
    {'process':'perf', "start":'sh snm.sh -s /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/perf_snm_config.xml', 'stop':'sh snm.sh -t /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/perf_snm_config.xml'},
    {'process':'aa', "start":'sh snm.sh -s /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/aa_snm_config.xml', 'stop':'sh snm.sh -t /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/aa_snm_config.xml'},
    {'process':'sa', "start":'sh snm.sh -s /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/sa_snm_config.xml', 'stop':'sh snm.sh -t /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/sa_snm_config.xml'},
    {'process':'omales', "start":'sh snm.sh -s /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/omales_snm_config.xml', 'stop':'sh snm.sh -t /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/omales_snm_config.xml'},
    {'process':'kmms', "start":'sh snm.sh -s /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/kmms_snm_config.xml', 'stop':'sh snm.sh -t /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/kmms_snm_config.xml'},
    {'process':'kmm_server', "start":'sh snm.sh -s /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/kmm_server_snm_config.xml', 'stop':'sh snm.sh -t /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/kmm_server_snm_config.xml'},
    {'process':'smartgui', "start":'sudo /OSM/script/smartgui/start_smart_gui.sh', 'stop':'sudo /OSM/script/smartgui/stop_smart_gui.sh'},
    {'process':'omtask', "start":'sudo sh /OSM/script/omtask/start_omtask.sh', 'stop':'sudo sh /OSM/script/omtask/stop_omtask.sh'},
    {'process':'oam_diagnose', "start":'sh /OSM/script/omm_task_start.sh /OSM/component/omm/bin/oam_diagnose', "stop":'daemon -s /OSM/component/omm/bin/oam_diagnose'}
]

#文件和目录，增加后，支持停止或者拉起进程的监控
#'src':需要被恢复的文件
#'dst':使用该文件恢复目标文件
#'nootExeUser':表示root环境使用哪个用户的权限去执行cp
#'unRootExeUser':表示root环境使用哪个用户的权限去执行cp
file_recover_list = [
    {'src':'/etc/passwd', 'dst':'/etc/passwd_default', 'nootExeUser':'root', 'unRootExeUser':'root'},
    {'src':'/etc/passwd', 'dst':'/startup_disk/conf/conf_local/passwd', 'nootExeUser':'root', 'unRootExeUser':'root'},
    {'src':'/etc/passwd', 'dst':'/startup_disk/conf/conf_local/passwd.bak', 'nootExeUser':'root', 'unRootExeUser':'root'},
    {'src':'/etc/group', 'dst':'/etc/group_default', 'nootExeUser':'root', 'unRootExeUser':'root'},
    {'src':'/etc/group', 'dst':'/startup_disk/conf/conf_local/group', 'nootExeUser':'root', 'unRootExeUser':'root'},
    {'src':'/etc/group', 'dst':'/startup_disk/conf/conf_local/group.bak', 'nootExeUser':'root', 'unRootExeUser':'root'},
    {'src':'/etc/shadow', 'dst':'/etc/shadow_default', 'nootExeUser':'root', 'unRootExeUser':'root'},
    {'src':'/etc/shadow', 'dst':'/startup_disk/conf/conf_local/shadow', 'nootExeUser':'root', 'unRootExeUser':'root'},
    {'src':'/etc/shadow', 'dst':'/startup_disk/conf/conf_local/shadow.bak', 'nootExeUser':'root', 'unRootExeUser':'root'}
]

path_prefix_white_list = [
'/OSM/log/',
'/OSM/coffer_log/',
'/OSM/coffer_data/ftds/',
'/OSM/coffer_data/fault_disklog/',
'/OSM/update/',
'/OSM/coffer_data/omm/export_import/',
'/OSM/coffer_data/omm/perf/',
'/OSM/coffer_data/dha/',
'/OSM/coffer_data/update/',
'/home/permitdir/',
'/OSM/data/omm/pms/data/'
]

def check_root_flag():
    return os.path.exists(ROOTFLAG_FILE_PATH)

def get_exe_permit(cmdlist, cmdType, param):
    for cmd in cmdlist:
        realpath = os.path.realpath(cmd['path'])
        if realpath == param:
            cmdStr = None
            if check_root_flag() == False:
                cmdStr = 'sudo -u ' + cmd['nootExeUser'] + ' ' + cmdType +' ' + cmd['nootPermit'] + ' ' + realpath
            else:
                cmdStr = 'sudo -u ' + cmd['unRootExeUser'] + ' ' + cmdType + ' ' + cmd['unRootPermit'] + ' ' + realpath
            return cmdStr
    print('Invalid realpath "%s".' %(param))
    return None

def get_exe_snm(cmd_type, param):
    for cmd in cmd_list_process:
        if cmd['process'] == param:
           return cmd[cmd_type]
    
    print('Invalid param "%s".' %(param))
    return None

def get_exe_query(cmd, cmd_list, param):
    for filePath in cmd_list:
        realpath = os.path.realpath(filePath)
        if realpath == param:
           return cmd + ' ' + param
    
    print('Invalid realpath "%s".' %(param))
    return None

def get_exe_getfacl(param):
    return get_exe_query('getfacl', cmd_list_query, param)

def get_exe_ls(param):
    return get_exe_query('ls -l', cmd_list_query, param)
    
def get_exe_du(param):
    return get_exe_query('du -sh', cmd_list_du, param)

def get_exe_chmodrecover(param):
    return get_exe_permit(cmd_list_chmod, 'chmod', param)

def get_exe_chownrecover(param):
    return get_exe_permit(cmd_list_chown, 'chown -h', param)
    
def get_exe_setfaclrecover(param):
    return get_exe_permit(cmd_list_setfacl, 'setfacl -m', param)

def get_exe_filerecover(param):
    for filePath in file_recover_list:
        realpath = os.path.realpath(filePath['dst'])
        if realpath == param:
            cmdStr = None
            if check_root_flag() == False:
                cmdStr = 'sudo -u ' + filePath['nootExeUser'] + ' cp ' + filePath['dst'] + ' ' + filePath['src']
            else:
                cmdStr = 'sudo -u ' + filePath['unRootExeUser'] + ' cp ' + filePath['dst'] + ' ' + filePath['src']
            return cmdStr
    
    print('Invalid realpath "%s".' %(param))
    return None

def get_exe_start(param):
    return get_exe_snm('start', param)
    
def get_exe_stop(param):
    return get_exe_snm('stop', param)
    
def get_exe_Cmd(cmdType, param):
    strCheckFun = 'get_exe_' + cmdType
    checkFun = eval(strCheckFun)
    cmd = checkFun(param)
    return cmd

def exe_sub_cmd(cmd, param):
    for subCmd in cmd_list_all:
        if cmd == subCmd: 
            cmdStr = get_exe_Cmd(subCmd, ' '.join(param))
            if cmdStr == None:
                print('Failed to excute "%s %s".' %(cmd, ' '.join(param)))
                sys.exit(1)
            sub_cmd_split = cmdStr.split()
            ret = subprocess.call(sub_cmd_split, shell=False)
            if ret == 0:
                print('Success in excuting "%s %s".' %(cmd, ' '.join(param)))
            else:
                print('Failed to excute "%s %s", error code is %d.' %(cmd, ' '.join(param), ret))
            sys.exit(ret)

def is_path_valid(cmd, paras):
    if 'path_fields' in cmd:
        for field_id in cmd['path_fields'].split():
            realpath = os.path.realpath(paras[int(field_id)])
            if realpath != paras[int(field_id)]:
                for path_prefix in path_prefix_white_list:
                    if realpath.startswith(path_prefix):
                        return True
                print('Invalid realpath "%s".' %(realpath))
                return False
    return True

CMDS_FILE = '/OSM/conf/maintain_cmds.json'

with open(CMDS_FILE, 'r') as f:
    cmd_list = json.load(f)

cmd_name_list=[]
for cmd in cmd_list:
    cmd_name_list.append(json.dumps(cmd['cmd']).strip('"'))

parser = argparse.ArgumentParser()
parser.add_argument("-c", "--command", help="Legal Commands", choices=cmd_name_list)
parser.add_argument("-p", "--parameters", nargs=argparse.REMAINDER, help="Legal Parameters")

args = parser.parse_args()
if args.parameters is None:
    args.parameters = ""

try:
    command = args.command + ' ' + ' '.join(args.parameters)
except:
    parser.print_help()
    sys.exit(1)

for cmd in cmd_list:
    if json.dumps(cmd['cmd']).strip('"') == args.command:
        if re.match(json.dumps(cmd['regex']).strip('"').replace('\\\\', '\\'), command):
        
            exe_sub_cmd(args.command, args.parameters)
            
            if not is_path_valid(cmd, ' '.join(args.parameters).split()):
                sys.exit(1)

            cmd_split = command.split()
            if cmd_split[0] == "grep":
                cmd_split[1] = cmd_split[1].strip("'")

            ret = subprocess.call(cmd_split, shell=False)
            if ret == 0:
                print('Success in excuting "%s".' %(command))
            else:
                print('Failed to excute "%s", error code is %d.' %(command, ret))
        else:
            print('Parameters is illegal, the legal parameters should match the regex: ' + cmd['regex'])
