mirror of https://github.com/jumpserver/jumpserver
pref: 资产的硬件信息可以更改
parent
0facd8a25e
commit
8761ed741c
|
@ -164,38 +164,7 @@ class Platform(models.Model):
|
||||||
# ordering = ('name',)
|
# ordering = ('name',)
|
||||||
|
|
||||||
|
|
||||||
class Asset(AbsConnectivity, ProtocolsMixin, NodesRelationMixin, OrgModelMixin):
|
class AbsHardwareInfo(models.Model):
|
||||||
# Important
|
|
||||||
PLATFORM_CHOICES = (
|
|
||||||
('Linux', 'Linux'),
|
|
||||||
('Unix', 'Unix'),
|
|
||||||
('MacOS', 'MacOS'),
|
|
||||||
('BSD', 'BSD'),
|
|
||||||
('Windows', 'Windows'),
|
|
||||||
('Windows2016', 'Windows(2016)'),
|
|
||||||
('Other', 'Other'),
|
|
||||||
)
|
|
||||||
|
|
||||||
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
|
||||||
ip = models.CharField(max_length=128, verbose_name=_('IP'), db_index=True)
|
|
||||||
hostname = models.CharField(max_length=128, verbose_name=_('Hostname'))
|
|
||||||
protocol = models.CharField(max_length=128, default=ProtocolsMixin.Protocol.ssh,
|
|
||||||
choices=ProtocolsMixin.Protocol.choices,
|
|
||||||
verbose_name=_('Protocol'))
|
|
||||||
port = models.IntegerField(default=22, verbose_name=_('Port'))
|
|
||||||
protocols = models.CharField(max_length=128, default='ssh/22', blank=True, verbose_name=_("Protocols"))
|
|
||||||
platform = models.ForeignKey(Platform, default=Platform.default, on_delete=models.PROTECT, verbose_name=_("Platform"), related_name='assets')
|
|
||||||
domain = models.ForeignKey("assets.Domain", null=True, blank=True, related_name='assets', verbose_name=_("Domain"), on_delete=models.SET_NULL)
|
|
||||||
nodes = models.ManyToManyField('assets.Node', default=default_node, related_name='assets', verbose_name=_("Nodes"))
|
|
||||||
is_active = models.BooleanField(default=True, verbose_name=_('Is active'))
|
|
||||||
|
|
||||||
# Auth
|
|
||||||
admin_user = models.ForeignKey('assets.SystemUser', on_delete=models.SET_NULL, null=True, verbose_name=_("Admin user"), related_name='admin_assets')
|
|
||||||
|
|
||||||
# Some information
|
|
||||||
public_ip = models.CharField(max_length=128, blank=True, null=True, verbose_name=_('Public IP'))
|
|
||||||
number = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Asset number'))
|
|
||||||
|
|
||||||
# Collect
|
# Collect
|
||||||
vendor = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('Vendor'))
|
vendor = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('Vendor'))
|
||||||
model = models.CharField(max_length=54, null=True, blank=True, verbose_name=_('Model'))
|
model = models.CharField(max_length=54, null=True, blank=True, verbose_name=_('Model'))
|
||||||
|
@ -214,6 +183,49 @@ class Asset(AbsConnectivity, ProtocolsMixin, NodesRelationMixin, OrgModelMixin):
|
||||||
os_arch = models.CharField(max_length=16, blank=True, null=True, verbose_name=_('OS arch'))
|
os_arch = models.CharField(max_length=16, blank=True, null=True, verbose_name=_('OS arch'))
|
||||||
hostname_raw = models.CharField(max_length=128, blank=True, null=True, verbose_name=_('Hostname raw'))
|
hostname_raw = models.CharField(max_length=128, blank=True, null=True, verbose_name=_('Hostname raw'))
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
abstract = True
|
||||||
|
|
||||||
|
@property
|
||||||
|
def cpu_info(self):
|
||||||
|
info = ""
|
||||||
|
if self.cpu_model:
|
||||||
|
info += self.cpu_model
|
||||||
|
if self.cpu_count and self.cpu_cores:
|
||||||
|
info += "{}*{}".format(self.cpu_count, self.cpu_cores)
|
||||||
|
return info
|
||||||
|
|
||||||
|
@property
|
||||||
|
def hardware_info(self):
|
||||||
|
if self.cpu_count:
|
||||||
|
return '{} Core {} {}'.format(
|
||||||
|
self.cpu_vcpus or self.cpu_count * self.cpu_cores,
|
||||||
|
self.memory, self.disk_total
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
return ''
|
||||||
|
|
||||||
|
|
||||||
|
class Asset(AbsConnectivity, AbsHardwareInfo, ProtocolsMixin, NodesRelationMixin, OrgModelMixin):
|
||||||
|
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
||||||
|
ip = models.CharField(max_length=128, verbose_name=_('IP'), db_index=True)
|
||||||
|
hostname = models.CharField(max_length=128, verbose_name=_('Hostname'))
|
||||||
|
protocol = models.CharField(max_length=128, default=ProtocolsMixin.Protocol.ssh,
|
||||||
|
choices=ProtocolsMixin.Protocol.choices, verbose_name=_('Protocol'))
|
||||||
|
port = models.IntegerField(default=22, verbose_name=_('Port'))
|
||||||
|
protocols = models.CharField(max_length=128, default='ssh/22', blank=True, verbose_name=_("Protocols"))
|
||||||
|
platform = models.ForeignKey(Platform, default=Platform.default, on_delete=models.PROTECT, verbose_name=_("Platform"), related_name='assets')
|
||||||
|
domain = models.ForeignKey("assets.Domain", null=True, blank=True, related_name='assets', verbose_name=_("Domain"), on_delete=models.SET_NULL)
|
||||||
|
nodes = models.ManyToManyField('assets.Node', default=default_node, related_name='assets', verbose_name=_("Nodes"))
|
||||||
|
is_active = models.BooleanField(default=True, verbose_name=_('Is active'))
|
||||||
|
|
||||||
|
# Auth
|
||||||
|
admin_user = models.ForeignKey('assets.SystemUser', on_delete=models.SET_NULL, null=True, verbose_name=_("Admin user"), related_name='admin_assets')
|
||||||
|
|
||||||
|
# Some information
|
||||||
|
public_ip = models.CharField(max_length=128, blank=True, null=True, verbose_name=_('Public IP'))
|
||||||
|
number = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Asset number'))
|
||||||
|
|
||||||
labels = models.ManyToManyField('assets.Label', blank=True, related_name='assets', verbose_name=_("Labels"))
|
labels = models.ManyToManyField('assets.Label', blank=True, related_name='assets', verbose_name=_("Labels"))
|
||||||
created_by = models.CharField(max_length=128, null=True, blank=True, verbose_name=_('Created by'))
|
created_by = models.CharField(max_length=128, null=True, blank=True, verbose_name=_('Created by'))
|
||||||
date_created = models.DateTimeField(auto_now_add=True, null=True, blank=True, verbose_name=_('Date created'))
|
date_created = models.DateTimeField(auto_now_add=True, null=True, blank=True, verbose_name=_('Date created'))
|
||||||
|
@ -269,25 +281,6 @@ class Asset(AbsConnectivity, ProtocolsMixin, NodesRelationMixin, OrgModelMixin):
|
||||||
def is_support_ansible(self):
|
def is_support_ansible(self):
|
||||||
return self.has_protocol('ssh') and self.platform_base not in ("Other",)
|
return self.has_protocol('ssh') and self.platform_base not in ("Other",)
|
||||||
|
|
||||||
@property
|
|
||||||
def cpu_info(self):
|
|
||||||
info = ""
|
|
||||||
if self.cpu_model:
|
|
||||||
info += self.cpu_model
|
|
||||||
if self.cpu_count and self.cpu_cores:
|
|
||||||
info += "{}*{}".format(self.cpu_count, self.cpu_cores)
|
|
||||||
return info
|
|
||||||
|
|
||||||
@property
|
|
||||||
def hardware_info(self):
|
|
||||||
if self.cpu_count:
|
|
||||||
return '{} Core {} {}'.format(
|
|
||||||
self.cpu_vcpus or self.cpu_count * self.cpu_cores,
|
|
||||||
self.memory, self.disk_total
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
return ''
|
|
||||||
|
|
||||||
def get_auth_info(self):
|
def get_auth_info(self):
|
||||||
if not self.admin_user:
|
if not self.admin_user:
|
||||||
return {}
|
return {}
|
||||||
|
|
|
@ -66,7 +66,9 @@ class AssetSerializer(BulkOrgResourceModelSerializer):
|
||||||
)
|
)
|
||||||
protocols = ProtocolsField(label=_('Protocols'), required=False, default=['ssh/22'])
|
protocols = ProtocolsField(label=_('Protocols'), required=False, default=['ssh/22'])
|
||||||
domain_display = serializers.ReadOnlyField(source='domain.name', label=_('Domain name'))
|
domain_display = serializers.ReadOnlyField(source='domain.name', label=_('Domain name'))
|
||||||
nodes_display = serializers.ListField(child=serializers.CharField(), label=_('Nodes name'), required=False)
|
nodes_display = serializers.ListField(
|
||||||
|
child=serializers.CharField(), label=_('Nodes name'), required=False
|
||||||
|
)
|
||||||
|
|
||||||
"""
|
"""
|
||||||
资产的数据结构
|
资产的数据结构
|
||||||
|
@ -79,11 +81,11 @@ class AssetSerializer(BulkOrgResourceModelSerializer):
|
||||||
'protocol', 'port', 'protocols', 'is_active',
|
'protocol', 'port', 'protocols', 'is_active',
|
||||||
'public_ip', 'number', 'comment',
|
'public_ip', 'number', 'comment',
|
||||||
]
|
]
|
||||||
hardware_fields = [
|
fields_hardware = [
|
||||||
'vendor', 'model', 'sn', 'cpu_model', 'cpu_count',
|
'vendor', 'model', 'sn', 'cpu_model', 'cpu_count',
|
||||||
'cpu_cores', 'cpu_vcpus', 'memory', 'disk_total', 'disk_info',
|
'cpu_cores', 'cpu_vcpus', 'memory', 'disk_total', 'disk_info',
|
||||||
'os', 'os_version', 'os_arch', 'hostname_raw', 'hardware_info',
|
'os', 'os_version', 'os_arch', 'hostname_raw',
|
||||||
'connectivity', 'date_verified'
|
'cpu_info', 'hardware_info',
|
||||||
]
|
]
|
||||||
fields_fk = [
|
fields_fk = [
|
||||||
'domain', 'domain_display', 'platform', 'admin_user', 'admin_user_display'
|
'domain', 'domain_display', 'platform', 'admin_user', 'admin_user_display'
|
||||||
|
@ -92,18 +94,16 @@ class AssetSerializer(BulkOrgResourceModelSerializer):
|
||||||
'nodes', 'nodes_display', 'labels',
|
'nodes', 'nodes_display', 'labels',
|
||||||
]
|
]
|
||||||
read_only_fields = [
|
read_only_fields = [
|
||||||
|
'connectivity', 'date_verified', 'cpu_info', 'hardware_info',
|
||||||
'created_by', 'date_created',
|
'created_by', 'date_created',
|
||||||
]
|
]
|
||||||
fields = fields_small + hardware_fields + fields_fk + fields_m2m + read_only_fields
|
fields = fields_small + fields_hardware + fields_fk + fields_m2m + read_only_fields
|
||||||
|
extra_kwargs = {
|
||||||
extra_kwargs = {k: {'read_only': True} for k in hardware_fields}
|
|
||||||
extra_kwargs.update({
|
|
||||||
'protocol': {'write_only': True},
|
'protocol': {'write_only': True},
|
||||||
'port': {'write_only': True},
|
'port': {'write_only': True},
|
||||||
'hardware_info': {'label': _('Hardware info'), 'read_only': True},
|
'hardware_info': {'label': _('Hardware info'), 'read_only': True},
|
||||||
'org_name': {'label': _('Org name'), 'read_only': True},
|
|
||||||
'admin_user_display': {'label': _('Admin user display'), 'read_only': True},
|
'admin_user_display': {'label': _('Admin user display'), 'read_only': True},
|
||||||
})
|
}
|
||||||
|
|
||||||
def get_fields(self):
|
def get_fields(self):
|
||||||
fields = super().get_fields()
|
fields = super().get_fields()
|
||||||
|
|
Loading…
Reference in New Issue