Skip to content

Commit

Permalink
Merge branch 'dev' of https://git.coding.net/jumpserver/jumpserver in…
Browse files Browse the repository at this point in the history
…to dev
  • Loading branch information
halcyonone committed Dec 5, 2015
2 parents 2c3e681 + 34ccaeb commit 0f6f3bd
Show file tree
Hide file tree
Showing 7 changed files with 238 additions and 198 deletions.
2 changes: 1 addition & 1 deletion jasset/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from jasset.forms import AssetForm, IdcForm
from jasset.models import Asset, IDC, AssetGroup, ASSET_TYPE, ASSET_STATUS
from jperm.perm_api import get_group_asset_perm
from jperm.ansible_api import Tasks, MyRunner
from jperm.ansible_api import MyRunner
from jperm.perm_api import gen_resource


Expand Down
155 changes: 21 additions & 134 deletions jperm/ansible_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,8 @@ def __init__(self, *args, **kwargs):
super(MyRunner, self).__init__(*args, **kwargs)
self.results_raw = {}

def run(self, module_name='shell', module_args='', timeout=10, forks=10, pattern='',
sudo=False, sudo_user='root', sudo_pass=''):
def run(self, module_name='shell', module_args='', timeout=10, forks=10, pattern='*',
become=False, become_method='sudo', become_user='root', become_pass=''):
"""
run module from andible ad-hoc.
module_name: ansible module_name
Expand All @@ -132,10 +132,10 @@ def run(self, module_name='shell', module_args='', timeout=10, forks=10, pattern
inventory=self.inventory,
pattern=pattern,
forks=forks,
become=sudo,
become_method='sudo',
become_user=sudo_user,
become_pass=sudo_pass
become=become,
become_method=become_method,
become_user=become_user,
become_pass=become_pass
)
self.results_raw = hoc.run()
return self.results_raw
Expand All @@ -156,7 +156,7 @@ def results(self):
for host, info in contacted.items():
if info.get('failed'):
result['failed'][host] = info.get('msg') + info.get('stderr', '')
elif info.get('stderr'):
elif info.get('stderr') and info.get('module_name') in ['shell', 'command', 'raw']:
result['failed'][host] = info.get('stderr') + str(info.get('warnings'))
else:
result['ok'][host] = info.get('stdout')
Expand Down Expand Up @@ -265,60 +265,21 @@ def dark(self):
return self.results_raw.get("dark")


class Tasks(Command):
class MyTask(MyRunner):
"""
this is a tasks object for include the common command.
"""
def __init__(self, *args, **kwargs):
super(Tasks, self).__init__(*args, **kwargs)

def __run(self,
module_args,
module_name="command",
timeout=5,
forks=10,
group='default_group',
pattern='*',
):
"""
run command from andible ad-hoc.
command : 必须是一个需要执行的命令字符串, 比如
'uname -a'
"""
hoc = Runner(module_name=module_name,
module_args=module_args,
timeout=timeout,
inventory=self.inventory,
subset=group,
pattern=pattern,
forks=forks,
become=False,
)

self.results = hoc.run()
return {"msg": self.msg, "result": self.results}

@property
def msg(self):
"""
get the contacted and dark msg
"""
msg = {}
for result in ["contacted", "dark"]:
all = self.results.get(result)
for key, value in all.iteritems():
if value.get("msg"):
msg[key] = value.get("msg")
return msg
super(MyTask, self).__init__(*args, **kwargs)

def push_key(self, user, key_path):
"""
push the ssh authorized key to target.
"""
module_args = 'user="%s" key="{{ lookup("file", "%s") }}" state=present' % (user, key_path)
self.__run(module_args, "authorized_key")
self.run("authorized_key", module_args, become=True)

return {"status": "failed", "msg": self.msg} if self.msg else {"status": "ok"}
return self.results

def push_multi_key(self, **user_info):
"""
Expand All @@ -345,9 +306,9 @@ def del_key(self, user, key_path):
push the ssh authorized key to target.
"""
module_args = 'user="%s" key="{{ lookup("file", "%s") }}" state="absent"' % (user, key_path)
self.__run(module_args, "authorized_key")
self.run("authorized_key", module_args, become=True)

return {"status": "failed", "msg": self.msg} if self.msg else {"status": "ok"}
return self.results

def add_user(self, username, password=''):
"""
Expand All @@ -358,9 +319,9 @@ def add_user(self, username, password=''):
module_args = 'name=%s shell=/bin/bash password=%s' % (username, encrypt_pass)
else:
module_args = 'name=%s shell=/bin/bash' % username
self.__run(module_args, "user")
self.run("user", module_args, become=True)

return {"status": "failed", "msg": self.msg} if self.msg else {"status": "ok"}
return self.results

def add_multi_user(self, **user_info):
"""
Expand All @@ -387,94 +348,20 @@ def del_user(self, username):
"""
delete a host user.
"""
module_args = 'name=%s state=absent remove=yes move_home=yes force=yes' % (username)
self.__run(module_args,
"user",)
module_args = 'name=%s state=absent remove=yes move_home=yes force=yes' % username
self.run("user", module_args, become=True)

return {"status": "failed","msg": self.msg} if self.msg else {"status": "ok"}

def add_init_users(self):
"""
add initail users: SA, DBA, DEV
"""
results = {}
action = results["action_info"] = {}
users = {"SA": get_rand_pass(), "DBA": get_rand_pass(), "DEV": get_rand_pass()}
for user, password in users.iteritems():
ret = self.add_user(user, password)
action[user] = ret
results["user_info"] = users

return results

def del_init_users(self):
"""
delete initail users: SA, DBA, DEV
"""
results = {}
action = results["action_info"] = {}
for user in ["SA", "DBA", "DEV"]:
ret = self.del_user(user)
action[user] = ret
return results

def get_host_info(self):
"""
use the setup module get host informations
:return:
all_ip is list
processor_count is int
system_dist_version is string
system_type is string
disk is dict (device_name: device_size}
system_dist is string
processor_type is string
default_ip is string
hostname is string
product_sn is string
memory_total is int (MB)
default_mac is string
product_name is string
"""
self.__run('', 'setup')

result = {}
all = self.results.get("contacted")
for key, value in all.iteritems():
setup =value.get("ansible_facts")
# get disk informations
disk_all = setup.get("ansible_devices")
disk_need = {}
for disk_name, disk_info in disk_all.iteritems():
if disk_name.startswith('sd') or disk_name.startswith('hd'):
disk_need[disk_name] = disk_info.get("size")

result[key] = {
"all_ip": setup.get("ansible_all_ipv4_addresses"),
"hostname" : setup.get("ansible_hostname"),
"default_ip": setup.get("ansible_default_ipv4").get("address"),
"default_mac": setup.get("ansible_default_ipv4").get("macaddress"),
"product_name": setup.get("ansible_product_name"),
"processor_type": ' '.join(setup.get("ansible_processor")),
"processor_count": setup.get("ansible_processor_count"),
"memory_total": setup.get("ansible_memtotal_mb"),
"disk": disk_need,
"system_type": setup.get("ansible_system"),
"system_dist": setup.get("ansible_distribution"),
"system_dist_verion": setup.get("ansible_distribution_major_version"),
"product_sn": setup.get("ansible_product_serial")
}

return {"failed": self.msg, "ok": result}
return self.results

def push_sudo_file(self, file_path):
"""
use template to render pushed sudoers file
:return:
"""
module_args1 = file_path
ret = self.__run(module_args1, "script")
return ret
self.run("script", module_args1, become=True)
print self.results_raw
return self.results


class CustomAggregateStats(callbacks.AggregateStats):
Expand Down
16 changes: 0 additions & 16 deletions jperm/perm_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -296,28 +296,12 @@ def get_role_push_host(role):
asset_all = Asset.objects.all()
asset_pushed = {}
for push in pushs:
print push.result
asset_pushed[push.asset] = {'success': push.success, 'key': push.is_public_key, 'password': push.is_password,
'result': push.result}
asset_no_push = set(asset_all) - set(asset_pushed.keys())
print asset_no_push, asset_pushed
return asset_pushed, asset_no_push


@require_role('user')
def perm_role_get(request):
asset_id = request.GET.get('id', 0)
if asset_id:
asset = get_object(Asset, id=asset_id)
if asset:
role = user_have_perm(request.user, asset=asset)
return HttpResponse(','.join([i.name for i in role]))
else:
roles = get_group_user_perm(request.user).get('role').keys()
return HttpResponse(','.join(i.name for i in roles))
return HttpResponse('error')


if __name__ == "__main__":
print get_role_info(1)

Expand Down
Loading

0 comments on commit 0f6f3bd

Please sign in to comment.