mirror of https://github.com/jumpserver/jumpserver
[Update] 修改connectivity
parent
9dd951dd0d
commit
63216addf6
|
@ -1,10 +1,10 @@
|
||||||
from .user import *
|
from .asset import *
|
||||||
from .label import Label
|
from .label import Label
|
||||||
|
from .user import *
|
||||||
from .cluster import *
|
from .cluster import *
|
||||||
from .group import *
|
from .group import *
|
||||||
from .domain import *
|
from .domain import *
|
||||||
from .node import *
|
from .node import *
|
||||||
from .asset import *
|
|
||||||
from .cmd_filter import *
|
from .cmd_filter import *
|
||||||
from .utils import *
|
|
||||||
from .authbook import *
|
from .authbook import *
|
||||||
|
from .utils import *
|
||||||
|
|
|
@ -12,8 +12,8 @@ from django.utils.translation import ugettext_lazy as _
|
||||||
from django.core.validators import MinValueValidator, MaxValueValidator
|
from django.core.validators import MinValueValidator, MaxValueValidator
|
||||||
|
|
||||||
from .user import AdminUser, SystemUser
|
from .user import AdminUser, SystemUser
|
||||||
|
from .utils import Connectivity
|
||||||
from orgs.mixins import OrgModelMixin, OrgManager
|
from orgs.mixins import OrgModelMixin, OrgManager
|
||||||
from ..utils import Connectivity
|
|
||||||
|
|
||||||
__all__ = ['Asset', 'Protocol']
|
__all__ = ['Asset', 'Protocol']
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
|
@ -5,7 +5,6 @@ from django.db import models
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from orgs.mixins import OrgManager
|
from orgs.mixins import OrgManager
|
||||||
from ..utils import Connectivity
|
|
||||||
from .base import AssetUser
|
from .base import AssetUser
|
||||||
|
|
||||||
__all__ = ['AuthBook']
|
__all__ = ['AuthBook']
|
||||||
|
@ -72,8 +71,6 @@ class AuthBook(AssetUser):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def connectivity(self):
|
def connectivity(self):
|
||||||
if self._connectivity:
|
|
||||||
return self._connectivity
|
|
||||||
return self.get_asset_connectivity(self.asset)
|
return self.get_asset_connectivity(self.asset)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|
|
@ -6,7 +6,6 @@ from hashlib import md5
|
||||||
|
|
||||||
import sshpubkeys
|
import sshpubkeys
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.core.cache import cache
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
|
@ -16,9 +15,7 @@ from common.utils import (
|
||||||
from common.validators import alphanumeric
|
from common.validators import alphanumeric
|
||||||
from common import fields
|
from common import fields
|
||||||
from orgs.mixins import OrgModelMixin
|
from orgs.mixins import OrgModelMixin
|
||||||
from .utils import private_key_validator
|
from .utils import private_key_validator, Connectivity
|
||||||
from ..utils import Connectivity
|
|
||||||
from .. import const
|
|
||||||
|
|
||||||
signer = get_signer()
|
signer = get_signer()
|
||||||
|
|
||||||
|
@ -167,12 +164,12 @@ class AssetUser(OrgModelMixin):
|
||||||
def get_asset_connectivity(self, asset):
|
def get_asset_connectivity(self, asset):
|
||||||
i = self.generate_id_with_asset(asset)
|
i = self.generate_id_with_asset(asset)
|
||||||
key = self.CONNECTIVITY_ASSET_CACHE_KEY.format(i)
|
key = self.CONNECTIVITY_ASSET_CACHE_KEY.format(i)
|
||||||
return cache.get(key, const.CONN_UNKNOWN)
|
return Connectivity.get(key)
|
||||||
|
|
||||||
def set_asset_connectivity(self, asset, c):
|
def set_asset_connectivity(self, asset, c):
|
||||||
i = self.generate_id_with_asset(asset)
|
i = self.generate_id_with_asset(asset)
|
||||||
key = self.CONNECTIVITY_ASSET_CACHE_KEY.format(i)
|
key = self.CONNECTIVITY_ASSET_CACHE_KEY.format(i)
|
||||||
cache.set(key, c, 3600)
|
Connectivity.set(key, c, 3600)
|
||||||
|
|
||||||
def load_specific_asset_auth(self, asset):
|
def load_specific_asset_auth(self, asset):
|
||||||
from ..backends import AssetUserManager
|
from ..backends import AssetUserManager
|
||||||
|
@ -225,17 +222,24 @@ class AssetUser(OrgModelMixin):
|
||||||
}
|
}
|
||||||
|
|
||||||
def generate_id_with_asset(self, asset):
|
def generate_id_with_asset(self, asset):
|
||||||
i = '{}_{}'.format(asset.id, self.id)
|
user_id = str(self.id).split('-')[:3]
|
||||||
i = uuid.UUID(md5(i.encode()).hexdigest())
|
asset_id = str(asset.id).split('-')[3:]
|
||||||
return i
|
ids = user_id + asset_id
|
||||||
|
return '-'.join(ids)
|
||||||
|
|
||||||
def construct_to_authbook(self, asset):
|
def construct_to_authbook(self, asset):
|
||||||
|
from . import AuthBook
|
||||||
|
fields = [
|
||||||
|
'name', 'username', 'comment', 'org_id',
|
||||||
|
'_password', '_private_key', '_public_key',
|
||||||
|
'date_created', 'date_updated', 'created_by'
|
||||||
|
]
|
||||||
i = self.generate_id_with_asset(asset)
|
i = self.generate_id_with_asset(asset)
|
||||||
self.id = i
|
obj = AuthBook(id=i, asset=asset, version=0, is_latest=True)
|
||||||
self.asset = asset
|
for field in fields:
|
||||||
self.version = 0
|
value = getattr(self, field)
|
||||||
self.is_latest = True
|
setattr(obj, field, value)
|
||||||
return self
|
return obj
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
abstract = True
|
abstract = True
|
||||||
|
|
|
@ -2,11 +2,17 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#
|
#
|
||||||
|
|
||||||
|
from django.utils import timezone
|
||||||
|
from django.core.cache import cache
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from common.utils import validate_ssh_private_key
|
from common.utils import validate_ssh_private_key
|
||||||
|
|
||||||
|
|
||||||
__all__ = ['init_model', 'generate_fake']
|
__all__ = [
|
||||||
|
'init_model', 'generate_fake', 'private_key_validator', 'Connectivity',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def init_model():
|
def init_model():
|
||||||
|
@ -31,5 +37,63 @@ def private_key_validator(value):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
class Connectivity:
|
||||||
pass
|
UNREACHABLE, REACHABLE, UNKNOWN = range(0, 3)
|
||||||
|
CONNECTIVITY_CHOICES = (
|
||||||
|
(UNREACHABLE, _("Unreachable")),
|
||||||
|
(REACHABLE, _('Reachable')),
|
||||||
|
(UNKNOWN, _("Unknown")),
|
||||||
|
)
|
||||||
|
|
||||||
|
value = UNKNOWN
|
||||||
|
datetime = timezone.now()
|
||||||
|
|
||||||
|
def __init__(self, value, datetime):
|
||||||
|
self.value = value
|
||||||
|
self.datetime = datetime
|
||||||
|
|
||||||
|
def display(self):
|
||||||
|
return dict(self.__class__.CONNECTIVITY_CHOICES).get(self.value)
|
||||||
|
|
||||||
|
def is_reachable(self):
|
||||||
|
return self.value == self.REACHABLE
|
||||||
|
|
||||||
|
def is_unreachable(self):
|
||||||
|
return self.value == self.UNREACHABLE
|
||||||
|
|
||||||
|
def is_unknown(self):
|
||||||
|
return self.value == self.UNKNOWN
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def unreachable(cls):
|
||||||
|
return cls(cls.UNREACHABLE, timezone.now())
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def reachable(cls):
|
||||||
|
return cls(cls.REACHABLE, timezone.now())
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def unknown(cls):
|
||||||
|
return cls(cls.UNKNOWN, timezone.now())
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def set(cls, key, value, ttl=0):
|
||||||
|
cache.set(key, value, ttl)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get(cls, key):
|
||||||
|
value = cache.get(key, cls.unknown())
|
||||||
|
if not isinstance(value, cls):
|
||||||
|
value = cls.unknown()
|
||||||
|
return value
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def set_unreachable(cls, key, ttl=0):
|
||||||
|
cls.set(key, cls.unreachable(), ttl)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def set_reachable(cls, key, ttl=0):
|
||||||
|
cls.set(key, cls.reachable(), ttl)
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return self.value == other.value
|
||||||
|
|
|
@ -23,24 +23,19 @@ class AdminUserSerializer(BulkOrgResourceModelSerializer):
|
||||||
list_serializer_class = AdaptedBulkListSerializer
|
list_serializer_class = AdaptedBulkListSerializer
|
||||||
model = AdminUser
|
model = AdminUser
|
||||||
fields = [
|
fields = [
|
||||||
'id', 'name', 'username', 'assets_amount',
|
'id', 'name', 'username', 'password', 'comment',
|
||||||
'reachable_amount', 'unreachable_amount', 'password', 'comment',
|
'connectivity_amount', 'assets_amount',
|
||||||
'date_created', 'date_updated', 'become', 'become_method',
|
'date_created', 'date_updated', 'created_by',
|
||||||
'become_user', 'created_by',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
extra_kwargs = {
|
extra_kwargs = {
|
||||||
'date_created': {'label': _('Date created')},
|
'date_created': {'read_only': True},
|
||||||
'date_updated': {'label': _('Date updated')},
|
'date_updated': {'read_only': True},
|
||||||
'become': {'read_only': True}, 'become_method': {'read_only': True},
|
'created_by': {'read_only': True},
|
||||||
'become_user': {'read_only': True}, 'created_by': {'read_only': True},
|
'assets_amount': {'label': _('Asset')},
|
||||||
'assets_amount': {'label', _('Asset')}
|
'connectivity_amount': {'label': _('Connectivity')},
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_field_names(self, declared_fields, info):
|
|
||||||
fields = super().get_field_names(declared_fields, info)
|
|
||||||
return [f for f in fields if not f.startswith('_')]
|
|
||||||
|
|
||||||
|
|
||||||
class AdminUserAuthSerializer(AuthSerializer):
|
class AdminUserAuthSerializer(AuthSerializer):
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,8 @@ from ops.celery.decorator import (
|
||||||
)
|
)
|
||||||
|
|
||||||
from .models import SystemUser, AdminUser
|
from .models import SystemUser, AdminUser
|
||||||
|
from .models.utils import Connectivity
|
||||||
from . import const
|
from . import const
|
||||||
from .utils import Connectivity
|
|
||||||
|
|
||||||
|
|
||||||
FORKS = 10
|
FORKS = 10
|
||||||
|
|
|
@ -75,27 +75,29 @@ function initTable() {
|
||||||
}},
|
}},
|
||||||
{targets: 4, createdCell: function (td, cellData) {
|
{targets: 4, createdCell: function (td, cellData) {
|
||||||
var innerHtml = "";
|
var innerHtml = "";
|
||||||
if (cellData !== 0) {
|
var data = cellData['reachable'];
|
||||||
innerHtml = "<span class='text-navy'>" + cellData + "</span>";
|
if (data !== 0) {
|
||||||
|
innerHtml = "<span class='text-navy'>" + data + "</span>";
|
||||||
} else {
|
} else {
|
||||||
innerHtml = "<span>" + cellData + "</span>";
|
innerHtml = "<span>" + data + "</span>";
|
||||||
}
|
}
|
||||||
$(td).html('<span href="javascript:void(0);" data-toggle="tooltip" title="' + cellData +'">' + innerHtml + '</span>');
|
$(td).html('<span href="javascript:void(0);" data-toggle="tooltip" title="' + data +'">' + innerHtml + '</span>');
|
||||||
}},
|
}},
|
||||||
{targets: 5, createdCell: function (td, cellData) {
|
{targets: 5, createdCell: function (td, cellData) {
|
||||||
|
var data = cellData['unreachable'];
|
||||||
var innerHtml = "";
|
var innerHtml = "";
|
||||||
if (cellData !== 0) {
|
if (data !== 0) {
|
||||||
innerHtml = "<span class='text-danger'>" + cellData + "</span>";
|
innerHtml = "<span class='text-danger'>" + data + "</span>";
|
||||||
} else {
|
} else {
|
||||||
innerHtml = "<span>" + cellData + "</span>";
|
innerHtml = "<span>" + data + "</span>";
|
||||||
}
|
}
|
||||||
$(td).html('<span href="javascript:void(0);" data-toggle="tooltip" title="' + cellData + '">' + innerHtml + '</span>');
|
$(td).html('<span href="javascript:void(0);" data-toggle="tooltip" title="' + data + '">' + innerHtml + '</span>');
|
||||||
}},
|
}},
|
||||||
{targets: 6, createdCell: function (td, cellData, rowData) {
|
{targets: 6, createdCell: function (td, cellData, rowData) {
|
||||||
var val = 0;
|
var val = 0;
|
||||||
var innerHtml = "";
|
var innerHtml = "";
|
||||||
var total = rowData.assets_amount;
|
var total = rowData.assets_amount;
|
||||||
var reachable = rowData.reachable_amount;
|
var reachable = cellData.reachable;
|
||||||
if (total !== 0) {
|
if (total !== 0) {
|
||||||
val = reachable/total * 100;
|
val = reachable/total * 100;
|
||||||
}
|
}
|
||||||
|
@ -114,8 +116,11 @@ function initTable() {
|
||||||
$(td).html(update_btn + del_btn)
|
$(td).html(update_btn + del_btn)
|
||||||
}}],
|
}}],
|
||||||
ajax_url: '{% url "api-assets:admin-user-list" %}',
|
ajax_url: '{% url "api-assets:admin-user-list" %}',
|
||||||
columns: [{data: function(){return ""}}, {data: "name"}, {data: "username" }, {data: "assets_amount" },
|
columns: [
|
||||||
{data: "reachable_amount"}, {data: "unreachable_amount"}, {data: "id"}, {data: "comment"}, {data: "id"}]
|
{data: function(){return ""}}, {data: "name"}, {data: "username" }, {data: "assets_amount" },
|
||||||
|
{data: "connectivity_amount"}, {data: "connectivity_amount"}, {data: "connectivity_amount"},
|
||||||
|
{data: "comment"}, {data: "id"}
|
||||||
|
]
|
||||||
};
|
};
|
||||||
admin_user_table = jumpserver.initServerSideDataTable(options);
|
admin_user_table = jumpserver.initServerSideDataTable(options);
|
||||||
return admin_user_table
|
return admin_user_table
|
||||||
|
|
|
@ -5,7 +5,7 @@ from django.core.cache import cache
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
|
||||||
from common.utils import get_object_or_none
|
from common.utils import get_object_or_none
|
||||||
from .models import Asset, SystemUser, Label
|
from .models import SystemUser, Label
|
||||||
|
|
||||||
|
|
||||||
def get_assets_by_id_list(id_list):
|
def get_assets_by_id_list(id_list):
|
||||||
|
@ -47,60 +47,4 @@ class LabelFilter:
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
class Connectivity:
|
|
||||||
UNREACHABLE, REACHABLE, UNKNOWN = range(0, 3)
|
|
||||||
CONNECTIVITY_CHOICES = (
|
|
||||||
(UNREACHABLE, _("Unreachable")),
|
|
||||||
(REACHABLE, _('Reachable')),
|
|
||||||
(UNKNOWN, _("Unknown")),
|
|
||||||
)
|
|
||||||
|
|
||||||
value = UNKNOWN
|
|
||||||
datetime = timezone.now()
|
|
||||||
|
|
||||||
def __init__(self, value, datetime):
|
|
||||||
self.value = value
|
|
||||||
self.datetime = datetime
|
|
||||||
|
|
||||||
def display(self):
|
|
||||||
return dict(self.__class__.CONNECTIVITY_CHOICES).get(self.value)
|
|
||||||
|
|
||||||
def is_reachable(self):
|
|
||||||
return self.value == self.REACHABLE
|
|
||||||
|
|
||||||
def is_unreachable(self):
|
|
||||||
return self.value == self.UNREACHABLE
|
|
||||||
|
|
||||||
def is_unknown(self):
|
|
||||||
return self.value == self.UNKNOWN
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def unreachable(cls):
|
|
||||||
return cls(cls.UNREACHABLE, timezone.now())
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def reachable(cls):
|
|
||||||
return cls(cls.REACHABLE, timezone.now())
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def unknown(cls):
|
|
||||||
return cls(cls.UNKNOWN, timezone.now())
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def set(cls, key, value, ttl=0):
|
|
||||||
cache.set(key, value, ttl)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def get(cls, key):
|
|
||||||
return cache.get(key, cls.UNKNOWN)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def set_unreachable(cls, key, ttl=0):
|
|
||||||
cls.set(key, cls.unreachable(), ttl)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def set_reachable(cls, key, ttl=0):
|
|
||||||
cls.set(key, cls.reachable(), ttl)
|
|
||||||
|
|
||||||
def __eq__(self, other):
|
|
||||||
return self.value == other.value
|
|
||||||
|
|
Loading…
Reference in New Issue