From 08e1788426f007d7657c900e80b08e6df3c01457 Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 14 Dec 2017 21:27:14 +0800 Subject: [PATCH] =?UTF-8?q?[Feature]=20=E6=89=93=E7=AE=97=E6=8B=86?= =?UTF-8?q?=E5=88=86=E4=B8=8B=E8=BD=BD=E5=92=8C=E4=B8=8A=E4=BC=A0=E4=B8=BA?= =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E6=A8=A1=E5=9D=97=EF=BC=8C=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=9C=89=E9=99=90=E6=9A=82=E6=97=B6=E6=94=BE=E5=BC=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/forms.py | 7 +- apps/assets/models/user.py | 28 +- apps/assets/serializers.py | 2 +- .../assets/templates/assets/_system_user.html | 2 +- .../assets/templates/assets/asset_update.html | 4 +- apps/assets/views/admin_user.py | 2 +- apps/assets/views/asset.py | 52 +-- apps/assets/views/cluster.py | 2 +- apps/assets/views/group.py | 2 +- apps/assets/views/system_user.py | 2 +- apps/common/imexp.py | 331 ++++++++++++++++++ apps/locale/zh/LC_MESSAGES/django.po | 6 +- apps/perms/views.py | 22 +- apps/templates/delete_confirm.html | 15 + .../templates/terminal/command_list.html | 8 +- .../templates/terminal/session_list.html | 28 +- .../templates/terminal/terminal_list.html | 33 +- .../terminal/terminal_modal_accept.html | 4 +- apps/terminal/urls/api_urls.py | 4 +- apps/terminal/views/command.py | 2 +- apps/terminal/views/session.py | 3 +- apps/terminal/views/terminal.py | 4 +- apps/users/models/authentication.py | 1 - apps/users/models/user.py | 6 +- 24 files changed, 458 insertions(+), 112 deletions(-) create mode 100644 apps/common/imexp.py create mode 100644 apps/templates/delete_confirm.html diff --git a/apps/assets/forms.py b/apps/assets/forms.py index bfaa3bf50..abd6f8254 100644 --- a/apps/assets/forms.py +++ b/apps/assets/forms.py @@ -9,6 +9,7 @@ from common.utils import validate_ssh_private_key, ssh_pubkey_gen, ssh_key_gen, logger = get_logger(__file__) +from rest_framework import serializers class AssetCreateForm(forms.ModelForm): @@ -240,7 +241,7 @@ class SystemUserForm(forms.ModelForm): fields = [ 'name', 'username', 'protocol', 'auto_generate_key', 'password', 'private_key_file', 'auto_push', 'sudo', - 'comment', 'shell', 'cluster' + 'comment', 'shell', 'cluster', 'priority', ] widgets = { 'name': forms.TextInput(attrs={'placeholder': _('Name')}), @@ -254,6 +255,7 @@ class SystemUserForm(forms.ModelForm): 'username': '* required', 'cluster': 'If auto push checked, system user will be create at cluster assets', 'auto_push': 'Auto push system user to asset', + 'priority': 'High level will be using login asset as default, if user was granted more than 2 system user', } @@ -261,7 +263,7 @@ class SystemUserUpdateForm(forms.ModelForm): class Meta: model = SystemUser fields = [ - 'name', 'username', 'protocol', + 'name', 'username', 'protocol', 'priority', 'sudo', 'comment', 'shell', 'cluster' ] widgets = { @@ -275,6 +277,7 @@ class SystemUserUpdateForm(forms.ModelForm): 'name': '* required', 'username': '* required', 'cluster': 'If auto push checked, then push system user to that cluster assets', + 'priority': 'High level will be using login asset as default, if user was granted more than 2 system user', } diff --git a/apps/assets/models/user.py b/apps/assets/models/user.py index 073b7809d..c1c87c9fd 100644 --- a/apps/assets/models/user.py +++ b/apps/assets/models/user.py @@ -7,6 +7,7 @@ import logging import uuid from hashlib import md5 +import sshpubkeys from django.db import models from django.utils.translation import ugettext_lazy as _ from django.conf import settings @@ -27,7 +28,8 @@ class AssetUser(models.Model): _private_key = models.TextField(max_length=4096, blank=True, null=True, verbose_name=_('SSH private key'), validators=[private_key_validator, ]) _public_key = models.TextField(max_length=4096, blank=True, verbose_name=_('SSH public key')) comment = models.TextField(blank=True, verbose_name=_('Comment')) - date_created = models.DateTimeField(auto_now_add=True, null=True) + date_created = models.DateTimeField(auto_now_add=True) + date_updated = models.DateTimeField(auto_now=True) created_by = models.CharField(max_length=32, null=True, verbose_name=_('Created by')) @property @@ -45,16 +47,21 @@ class AssetUser(models.Model): @property def private_key(self): if self._private_key: - key_str = signer.unsign(self._private_key) - return ssh_key_string_to_obj(key_str, password=self.password) - else: - return None + return signer.unsign(self._private_key) @private_key.setter def private_key(self, private_key_raw): raise AttributeError("Using set_auth do that") # self._private_key = signer.sign(private_key_raw) + @property + def private_key_obj(self): + if self._private_key: + key_str = signer.unsign(self._private_key) + return ssh_key_string_to_obj(key_str, password=self.password) + else: + return None + @property def private_key_file(self): if not self.private_key: @@ -74,6 +81,15 @@ class AssetUser(models.Model): def public_key(self): return signer.unsign(self._public_key) + @property + def public_key_obj(self): + if self.public_key: + try: + return sshpubkeys.SSHKey(self.public_key) + except TabError: + pass + return None + def set_auth(self, password=None, private_key=None, public_key=None): update_fields = [] if password: @@ -170,6 +186,7 @@ class SystemUser(AssetUser): ('K', 'Public key'), ) cluster = models.ManyToManyField('assets.Cluster', verbose_name=_("Cluster")) + priority = models.IntegerField(default=10, verbose_name=_("Priority")) # Todo: If user granted more priority user, default will be login as the hign protocol = models.CharField(max_length=16, choices=PROTOCOL_CHOICES, default='ssh', verbose_name=_('Protocol')) auto_push = models.BooleanField(default=True, verbose_name=_('Auto push')) sudo = models.TextField(default='/sbin/ifconfig', verbose_name=_('Sudo')) @@ -205,6 +222,7 @@ class SystemUser(AssetUser): 'name': self.name, 'username': self.username, 'protocol': self.protocol, + 'priority': self.priority, 'auto_push': self.auto_push, } diff --git a/apps/assets/serializers.py b/apps/assets/serializers.py index c46942ad0..50cc091e1 100644 --- a/apps/assets/serializers.py +++ b/apps/assets/serializers.py @@ -115,7 +115,7 @@ class SystemUserSerializer(serializers.ModelSerializer): class AssetSystemUserSerializer(serializers.ModelSerializer): class Meta: model = SystemUser - fields = ('id', 'name', 'username', 'protocol', 'comment') + fields = ('id', 'name', 'username', 'priority', 'protocol', 'comment',) class SystemUserUpdateAssetsSerializer(serializers.ModelSerializer): diff --git a/apps/assets/templates/assets/_system_user.html b/apps/assets/templates/assets/_system_user.html index fe1836e8d..99b64af30 100644 --- a/apps/assets/templates/assets/_system_user.html +++ b/apps/assets/templates/assets/_system_user.html @@ -37,6 +37,7 @@

{% trans 'Basic' %}

{% bootstrap_field form.name layout="horizontal" %} {% bootstrap_field form.username layout="horizontal" %} + {% bootstrap_field form.priority layout="horizontal" %} {% bootstrap_field form.protocol layout="horizontal" %} {% bootstrap_field form.cluster layout="horizontal" %} @@ -49,7 +50,6 @@ {{ form.auto_generate_key}} -
{% bootstrap_field form.private_key_file layout="horizontal" %} diff --git a/apps/assets/templates/assets/asset_update.html b/apps/assets/templates/assets/asset_update.html index af5f46566..fea3249e6 100644 --- a/apps/assets/templates/assets/asset_update.html +++ b/apps/assets/templates/assets/asset_update.html @@ -64,7 +64,9 @@ {% block custom_foot_js %} {% endblock %} diff --git a/apps/terminal/templates/terminal/terminal_list.html b/apps/terminal/templates/terminal/terminal_list.html index edcfd7f31..966edae22 100644 --- a/apps/terminal/templates/terminal/terminal_list.html +++ b/apps/terminal/templates/terminal/terminal_list.html @@ -2,7 +2,6 @@ {% load i18n static %} {% block custom_head_css_js %} {{ block.super }} - {% endblock %} + {% block table_search %}{% endblock %} + {% block table_container %} -{##} @@ -40,12 +40,11 @@
{% include 'terminal/terminal_modal_accept.html' %} - {% endblock %} {% block custom_foot_js %}