diff --git a/jperm/models.py b/jperm/models.py index 167ae0485..336016f8f 100644 --- a/jperm/models.py +++ b/jperm/models.py @@ -5,22 +5,37 @@ from juser.models import User, UserGroup from jasset.models import Asset, AssetGroup -class UserPerm(models.Model): - user = models.ForeignKey(User) - asset = models.ForeignKey(Asset, null=True) - asset_group = models.ForeignKey(AssetGroup, null=True) +# class PermUserAsset(models.Model): +# user = models.ForeignKey(User) +# asset = models.ForeignKey(Asset) +# +# def __unicode__(self): +# return self.user.username +# +# +# class PermUserAssetGroup(models.Model): +# user = models.ForeignKey(User) +# asset_group = models.ForeignKey(AssetGroup) +# +# def __unicode__(self): +# return self.user.username +# +# +# class PermUserGroupAsset(models.Model): +# user_group = models.ForeignKey(UserGroup) +# asset = models.ForeignKey(Asset) +# +# def __unicode__(self): +# return self.user_group.name +# +# +# class PermUserGroupAssetGroup(models.Model): +# user_group = models.ForeignKey(UserGroup) +# asset_group = models.ForeignKey(AssetGroup) +# +# def __unicode__(self): +# return self.user_group.name - def __unicode__(self): - return self.user.name - - -class GroupPerm(models.Model): - user_group = models.ForeignKey(UserGroup) - asset = models.ForeignKey(Asset, null=True) - asset_group = models.ForeignKey(AssetGroup, null=True) - - def __unicode__(self): - return self.user.name # class CmdGroup(models.Model): diff --git a/jperm/perm_api.py b/jperm/perm_api.py new file mode 100644 index 000000000..cbaede5a3 --- /dev/null +++ b/jperm/perm_api.py @@ -0,0 +1,111 @@ +# coding: utf-8 + +from jasset.models import * +from jumpserver.api import * +import uuid +import re +from ansible.playbook import PlayBook +from ansible import callbacks, utils + + +def get_object_list(model, id_list): + object_list = [] + for object_id in id_list: + if object_id: + object_list.extend(model.objects.filter(id=int(object_id))) + + return object_list + + +def perm_user_handle(user, asset_new, asset_del, group_new, group_del): + username = user.name + asset_group_new = get_object_list(AssetGroup, group_new) + asset_group_del = get_object_list(AssetGroup, group_del) + for asset_group in asset_group_new: + asset_new.extend([asset.ip for asset in asset_group.asset_set.all()]) + + for asset_group in asset_group_del: + asset_del.extend(asset.ip for asset in asset_group.asset_set.all()) + + +def get_rand_file_path(base_dir=os.path.join(BASE_DIR, 'tmp')): + filename = uuid.uuid1().hex + return os.path.join(base_dir, filename) + + +def get_inventory(host_group): + path = get_rand_file_path() + f = open(path, 'w') + for group, host_list in host_group.items(): + f.write('[%s]\n' % group) + for ip in host_list: + asset = get_object(Asset, ip=ip) + if asset.use_default_auth: + f.write('%s ansbile_ssh_port=%s\n' % (ip, asset.port)) + else: + f.write('%s ansible_ssh_port=%s ansible_ssh_user=%s ansbile_ssh_pass=%s\n' + % (ip, asset.port, asset.username, CRYPTOR.decrypt(asset.password))) + f.close() + return path + + +def get_playbook(tempate, var): + str_playbook = open(tempate).read() + for k, v in var.items(): + str_playbook = re.sub(r'%s' % k, v, str_playbook) + path = get_rand_file_path() + f = open(path, 'w') + f.write(str_playbook) + return path + + +def perm_user_api(user, asset_new, asset_del, asset_group_new, asset_group_del): + asset_new_ip = [] + asset_del_ip = [] + + if '' in asset_group_new: + asset_group_new.remove('') + + if '' in asset_group_del: + asset_group_del.remove('') + + asset_new_ip.extend([asset.ip for asset in get_object_list(Asset, asset_new)]) + + for asset_group_id in asset_group_new: + asset_new_ip.extend([asset.ip for asset in get_object(AssetGroup, id=asset_group_id).asset_set.all()]) + + asset_del_ip.extend([asset.ip for asset in get_object_list(Asset, asset_del)]) + + for asset_group_id in asset_group_del: + asset_del_ip.extend([asset.ip for asset in get_object(AssetGroup, id=asset_group_id).asset_set.all()]) + + print asset_new_ip + print asset_del_ip + + stats = callbacks.AggregateStats() + playbook_cb = callbacks.PlaybookCallbacks(verbose=utils.VERBOSITY) + runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY) + + if asset_new_ip or asset_del_ip: + host_group = {'new': asset_new_ip, 'del': asset_del_ip} + host_list = get_inventory(host_group) + playbook = get_playbook(os.path.join(BASE_DIR, 'playbook', 'user_perm.yaml'), + {'the_new_group': 'new', 'the_del_group': 'del', + 'the_user': user.username, 'the_pub_key': '/tmp/id_rsa.pub'}) + print host_list, playbook + results = PlayBook(host_list=host_list, + playbook=playbook, + forks=5, + remote_user='web', + remote_pass='redhat', + callbacks=playbook_cb, + runner_callbacks=runner_cb, + stats=stats, + become=True, + become_user='root').run() + + for hostname, result in results.items(): + if result.get('failures', 2): + print "%s >>> Failed" % hostname + else: + print "%s >>> Success" % hostname diff --git a/jperm/urls.py b/jperm/urls.py index c4f398c66..a32025944 100644 --- a/jperm/urls.py +++ b/jperm/urls.py @@ -3,7 +3,8 @@ from jperm.views import * urlpatterns = patterns('jperm.views', # Examples: - (r'^user/$', user_perm), + (r'^user/$', perm_user_list), + (r'^perm_user_edit/$', perm_user_edit), # (r'^dept_perm_edit/$', 'dept_perm_edit'), # (r'^perm_list/$', view_splitter, {'su': perm_list, 'adm': perm_list_adm}), # (r'^dept_perm_list/$', 'dept_perm_list'), diff --git a/jperm/views.py b/jperm/views.py index c098f6b37..fdf95aa0d 100644 --- a/jperm/views.py +++ b/jperm/views.py @@ -8,12 +8,58 @@ # from django.template import RequestContext # from jperm.models import Perm, SudoPerm, CmdGroup, Apply from django.db.models import Q +from jperm.models import * from jumpserver.api import * +from jperm.perm_api import * -def user_perm(request): +@require_role('admin') +def perm_user_list(request): header_title, path1, path2 = '用户授权', '授权管理', '用户授权' - return my_render('jperm/user_perm.html', locals(), request) + keyword = request.GET.get('search', '') + users_list = User.objects.all() + + if keyword: + users_list = users_list.filter(Q(name=keyword) | Q(username=keyword)) + users_list, p, users, page_range, current_page, show_first, show_end = pages(users_list, request) + + return my_render('jperm/perm_user_list.html', locals(), request) + + +@require_role('admin') +def perm_user_edit(request): + header_title, path1, path2 = '用户授权', '授权管理', '授权更改' + user_id = request.GET.get('id', '') + user = get_object(User, id=user_id) + asset_all = Asset.objects.all() + asset_group_all = AssetGroup.objects.all() + + asset_id_list = user.assets.split(',') + asset_group_id_list = user.asset_groups.split(',') + if request.method == 'GET' and user: + asset_permed = get_object_list(Asset, asset_id_list) + asset_group_permed = get_object_list(AssetGroup, asset_group_id_list) + assets = [asset for asset in asset_all if asset not in asset_permed] + asset_groups = [asset_group for asset_group in asset_group_all if asset_group not in asset_group_permed] + return my_render('jperm/perm_user_edit.html', locals(), request) + + elif request.method == 'POST' and user: + asset_select = request.POST.getlist('asset_select', []) + asset_group_select = request.POST.getlist('asset_groups_select', []) + asset_new = list(set(asset_select) - set(asset_id_list)) + asset_del = list(set(asset_id_list) - set(asset_select)) + asset_group_new = list(set(asset_group_select) - set(asset_group_id_list)) + asset_group_del = list(set(asset_group_id_list) - set(asset_group_select)) + user.assets = ','.join(asset_select) + user.asset_groups = ','.join(asset_group_select) + user.save() + + perm_user_api(user, asset_new, asset_del, asset_group_new, asset_group_del) + + return HttpResponseRedirect('/jperm/user/') + + else: + return HttpResponse('输入错误') # def asset_cmd_groups_get(asset_groups_select='', cmd_groups_select=''): @@ -51,7 +97,7 @@ def user_perm(request): # perm.user_group = user_groups # perm.asset_group = asset_groups # msg = '添加成功' -# return render_to_response('jperm/user_perm.html', locals(), context_instance=RequestContext(request)) +# return render_to_response('jperm/perm_user_edit.html', locals(), context_instance=RequestContext(request)) # # # def dept_add_asset(dept_id, asset_list): @@ -115,7 +161,7 @@ def user_perm(request): # contact_list = contact_list_confirm # # contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request) -# return render_to_response('jperm/perm_list.html', locals(), context_instance=RequestContext(request)) +# return render_to_response('jperm/perm_user_list.html', locals(), context_instance=RequestContext(request)) # # # @require_admin @@ -147,7 +193,7 @@ def user_perm(request): # contact_list = contact_list_confirm # # contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request) -# return render_to_response('jperm/perm_list.html', locals(), context_instance=RequestContext(request)) +# return render_to_response('jperm/perm_user_list.html', locals(), context_instance=RequestContext(request)) # # # @require_super_user diff --git a/jumpserver/api.py b/jumpserver/api.py index 59411abe4..fcd21c913 100644 --- a/jumpserver/api.py +++ b/jumpserver/api.py @@ -476,6 +476,10 @@ def get_object(model, **kwargs): use this function for query 使用改封装函数查询数据库 """ + for value in kwargs.values(): + if not value: + return None + the_object = model.objects.filter(**kwargs) if len(the_object) == 1: the_object = the_object[0] diff --git a/jumpserver/models.py b/jumpserver/models.py new file mode 100644 index 000000000..aa186301b --- /dev/null +++ b/jumpserver/models.py @@ -0,0 +1,12 @@ +# coding: utf-8 + +from django.db import models + + +class Setting(models.Model): + default_user = models.CharField(max_length=100, null=True, blank=True) + default_password = models.CharField(max_length=100, null=True, blank=True) + default_pri_key_path = models.CharField(max_length=100, null=True, blank=True) + + class Meta: + db_table = u'setting' \ No newline at end of file diff --git a/jumpserver/urls.py b/jumpserver/urls.py index 617d0351e..6c483ea5b 100644 --- a/jumpserver/urls.py +++ b/jumpserver/urls.py @@ -12,6 +12,7 @@ urlpatterns = patterns('', (r'^logout/$', 'jumpserver.views.logout'), (r'^file/upload/$', 'jumpserver.views.upload'), (r'^file/download/$', 'jumpserver.views.download'), + (r'^setting', 'jumpserver.views.setting'), (r'^error/$', 'jumpserver.views.httperror'), (r'^juser/', include('juser.urls')), (r'^jasset/', include('jasset.urls')), diff --git a/jumpserver/views.py b/jumpserver/views.py index 37784f9c7..9b0ce396c 100644 --- a/jumpserver/views.py +++ b/jumpserver/views.py @@ -229,6 +229,9 @@ def logout(request): request.session.delete() return HttpResponseRedirect('/login/') + +def setting(request): + return my_render('setting.html', locals(), request) # # def filter_ajax_api(request): # attr = request.GET.get('attr', 'user') diff --git a/juser/models.py b/juser/models.py index 67325ef7f..da61481b2 100644 --- a/juser/models.py +++ b/juser/models.py @@ -32,6 +32,8 @@ class User(models.Model): role = models.CharField(max_length=2, choices=USER_ROLE_CHOICES, default='CU') uuid = models.CharField(max_length=100) group = models.ManyToManyField(UserGroup) + assets = models.TextField(max_length=1000, verbose_name="Assets", default='') + asset_groups = models.CharField(max_length=1000, verbose_name="Asset Groups", default='') ssh_key_pwd = models.CharField(max_length=200) is_active = models.BooleanField(default=True) last_login = models.DateTimeField(null=True) diff --git a/playbook/user_perm.yaml b/playbook/user_perm.yaml new file mode 100644 index 000000000..4aaefa91d --- /dev/null +++ b/playbook/user_perm.yaml @@ -0,0 +1,17 @@ +- hosts: the_new_group + vars: + user: the_user + tasks: + - name: add user + user: name={{ user }} state=present + - name: .ssh direcotory + file: name=/home/{{ user }}/.ssh mode=700 owner={{ user }} group={{ user }} state=directory + - name: set authorizied_file + copy: src=the_pub_key dest=/home/{{ user }}/.ssh/authorizied_keys owner={{ user }} group={{ user }} mode=600 + +- hosts: the_del_group + vars: + user: the_user + tasks: + - name: del user + user: name={{ user }} state=absent remove=yes diff --git a/static/js/base.js b/static/js/base.js index 0c5612a0d..5445ab9b6 100644 --- a/static/js/base.js +++ b/static/js/base.js @@ -89,7 +89,7 @@ function move(from, to, from_o, to_o) { //} // -function selectAll(){ +function selectAllOption(){ var checklist = document.getElementsByName ("selected"); if(document.getElementById("select_all").checked) { @@ -106,6 +106,12 @@ function selectAll(){ } +function checkAll(formID){ + $('#'+formID+'option').each(function(){ + $(this).attr('checked', true) + }) +} + // //function move_all(from, to){ // $("#"+from).children().each(function(){ diff --git a/templates/jperm/perm_edit.html b/templates/jperm/perm_edit.html index 1b2377bac..33cd1e4eb 100644 --- a/templates/jperm/perm_edit.html +++ b/templates/jperm/perm_edit.html @@ -82,7 +82,7 @@