|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
import random
|
|
|
import os.path
|
|
|
import shutil
|
|
|
from paramiko import SSHException
|
|
|
from paramiko.rsakey import RSAKey
|
|
|
from jumpserver.api import mkdir
|
|
|
from uuid import uuid4
|
|
|
from jumpserver.api import CRYPTOR
|
|
|
from os import makedirs
|
|
|
|
|
|
from django.template.loader import get_template
|
|
|
from django.template import Context
|
|
|
from tempfile import NamedTemporaryFile
|
|
|
|
|
|
|
|
|
from jumpserver.settings import KEY_DIR
|
|
|
|
|
|
|
|
|
def get_rand_pass():
|
|
|
"""
|
|
|
get a reandom password.
|
|
|
"""
|
|
|
CRYPTOR.gen_rand_pass(20)
|
|
|
|
|
|
|
|
|
def updates_dict(*args):
|
|
|
"""
|
|
|
surport update multi dict
|
|
|
"""
|
|
|
result = {}
|
|
|
for d in args:
|
|
|
result.update(d)
|
|
|
return result
|
|
|
|
|
|
|
|
|
def gen_keys(key="", key_path_dir=""):
|
|
|
"""
|
|
|
在KEY_DIR下创建一个 uuid命名的目录,
|
|
|
并且在该目录下 生产一对秘钥
|
|
|
:return: 返回目录名(uuid)
|
|
|
"""
|
|
|
key_basename = "key-" + uuid4().hex
|
|
|
if not key_path_dir:
|
|
|
key_path_dir = os.path.join(KEY_DIR, 'role_key', key_basename)
|
|
|
private_key = os.path.join(key_path_dir, 'id_rsa')
|
|
|
public_key = os.path.join(key_path_dir, 'id_rsa.pub')
|
|
|
mkdir(key_path_dir, mode=0755)
|
|
|
if not key:
|
|
|
key = RSAKey.generate(2048)
|
|
|
key.write_private_key_file(private_key)
|
|
|
else:
|
|
|
key_file = os.path.join(key_path_dir, 'id_rsa')
|
|
|
with open(key_file, 'w') as f:
|
|
|
f.write(key)
|
|
|
f.close()
|
|
|
with open(key_file) as f:
|
|
|
try:
|
|
|
key = RSAKey.from_private_key(f)
|
|
|
except SSHException:
|
|
|
shutil.rmtree(key_path_dir, ignore_errors=True)
|
|
|
raise SSHException
|
|
|
os.chmod(private_key, 0644)
|
|
|
|
|
|
with open(public_key, 'w') as content_file:
|
|
|
for data in [key.get_name(),
|
|
|
" ",
|
|
|
key.get_base64(),
|
|
|
" %s@%s" % ("jumpserver", os.uname()[1])]:
|
|
|
content_file.write(data)
|
|
|
return key_path_dir
|
|
|
|
|
|
|
|
|
def gen_sudo(role_custom, role_name, role_chosen):
|
|
|
"""
|
|
|
生成sudo file, 仅测试了cenos7
|
|
|
role_custom: 自定义支持的sudo 命令 格式: 'CMD1, CMD2, CMD3, ...'
|
|
|
role_name: role name
|
|
|
role_chosen: 选择那些sudo的命令别名:
|
|
|
NETWORKING, SOFTWARE, SERVICES, STORAGE,
|
|
|
DELEGATING, PROCESSES, LOCATE, DRIVERS
|
|
|
:return:
|
|
|
"""
|
|
|
sudo_file_basename = os.path.join(os.path.dirname(KEY_DIR), 'role_sudo_file')
|
|
|
makedirs(sudo_file_basename)
|
|
|
sudo_file_path = os.path.join(sudo_file_basename, role_name)
|
|
|
|
|
|
t = get_template('role_sudo.j2')
|
|
|
content = t.render(Context({"role_custom": role_custom,
|
|
|
"role_name": role_name,
|
|
|
"role_chosen": role_chosen,
|
|
|
}))
|
|
|
with open(sudo_file_path, 'w') as f:
|
|
|
f.write(content)
|
|
|
return sudo_file_path
|
|
|
|
|
|
|
|
|
def get_add_sudo_script(role_chosen_aliase, sudo_alias):
|
|
|
"""
|
|
|
get the sudo file
|
|
|
:param kwargs:
|
|
|
:return:
|
|
|
"""
|
|
|
sudo_j2 = get_template('jperm/role_sudo.j2')
|
|
|
sudo_content = sudo_j2.render(Context({"role_chosen_aliase": role_chosen_aliase,
|
|
|
"sudo_alias": sudo_alias}))
|
|
|
sudo_file = NamedTemporaryFile(delete=False)
|
|
|
sudo_file.write(sudo_content)
|
|
|
sudo_file.close()
|
|
|
print(sudo_file.name)
|
|
|
return sudo_file.name
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
print gen_keys()
|
|
|
|
|
|
|