From 75319b99ae4ed55214243240ba6d36c5bdcc94f9 Mon Sep 17 00:00:00 2001 From: ibuler Date: Sun, 25 Mar 2018 21:47:29 +0800 Subject: [PATCH] =?UTF-8?q?[Update]=20=E6=9B=B4=E6=96=B0ap=E8=AF=B7?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/api/domain.py | 19 ++- apps/assets/models/domain.py | 13 ++ apps/assets/serializers/asset.py | 2 +- apps/assets/serializers/domain.py | 21 +++ apps/i18n/zh/LC_MESSAGES/django.mo | Bin 30144 -> 30239 bytes apps/i18n/zh/LC_MESSAGES/django.po | 204 ++++++++++++++--------------- apps/ops/inventory.py | 5 +- jms | 11 +- 8 files changed, 159 insertions(+), 116 deletions(-) diff --git a/apps/assets/api/domain.py b/apps/assets/api/domain.py index 6d1c085af..5114b5561 100644 --- a/apps/assets/api/domain.py +++ b/apps/assets/api/domain.py @@ -1,13 +1,13 @@ # ~*~ coding: utf-8 ~*~ from rest_framework_bulk import BulkModelViewSet -from rest_framework.views import APIView -from rest_framework.views import Response +from rest_framework.views import APIView, Response +from rest_framework.generics import RetrieveAPIView from django.views.generic.detail import SingleObjectMixin from common.utils import get_logger -from ..hands import IsSuperUser +from ..hands import IsSuperUser, IsSuperUserOrAppUser from ..models import Domain, Gateway from ..utils import test_gateway_connectability from .. import serializers @@ -22,6 +22,16 @@ class DomainViewSet(BulkModelViewSet): permission_classes = (IsSuperUser,) serializer_class = serializers.DomainSerializer + def get_serializer_class(self): + if self.request.query_params.get('gateway'): + return serializers.DomainWithGatewaySerializer + return super().get_serializer_class() + + def get_permissions(self): + if self.request.query_params.get('gateway'): + self.permission_classes = (IsSuperUserOrAppUser,) + return super().get_permissions() + class GatewayViewSet(BulkModelViewSet): filter_fields = ("domain",) @@ -43,6 +53,3 @@ class GatewayTestConnectionApi(SingleObjectMixin, APIView): return Response("ok") else: return Response({"failed": e}, status=404) - - - diff --git a/apps/assets/models/domain.py b/apps/assets/models/domain.py index d7227f081..6f29a0381 100644 --- a/apps/assets/models/domain.py +++ b/apps/assets/models/domain.py @@ -2,6 +2,8 @@ # import uuid +import random + from django.db import models from django.utils.translation import ugettext_lazy as _ @@ -20,6 +22,16 @@ class Domain(models.Model): def __str__(self): return self.name + def has_gateway(self): + return self.gateway_set.filter(is_active=True).exists() + + @property + def gateways(self): + return self.gateway_set.filter(is_active=True) + + def random_gateway(self): + return random.choice(self.gateways) + class Gateway(AssetUser): SSH_PROTOCOL = 'ssh' @@ -37,3 +49,4 @@ class Gateway(AssetUser): def __str__(self): return self.name + diff --git a/apps/assets/serializers/asset.py b/apps/assets/serializers/asset.py index e479a7149..bcb3b81b1 100644 --- a/apps/assets/serializers/asset.py +++ b/apps/assets/serializers/asset.py @@ -38,7 +38,7 @@ class AssetGrantedSerializer(serializers.ModelSerializer): model = Asset fields = ( "id", "hostname", "ip", "port", "system_users_granted", - "is_active", "system_users_join", "os", + "is_active", "system_users_join", "os", 'domain', "platform", "comment" ) diff --git a/apps/assets/serializers/domain.py b/apps/assets/serializers/domain.py index 14dc7b40f..034c29387 100644 --- a/apps/assets/serializers/domain.py +++ b/apps/assets/serializers/domain.py @@ -26,4 +26,25 @@ class GatewaySerializer(serializers.ModelSerializer): class Meta: model = Gateway + fields = [ + 'id', 'name', 'ip', 'port', 'protocol', 'username', + 'domain', 'is_active', 'date_created', 'date_updated', + 'created_by', 'comment', + ] + + +class GatewayWithAuthSerializer(GatewaySerializer): + def get_field_names(self, declared_fields, info): + fields = super().get_field_names(declared_fields, info) + fields.extend( + ['password', 'private_key'] + ) + return fields + + +class DomainWithGatewaySerializer(serializers.ModelSerializer): + gateways = GatewayWithAuthSerializer(many=True, read_only=True) + + class Meta: + model = Domain fields = '__all__' diff --git a/apps/i18n/zh/LC_MESSAGES/django.mo b/apps/i18n/zh/LC_MESSAGES/django.mo index c61b8a8089d8646d2f9ad511033006208dce84e9..da9fcf171523f8a8a892810b7222767dd1e8c87c 100644 GIT binary patch delta 10590 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\n" "Language-Team: Jumpserver team\n" @@ -29,28 +29,33 @@ msgstr "" msgid "测试节点下资产是否可连接: {}" msgstr "" -#: assets/forms/asset.py:23 assets/forms/asset.py:54 assets/models/asset.py:52 +#: assets/forms/asset.py:24 assets/forms/asset.py:60 assets/models/asset.py:53 #: assets/models/user.py:102 assets/templates/assets/asset_detail.html:183 #: assets/templates/assets/asset_detail.html:191 #: assets/templates/assets/system_user_detail.html:166 msgid "Nodes" msgstr "节点管理" -#: assets/forms/asset.py:26 assets/forms/asset.py:57 assets/forms/asset.py:93 -#: assets/forms/asset.py:97 assets/models/asset.py:56 +#: assets/forms/asset.py:27 assets/forms/asset.py:63 assets/forms/asset.py:103 +#: assets/forms/asset.py:107 assets/models/asset.py:57 #: assets/models/cluster.py:19 assets/models/user.py:71 #: assets/templates/assets/asset_detail.html:73 templates/_nav.html:25 msgid "Admin user" msgstr "管理用户" -#: assets/forms/asset.py:29 assets/forms/asset.py:60 assets/models/asset.py:80 -#: assets/templates/assets/asset_create.html:32 +#: assets/forms/asset.py:30 assets/forms/asset.py:66 assets/models/asset.py:81 +#: assets/templates/assets/asset_create.html:33 #: assets/templates/assets/asset_detail.html:220 -#: assets/templates/assets/asset_update.html:37 templates/_nav.html:27 +#: assets/templates/assets/asset_update.html:38 templates/_nav.html:27 msgid "Labels" msgstr "标签管理" -#: assets/forms/asset.py:38 assets/forms/asset.py:70 +#: assets/forms/asset.py:34 assets/forms/asset.py:70 assets/models/asset.py:52 +#: assets/models/domain.py:34 +msgid "Domain" +msgstr "网域" + +#: assets/forms/asset.py:42 assets/forms/asset.py:79 msgid "" "root or other NOPASSWD sudo privilege user existed in asset,If asset is " "windows or other set any one, more see admin user left menu" @@ -58,17 +63,22 @@ msgstr "" "root或其他拥有NOPASSWD: ALL权限的用户, 如果是windows或其它硬件可以随意设置一" "个, 更多信息查看左侧 `管理用户` 菜单" -#: assets/forms/asset.py:41 assets/forms/asset.py:73 +#: assets/forms/asset.py:45 assets/forms/asset.py:82 msgid "* required Must set exact system platform, Windows, Linux ..." msgstr "* required 必须准确设置操作系统平台,如Windows, Linux ..." -#: assets/forms/asset.py:80 assets/forms/asset.py:84 assets/forms/domain.py:16 +#: assets/forms/asset.py:46 assets/forms/asset.py:83 +msgid "" +"If your have some network not connect with each other, you can set domain" +msgstr "" + +#: assets/forms/asset.py:90 assets/forms/asset.py:94 assets/forms/domain.py:16 #: assets/forms/label.py:15 #: perms/templates/perms/asset_permission_asset.html:88 users/forms.py:270 msgid "Select assets" msgstr "选择资产" -#: assets/forms/asset.py:89 assets/models/asset.py:50 +#: assets/forms/asset.py:99 assets/models/asset.py:51 #: assets/models/domain.py:32 assets/templates/assets/admin_user_assets.html:53 #: assets/templates/assets/asset_detail.html:69 #: assets/templates/assets/domain_gateway_list.html:58 @@ -77,16 +87,16 @@ msgstr "选择资产" msgid "Port" msgstr "端口" -#: assets/forms/asset.py:109 assets/templates/assets/asset_create.html:36 +#: assets/forms/asset.py:119 assets/templates/assets/asset_create.html:37 msgid "Select labels" msgstr "选择标签" -#: assets/forms/asset.py:112 assets/templates/assets/admin_user_detail.html:91 +#: assets/forms/asset.py:122 assets/templates/assets/admin_user_detail.html:91 msgid "Select nodes" msgstr "选择节点" #: assets/forms/domain.py:14 assets/forms/label.py:13 -#: assets/models/asset.py:152 assets/templates/assets/admin_user_list.html:25 +#: assets/models/asset.py:156 assets/templates/assets/admin_user_list.html:25 #: assets/templates/assets/domain_detail.html:60 #: assets/templates/assets/domain_list.html:15 #: assets/templates/assets/label_list.html:16 @@ -99,7 +109,7 @@ msgstr "选择节点" msgid "Asset" msgstr "资产" -#: assets/forms/domain.py:46 assets/forms/user.py:79 assets/forms/user.py:120 +#: assets/forms/domain.py:54 assets/forms/user.py:79 assets/forms/user.py:120 #: assets/models/base.py:20 assets/models/cluster.py:18 #: assets/models/domain.py:15 assets/models/group.py:20 #: assets/models/label.py:17 assets/templates/assets/admin_user_detail.html:56 @@ -127,7 +137,7 @@ msgstr "资产" msgid "Name" msgstr "名称" -#: assets/forms/domain.py:47 assets/forms/user.py:80 assets/forms/user.py:121 +#: assets/forms/domain.py:55 assets/forms/user.py:80 assets/forms/user.py:121 #: assets/models/base.py:21 assets/templates/assets/admin_user_detail.html:60 #: assets/templates/assets/admin_user_list.html:24 #: assets/templates/assets/domain_gateway_list.html:60 @@ -180,7 +190,7 @@ msgid "" "than 2 system user" msgstr "高优先级的系统用户将会作为默认登录用户" -#: assets/models/asset.py:48 assets/models/domain.py:31 +#: assets/models/asset.py:49 assets/models/domain.py:31 #: assets/templates/assets/_asset_list_modal.html:21 #: assets/templates/assets/admin_user_assets.html:52 #: assets/templates/assets/asset_detail.html:61 @@ -195,7 +205,7 @@ msgstr "高优先级的系统用户将会作为默认登录用户" msgid "IP" msgstr "IP" -#: assets/models/asset.py:49 assets/templates/assets/_asset_list_modal.html:20 +#: assets/models/asset.py:50 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:86 @@ -207,81 +217,77 @@ msgstr "IP" msgid "Hostname" msgstr "主机名" -#: assets/models/asset.py:51 assets/models/domain.py:34 -msgid "Domain" -msgstr "网域" - -#: assets/models/asset.py:53 assets/models/domain.py:36 +#: assets/models/asset.py:54 assets/models/domain.py:36 #: 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:59 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:60 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:63 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:64 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:65 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:67 +#: assets/models/asset.py:68 msgid "CPU model" msgstr "CPU型号" -#: assets/models/asset.py:68 +#: assets/models/asset.py:69 msgid "CPU count" msgstr "CPU数量" -#: assets/models/asset.py:69 +#: assets/models/asset.py:70 msgid "CPU cores" msgstr "CPU核数" -#: assets/models/asset.py:70 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:71 +#: assets/models/asset.py:72 msgid "Disk total" msgstr "硬盘大小" -#: assets/models/asset.py:72 +#: assets/models/asset.py:73 msgid "Disk info" msgstr "硬盘信息" -#: assets/models/asset.py:74 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:75 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:76 +#: assets/models/asset.py:77 msgid "OS version" msgstr "系统版本" -#: assets/models/asset.py:77 +#: assets/models/asset.py:78 msgid "OS arch" msgstr "系统架构" -#: assets/models/asset.py:78 +#: assets/models/asset.py:79 msgid "Hostname raw" msgstr "主机名原始" -#: assets/models/asset.py:81 assets/models/base.py:28 +#: assets/models/asset.py:82 assets/models/base.py:28 #: assets/models/cluster.py:28 assets/models/group.py:21 #: assets/templates/assets/admin_user_detail.html:68 #: assets/templates/assets/asset_detail.html:117 @@ -293,7 +299,7 @@ msgstr "主机名原始" msgid "Created by" msgstr "创建者" -#: assets/models/asset.py:82 assets/models/cluster.py:26 +#: assets/models/asset.py:83 assets/models/cluster.py:26 #: assets/models/domain.py:18 assets/models/group.py:22 #: assets/models/label.py:23 assets/templates/assets/admin_user_detail.html:64 #: assets/templates/assets/domain_detail.html:68 @@ -306,7 +312,7 @@ msgstr "创建者" msgid "Date created" msgstr "创建日期" -#: assets/models/asset.py:83 assets/models/base.py:25 +#: assets/models/asset.py:84 assets/models/base.py:25 #: assets/models/cluster.py:29 assets/models/domain.py:16 #: assets/models/domain.py:35 assets/models/group.py:23 #: assets/models/label.py:21 assets/templates/assets/admin_user_detail.html:72 @@ -455,39 +461,39 @@ msgstr "系统用户" msgid "%(value)s is not an even number" msgstr "%(value)s is not an even number" -#: assets/tasks.py:95 assets/tasks.py:112 +#: assets/tasks.py:96 assets/tasks.py:113 msgid "更新资产硬件信息" msgstr "" -#: assets/tasks.py:131 +#: assets/tasks.py:132 msgid "定期更新资产硬件信息" msgstr "" -#: assets/tasks.py:209 +#: assets/tasks.py:210 msgid "定期测试管理账号可连接性: {}" msgstr "" -#: assets/tasks.py:216 +#: assets/tasks.py:217 msgid "测试管理行号可连接性: {}" msgstr "" -#: assets/tasks.py:226 +#: assets/tasks.py:227 msgid "测试资产可连接性" msgstr "" -#: assets/tasks.py:296 +#: assets/tasks.py:297 msgid "Test system user connectability: {}" msgstr "测试系统用户可连接性: {}" -#: assets/tasks.py:312 +#: assets/tasks.py:313 msgid "定期测试系统用户可连接性: {}" msgstr "" -#: assets/tasks.py:391 +#: assets/tasks.py:392 msgid "推送系统用户到节点资产: {} => {}" msgstr "" -#: assets/tasks.py:430 +#: assets/tasks.py:431 msgid "推送节点系统用户到新加入资产中: {}" msgstr "" @@ -505,12 +511,14 @@ msgstr "仅修改你需要更新的字段" #: 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: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 assets/views/vpc.py:29 assets/views/vpc.py:45 -#: assets/views/vpc.py:61 assets/views/vpc.py:74 assets/views/vpc.py:98 -#: assets/views/vpc.py:126 assets/views/vpc.py:145 templates/_nav.html:20 +#: assets/views/asset.py:195 assets/views/domain.py:29 +#: assets/views/domain.py:45 assets/views/domain.py:61 +#: assets/views/domain.py:74 assets/views/domain.py:98 +#: assets/views/domain.py:126 assets/views/domain.py:150 +#: 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 "资产管理" @@ -632,9 +640,9 @@ 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:66 +#: assets/templates/assets/asset_create.html:67 #: assets/templates/assets/asset_list.html:108 -#: assets/templates/assets/asset_update.html:70 +#: assets/templates/assets/asset_update.html:71 #: assets/templates/assets/domain_create_update.html:17 #: assets/templates/assets/gateway_create_update.html:59 #: assets/templates/assets/label_create_update.html:17 @@ -714,8 +722,8 @@ msgid "Basic" msgstr "基本" #: assets/templates/assets/_system_user.html:44 -#: assets/templates/assets/asset_create.html:24 -#: assets/templates/assets/asset_update.html:29 +#: assets/templates/assets/asset_create.html:25 +#: assets/templates/assets/asset_update.html:30 #: assets/templates/assets/gateway_create_update.html:45 #: assets/templates/assets/system_user_update.html:7 #: users/templates/users/user_create.html:9 @@ -728,8 +736,8 @@ msgid "Auto generate key" msgstr "自动生成密钥" #: assets/templates/assets/_system_user.html:64 -#: assets/templates/assets/asset_create.html:58 -#: assets/templates/assets/asset_update.html:62 +#: assets/templates/assets/asset_create.html:59 +#: assets/templates/assets/asset_update.html:63 #: assets/templates/assets/gateway_create_update.html:53 #: perms/templates/perms/asset_permission_create_update.html:49 #: terminal/templates/terminal/terminal_update.html:42 @@ -739,8 +747,8 @@ 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:65 -#: assets/templates/assets/asset_update.html:69 +#: assets/templates/assets/asset_create.html:66 +#: assets/templates/assets/asset_update.html:70 #: assets/templates/assets/domain_create_update.html:16 #: assets/templates/assets/gateway_create_update.html:58 #: assets/templates/assets/label_create_update.html:16 @@ -845,16 +853,16 @@ msgstr "不可达" msgid "Ratio" msgstr "比例" -#: assets/templates/assets/asset_create.html:28 -#: assets/templates/assets/asset_update.html:33 perms/models.py:74 +#: assets/templates/assets/asset_create.html:29 +#: assets/templates/assets/asset_update.html:34 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:34 +#: assets/templates/assets/asset_create.html:35 #: assets/templates/assets/asset_list.html:75 -#: assets/templates/assets/asset_update.html:39 +#: assets/templates/assets/asset_update.html:40 msgid "Label" msgstr "标签" @@ -973,7 +981,7 @@ msgstr "删除" msgid "Asset Deleting failed." msgstr "删除失败" -#: assets/templates/assets/asset_update.html:58 +#: assets/templates/assets/asset_update.html:59 msgid "Configuration" msgstr "配置" @@ -998,7 +1006,8 @@ msgstr "网关" msgid "Gateway list" msgstr "网关列表" -#: assets/templates/assets/domain_gateway_list.html:48 assets/views/vpc.py:127 +#: assets/templates/assets/domain_gateway_list.html:48 +#: assets/views/domain.py:127 msgid "Create gateway" msgstr "创建网关" @@ -1008,7 +1017,7 @@ msgstr "创建网关" msgid "Test connection" msgstr "测试连接" -#: assets/templates/assets/domain_list.html:6 assets/views/vpc.py:46 +#: assets/templates/assets/domain_list.html:6 assets/views/domain.py:46 msgid "Create domain" msgstr "创建网域" @@ -1115,6 +1124,26 @@ msgstr "更新资产" msgid "already exists" msgstr "已经存在" +#: assets/views/domain.py:30 templates/_nav.html:24 +msgid "Domain list" +msgstr "网域列表" + +#: assets/views/domain.py:62 +msgid "Update domain" +msgstr "更新网域" + +#: assets/views/domain.py:75 +msgid "Domain detail" +msgstr "网域详情" + +#: assets/views/domain.py:99 +msgid "Domain gateway list" +msgstr "域网关列表" + +#: assets/views/domain.py:151 +msgid "Update gateway" +msgstr "创建网关" + #: assets/views/label.py:27 msgid "Label list" msgstr "标签列表" @@ -1143,32 +1172,6 @@ msgstr "资产管理" msgid "System user asset" msgstr "系统用户集群资产" -#: assets/views/vpc.py:30 -#, fuzzy -#| msgid "Domain list" -msgid "domain list" -msgstr "网域列表" - -#: assets/views/vpc.py:62 -msgid "Update domain" -msgstr "更新网域" - -#: assets/views/vpc.py:75 -#, fuzzy -#| msgid "Domain detail" -msgid "domain detail" -msgstr "网域详情" - -#: assets/views/vpc.py:99 -#, fuzzy -#| msgid "Domain gateway list" -msgid "domain gateway list" -msgstr "域网关列表" - -#: assets/views/vpc.py:146 -msgid "Update gateway" -msgstr "创建网关" - #: common/api.py:19 msgid "Test mail sent to {}, please check" msgstr "邮件已经发送{}, 请检查" @@ -1861,10 +1864,6 @@ msgstr "用户列表" msgid "Login logs" msgstr "登录日志" -#: templates/_nav.html:24 -msgid "Domain list" -msgstr "网域列表" - #: templates/_nav.html:40 msgid "Sessions" msgstr "会话管理" @@ -2778,3 +2777,4 @@ msgstr "密码更新" #: users/views/user.py:375 msgid "Public key update" msgstr "密钥更新" + diff --git a/apps/ops/inventory.py b/apps/ops/inventory.py index 2f75700c1..6e3d6325c 100644 --- a/apps/ops/inventory.py +++ b/apps/ops/inventory.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- # -import random from .ansible.inventory import BaseInventory from assets.utils import get_assets_by_hostname_list, get_system_user_by_name @@ -11,7 +10,7 @@ __all__ = [ def make_proxy_command(asset): - gateway = random.choice(asset.domain.gateway_set.filter(is_active=True)) + gateway = asset.domain.random_gateway() proxy_command = [ "ssh", "-p", str(gateway.port), @@ -49,7 +48,7 @@ class JMSInventory(BaseInventory): info = asset.to_json() info["vars"] = vars - if asset.domain and asset.domain.gateway_set.count(): + if asset.domain and asset.domain.has_gateway(): vars.update(make_proxy_command(asset)) info.update(vars) diff --git a/jms b/jms index 08505cc17..ea48ab6a7 100755 --- a/jms +++ b/jms @@ -82,7 +82,10 @@ def get_pid(service): pid_file = get_pid_file_path(service) if os.path.isfile(pid_file): with open(pid_file) as f: - return int(f.read().strip()) + try: + return int(f.read().strip()) + except ValueError: + return 0 return 0 @@ -282,9 +285,9 @@ if __name__ == '__main__': parser = argparse.ArgumentParser( description=""" Jumpserver service control tools; - - Example: \r\n - + + Example: \r\n + %(prog)s start all -d; """ )