diff --git a/apps/assets/api/node.py b/apps/assets/api/node.py index 9538a265c..78cd7a27a 100644 --- a/apps/assets/api/node.py +++ b/apps/assets/api/node.py @@ -19,7 +19,7 @@ from rest_framework.response import Response from rest_framework_bulk import BulkModelViewSet from django.utils.translation import ugettext_lazy as _ -from common.utils import get_logger +from common.utils import get_logger, get_object_or_none from ..hands import IsSuperUser from ..models import Node from .. import serializers @@ -29,6 +29,7 @@ logger = get_logger(__file__) __all__ = [ 'NodeViewSet', 'NodeChildrenApi', 'NodeAddAssetsApi', 'NodeRemoveAssetsApi', + 'NodeAddChildrenApi', ] @@ -75,6 +76,24 @@ class NodeChildrenApi(mixins.ListModelMixin, generics.CreateAPIView): return Response(response, status=200) +class NodeAddChildrenApi(generics.UpdateAPIView): + queryset = Node.objects.all() + permission_classes = (IsSuperUser,) + serializer_class = serializers.NodeAddChildrenSerializer + instance = None + + def put(self, request, *args, **kwargs): + instance = self.get_object() + nodes_id = request.data.get("nodes") + children = [get_object_or_none(Node, id=pk) for pk in nodes_id] + for node in children: + if not node: + continue + node.parent = instance + node.save() + return Response("OK") + + class NodeAddAssetsApi(generics.UpdateAPIView): serializer_class = serializers.NodeAssetsSerializer queryset = Node.objects.all() diff --git a/apps/assets/forms/asset.py b/apps/assets/forms/asset.py index 763608daf..34865c544 100644 --- a/apps/assets/forms/asset.py +++ b/apps/assets/forms/asset.py @@ -15,7 +15,7 @@ class AssetCreateForm(forms.ModelForm): model = Asset fields = [ 'hostname', 'ip', 'public_ip', 'port', 'comment', - 'nodes', 'is_active', 'admin_user', 'labels', + 'nodes', 'is_active', 'admin_user', 'labels', 'platform', ] widgets = { @@ -44,7 +44,7 @@ class AssetUpdateForm(forms.ModelForm): class Meta: model = Asset fields = [ - 'hostname', 'ip', 'port', 'nodes', 'is_active', + 'hostname', 'ip', 'port', 'nodes', 'is_active', 'platform', 'public_ip', 'number', 'comment', 'admin_user', 'labels', ] widgets = { diff --git a/apps/assets/models/asset.py b/apps/assets/models/asset.py index 01c9ad255..3f7dec4ec 100644 --- a/apps/assets/models/asset.py +++ b/apps/assets/models/asset.py @@ -38,6 +38,14 @@ def default_node(): class Asset(models.Model): # Important + PLATFORM_CHOICES = ( + ('Linux', 'Linux'), + ('Unix', 'Unix'), + ('MacOS', 'MacOS'), + ('BSD', 'BSD'), + ('Windows', 'Windows'), + ('Other', 'Other'), + ) id = models.UUIDField(default=uuid.uuid4, primary_key=True) ip = models.GenericIPAddressField(max_length=32, verbose_name=_('IP'), db_index=True) hostname = models.CharField(max_length=128, unique=True, verbose_name=_('Hostname')) @@ -64,7 +72,7 @@ class Asset(models.Model): disk_total = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('Disk total')) disk_info = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('Disk info')) - platform = models.CharField(max_length=128, null=True, blank=True, verbose_name=_('Platform')) + platform = models.CharField(max_length=128, choices=PLATFORM_CHOICES, default='Linux', verbose_name=_('Platform')) os = models.CharField(max_length=128, null=True, blank=True, verbose_name=_('OS')) os_version = models.CharField(max_length=16, null=True, blank=True, verbose_name=_('OS version')) os_arch = models.CharField(max_length=16, blank=True, null=True, verbose_name=_('OS arch')) @@ -87,6 +95,12 @@ class Asset(models.Model): return True, '' return False, warning + def is_unixlike(self): + if self.platform not in ("Windows", "Other"): + return True + else: + return False + @property def hardware_info(self): if self.cpu_count: @@ -99,6 +113,8 @@ class Asset(models.Model): @property def is_connective(self): + if not self.is_unixlike(): + return True val = cache.get(ASSET_ADMIN_CONN_CACHE_KEY.format(self.hostname)) if val == 1: return True diff --git a/apps/assets/models/node.py b/apps/assets/models/node.py index a502694c9..5ce195783 100644 --- a/apps/assets/models/node.py +++ b/apps/assets/models/node.py @@ -61,6 +61,9 @@ class Node(models.Model): assets = Asset.objects.filter(nodes__id=self.id) return assets + def get_active_assets(self): + return self.get_assets().filter(is_active=True) + def get_all_assets(self): from .asset import Asset if self.is_root(): @@ -70,6 +73,9 @@ class Node(models.Model): assets = Asset.objects.filter(nodes__in=nodes) return assets + def get_all_active_assets(self): + return self.get_all_assets().filter(is_active=True) + def is_root(self): return self.key == '0' @@ -88,6 +94,10 @@ class Node(models.Model): else: return parent + @parent.setter + def parent(self, parent): + self.key = parent.get_next_child_key() + @property def ancestor(self): if self.parent == self.__class__.root(): diff --git a/apps/assets/models/user.py b/apps/assets/models/user.py index 999b9e016..7eaff63e6 100644 --- a/apps/assets/models/user.py +++ b/apps/assets/models/user.py @@ -26,14 +26,14 @@ signer = get_signer() class AssetUser(models.Model): id = models.UUIDField(default=uuid.uuid4, primary_key=True) name = models.CharField(max_length=128, unique=True, verbose_name=_('Name')) - username = models.CharField(max_length=16, verbose_name=_('Username')) + username = models.CharField(max_length=128, verbose_name=_('Username')) _password = models.CharField(max_length=256, blank=True, null=True, verbose_name=_('Password')) _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) date_updated = models.DateTimeField(auto_now=True) - created_by = models.CharField(max_length=32, null=True, verbose_name=_('Created by')) + created_by = models.CharField(max_length=128, null=True, verbose_name=_('Created by')) @property def password(self): @@ -175,15 +175,12 @@ class AdminUser(AssetUser): return info def get_related_assets(self): - assets = [] - for cluster in self.cluster_set.all(): - assets.extend(cluster.assets.all()) - assets.extend(self.asset_set.all()) - return list(set(assets)) + assets = self.asset_set.all() + return assets @property def assets_amount(self): - return len(self.get_related_assets()) + return self.get_related_assets().count() class Meta: ordering = ['name'] diff --git a/apps/assets/serializers/node.py b/apps/assets/serializers/node.py index 6e69008bb..f6654aef9 100644 --- a/apps/assets/serializers/node.py +++ b/apps/assets/serializers/node.py @@ -65,4 +65,8 @@ class NodeAssetsSerializer(serializers.ModelSerializer): class Meta: model = Node - fields = ['assets'] \ No newline at end of file + fields = ['assets'] + + +class NodeAddChildrenSerializer(serializers.Serializer): + nodes = serializers.ListField() diff --git a/apps/assets/templates/assets/_system_user.html b/apps/assets/templates/assets/_system_user.html index fe06a6fc7..528e271e6 100644 --- a/apps/assets/templates/assets/_system_user.html +++ b/apps/assets/templates/assets/_system_user.html @@ -13,7 +13,7 @@
-
{% trans 'Create system user' %}
+
{{ action }}
@@ -81,6 +81,14 @@ {% block custom_foot_js %} @@ -224,6 +230,9 @@ function editTreeNode() { if (!current_node){ return } + if (current_node.value) { + current_node.name = current_node.value; + } zTree.editName(current_node); } @@ -308,6 +317,42 @@ function selectQueryNode() { } } +function beforeDrag() { + return true +} + +function beforeDrop(treeId, treeNodes, targetNode, moveType) { + var treeNodesNames = []; + $.each(treeNodes, function (index, value) { + treeNodesNames.push(value.value); + }); + + var msg = "你想移动节点: `" + treeNodesNames.join(",") + "` 到 `" + targetNode.value + "` 下吗?"; + if (confirm(msg)){ + return true + } else { + return false + } +} + +function onDrag(event, treeId, treeNodes) { +} + +function onDrop(event, treeId, treeNodes, targetNode, moveType) { + var treeNodesIds = []; + $.each(treeNodes, function (index, value) { + treeNodesIds.push(value.id); + }); + + var the_url = "{% url 'api-assets:node-add-children' pk=DEFAULT_PK %}".replace("{{ DEFAULT_PK }}", targetNode.id); + var body = {nodes: treeNodesIds}; + APIUpdateAttr({ + url: the_url, + method: "PUT", + body: JSON.stringify(body) + }) +} + function initTree() { var setting = { view: { @@ -319,11 +364,24 @@ function initTree() { enable: true } }, + edit: { + enable: true, + showRemoveBtn: false, + showRenameBtn: false, + drag: { + isCopy: true, + isMove: true + } + }, callback: { onRightClick: OnRightClick, beforeClick: beforeClick, onRename: onRename, - onSelected: onSelected + onSelected: onSelected, + beforeDrag: beforeDrag, + onDrag: onDrag, + beforeDrop: beforeDrop, + onDrop: onDrop } }; @@ -334,7 +392,8 @@ function initTree() { {#if (value["key"] === "0") {#} value["open"] = true; {# }#} - value["name"] = value["value"] + ' (' + value['assets_amount'] + ')' + value["name"] = value["value"] + ' (' + value['assets_amount'] + ')'; + value['value'] = value['value']; }); zNodes = data; $.fn.zTree.init($("#assetTree"), setting, zNodes); @@ -415,7 +474,7 @@ $(document).ready(function(){ current_node = nodes[0]; url += "?node_id=" + current_node.id; } - window.open(url); + window.open(url, '_self'); }) .on('click', '.btn_asset_delete', function () { var $this = $(this); diff --git a/apps/assets/templates/assets/asset_update.html b/apps/assets/templates/assets/asset_update.html index 515780f55..5d8006451 100644 --- a/apps/assets/templates/assets/asset_update.html +++ b/apps/assets/templates/assets/asset_update.html @@ -22,6 +22,7 @@ {% bootstrap_field form.hostname layout="horizontal" %} {% bootstrap_field form.ip layout="horizontal" %} {% bootstrap_field form.port layout="horizontal" %} + {% bootstrap_field form.platform layout="horizontal" %} {% bootstrap_field form.public_ip layout="horizontal" %}
diff --git a/apps/assets/urls/api_urls.py b/apps/assets/urls/api_urls.py index 236a1f854..38494539c 100644 --- a/apps/assets/urls/api_urls.py +++ b/apps/assets/urls/api_urls.py @@ -44,6 +44,7 @@ urlpatterns = [ url(r'^v1/system-user/(?P[0-9a-zA-Z\-]{36})/connective/$', api.SystemUserTestConnectiveApi.as_view(), name='system-user-connective'), url(r'^v1/nodes/(?P[0-9a-zA-Z\-]{36})/children/$', api.NodeChildrenApi.as_view(), name='node-children'), + url(r'^v1/nodes/(?P[0-9a-zA-Z\-]{36})/children/add/$', api.NodeAddChildrenApi.as_view(), name='node-add-children'), url(r'^v1/nodes/(?P[0-9a-zA-Z\-]{36})/assets/add/$', api.NodeAddAssetsApi.as_view(), name='node-add-assets'), url(r'^v1/nodes/(?P[0-9a-zA-Z\-]{36})/assets/remove/$', api.NodeRemoveAssetsApi.as_view(), name='node-remove-assets'), ] diff --git a/apps/assets/views/asset.py b/apps/assets/views/asset.py index 900adefc3..466bf7f4c 100644 --- a/apps/assets/views/asset.py +++ b/apps/assets/views/asset.py @@ -58,8 +58,7 @@ class UserAssetListView(LoginRequiredMixin, TemplateView): def get_context_data(self, **kwargs): context = { - 'app': _('Assets'), - 'action': _('Asset list'), + 'action': _('My assets'), 'system_users': SystemUser.objects.all(), } kwargs.update(context) @@ -248,6 +247,7 @@ class BulkImportAssetView(AdminUserRequiredMixin, JSONResponseMixin, FormView): f = form.cleaned_data['file'] det_result = chardet.detect(f.read()) f.seek(0) # reset file seek index + file_data = f.read().decode(det_result['encoding']).strip(codecs.BOM_UTF8.decode()) csv_file = StringIO(file_data) reader = csv.reader(csv_file) diff --git a/apps/common/forms.py b/apps/common/forms.py index 0d0f057cf..8a6c87fe4 100644 --- a/apps/common/forms.py +++ b/apps/common/forms.py @@ -68,10 +68,10 @@ class BaseForm(forms.Form): class BasicSettingForm(BaseForm): SITE_URL = forms.URLField( label=_("Current SITE URL"), - help_text="http://jumpserver.abc.com:8080" + help_text="eg: http://jumpserver.abc.com:8080" ) USER_GUIDE_URL = forms.URLField( - label=_("User Guide URL"), + label=_("User Guide URL"), required=False, help_text=_("User first login update profile done redirect to it") ) EMAIL_SUBJECT_PREFIX = forms.CharField( @@ -135,7 +135,7 @@ class LDAPSettingForm(BaseForm): AUTH_LDAP_START_TLS = forms.BooleanField( label=_("Use SSL"), initial=False, required=False ) - AUTH_LDAP = forms.BooleanField(label=_("Enable LDAP auth"), initial=False) + AUTH_LDAP = forms.BooleanField(label=_("Enable LDAP auth"), initial=False, required=False) class TerminalSettingForm(BaseForm): diff --git a/apps/common/mixins.py b/apps/common/mixins.py index 57509af6c..243ee93c6 100644 --- a/apps/common/mixins.py +++ b/apps/common/mixins.py @@ -99,9 +99,8 @@ class DatetimeSearchMixin: if date_from_s: date_from = timezone.datetime.strptime(date_from_s, self.date_format) - self.date_from = date_from.replace( - tzinfo=timezone.get_current_timezone() - ) + tz = timezone.get_current_timezone() + self.date_from = tz.localize(date_from) else: self.date_from = timezone.now() - timezone.timedelta(7) diff --git a/apps/common/templatetags/common_tags.py b/apps/common/templatetags/common_tags.py index 747868430..9123ecef8 100644 --- a/apps/common/templatetags/common_tags.py +++ b/apps/common/templatetags/common_tags.py @@ -73,17 +73,20 @@ def to_html(s): @register.filter def time_util_with_seconds(date_from, date_to): - if date_from and date_to: - delta = date_to - date_from - seconds = delta.seconds - if seconds < 60: - return '{} s'.format(seconds) - elif seconds < 60*60: - return '{} m'.format(seconds//60) - else: - return '{} h'.format(seconds//3600) - else: + if not date_from: return '' + if not date_to: + return '' + date_to = timezone.now() + + delta = date_to - date_from + seconds = delta.seconds + if seconds < 60: + return '{} s'.format(seconds) + elif seconds < 60*60: + return '{} m'.format(seconds//60) + else: + return '{} h'.format(seconds//3600) @register.filter diff --git a/apps/i18n/zh/LC_MESSAGES/django.mo b/apps/i18n/zh/LC_MESSAGES/django.mo index c38fdb5c9..c3c6b39c8 100644 Binary files a/apps/i18n/zh/LC_MESSAGES/django.mo and b/apps/i18n/zh/LC_MESSAGES/django.mo differ diff --git a/apps/i18n/zh/LC_MESSAGES/django.po b/apps/i18n/zh/LC_MESSAGES/django.po index 0a839e612..05acb43c3 100644 --- a/apps/i18n/zh/LC_MESSAGES/django.po +++ b/apps/i18n/zh/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Jumpserver 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-26 16:54+0800\n" +"POT-Creation-Date: 2018-03-06 17:57+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: Jumpserver team\n" @@ -17,12 +17,12 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: assets/api/node.py:54 +#: assets/api/node.py:55 msgid "New node {}" msgstr "新节点 {}" #: assets/forms/asset.py:23 assets/forms/asset.py:52 assets/forms/user.py:125 -#: assets/models/asset.py:45 assets/models/user.py:221 +#: assets/models/asset.py:53 assets/models/user.py:218 #: assets/templates/assets/asset_detail.html:181 #: assets/templates/assets/asset_detail.html:189 #: assets/templates/assets/system_user_detail.html:164 @@ -30,16 +30,16 @@ msgid "Nodes" msgstr "节点管理" #: assets/forms/asset.py:26 assets/forms/asset.py:55 assets/forms/asset.py:90 -#: assets/forms/asset.py:94 assets/models/asset.py:49 -#: assets/models/cluster.py:19 assets/models/user.py:190 -#: assets/templates/assets/asset_detail.html:73 templates/_nav.html:23 +#: assets/forms/asset.py:94 assets/models/asset.py:57 +#: assets/models/cluster.py:19 assets/models/user.py:187 +#: assets/templates/assets/asset_detail.html:73 templates/_nav.html:24 msgid "Admin user" msgstr "管理用户" -#: assets/forms/asset.py:29 assets/forms/asset.py:58 assets/models/asset.py:73 -#: assets/templates/assets/asset_create.html:31 +#: assets/forms/asset.py:29 assets/forms/asset.py:58 assets/models/asset.py:81 +#: assets/templates/assets/asset_create.html:32 #: assets/templates/assets/asset_detail.html:218 -#: assets/templates/assets/asset_update.html:36 templates/_nav.html:25 +#: assets/templates/assets/asset_update.html:37 templates/_nav.html:26 msgid "Labels" msgstr "标签管理" @@ -54,7 +54,7 @@ msgstr "管理用户是资产上已经存在的特权用户,如 root或者其 msgid "Select assets" msgstr "选择资产" -#: assets/forms/asset.py:86 assets/models/asset.py:44 +#: assets/forms/asset.py:86 assets/models/asset.py:52 #: assets/templates/assets/admin_user_assets.html:53 #: assets/templates/assets/asset_detail.html:69 #: assets/templates/assets/system_user_asset.html:51 @@ -62,7 +62,7 @@ msgstr "选择资产" msgid "Port" msgstr "端口" -#: assets/forms/asset.py:106 assets/templates/assets/asset_create.html:35 +#: assets/forms/asset.py:106 assets/templates/assets/asset_create.html:36 msgid "Select labels" msgstr "选择标签" @@ -70,11 +70,11 @@ msgstr "选择标签" msgid "Select nodes" msgstr "选择节点" -#: assets/forms/label.py:13 assets/models/asset.py:137 +#: assets/forms/label.py:13 assets/models/asset.py:153 #: assets/templates/assets/admin_user_list.html:24 #: assets/templates/assets/label_list.html:16 #: assets/templates/assets/system_user_list.html:26 perms/models.py:17 -#: terminal/backends/command/models.py:11 terminal/models.py:116 +#: terminal/backends/command/models.py:11 terminal/models.py:123 #: terminal/templates/terminal/command_list.html:40 #: terminal/templates/terminal/command_list.html:73 #: terminal/templates/terminal/session_list.html:41 @@ -84,10 +84,10 @@ msgstr "资产" #: assets/forms/user.py:24 msgid "Password or private key passphrase" -msgstr "密码或秘钥密码" +msgstr "密码或密钥密码" #: assets/forms/user.py:25 assets/models/user.py:30 common/forms.py:113 -#: users/forms.py:16 users/forms.py:24 users/templates/users/login.html:56 +#: users/forms.py:16 users/forms.py:24 users/templates/users/login.html:59 #: users/templates/users/reset_password.html:52 #: users/templates/users/user_create.html:11 #: users/templates/users/user_password_update.html:40 @@ -116,11 +116,11 @@ msgstr "密码和私钥, 必须输入一个" #: assets/templates/assets/system_user_detail.html:58 #: assets/templates/assets/system_user_list.html:24 common/models.py:26 #: common/templates/common/terminal_setting.html:67 -#: common/templates/common/terminal_setting.html:88 ops/models.py:31 +#: common/templates/common/terminal_setting.html:85 ops/models.py:31 #: ops/templates/ops/task_detail.html:56 ops/templates/ops/task_list.html:34 #: perms/models.py:14 perms/templates/perms/asset_permission_detail.html:62 -#: perms/templates/perms/asset_permission_user.html:54 terminal/models.py:15 -#: terminal/models.py:141 terminal/templates/terminal/terminal_detail.html:43 +#: perms/templates/perms/asset_permission_user.html:54 terminal/models.py:16 +#: terminal/models.py:149 terminal/templates/terminal/terminal_detail.html:43 #: terminal/templates/terminal/terminal_list.html:29 users/models/group.py:14 #: users/models/user.py:35 users/templates/users/_select_user_modal.html:13 #: users/templates/users/user_detail.html:63 @@ -138,9 +138,9 @@ msgstr "名称" #: assets/templates/assets/system_user_detail.html:62 #: assets/templates/assets/system_user_list.html:25 #: perms/templates/perms/asset_permission_user.html:55 users/forms.py:14 -#: users/models/authentication.py:44 users/models/user.py:34 +#: users/models/authentication.py:45 users/models/user.py:34 #: users/templates/users/_select_user_modal.html:14 -#: users/templates/users/login.html:53 +#: users/templates/users/login.html:56 #: users/templates/users/login_log_list.html:49 #: users/templates/users/user_detail.html:67 #: users/templates/users/user_list.html:24 @@ -162,10 +162,10 @@ msgid "" "than 2 system user" msgstr "高优先级的系统用户将会作为默认登录用户" -#: assets/models/asset.py:42 assets/templates/assets/_asset_list_modal.html:21 +#: assets/models/asset.py:50 assets/templates/assets/_asset_list_modal.html:21 #: assets/templates/assets/admin_user_assets.html:52 #: assets/templates/assets/asset_detail.html:61 -#: assets/templates/assets/asset_list.html:81 +#: assets/templates/assets/asset_list.html:87 #: assets/templates/assets/system_user_asset.html:50 #: assets/templates/assets/user_asset_list.html:20 common/forms.py:144 #: perms/templates/perms/asset_permission_asset.html:55 @@ -175,10 +175,10 @@ msgstr "高优先级的系统用户将会作为默认登录用户" msgid "IP" msgstr "IP" -#: assets/models/asset.py:43 assets/templates/assets/_asset_list_modal.html:20 +#: assets/models/asset.py:51 assets/templates/assets/_asset_list_modal.html:20 #: assets/templates/assets/admin_user_assets.html:51 #: assets/templates/assets/asset_detail.html:57 -#: assets/templates/assets/asset_list.html:80 +#: assets/templates/assets/asset_list.html:86 #: assets/templates/assets/system_user_asset.html:49 #: assets/templates/assets/user_asset_list.html:19 common/forms.py:143 #: perms/templates/perms/asset_permission_asset.html:54 @@ -187,77 +187,77 @@ msgstr "IP" msgid "Hostname" msgstr "主机名" -#: assets/models/asset.py:46 assets/models/label.py:20 +#: assets/models/asset.py:54 assets/models/label.py:20 #: assets/templates/assets/asset_detail.html:105 #: perms/templates/perms/asset_permission_list.html:70 msgid "Is active" msgstr "激活" -#: assets/models/asset.py:52 assets/templates/assets/asset_detail.html:65 +#: assets/models/asset.py:60 assets/templates/assets/asset_detail.html:65 msgid "Public IP" msgstr "公网IP" -#: assets/models/asset.py:53 assets/templates/assets/asset_detail.html:113 +#: assets/models/asset.py:61 assets/templates/assets/asset_detail.html:113 msgid "Asset number" msgstr "资产编号" -#: assets/models/asset.py:56 assets/templates/assets/asset_detail.html:77 +#: assets/models/asset.py:64 assets/templates/assets/asset_detail.html:77 msgid "Vendor" msgstr "制造商" -#: assets/models/asset.py:57 assets/templates/assets/asset_detail.html:81 +#: assets/models/asset.py:65 assets/templates/assets/asset_detail.html:81 msgid "Model" msgstr "型号" -#: assets/models/asset.py:58 assets/templates/assets/asset_detail.html:109 +#: assets/models/asset.py:66 assets/templates/assets/asset_detail.html:109 msgid "Serial number" msgstr "序列号" -#: assets/models/asset.py:60 +#: assets/models/asset.py:68 msgid "CPU model" msgstr "CPU型号" -#: assets/models/asset.py:61 +#: assets/models/asset.py:69 msgid "CPU count" msgstr "CPU数量" -#: assets/models/asset.py:62 +#: assets/models/asset.py:70 msgid "CPU cores" msgstr "CPU核数" -#: assets/models/asset.py:63 assets/templates/assets/asset_detail.html:89 +#: assets/models/asset.py:71 assets/templates/assets/asset_detail.html:89 msgid "Memory" msgstr "内存" -#: assets/models/asset.py:64 +#: assets/models/asset.py:72 msgid "Disk total" msgstr "硬盘大小" -#: assets/models/asset.py:65 +#: assets/models/asset.py:73 msgid "Disk info" msgstr "硬盘信息" -#: assets/models/asset.py:67 assets/templates/assets/asset_detail.html:97 +#: assets/models/asset.py:75 assets/templates/assets/asset_detail.html:97 msgid "Platform" msgstr "系统平台" -#: assets/models/asset.py:68 assets/templates/assets/asset_detail.html:101 +#: assets/models/asset.py:76 assets/templates/assets/asset_detail.html:101 msgid "OS" msgstr "操作系统" -#: assets/models/asset.py:69 +#: assets/models/asset.py:77 msgid "OS version" msgstr "系统版本" -#: assets/models/asset.py:70 +#: assets/models/asset.py:78 msgid "OS arch" msgstr "系统架构" -#: assets/models/asset.py:71 +#: assets/models/asset.py:79 msgid "Hostname raw" msgstr "主机名原始" -#: assets/models/asset.py:74 assets/models/cluster.py:28 +#: assets/models/asset.py:82 assets/models/cluster.py:28 #: assets/models/group.py:21 assets/models/user.py:36 #: assets/templates/assets/admin_user_detail.html:68 #: assets/templates/assets/asset_detail.html:117 @@ -268,7 +268,7 @@ msgstr "主机名原始" msgid "Created by" msgstr "创建者" -#: assets/models/asset.py:75 assets/models/cluster.py:26 +#: assets/models/asset.py:83 assets/models/cluster.py:26 #: assets/models/group.py:22 assets/models/label.py:23 #: assets/templates/assets/admin_user_detail.html:64 #: assets/templates/assets/system_user_detail.html:92 @@ -280,7 +280,7 @@ msgstr "创建者" msgid "Date created" msgstr "创建日期" -#: assets/models/asset.py:76 assets/models/cluster.py:29 +#: assets/models/asset.py:84 assets/models/cluster.py:29 #: assets/models/group.py:23 assets/models/label.py:21 assets/models/user.py:33 #: assets/templates/assets/admin_user_detail.html:72 #: assets/templates/assets/admin_user_list.html:28 @@ -288,7 +288,7 @@ msgstr "创建日期" #: assets/templates/assets/system_user_detail.html:100 #: assets/templates/assets/system_user_list.html:30 common/models.py:30 #: ops/models.py:37 perms/models.py:24 perms/models.py:81 -#: perms/templates/perms/asset_permission_detail.html:98 terminal/models.py:25 +#: perms/templates/perms/asset_permission_detail.html:98 terminal/models.py:26 #: terminal/templates/terminal/terminal_detail.html:63 users/models/group.py:15 #: users/models/user.py:47 users/templates/users/user_detail.html:111 #: users/templates/users/user_group_detail.html:67 @@ -331,7 +331,7 @@ msgid "Default" msgstr "默认" #: assets/models/cluster.py:36 assets/models/label.py:13 -#: users/models/user.py:261 +#: users/models/user.py:266 msgid "System" msgstr "系统" @@ -352,13 +352,14 @@ msgid "Default asset group" msgstr "默认资产组" #: assets/models/label.py:14 perms/models.py:15 -#: terminal/backends/command/models.py:10 terminal/models.py:115 +#: terminal/backends/command/models.py:10 terminal/models.py:122 #: terminal/templates/terminal/command_list.html:32 #: terminal/templates/terminal/command_list.html:72 #: terminal/templates/terminal/session_list.html:33 #: terminal/templates/terminal/session_list.html:71 users/forms.py:190 -#: users/models/user.py:30 users/templates/users/user_group_detail.html:78 -#: users/templates/users/user_group_list.html:13 users/views/user.py:330 +#: users/models/user.py:30 users/models/user.py:254 +#: users/templates/users/user_group_detail.html:78 +#: users/templates/users/user_group_list.html:13 users/views/user.py:333 msgid "User" msgstr "用户" @@ -383,32 +384,32 @@ msgstr "ssh密钥" msgid "SSH public key" msgstr "ssh公钥" -#: assets/models/user.py:222 +#: assets/models/user.py:219 msgid "Priority" msgstr "优先级" -#: assets/models/user.py:223 assets/templates/assets/system_user_detail.html:66 +#: assets/models/user.py:220 assets/templates/assets/system_user_detail.html:66 msgid "Protocol" msgstr "协议" -#: assets/models/user.py:224 assets/templates/assets/_system_user.html:58 +#: assets/models/user.py:221 assets/templates/assets/_system_user.html:58 #: assets/templates/assets/system_user_detail.html:118 #: assets/templates/assets/system_user_update.html:11 msgid "Auto push" msgstr "自动推送" -#: assets/models/user.py:225 assets/templates/assets/system_user_detail.html:70 +#: assets/models/user.py:222 assets/templates/assets/system_user_detail.html:70 msgid "Sudo" msgstr "Sudo" -#: assets/models/user.py:226 assets/templates/assets/system_user_detail.html:75 +#: assets/models/user.py:223 assets/templates/assets/system_user_detail.html:75 msgid "Shell" msgstr "Shell" -#: assets/models/user.py:269 perms/forms.py:25 perms/models.py:19 +#: assets/models/user.py:266 perms/forms.py:25 perms/models.py:19 #: perms/models.py:76 perms/templates/perms/asset_permission_detail.html:136 -#: perms/templates/perms/asset_permission_list.html:69 templates/_nav.html:24 -#: terminal/backends/command/models.py:12 terminal/models.py:117 +#: perms/templates/perms/asset_permission_list.html:69 templates/_nav.html:25 +#: terminal/backends/command/models.py:12 terminal/models.py:124 #: terminal/templates/terminal/command_list.html:48 #: terminal/templates/terminal/command_list.html:74 #: terminal/templates/terminal/session_list.html:49 @@ -463,7 +464,7 @@ msgstr "推送系统用户到节点: {}" #: assets/templates/assets/_asset_group_bulk_update_modal.html:5 msgid "Update asset group" -msgstr "编辑用户组" +msgstr "更新用户组" #: assets/templates/assets/_asset_group_bulk_update_modal.html:8 msgid "Hint: only change the field you want to update." @@ -474,12 +475,11 @@ msgstr "仅修改你需要更新的字段" #: assets/views/admin_user.py:29 assets/views/admin_user.py:47 #: assets/views/admin_user.py:63 assets/views/admin_user.py:78 #: assets/views/admin_user.py:102 assets/views/asset.py:48 -#: assets/views/asset.py:61 assets/views/asset.py:95 assets/views/asset.py:155 -#: assets/views/asset.py:172 assets/views/asset.py:196 assets/views/label.py:26 -#: assets/views/label.py:42 assets/views/label.py:58 -#: assets/views/system_user.py:28 assets/views/system_user.py:44 -#: assets/views/system_user.py:60 assets/views/system_user.py:74 -#: templates/_nav.html:19 +#: assets/views/asset.py:94 assets/views/asset.py:154 assets/views/asset.py:171 +#: assets/views/asset.py:195 assets/views/label.py:26 assets/views/label.py:42 +#: assets/views/label.py:58 assets/views/system_user.py:28 +#: assets/views/system_user.py:44 assets/views/system_user.py:60 +#: assets/views/system_user.py:74 templates/_nav.html:20 msgid "Assets" msgstr "资产管理" @@ -522,14 +522,14 @@ msgid "If set id, will use this id update asset existed" msgstr "如果设置了id,则会使用该行信息更新该id的资产" #: assets/templates/assets/_asset_list_modal.html:22 -#: assets/templates/assets/asset_list.html:82 +#: assets/templates/assets/asset_list.html:88 #: assets/templates/assets/user_asset_list.html:22 msgid "Hardware" msgstr "硬件" #: assets/templates/assets/_asset_list_modal.html:23 #: assets/templates/assets/asset_detail.html:143 -#: assets/templates/assets/asset_list.html:83 +#: assets/templates/assets/asset_list.html:89 #: assets/templates/assets/user_asset_list.html:23 perms/models.py:20 #: perms/models.py:77 #: perms/templates/perms/asset_permission_create_update.html:51 @@ -548,7 +548,7 @@ msgstr "激活中" #: assets/templates/assets/admin_user_assets.html:54 #: assets/templates/assets/admin_user_list.html:25 #: assets/templates/assets/asset_detail.html:357 -#: assets/templates/assets/asset_list.html:84 +#: assets/templates/assets/asset_list.html:90 #: assets/templates/assets/system_user_asset.html:52 #: assets/templates/assets/system_user_list.html:27 #: users/templates/users/user_granted_asset.html:47 @@ -558,13 +558,13 @@ msgstr "可连接" #: assets/templates/assets/_asset_list_modal.html:25 #: assets/templates/assets/admin_user_list.html:29 -#: assets/templates/assets/asset_list.html:85 +#: assets/templates/assets/asset_list.html:91 #: assets/templates/assets/label_list.html:17 #: assets/templates/assets/system_user_list.html:31 #: ops/templates/ops/adhoc_history.html:59 ops/templates/ops/task_adhoc.html:61 #: ops/templates/ops/task_history.html:62 ops/templates/ops/task_list.html:41 #: perms/templates/perms/asset_permission_list.html:72 -#: terminal/templates/terminal/session_list.html:79 +#: terminal/templates/terminal/session_list.html:80 #: terminal/templates/terminal/terminal_list.html:36 #: users/templates/users/user_group_list.html:15 #: users/templates/users/user_list.html:28 @@ -572,25 +572,25 @@ msgid "Action" msgstr "动作" #: assets/templates/assets/_asset_list_modal.html:34 -#: assets/templates/assets/asset_list.html:94 +#: assets/templates/assets/asset_list.html:100 #: users/templates/users/user_list.html:37 msgid "Delete selected" msgstr "批量删除" #: assets/templates/assets/_asset_list_modal.html:35 -#: assets/templates/assets/asset_list.html:95 +#: assets/templates/assets/asset_list.html:101 #: users/templates/users/user_list.html:38 msgid "Update selected" msgstr "批量更新" #: assets/templates/assets/_asset_list_modal.html:36 -#: assets/templates/assets/asset_list.html:97 +#: assets/templates/assets/asset_list.html:103 #: users/templates/users/user_list.html:39 msgid "Deactive selected" msgstr "禁用所选" #: assets/templates/assets/_asset_list_modal.html:37 -#: assets/templates/assets/asset_list.html:98 +#: assets/templates/assets/asset_list.html:104 #: users/templates/users/user_list.html:40 msgid "Active selected" msgstr "激活所选" @@ -599,16 +599,17 @@ msgstr "激活所选" #: assets/templates/assets/_system_user.html:71 #: assets/templates/assets/admin_user_create_update.html:46 #: assets/templates/assets/asset_bulk_update.html:24 -#: assets/templates/assets/asset_create.html:65 -#: assets/templates/assets/asset_list.html:102 -#: assets/templates/assets/asset_update.html:69 +#: assets/templates/assets/asset_create.html:66 +#: assets/templates/assets/asset_list.html:108 +#: assets/templates/assets/asset_update.html:70 #: assets/templates/assets/label_create_update.html:17 #: common/templates/common/basic_setting.html:59 #: common/templates/common/email_setting.html:60 #: common/templates/common/ldap_setting.html:60 -#: common/templates/common/terminal_setting.html:108 +#: common/templates/common/terminal_setting.html:103 #: perms/templates/perms/asset_permission_create_update.html:72 -#: terminal/templates/terminal/terminal_update.html:47 +#: terminal/templates/terminal/session_list.html:120 +#: terminal/templates/terminal/terminal_update.html:48 #: users/templates/users/_user.html:44 #: users/templates/users/first_login.html:62 #: users/templates/users/forgot_password.html:44 @@ -624,7 +625,7 @@ msgstr "提交" #: assets/templates/assets/admin_user_detail.html:24 #: assets/templates/assets/admin_user_list.html:84 #: assets/templates/assets/asset_detail.html:24 -#: assets/templates/assets/asset_list.html:160 +#: assets/templates/assets/asset_list.html:166 #: assets/templates/assets/label_list.html:38 #: assets/templates/assets/system_user_detail.html:26 #: assets/templates/assets/system_user_list.html:85 @@ -643,7 +644,7 @@ msgstr "更新" #: assets/templates/assets/admin_user_detail.html:28 #: assets/templates/assets/admin_user_list.html:85 #: assets/templates/assets/asset_detail.html:28 -#: assets/templates/assets/asset_list.html:161 +#: assets/templates/assets/asset_list.html:167 #: assets/templates/assets/label_list.html:39 #: assets/templates/assets/system_user_detail.html:30 #: assets/templates/assets/system_user_list.html:86 @@ -673,8 +674,8 @@ msgid "Basic" msgstr "基本" #: assets/templates/assets/_system_user.html:44 -#: assets/templates/assets/asset_create.html:23 -#: assets/templates/assets/asset_update.html:28 +#: assets/templates/assets/asset_create.html:24 +#: assets/templates/assets/asset_update.html:29 #: assets/templates/assets/system_user_update.html:7 #: users/templates/users/user_create.html:9 #: users/templates/users/user_update.html:6 @@ -683,28 +684,28 @@ msgstr "认证" #: assets/templates/assets/_system_user.html:47 msgid "Auto generate key" -msgstr "自动生成秘钥" +msgstr "自动生成密钥" #: assets/templates/assets/_system_user.html:64 -#: assets/templates/assets/asset_create.html:57 -#: assets/templates/assets/asset_update.html:61 +#: assets/templates/assets/asset_create.html:58 +#: assets/templates/assets/asset_update.html:62 #: perms/templates/perms/asset_permission_create_update.html:49 -#: terminal/templates/terminal/terminal_update.html:41 +#: terminal/templates/terminal/terminal_update.html:42 msgid "Other" msgstr "其它" #: assets/templates/assets/_system_user.html:70 #: assets/templates/assets/admin_user_create_update.html:45 #: assets/templates/assets/asset_bulk_update.html:23 -#: assets/templates/assets/asset_create.html:64 -#: assets/templates/assets/asset_update.html:68 +#: assets/templates/assets/asset_create.html:65 +#: assets/templates/assets/asset_update.html:69 #: assets/templates/assets/label_create_update.html:16 #: common/templates/common/basic_setting.html:58 #: common/templates/common/email_setting.html:59 #: common/templates/common/ldap_setting.html:59 -#: common/templates/common/terminal_setting.html:106 +#: common/templates/common/terminal_setting.html:101 #: perms/templates/perms/asset_permission_create_update.html:71 -#: terminal/templates/terminal/terminal_update.html:46 +#: terminal/templates/terminal/terminal_update.html:47 #: users/templates/users/_user.html:43 #: users/templates/users/user_bulk_update.html:23 #: users/templates/users/user_password_update.html:58 @@ -773,7 +774,7 @@ msgstr "替换资产的管理员" #: assets/templates/assets/admin_user_detail.html:100 #: assets/templates/assets/asset_detail.html:198 -#: assets/templates/assets/asset_list.html:482 +#: assets/templates/assets/asset_list.html:541 #: assets/templates/assets/system_user_detail.html:181 #: assets/templates/assets/system_user_list.html:135 templates/_modal.html:16 #: terminal/templates/terminal/session_detail.html:108 @@ -799,20 +800,20 @@ msgstr "不可达" msgid "Ratio" msgstr "比例" -#: assets/templates/assets/asset_create.html:27 -#: assets/templates/assets/asset_update.html:32 perms/models.py:74 +#: assets/templates/assets/asset_create.html:28 +#: assets/templates/assets/asset_update.html:33 perms/models.py:74 #: perms/templates/perms/asset_permission_create_update.html:40 #: perms/templates/perms/asset_permission_list.html:67 msgid "Node" msgstr "节点" -#: assets/templates/assets/asset_create.html:33 -#: assets/templates/assets/asset_list.html:69 -#: assets/templates/assets/asset_update.html:38 +#: assets/templates/assets/asset_create.html:34 +#: assets/templates/assets/asset_list.html:75 +#: assets/templates/assets/asset_update.html:39 msgid "Label" msgstr "标签" -#: assets/templates/assets/asset_detail.html:20 assets/views/asset.py:197 +#: assets/templates/assets/asset_detail.html:20 assets/views/asset.py:196 msgid "Asset detail" msgstr "资产详情" @@ -850,50 +851,50 @@ msgstr "刷新" msgid "Update successfully!" msgstr "更新成功" -#: assets/templates/assets/asset_list.html:57 -#: assets/templates/assets/asset_list.html:114 assets/views/asset.py:96 +#: assets/templates/assets/asset_list.html:63 +#: assets/templates/assets/asset_list.html:120 assets/views/asset.py:95 msgid "Create asset" msgstr "创建资产" -#: assets/templates/assets/asset_list.html:61 +#: assets/templates/assets/asset_list.html:67 #: users/templates/users/user_list.html:7 msgid "Import" msgstr "导入" -#: assets/templates/assets/asset_list.html:64 +#: assets/templates/assets/asset_list.html:70 #: users/templates/users/user_list.html:10 msgid "Export" msgstr "导出" -#: assets/templates/assets/asset_list.html:96 +#: assets/templates/assets/asset_list.html:102 msgid "Remove from this node" msgstr "从节点移除" -#: assets/templates/assets/asset_list.html:115 +#: assets/templates/assets/asset_list.html:121 msgid "Add asset" msgstr "添加资产到节点" -#: assets/templates/assets/asset_list.html:117 +#: assets/templates/assets/asset_list.html:123 msgid "Add node" msgstr "新建节点" -#: assets/templates/assets/asset_list.html:118 +#: assets/templates/assets/asset_list.html:124 msgid "Rename node" msgstr "重命名节点" -#: assets/templates/assets/asset_list.html:120 +#: assets/templates/assets/asset_list.html:126 msgid "Delete node" msgstr "删除节点" -#: assets/templates/assets/asset_list.html:195 +#: assets/templates/assets/asset_list.html:201 msgid "Create node failed" msgstr "创建节点失败" -#: assets/templates/assets/asset_list.html:208 +#: assets/templates/assets/asset_list.html:214 msgid "Have child node, cancel" msgstr "存在子节点,不能删除" -#: assets/templates/assets/asset_list.html:477 +#: assets/templates/assets/asset_list.html:536 #: assets/templates/assets/system_user_list.html:130 #: users/templates/users/user_detail.html:334 #: users/templates/users/user_detail.html:359 @@ -902,24 +903,24 @@ msgstr "存在子节点,不能删除" msgid "Are you sure?" msgstr "你确认吗?" -#: assets/templates/assets/asset_list.html:478 +#: assets/templates/assets/asset_list.html:537 msgid "This will delete the selected assets !!!" msgstr "删除选择资产" -#: assets/templates/assets/asset_list.html:486 +#: assets/templates/assets/asset_list.html:545 msgid "Asset Deleted." msgstr "已被删除" -#: assets/templates/assets/asset_list.html:487 -#: assets/templates/assets/asset_list.html:492 +#: assets/templates/assets/asset_list.html:546 +#: assets/templates/assets/asset_list.html:551 msgid "Asset Delete" msgstr "删除" -#: assets/templates/assets/asset_list.html:491 +#: assets/templates/assets/asset_list.html:550 msgid "Asset Deleting failed." msgstr "删除失败" -#: assets/templates/assets/asset_update.html:57 +#: assets/templates/assets/asset_update.html:58 msgid "Configuration" msgstr "配置" @@ -1011,17 +1012,21 @@ msgstr "更新管理用户" msgid "Admin user detail" msgstr "管理用户详情" -#: assets/views/asset.py:49 assets/views/asset.py:62 templates/_nav.html:22 +#: assets/views/asset.py:49 templates/_nav.html:23 msgid "Asset list" msgstr "资产列表" -#: assets/views/asset.py:156 +#: assets/views/asset.py:61 templates/_nav_user.html:4 +msgid "My assets" +msgstr "我的资产" + +#: assets/views/asset.py:155 msgid "Bulk update asset" msgstr "批量更新资产" -#: assets/views/asset.py:173 +#: assets/views/asset.py:172 msgid "Update asset" -msgstr "编辑资产" +msgstr "更新资产" #: assets/views/asset.py:296 msgid "already exists" @@ -1033,7 +1038,7 @@ msgstr "标签列表" #: assets/views/label.py:59 msgid "Update label" -msgstr "编辑标签" +msgstr "更新标签" #: assets/views/system_user.py:29 msgid "System user list" @@ -1192,10 +1197,10 @@ msgstr "密码认证" #: common/forms.py:156 msgid "Public key auth" -msgstr "秘钥认证" +msgstr "密钥认证" #: common/forms.py:159 common/templates/common/terminal_setting.html:63 -#: terminal/forms.py:21 terminal/models.py:19 +#: terminal/forms.py:30 terminal/models.py:20 msgid "Command storage" msgstr "命令存储" @@ -1205,8 +1210,8 @@ msgid "" "other storage and some terminal using" msgstr "设置终端命令存储,default是默认用的存储方式" -#: common/forms.py:165 common/templates/common/terminal_setting.html:84 -#: terminal/models.py:20 +#: common/forms.py:165 common/templates/common/terminal_setting.html:81 +#: terminal/forms.py:34 terminal/models.py:21 msgid "Replay storage" msgstr "录像存储" @@ -1263,19 +1268,13 @@ msgid "Test connection" msgstr "测试连接" #: common/templates/common/terminal_setting.html:68 -#: common/templates/common/terminal_setting.html:89 +#: common/templates/common/terminal_setting.html:86 #: users/templates/users/login_log_list.html:50 msgid "Type" msgstr "类型" -#: common/templates/common/terminal_setting.html:90 -#: users/templates/users/reset_password.html:57 -#: users/templates/users/user_profile.html:20 -msgid "Setting" -msgstr "设置" - #: common/views.py:20 common/views.py:46 common/views.py:72 common/views.py:102 -#: templates/_nav.html:66 +#: templates/_nav.html:72 msgid "Settings" msgstr "系统设置" @@ -1430,7 +1429,7 @@ msgstr "执行历史" #: ops/templates/ops/adhoc_history.html:52 #: ops/templates/ops/adhoc_history_detail.html:58 -#: ops/templates/ops/task_history.html:55 terminal/models.py:124 +#: ops/templates/ops/task_history.html:55 terminal/models.py:132 #: terminal/templates/terminal/session_list.html:77 msgid "Date start" msgstr "开始日期" @@ -1542,7 +1541,7 @@ msgstr "任务开始: " msgid "Ops" msgstr "作业中心" -#: ops/views.py:37 templates/_nav.html:52 +#: ops/views.py:37 templates/_nav.html:58 msgid "Task list" msgstr "任务列表" @@ -1551,8 +1550,9 @@ msgid "Task run history" msgstr "执行历史" #: perms/forms.py:22 perms/models.py:16 perms/models.py:75 -#: perms/templates/perms/asset_permission_list.html:68 templates/_nav.html:13 -#: users/models/user.py:37 users/templates/users/_select_user_modal.html:16 +#: perms/templates/perms/asset_permission_list.html:68 templates/_nav.html:14 +#: users/models/group.py:25 users/models/user.py:37 +#: users/templates/users/_select_user_modal.html:16 #: users/templates/users/user_detail.html:179 #: users/templates/users/user_list.html:26 msgid "User group" @@ -1566,7 +1566,7 @@ msgstr "用户组" msgid "Date expired" msgstr "失效日期" -#: perms/models.py:88 templates/_nav.html:32 +#: perms/models.py:88 templates/_nav.html:33 msgid "Asset permission" msgstr "资产授权" @@ -1660,7 +1660,7 @@ msgstr "添加用户组" msgid "Select user groups" msgstr "选择用户组" -#: perms/views.py:23 perms/views.py:47 perms/views.py:67 templates/_nav.html:29 +#: perms/views.py:23 perms/views.py:47 perms/views.py:67 templates/_nav.html:30 msgid "Perms" msgstr "权限管理" @@ -1677,37 +1677,41 @@ msgid "Update asset permission" msgstr "更新资产授权" #: templates/_header_bar.html:18 -msgid "Help" -msgstr "帮助" +msgid "Supports" +msgstr "商业支持" -#: templates/_header_bar.html:32 templates/_nav_user.html:9 +#: templates/_header_bar.html:23 +msgid "Docs" +msgstr "文档" + +#: templates/_header_bar.html:37 templates/_nav_user.html:9 #: users/templates/users/_user.html:36 #: users/templates/users/user_password_update.html:37 #: users/templates/users/user_profile.html:17 #: users/templates/users/user_profile_update.html:37 #: users/templates/users/user_profile_update.html:57 -#: users/templates/users/user_pubkey_update.html:37 users/views/user.py:313 +#: users/templates/users/user_pubkey_update.html:37 users/views/user.py:316 msgid "Profile" msgstr "个人信息" -#: templates/_header_bar.html:36 +#: templates/_header_bar.html:40 msgid "Admin page" msgstr "管理页面" -#: templates/_header_bar.html:38 +#: templates/_header_bar.html:42 msgid "User page" msgstr "用户页面" -#: templates/_header_bar.html:41 +#: templates/_header_bar.html:45 msgid "Logout" msgstr "注销登录" -#: templates/_header_bar.html:45 users/templates/users/login.html:42 -#: users/templates/users/login.html:61 +#: templates/_header_bar.html:49 users/templates/users/login.html:44 +#: users/templates/users/login.html:64 msgid "Login" msgstr "登录" -#: templates/_header_bar.html:58 templates/_nav.html:4 +#: templates/_header_bar.html:62 templates/_nav.html:4 msgid "Dashboard" msgstr "仪表盘" @@ -1733,7 +1737,7 @@ msgid "" " " msgstr "" "\n" -" 您的ssh秘钥没有设置或已失效,请点击
链接 更新\n" " " @@ -1741,39 +1745,43 @@ msgstr "" msgid "Close" msgstr "关闭" -#: templates/_nav.html:9 users/views/group.py:28 users/views/group.py:44 -#: users/views/group.py:62 users/views/group.py:79 users/views/login.py:200 -#: users/views/login.py:249 users/views/user.py:57 users/views/user.py:72 -#: users/views/user.py:91 users/views/user.py:147 users/views/user.py:300 -#: users/views/user.py:312 users/views/user.py:348 users/views/user.py:370 +#: templates/_nav.html:10 users/views/group.py:28 users/views/group.py:44 +#: users/views/group.py:62 users/views/group.py:79 users/views/group.py:95 +#: users/views/login.py:209 users/views/login.py:258 users/views/user.py:59 +#: users/views/user.py:74 users/views/user.py:93 users/views/user.py:149 +#: users/views/user.py:304 users/views/user.py:351 users/views/user.py:373 msgid "Users" msgstr "用户管理" -#: templates/_nav.html:12 users/views/user.py:58 +#: templates/_nav.html:13 users/views/user.py:60 msgid "User list" msgstr "用户列表" -#: templates/_nav.html:14 +#: templates/_nav.html:15 msgid "Login logs" msgstr "登录日志" -#: templates/_nav.html:38 +#: templates/_nav.html:39 msgid "Sessions" msgstr "会话管理" -#: templates/_nav.html:41 +#: templates/_nav.html:42 msgid "Session online" msgstr "在线会话" -#: templates/_nav.html:42 +#: templates/_nav.html:43 msgid "Session offline" msgstr "历史会话" -#: templates/_nav.html:43 +#: templates/_nav.html:44 msgid "Commands" msgstr "命令记录" -#: templates/_nav.html:44 terminal/templates/terminal/session_list.html:75 +#: templates/_nav.html:47 templates/_nav_user.html:14 +msgid "Web terminal" +msgstr "Web终端" + +#: templates/_nav.html:50 terminal/templates/terminal/session_list.html:75 #: terminal/views/command.py:47 terminal/views/session.py:75 #: terminal/views/session.py:92 terminal/views/session.py:114 #: terminal/views/terminal.py:31 terminal/views/terminal.py:46 @@ -1781,18 +1789,10 @@ msgstr "命令记录" msgid "Terminal" msgstr "终端管理" -#: templates/_nav.html:49 +#: templates/_nav.html:55 msgid "Job Center" msgstr "作业中心" -#: templates/_nav_user.html:4 -msgid "My assets" -msgstr "我的资产" - -#: templates/_nav_user.html:14 -msgid "Web terminal" -msgstr "Web终端" - #: templates/captcha/image.html:3 msgid "Play CAPTCHA as audio file" msgstr "语言播放验证码" @@ -1819,71 +1819,75 @@ msgstr "输出" msgid "Session" msgstr "会话" -#: terminal/forms.py:27 +#: terminal/forms.py:44 msgid "Coco ssh listen port" msgstr "SSH 监听端口" -#: terminal/forms.py:28 +#: terminal/forms.py:45 msgid "Coco http/ws listen port" msgstr "Http/Websocket 监听端口" -#: terminal/models.py:16 +#: terminal/models.py:17 msgid "Remote Address" msgstr "远端地址" -#: terminal/models.py:17 +#: terminal/models.py:18 msgid "SSH Port" msgstr "SSH端口" -#: terminal/models.py:18 +#: terminal/models.py:19 msgid "HTTP Port" msgstr "HTTP端口" -#: terminal/models.py:91 +#: terminal/models.py:98 msgid "Session Online" msgstr "在线会话" -#: terminal/models.py:92 +#: terminal/models.py:99 msgid "CPU Usage" msgstr "CPU使用" -#: terminal/models.py:93 +#: terminal/models.py:100 msgid "Memory Used" msgstr "内存使用" -#: terminal/models.py:94 +#: terminal/models.py:101 msgid "Connections" msgstr "连接数" -#: terminal/models.py:95 +#: terminal/models.py:102 msgid "Threads" msgstr "线程数" -#: terminal/models.py:96 +#: terminal/models.py:103 msgid "Boot Time" msgstr "运行时间" -#: terminal/models.py:119 terminal/templates/terminal/session_list.html:74 +#: terminal/models.py:126 terminal/templates/terminal/session_list.html:74 #: terminal/templates/terminal/terminal_detail.html:47 msgid "Remote addr" msgstr "远端地址" -#: terminal/models.py:121 terminal/templates/terminal/session_list.html:100 +#: terminal/models.py:128 terminal/templates/terminal/session_list.html:102 msgid "Replay" msgstr "回放" -#: terminal/models.py:122 terminal/templates/terminal/command_list.html:55 +#: terminal/models.py:129 terminal/templates/terminal/command_list.html:55 #: terminal/templates/terminal/command_list.html:71 #: terminal/templates/terminal/session_detail.html:48 #: terminal/templates/terminal/session_list.html:76 msgid "Command" msgstr "命令" -#: terminal/models.py:125 +#: terminal/models.py:131 +msgid "Date last active" +msgstr "最后活跃日期" + +#: terminal/models.py:133 msgid "Date end" msgstr "结束日期" -#: terminal/models.py:142 +#: terminal/models.py:150 msgid "Args" msgstr "参数" @@ -1922,19 +1926,25 @@ msgstr "监控" msgid "Terminate session" msgstr "终止会话" -#: terminal/templates/terminal/session_list.html:78 +#: terminal/templates/terminal/session_list.html:79 msgid "Duration" msgstr "时长" -#: terminal/templates/terminal/session_list.html:102 +#: terminal/templates/terminal/session_list.html:104 msgid "Monitor" msgstr "监控" -#: terminal/templates/terminal/session_list.html:103 +#: terminal/templates/terminal/session_list.html:105 msgid "Terminate" msgstr "终断" -#: terminal/templates/terminal/session_list.html:119 +#: terminal/templates/terminal/session_list.html:116 +#, fuzzy +#| msgid "Deactive selected" +msgid "Terminate selected" +msgstr "禁用所选" + +#: terminal/templates/terminal/session_list.html:136 msgid "Terminate task send, waiting ..." msgstr "终断任务已发送,请等待" @@ -2105,31 +2115,31 @@ msgstr "ssh密钥不合法" msgid "Select users" msgstr "选择用户" -#: users/models/authentication.py:35 +#: users/models/authentication.py:36 msgid "Private Token" msgstr "ssh密钥" -#: users/models/authentication.py:45 +#: users/models/authentication.py:46 msgid "Login type" msgstr "登录方式" -#: users/models/authentication.py:46 +#: users/models/authentication.py:47 msgid "Login ip" msgstr "登录IP" -#: users/models/authentication.py:47 +#: users/models/authentication.py:48 msgid "Login city" msgstr "登录城市" -#: users/models/authentication.py:48 +#: users/models/authentication.py:49 msgid "User agent" msgstr "Agent" -#: users/models/authentication.py:49 +#: users/models/authentication.py:50 msgid "Date login" msgstr "登录日期" -#: users/models/user.py:29 users/models/user.py:257 +#: users/models/user.py:29 users/models/user.py:262 msgid "Administrator" msgstr "管理员" @@ -2168,7 +2178,7 @@ msgstr "二次验证" msgid "Public key" msgstr "ssh公钥" -#: users/models/user.py:260 +#: users/models/user.py:265 msgid "Administrator is the super user of system" msgstr "Administrator是初始的超级管理员" @@ -2239,7 +2249,7 @@ msgid " for more information" msgstr "获取更多信息" #: users/templates/users/forgot_password.html:26 -#: users/templates/users/login.html:64 +#: users/templates/users/login.html:73 msgid "Forgot password" msgstr "忘记密码" @@ -2247,7 +2257,7 @@ msgstr "忘记密码" msgid "Input your email, that will send a mail to your" msgstr "输入您的邮箱, 将会发一封重置邮件到您的邮箱中" -#: users/templates/users/login.html:47 +#: users/templates/users/login.html:50 msgid "Captcha invalid" msgstr "验证码错误" @@ -2269,8 +2279,13 @@ msgstr "重置密码" msgid "Password again" msgstr "再次输入密码" +#: users/templates/users/reset_password.html:57 +#: users/templates/users/user_profile.html:20 +msgid "Setting" +msgstr "设置" + #: users/templates/users/user_create.html:4 -#: users/templates/users/user_list.html:16 users/views/user.py:72 +#: users/templates/users/user_list.html:16 users/views/user.py:74 msgid "Create user" msgstr "创建用户" @@ -2279,7 +2294,7 @@ msgid "Reset link will be generated and sent to the user. " msgstr "生成重置密码连接,通过邮件发送给用户" #: users/templates/users/user_detail.html:19 -#: users/templates/users/user_granted_asset.html:18 users/views/user.py:148 +#: users/templates/users/user_granted_asset.html:18 users/views/user.py:150 msgid "User detail" msgstr "用户详情" @@ -2320,7 +2335,7 @@ msgstr "将失效用户当前密码,并发送重设密码邮件到用户邮箱 msgid "" "The reset-ssh-public-key E-mail has been sent successfully. Please inform " "the user to update his new ssh public key." -msgstr "重设秘钥邮件将会发送到用户邮箱" +msgstr "重设密钥邮件将会发送到用户邮箱" #: users/templates/users/user_detail.html:350 #: users/templates/users/user_profile.html:140 @@ -2329,7 +2344,7 @@ msgstr "重置SSH密钥" #: users/templates/users/user_detail.html:360 msgid "This will reset the user public key and send a reset mail" -msgstr "将会失效用户当前秘钥,并发送重置邮件到用户邮箱" +msgstr "将会失效用户当前密钥,并发送重置邮件到用户邮箱" #: users/templates/users/user_detail.html:377 #: users/templates/users/user_profile.html:166 @@ -2351,7 +2366,7 @@ msgstr "取消" #: users/templates/users/user_group_granted_asset.html:18 #: users/views/group.py:80 msgid "User group detail" -msgstr "资产组详情" +msgstr "用户组详情" #: users/templates/users/user_group_detail.html:86 msgid "Add user" @@ -2399,8 +2414,8 @@ msgstr "用户删除失败" msgid "OTP" msgstr "" -#: users/templates/users/user_profile.html:100 users/views/user.py:177 -#: users/views/user.py:229 +#: users/templates/users/user_profile.html:100 users/views/user.py:179 +#: users/views/user.py:233 msgid "User groups" msgstr "用户组" @@ -2420,9 +2435,9 @@ msgstr "指纹" msgid "Update public key" msgstr "更新密钥" -#: users/templates/users/user_update.html:4 users/views/user.py:91 +#: users/templates/users/user_update.html:4 users/views/user.py:93 msgid "Update user" -msgstr "编辑用户" +msgstr "更新用户" #: users/utils.py:35 msgid "Create account successfully" @@ -2552,7 +2567,7 @@ msgstr "禁用或失效" #: users/utils.py:154 msgid "Password or SSH public key invalid" -msgstr "密码或秘钥不合法" +msgstr "密码或密钥不合法" #: users/views/group.py:29 msgid "User group list" @@ -2560,78 +2575,81 @@ msgstr "用户组列表" #: users/views/group.py:63 msgid "Update user group" -msgstr "编辑用户组" +msgstr "更新用户组" -#: users/views/login.py:56 +#: users/views/group.py:96 +msgid "User group granted asset" +msgstr "用户组授权资产" + +#: users/views/login.py:57 msgid "Please enable cookies and try again." msgstr "设置你的浏览器支持cookie" -#: users/views/login.py:90 +#: users/views/login.py:99 msgid "Logout success" msgstr "退出登录成功" -#: users/views/login.py:91 +#: users/views/login.py:100 msgid "Logout success, return login page" msgstr "退出登录成功,返回到登录页面" -#: users/views/login.py:107 +#: users/views/login.py:116 msgid "Email address invalid, please input again" msgstr "邮箱地址错误,重新输入" -#: users/views/login.py:120 +#: users/views/login.py:129 msgid "Send reset password message" msgstr "发送重置密码邮件" -#: users/views/login.py:121 +#: users/views/login.py:130 msgid "Send reset password mail success, login your mail box and follow it " msgstr "" "发送重置邮件成功, 请登录邮箱查看, 按照提示操作 (如果没收到,请等待3-5分钟)" -#: users/views/login.py:135 +#: users/views/login.py:144 msgid "Reset password success" msgstr "重置密码成功" -#: users/views/login.py:136 +#: users/views/login.py:145 msgid "Reset password success, return to login page" msgstr "重置密码成功,返回到登录页面" -#: users/views/login.py:153 users/views/login.py:166 +#: users/views/login.py:162 users/views/login.py:175 msgid "Token invalid or expired" msgstr "Token错误或失效" -#: users/views/login.py:162 +#: users/views/login.py:171 msgid "Password not same" msgstr "密码不一致" -#: users/views/login.py:200 +#: users/views/login.py:209 msgid "First login" msgstr "首次登陆" -#: users/views/login.py:250 +#: users/views/login.py:259 msgid "Login log list" msgstr "登录日志" -#: users/views/user.py:101 +#: users/views/user.py:103 msgid "Bulk update user success" msgstr "批量更新用户成功" -#: users/views/user.py:206 +#: users/views/user.py:208 msgid "Invalid file." msgstr "文件不合法" -#: users/views/user.py:301 +#: users/views/user.py:305 msgid "User granted assets" msgstr "用户授权资产" -#: users/views/user.py:331 +#: users/views/user.py:334 msgid "Profile setting" msgstr "个人信息设置" -#: users/views/user.py:349 +#: users/views/user.py:352 msgid "Password update" msgstr "密码更新" -#: users/views/user.py:371 +#: users/views/user.py:374 msgid "Public key update" -msgstr "秘钥更新" - +msgstr "密钥更新" diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py index 8151147d2..04fe210b2 100644 --- a/apps/jumpserver/settings.py +++ b/apps/jumpserver/settings.py @@ -397,6 +397,6 @@ BOOTSTRAP3 = { } TOKEN_EXPIRATION = CONFIG.TOKEN_EXPIRATION or 3600 -DISPLAY_PER_PAGE = CONFIG.DISPLAY_PER_PAGE +DISPLAY_PER_PAGE = CONFIG.DISPLAY_PER_PAGE or 25 DEFAULT_EXPIRED_YEARS = 70 USER_GUIDE_URL = "" diff --git a/apps/jumpserver/urls.py b/apps/jumpserver/urls.py index 2eb54d87d..986f9b0cb 100644 --- a/apps/jumpserver/urls.py +++ b/apps/jumpserver/urls.py @@ -4,16 +4,16 @@ from __future__ import unicode_literals from django.conf.urls import url, include from django.conf import settings from django.conf.urls.static import static -from django.views.static import serve as static_serve from rest_framework.schemas import get_schema_view from rest_framework_swagger.renderers import SwaggerUIRenderer, OpenAPIRenderer -from .views import IndexView +from .views import IndexView, LunaView schema_view = get_schema_view(title='Users API', renderer_classes=[OpenAPIRenderer, SwaggerUIRenderer]) urlpatterns = [ url(r'^$', IndexView.as_view(), name='index'), + url(r'^luna/$', LunaView.as_view(), name='luna-error'), url(r'^users/', include('users.urls.views_urls', namespace='users')), url(r'^assets/', include('assets.urls.views_urls', namespace='assets')), url(r'^perms/', include('perms.urls.views_urls', namespace='perms')), diff --git a/apps/jumpserver/views.py b/apps/jumpserver/views.py index 0ddba94bf..67fb725c5 100644 --- a/apps/jumpserver/views.py +++ b/apps/jumpserver/views.py @@ -1,4 +1,5 @@ -from django.views.generic import TemplateView +from django.http import HttpResponse +from django.views.generic import TemplateView, View from django.utils import timezone from django.db.models import Count from django.contrib.auth.mixins import LoginRequiredMixin @@ -45,7 +46,8 @@ class IndexView(LoginRequiredMixin, TemplateView): return self.session_week.values('user').distinct().count() def get_week_login_asset_count(self): - return self.session_week.values('asset').distinct().count() + return self.session_week.count() + # return self.session_week.values('asset').distinct().count() def get_month_day_metrics(self): month_str = [d.strftime('%m-%d') for d in self.session_month_dates] or ['0'] @@ -149,3 +151,12 @@ class IndexView(LoginRequiredMixin, TemplateView): kwargs.update(context) return super(IndexView, self).get_context_data(**kwargs) + + +class LunaView(View): + def get(self, request): + msg = """ + Luna是单独部署的一个程序,你需要部署luna,coco,配置nginx做url分发, + 如果你看到了这个页面,证明你访问的不是nginx监听的端口,祝你好运 + """ + return HttpResponse(msg) \ No newline at end of file diff --git a/apps/perms/api.py b/apps/perms/api.py index 958ee6838..6b0b15f76 100644 --- a/apps/perms/api.py +++ b/apps/perms/api.py @@ -54,7 +54,11 @@ class UserGrantedAssetsApi(ListAPIView): user = self.request.user for k, v in NodePermissionUtil.get_user_assets(user).items(): - k.system_users_granted = v + if k.is_unixlike(): + system_users_granted = [s for s in v if s.protocol == 'ssh'] + else: + system_users_granted = [s for s in v if s.protocol == 'rdp'] + k.system_users_granted = system_users_granted queryset.append(k) return queryset @@ -118,9 +122,16 @@ class UserGrantedNodesWithAssetsApi(ListAPIView): user = get_object_or_404(User, id=user_id) nodes = NodePermissionUtil.get_user_nodes_with_assets(user) + assets = {} + for k, v in NodePermissionUtil.get_user_assets(user).items(): + if k.is_unixlike(): + system_users_granted = [s for s in v if s.protocol == 'ssh'] + else: + system_users_granted = [s for s in v if s.protocol == 'rdp'] + assets[k] = system_users_granted for node, v in nodes.items(): for asset in v['assets']: - asset.system_users_granted = v['system_users'] + asset.system_users_granted = assets[asset] node.assets_granted = v['assets'] queryset.append(node) return queryset diff --git a/apps/perms/serializers.py b/apps/perms/serializers.py index cc65fc33e..6decf663b 100644 --- a/apps/perms/serializers.py +++ b/apps/perms/serializers.py @@ -12,7 +12,7 @@ class AssetPermissionCreateUpdateSerializer(serializers.ModelSerializer): class Meta: model = NodePermission fields = [ - 'node', 'user_group', 'system_user', + 'id', 'node', 'user_group', 'system_user', 'is_active', 'date_expired' ] diff --git a/apps/perms/templates/perms/asset_permission_create_update.html b/apps/perms/templates/perms/asset_permission_create_update.html index aafb650da..d02b354f5 100644 --- a/apps/perms/templates/perms/asset_permission_create_update.html +++ b/apps/perms/templates/perms/asset_permission_create_update.html @@ -14,7 +14,7 @@
-
{% trans 'Create asset permission ' %}
+
{{ action }}
diff --git a/apps/perms/templates/perms/asset_permission_list.html b/apps/perms/templates/perms/asset_permission_list.html index 9b1bd3875..fa9118dcd 100644 --- a/apps/perms/templates/perms/asset_permission_list.html +++ b/apps/perms/templates/perms/asset_permission_list.html @@ -215,16 +215,6 @@ $(document).ready(function(){ initTable(); initTree(); }) -.on('click', '.btn-create-asset', function () { - var url = "{% url 'assets:asset-create' %}"; - var nodes = zTree.getSelectedNodes(); - var current_node; - if (nodes && nodes.length ===1 ){ - current_node = nodes[0]; - url += "?node=" + current_node.id; - } - window.open(url); -}) .on('click', '.btn-del', function () { var $this = $(this); var uid = $this.data('uid'); @@ -241,7 +231,7 @@ $(document).ready(function(){ current_node = nodes[0]; url += "?node_id=" + current_node.id; } - window.open(url); + window.open(url, '_self'); }) diff --git a/apps/perms/utils.py b/apps/perms/utils.py index c067bbd11..7abf96352 100644 --- a/apps/perms/utils.py +++ b/apps/perms/utils.py @@ -56,7 +56,7 @@ class NodePermissionUtil: nodes_with_assets = dict() for node, system_users in nodes.items(): nodes_with_assets[node] = { - 'assets': node.get_assets(), + 'assets': node.get_active_assets(), 'system_users': system_users } return nodes_with_assets @@ -87,7 +87,7 @@ class NodePermissionUtil: nodes_with_assets = dict() for node, system_users in nodes.items(): nodes_with_assets[node] = { - 'assets': node.get_assets(), + 'assets': node.get_active_assets(), 'system_users': system_users } return nodes_with_assets diff --git a/apps/static/css/jumpserver.css b/apps/static/css/jumpserver.css index 947fae9a2..29e786eb3 100644 --- a/apps/static/css/jumpserver.css +++ b/apps/static/css/jumpserver.css @@ -427,3 +427,9 @@ div.dataTables_wrapper div.dataTables_filter { text-align: center; padding: 5px 0; } + +.profile-dropdown li a { + font-size: 12px !important; +} + + diff --git a/apps/static/css/style.css b/apps/static/css/style.css index c02935fb5..1bfc8ed34 100644 --- a/apps/static/css/style.css +++ b/apps/static/css/style.css @@ -3299,7 +3299,7 @@ body.tour-open .animated { border-bottom: 1px solid #e7eaec; } body { - font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-family: "open sans", "Helvetica Neue", "微软雅黑", Helvetica, Arial, sans-serif; background-color: #2f4050; font-size: 13px; color: #676a6c; diff --git a/apps/static/img/logo-text.png b/apps/static/img/logo-text.png index cb76b555a..9d532a285 100644 Binary files a/apps/static/img/logo-text.png and b/apps/static/img/logo-text.png differ diff --git a/apps/templates/_copyright.html b/apps/templates/_copyright.html new file mode 100644 index 000000000..ebff34379 --- /dev/null +++ b/apps/templates/_copyright.html @@ -0,0 +1 @@ +Copyright 北京堆栈科技有限公司 © 2014-2018 \ No newline at end of file diff --git a/apps/templates/_header_bar.html b/apps/templates/_header_bar.html index 74c0787c9..fba075e16 100644 --- a/apps/templates/_header_bar.html +++ b/apps/templates/_header_bar.html @@ -14,8 +14,13 @@ {# {% trans 'Welcome to use Jumpserver system' %}#} {# #} +
@@ -23,7 +23,7 @@

{{ assets_count }}

- All host + All hosts
@@ -36,7 +36,7 @@

{{ online_user_count }}

- Online user + Online users
@@ -57,7 +57,7 @@

活跃用户TOP5

- 过去一周共有{{ user_visit_count_weekly }}位用户登录{{ asset_visit_count_weekly }}次服务器. + 过去一周共有{{ user_visit_count_weekly }}位用户登录{{ asset_visit_count_weekly }}次资产.
    {% for data in user_visit_count_top_five %}
  • diff --git a/apps/terminal/forms.py b/apps/terminal/forms.py index a3672eeef..ab4520b03 100644 --- a/apps/terminal/forms.py +++ b/apps/terminal/forms.py @@ -25,18 +25,22 @@ def get_all_replay_storage(): class TerminalForm(forms.ModelForm): - command_storage = forms.ChoiceField(choices=get_all_command_storage(), - label=_("Command storage")) - replay_storage = forms.ChoiceField(choices=get_all_replay_storage(), - label=_("Replay storage")) + command_storage = forms.ChoiceField( + choices=get_all_command_storage(), + label=_("Command storage") + ) + replay_storage = forms.ChoiceField( + choices=get_all_replay_storage(), + label=_("Replay storage") + ) class Meta: model = Terminal - fields = ['name', 'remote_addr', 'ssh_port', 'http_port', 'comment', 'command_storage', 'replay_storage'] + fields = [ + 'name', 'remote_addr', 'ssh_port', 'http_port', 'comment', + 'command_storage', 'replay_storage', + ] help_texts = { 'ssh_port': _("Coco ssh listen port"), 'http_port': _("Coco http/ws listen port"), } - widgets = { - 'name': forms.TextInput(attrs={'readonly': 'readonly'}) - } diff --git a/apps/terminal/models.py b/apps/terminal/models.py index 23cb70f8e..c4ac25192 100644 --- a/apps/terminal/models.py +++ b/apps/terminal/models.py @@ -4,6 +4,7 @@ import uuid from django.db import models from django.utils.translation import ugettext_lazy as _ +from django.utils import timezone from django.conf import settings from users.models import User @@ -127,6 +128,7 @@ class Session(models.Model): has_replay = models.BooleanField(default=False, verbose_name=_("Replay")) has_command = models.BooleanField(default=False, verbose_name=_("Command")) terminal = models.ForeignKey(Terminal, null=True, on_delete=models.CASCADE) + date_last_active = models.DateTimeField(verbose_name=_("Date last active"), default=timezone.now) date_start = models.DateTimeField(verbose_name=_("Date start")) date_end = models.DateTimeField(verbose_name=_("Date end"), null=True) diff --git a/apps/terminal/tasks.py b/apps/terminal/tasks.py index ed404a54b..89f9cc5cc 100644 --- a/apps/terminal/tasks.py +++ b/apps/terminal/tasks.py @@ -1,20 +1,36 @@ # -*- coding: utf-8 -*- # +import datetime + from celery import shared_task +from django.utils import timezone + +from common.celery import register_as_period_task, after_app_ready_start, \ + after_app_shutdown_clean +from .models import Status, Session CACHE_REFRESH_INTERVAL = 10 RUNNING = False -# Todo: 定期清理上报history @shared_task -def clean_terminal_history(): - pass - - - - +@register_as_period_task(interval=3600) +@after_app_ready_start +@after_app_shutdown_clean +def delete_terminal_status_period(): + yesterday = timezone.now() - datetime.timedelta(days=3) + Status.objects.filter(date_created__lt=yesterday).delete() +@shared_task +@register_as_period_task(interval=3600) +@after_app_ready_start +@after_app_shutdown_clean +def clean_orphan_session(): + active_sessions = Session.objects.filter(is_finished=False) + for session in active_sessions: + if not session.terminal.is_active: + session.is_finished = True + session.save() diff --git a/apps/terminal/templates/terminal/session_list.html b/apps/terminal/templates/terminal/session_list.html index 3bf2600c8..b5168f8e4 100644 --- a/apps/terminal/templates/terminal/session_list.html +++ b/apps/terminal/templates/terminal/session_list.html @@ -75,6 +75,7 @@ {% trans 'Terminal' %} {% trans 'Command' %} {% trans 'Date start' %} +{# {% trans 'Date last active' %}#} {% trans 'Duration' %} {% trans 'Action' %} {% endblock %} @@ -94,6 +95,7 @@ {{ session.id | get_session_command_amount }} {{ session.date_start }} +{# {{ session.date_last_active }}#} {{ session.date_start|time_util_with_seconds:session.date_end }} {% if session.is_finished %} @@ -107,6 +109,21 @@ {% endfor %} {% endblock %} +{% block content_bottom_left %} +
    +
    + +
    + +
    +
    +
    +{% endblock %} + {% block custom_foot_js %}