diff --git a/apps/assets/models/__init__.py b/apps/assets/models/__init__.py
index b87a18796..e1fbf6f8e 100644
--- a/apps/assets/models/__init__.py
+++ b/apps/assets/models/__init__.py
@@ -1,10 +1,10 @@
-from .user import *
+from .asset import *
from .label import Label
+from .user import *
from .cluster import *
from .group import *
from .domain import *
from .node import *
-from .asset import *
from .cmd_filter import *
-from .utils import *
from .authbook import *
+from .utils import *
diff --git a/apps/assets/models/asset.py b/apps/assets/models/asset.py
index 1e72d2614..f0ea3f6f6 100644
--- a/apps/assets/models/asset.py
+++ b/apps/assets/models/asset.py
@@ -12,8 +12,8 @@ from django.utils.translation import ugettext_lazy as _
from django.core.validators import MinValueValidator, MaxValueValidator
from .user import AdminUser, SystemUser
+from .utils import Connectivity
from orgs.mixins import OrgModelMixin, OrgManager
-from ..utils import Connectivity
__all__ = ['Asset', 'Protocol']
logger = logging.getLogger(__name__)
diff --git a/apps/assets/models/authbook.py b/apps/assets/models/authbook.py
index ba676c309..85cb22606 100644
--- a/apps/assets/models/authbook.py
+++ b/apps/assets/models/authbook.py
@@ -5,7 +5,6 @@ from django.db import models
from django.utils.translation import ugettext_lazy as _
from orgs.mixins import OrgManager
-from ..utils import Connectivity
from .base import AssetUser
__all__ = ['AuthBook']
@@ -72,8 +71,6 @@ class AuthBook(AssetUser):
@property
def connectivity(self):
- if self._connectivity:
- return self._connectivity
return self.get_asset_connectivity(self.asset)
@property
diff --git a/apps/assets/models/base.py b/apps/assets/models/base.py
index 5b9aeddde..d99bc982a 100644
--- a/apps/assets/models/base.py
+++ b/apps/assets/models/base.py
@@ -6,7 +6,6 @@ from hashlib import md5
import sshpubkeys
from django.db import models
-from django.core.cache import cache
from django.utils.translation import ugettext_lazy as _
from django.conf import settings
@@ -16,9 +15,7 @@ from common.utils import (
from common.validators import alphanumeric
from common import fields
from orgs.mixins import OrgModelMixin
-from .utils import private_key_validator
-from ..utils import Connectivity
-from .. import const
+from .utils import private_key_validator, Connectivity
signer = get_signer()
@@ -167,12 +164,12 @@ class AssetUser(OrgModelMixin):
def get_asset_connectivity(self, asset):
i = self.generate_id_with_asset(asset)
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):
i = self.generate_id_with_asset(asset)
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):
from ..backends import AssetUserManager
@@ -225,17 +222,24 @@ class AssetUser(OrgModelMixin):
}
def generate_id_with_asset(self, asset):
- i = '{}_{}'.format(asset.id, self.id)
- i = uuid.UUID(md5(i.encode()).hexdigest())
- return i
+ user_id = str(self.id).split('-')[:3]
+ asset_id = str(asset.id).split('-')[3:]
+ ids = user_id + asset_id
+ return '-'.join(ids)
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)
- self.id = i
- self.asset = asset
- self.version = 0
- self.is_latest = True
- return self
+ obj = AuthBook(id=i, asset=asset, version=0, is_latest=True)
+ for field in fields:
+ value = getattr(self, field)
+ setattr(obj, field, value)
+ return obj
class Meta:
abstract = True
diff --git a/apps/assets/models/utils.py b/apps/assets/models/utils.py
index 11d347685..1f5b630bd 100644
--- a/apps/assets/models/utils.py
+++ b/apps/assets/models/utils.py
@@ -2,11 +2,17 @@
# -*- coding: utf-8 -*-
#
+from django.utils import timezone
+from django.core.cache import cache
from django.core.exceptions import ValidationError
+from django.utils.translation import ugettext_lazy as _
+
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():
@@ -31,5 +37,63 @@ def private_key_validator(value):
)
-if __name__ == '__main__':
- pass
+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):
+ 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
diff --git a/apps/assets/serializers/admin_user.py b/apps/assets/serializers/admin_user.py
index 142f5169a..581e810b7 100644
--- a/apps/assets/serializers/admin_user.py
+++ b/apps/assets/serializers/admin_user.py
@@ -23,24 +23,19 @@ class AdminUserSerializer(BulkOrgResourceModelSerializer):
list_serializer_class = AdaptedBulkListSerializer
model = AdminUser
fields = [
- 'id', 'name', 'username', 'assets_amount',
- 'reachable_amount', 'unreachable_amount', 'password', 'comment',
- 'date_created', 'date_updated', 'become', 'become_method',
- 'become_user', 'created_by',
+ 'id', 'name', 'username', 'password', 'comment',
+ 'connectivity_amount', 'assets_amount',
+ 'date_created', 'date_updated', 'created_by',
]
extra_kwargs = {
- 'date_created': {'label': _('Date created')},
- 'date_updated': {'label': _('Date updated')},
- 'become': {'read_only': True}, 'become_method': {'read_only': True},
- 'become_user': {'read_only': True}, 'created_by': {'read_only': True},
- 'assets_amount': {'label', _('Asset')}
+ 'date_created': {'read_only': True},
+ 'date_updated': {'read_only': True},
+ 'created_by': {'read_only': True},
+ '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):
diff --git a/apps/assets/tasks.py b/apps/assets/tasks.py
index 01271be96..8e7924e71 100644
--- a/apps/assets/tasks.py
+++ b/apps/assets/tasks.py
@@ -16,8 +16,8 @@ from ops.celery.decorator import (
)
from .models import SystemUser, AdminUser
+from .models.utils import Connectivity
from . import const
-from .utils import Connectivity
FORKS = 10
diff --git a/apps/assets/templates/assets/admin_user_list.html b/apps/assets/templates/assets/admin_user_list.html
index 4f4356539..d5383a0f6 100644
--- a/apps/assets/templates/assets/admin_user_list.html
+++ b/apps/assets/templates/assets/admin_user_list.html
@@ -75,27 +75,29 @@ function initTable() {
}},
{targets: 4, createdCell: function (td, cellData) {
var innerHtml = "";
- if (cellData !== 0) {
- innerHtml = "" + cellData + "";
+ var data = cellData['reachable'];
+ if (data !== 0) {
+ innerHtml = "" + data + "";
} else {
- innerHtml = "" + cellData + "";
+ innerHtml = "" + data + "";
}
- $(td).html('' + innerHtml + '');
+ $(td).html('' + innerHtml + '');
}},
{targets: 5, createdCell: function (td, cellData) {
+ var data = cellData['unreachable'];
var innerHtml = "";
- if (cellData !== 0) {
- innerHtml = "" + cellData + "";
+ if (data !== 0) {
+ innerHtml = "" + data + "";
} else {
- innerHtml = "" + cellData + "";
+ innerHtml = "" + data + "";
}
- $(td).html('' + innerHtml + '');
+ $(td).html('' + innerHtml + '');
}},
{targets: 6, createdCell: function (td, cellData, rowData) {
var val = 0;
var innerHtml = "";
var total = rowData.assets_amount;
- var reachable = rowData.reachable_amount;
+ var reachable = cellData.reachable;
if (total !== 0) {
val = reachable/total * 100;
}
@@ -114,8 +116,11 @@ function initTable() {
$(td).html(update_btn + del_btn)
}}],
ajax_url: '{% url "api-assets:admin-user-list" %}',
- columns: [{data: function(){return ""}}, {data: "name"}, {data: "username" }, {data: "assets_amount" },
- {data: "reachable_amount"}, {data: "unreachable_amount"}, {data: "id"}, {data: "comment"}, {data: "id"}]
+ columns: [
+ {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);
return admin_user_table
diff --git a/apps/assets/utils.py b/apps/assets/utils.py
index cd022a9aa..a796e210e 100644
--- a/apps/assets/utils.py
+++ b/apps/assets/utils.py
@@ -5,7 +5,7 @@ from django.core.cache import cache
from django.utils import timezone
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):
@@ -47,60 +47,4 @@ class LabelFilter:
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