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 %} -{#
{% trans "Create user" %}
#} @@ -40,12 +40,11 @@
{% include 'terminal/terminal_modal_accept.html' %} - {% endblock %} {% block custom_foot_js %}