#!/usr/bin/python3
# -*- coding:utf-8 -*-

import os, sys, getopt

sys.path.append("/usr/lib/python3.7/site-packages/security-switch")

from utils import print_err
from security_set import security_level_isvalid, security_level_set, security_level_get, get_valid_security_module_name

def usage():
	print_err("\n用法: %s [ --set LEVEL [ --no-resetpw | --rollback | --list MODULES ] | --get | --help ]\n\n"%sys.argv[0])
	print_err("--help          打印命令使用帮助信息 \n")
	print_err("--get           获取当前系统安全状态信息 \n")
	print_err("--set           将当前系统安全级别更改为LEVEL\n\n")
	print_err("--auto-resetpw  在切换安全级别时自动重置管理员密码，该选项仅在切换到三权分立时有效\n")
	print_err("--rollback      回退到上一次的用户自定义模式，该选项仅在切换到custom模式时有效\n")
	print_err("--list          需要添加的合法安全模块列表MODULES（安全模块名间用空格隔开），该选项仅在切换到custom模式时有效\n\n")
	print_err("LEVEL 可以是下面列表中的任意一个: \n")
	print_err("  default       启用执行控制\n")
	print_err("  strict        同时启用执行控制, SELinux 和三权分立\n")
	print_err("  custom        用户自定义模式，用户可以自由选择安全模块组合（建议由管理员使用）\n")
	module_name = get_valid_security_module_name()
	print_err("\nMODULES 合法模块名是：\n%s\n\n"%module_name)

def exit_with_code(ret):
	sys.exit(ret)


long_args=["set=", "get", "auto-resetpw", "help", "rollback", "list="]

OPERATION_GET = 0
OPERATION_SET = 1
OPERATION_HELP	    = 2
OPERATION_INVALID   = 3

ret = 0
auto_resetpw = False
rollback = False
mlist_check = False
module_list = []
op_type = OPERATION_INVALID
op_val = ""

try:
	opts, args = getopt.getopt(sys.argv[1:], [], long_args)
except getopt.GetoptError as e:
	print_err(str(e))
	usage()
	sys.exit(1)

if not len(opts):
	usage()
	sys.exit(1)

for opt, val in opts:
	if opt == "--set":
		if os.getuid() != 0:
			print_err("切换系统安全级别需要管理员权限!\n")
			sys.exit(1)

		if security_level_isvalid(val):
			op_type = OPERATION_SET
			op_val = val
		else:
			print_err("未知的安全级别: %s\n"%val)
			usage()
			exit_with_code(1)

	elif opt == "--get":
		if len(args):
			print_err("非法参数: %s\n"%(" ".join(args)))
			usage()
			exit_with_code(1)
		else:
			op_type = OPERATION_GET
	elif opt == "--auto-resetpw":
		auto_resetpw = True
	elif opt == "--rollback":
		rollback = True
	elif opt == "--list":
		module_list = val.split()
		mlist_check = True

	elif opt == "--help":
		op_type = OPERATION_HELP
	else:
		print_err("非法参数: %s\n"%opt)
		usage()
		exit_with_code(1)


if auto_resetpw and op_type != OPERATION_SET:
	print_err("非法参数\n")
	usage()
	exit_with_code(1)

if rollback or mlist_check:
	if op_type != OPERATION_SET or op_val != "custom":
		print_err("非法参数\n")
		usage()
		exit_with_code(1)
	elif mlist_check and not len(module_list):
		print_err("错误：请输入需要切换的安全模块列表！\n")
		module_name = get_valid_security_module_name()
		print_err("\nMODULES 合法模块有：\n%s\n\n"%module_name)
		exit_with_code(1)

if op_val == "custom" and not rollback and not mlist_check:
	print_err("参数错误\n")
	print_err("提示：设置自定义模式时需要选择参数'--rollback'或者'--list MODULES'\n")
	usage()
	exit_with_code(1)

if op_type == OPERATION_GET:
	security_level_get()
elif op_type == OPERATION_SET:
	if security_level_set(op_val, auto_resetpw, rollback, module_list):
		print("系统安全级别切换成功，请立即重启系统生效!!!\n")
	else:
		print_err("切换系统安全级别时出错\n")
elif op_type == OPERATION_HELP:
	usage()
else:
	print_err("未知的操作类型\n")
	usage()
	exit_with_code(1)

