add new hid in devices
This commit is contained in:
parent
0ae12e71a6
commit
236fcac0b8
|
@ -297,10 +297,13 @@ class UploadSnapshotForm(SnapshotMixin, FlaskForm):
|
||||||
system_uuid = self.get_uuid(debug)
|
system_uuid = self.get_uuid(debug)
|
||||||
if system_uuid:
|
if system_uuid:
|
||||||
snapshot_json['device']['system_uuid'] = system_uuid
|
snapshot_json['device']['system_uuid'] = system_uuid
|
||||||
|
self.get_fields_extra(debug, snapshot_json)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
snapshot_json = schema.load(snapshot_json)
|
snapshot_json = schema.load(snapshot_json)
|
||||||
response = self.build(snapshot_json)
|
response = self.build(snapshot_json)
|
||||||
|
response.device.set_hid()
|
||||||
|
response.device.binding.device.set_hid()
|
||||||
except ValidationError as err:
|
except ValidationError as err:
|
||||||
txt = "{}".format(err)
|
txt = "{}".format(err)
|
||||||
self.errors(txt=txt)
|
self.errors(txt=txt)
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
"""add vendor family in device
|
||||||
|
|
||||||
|
Revision ID: 564952310b17
|
||||||
|
Revises: d65745749e34
|
||||||
|
Create Date: 2022-11-14 13:12:22.916848
|
||||||
|
|
||||||
|
"""
|
||||||
|
import citext
|
||||||
|
import sqlalchemy as sa
|
||||||
|
from alembic import context, op
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = '564952310b17'
|
||||||
|
down_revision = 'd65745749e34'
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def get_inv():
|
||||||
|
INV = context.get_x_argument(as_dictionary=True).get('inventory')
|
||||||
|
if not INV:
|
||||||
|
raise ValueError("Inventory value is not specified")
|
||||||
|
return INV
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
op.add_column(
|
||||||
|
'device',
|
||||||
|
sa.Column('family', citext.CIText(), nullable=True),
|
||||||
|
schema=f'{get_inv()}',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
op.drop_column('device', 'family', schema=f'{get_inv()}')
|
|
@ -547,6 +547,12 @@ class ParseSnapshotLsHw:
|
||||||
|
|
||||||
return action
|
return action
|
||||||
|
|
||||||
|
def get_hid_datas(self):
|
||||||
|
self.device.family = self.get_family()
|
||||||
|
|
||||||
|
def get_family(self):
|
||||||
|
return self.dmi.get("System", [{}])[0].get("Family", '')
|
||||||
|
|
||||||
def errors(self, txt=None, severity=Severity.Error):
|
def errors(self, txt=None, severity=Severity.Error):
|
||||||
if not txt:
|
if not txt:
|
||||||
return self._errors
|
return self._errors
|
||||||
|
|
|
@ -2008,7 +2008,7 @@ def update_components_action_one(target: ActionWithOneDevice, device: Device, __
|
||||||
if isinstance(device, Computer):
|
if isinstance(device, Computer):
|
||||||
target.components |= device.components
|
target.components |= device.components
|
||||||
elif isinstance(device, Computer):
|
elif isinstance(device, Computer):
|
||||||
device.add_mac_to_hid()
|
device.set_hid()
|
||||||
|
|
||||||
|
|
||||||
@event.listens_for(
|
@event.listens_for(
|
||||||
|
|
|
@ -72,9 +72,7 @@ class SnapshotMixin:
|
||||||
if snapshot_json['software'] == (
|
if snapshot_json['software'] == (
|
||||||
SnapshotSoftware.Workbench or SnapshotSoftware.WorkbenchAndroid
|
SnapshotSoftware.Workbench or SnapshotSoftware.WorkbenchAndroid
|
||||||
):
|
):
|
||||||
components = snapshot_json.pop('components', None) # type: List[Component]
|
components = snapshot_json.pop('components', None)
|
||||||
if isinstance(device, Computer) and device.hid:
|
|
||||||
device.add_mac_to_hid(components_snap=components)
|
|
||||||
snapshot = Snapshot(**snapshot_json)
|
snapshot = Snapshot(**snapshot_json)
|
||||||
|
|
||||||
# Remove new actions from devices so they don't interfere with sync
|
# Remove new actions from devices so they don't interfere with sync
|
||||||
|
@ -151,6 +149,30 @@ class SnapshotMixin:
|
||||||
uuid = UUID(hw_uuid)
|
uuid = UUID(hw_uuid)
|
||||||
return UUID(bytes_le=uuid.bytes)
|
return UUID(bytes_le=uuid.bytes)
|
||||||
|
|
||||||
|
def get_fields_extra(self, debug, snapshot_json):
|
||||||
|
if not debug or not isinstance(debug, dict):
|
||||||
|
return
|
||||||
|
|
||||||
|
lshw = debug.get('lshw', {})
|
||||||
|
|
||||||
|
family = lshw.get('configuration', {}).get('family', '')
|
||||||
|
|
||||||
|
snapshot_json['device']['family'] = family
|
||||||
|
|
||||||
|
# lshw_mothers = []
|
||||||
|
# for mt in lshw.get('children', []):
|
||||||
|
# if mt.get('description') == "Motherboard":
|
||||||
|
# lshw_mothers.append(mt)
|
||||||
|
|
||||||
|
# for comp in snapshot_json.get('components', []):
|
||||||
|
# if comp.get('type') != 'Motherboard':
|
||||||
|
# continue
|
||||||
|
# for mt in lshw_mothers:
|
||||||
|
# if comp['serialNumber'] == mt.get('serial', ''):
|
||||||
|
# comp['vendor'] = mt.get('vendor', '')
|
||||||
|
# comp['product'] = mt.get('product', '')
|
||||||
|
# comp['version'] = mt.get('version', '')
|
||||||
|
|
||||||
def errors(self, txt=None, severity=Severity.Error, snapshot=None, commit=False):
|
def errors(self, txt=None, severity=Severity.Error, snapshot=None, commit=False):
|
||||||
if not txt:
|
if not txt:
|
||||||
return
|
return
|
||||||
|
@ -187,10 +209,13 @@ class SnapshotView(SnapshotMixin):
|
||||||
self.version = snapshot_json.get('version')
|
self.version = snapshot_json.get('version')
|
||||||
self.uuid = snapshot_json.get('uuid')
|
self.uuid = snapshot_json.get('uuid')
|
||||||
self.sid = None
|
self.sid = None
|
||||||
system_uuid = self.get_uuid(snapshot_json.pop('debug', None))
|
self.debug = snapshot_json.pop('debug', {})
|
||||||
|
system_uuid = self.get_uuid(self.debug)
|
||||||
if system_uuid:
|
if system_uuid:
|
||||||
snapshot_json['device']['system_uuid'] = system_uuid
|
snapshot_json['device']['system_uuid'] = system_uuid
|
||||||
|
|
||||||
|
self.get_fields_extra(self.debug, snapshot_json)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.snapshot_json = resource_def.schema.load(snapshot_json)
|
self.snapshot_json = resource_def.schema.load(snapshot_json)
|
||||||
snapshot = self.build()
|
snapshot = self.build()
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import copy
|
import copy
|
||||||
|
import hashlib
|
||||||
import pathlib
|
import pathlib
|
||||||
from contextlib import suppress
|
from contextlib import suppress
|
||||||
from fractions import Fraction
|
from fractions import Fraction
|
||||||
|
@ -181,6 +182,7 @@ class Device(Thing):
|
||||||
dhid_bk = db.Column(db.CIText(), nullable=True, unique=False)
|
dhid_bk = db.Column(db.CIText(), nullable=True, unique=False)
|
||||||
phid_bk = db.Column(db.CIText(), nullable=True, unique=False)
|
phid_bk = db.Column(db.CIText(), nullable=True, unique=False)
|
||||||
active = db.Column(Boolean, default=True)
|
active = db.Column(Boolean, default=True)
|
||||||
|
family = db.Column(db.CIText())
|
||||||
|
|
||||||
_NON_PHYSICAL_PROPS = {
|
_NON_PHYSICAL_PROPS = {
|
||||||
'id',
|
'id',
|
||||||
|
@ -201,6 +203,7 @@ class Device(Thing):
|
||||||
'production_date',
|
'production_date',
|
||||||
'variant',
|
'variant',
|
||||||
'version',
|
'version',
|
||||||
|
'family',
|
||||||
'sku',
|
'sku',
|
||||||
'image',
|
'image',
|
||||||
'allocated',
|
'allocated',
|
||||||
|
@ -735,10 +738,69 @@ class Device(Thing):
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
def set_hid(self):
|
def set_hid(self):
|
||||||
|
"""
|
||||||
|
# product_vendor,
|
||||||
|
# product_family,
|
||||||
|
# product_chassis,
|
||||||
|
# product_number,
|
||||||
|
# product_version,
|
||||||
|
# product_sku,
|
||||||
|
# product_serial,
|
||||||
|
# product_uuid,
|
||||||
|
# board_vendor,
|
||||||
|
# board_number,
|
||||||
|
# board_serial,
|
||||||
|
# board_version
|
||||||
|
"""
|
||||||
with suppress(TypeError):
|
with suppress(TypeError):
|
||||||
self.hid = Naming.hid(
|
family = (self.family or '').replace(' ', '_')
|
||||||
self.type, self.manufacturer, self.model, self.serial_number
|
chassis = self.type
|
||||||
)
|
if hasattr(self, 'chassis'):
|
||||||
|
chassis = self.chassis and self.chassis.name or ''
|
||||||
|
version = (self.version or '').replace(' ', '_')
|
||||||
|
sku = (self.sku or '').replace(' ', '_')
|
||||||
|
system_uuid = ''
|
||||||
|
if hasattr(self, 'system_uuid'):
|
||||||
|
system_uuid = str(self.system_uuid or '')
|
||||||
|
|
||||||
|
board = None
|
||||||
|
board_serial_number = ''
|
||||||
|
board_version = ''
|
||||||
|
board_manufacturer = ''
|
||||||
|
board_model = ''
|
||||||
|
|
||||||
|
if hasattr(self, 'components'):
|
||||||
|
for c in self.components:
|
||||||
|
if c.type == 'Motherboard':
|
||||||
|
board = c
|
||||||
|
break
|
||||||
|
|
||||||
|
if board:
|
||||||
|
board_manufacturer = (board.manufacturer or '').replace(' ', '_')
|
||||||
|
board_model = (board.model or '').replace(' ', '_')
|
||||||
|
board_serial_number = (board.serial_number or '').replace(' ', '_')
|
||||||
|
board_version = (board.version or '').replace(' ', '_')
|
||||||
|
|
||||||
|
self.hid = '-'.join(
|
||||||
|
[
|
||||||
|
(self.manufacturer or '').replace(' ', '_'),
|
||||||
|
family,
|
||||||
|
chassis,
|
||||||
|
(self.model or '').replace(' ', '_'),
|
||||||
|
version,
|
||||||
|
sku,
|
||||||
|
self.serial_number,
|
||||||
|
system_uuid,
|
||||||
|
board_manufacturer,
|
||||||
|
board_model,
|
||||||
|
board_serial_number,
|
||||||
|
board_version,
|
||||||
|
]
|
||||||
|
).lower()
|
||||||
|
|
||||||
|
def get_hid(self):
|
||||||
|
if self.hid:
|
||||||
|
return hashlib.sha3_512(self.hid.encode()).hexdigest()
|
||||||
|
|
||||||
def last_action_of(self, *types):
|
def last_action_of(self, *types):
|
||||||
"""Gets the last action of the given types.
|
"""Gets the last action of the given types.
|
||||||
|
@ -1119,6 +1181,7 @@ class Computer(Device):
|
||||||
"""Returns the Naming.hid with the first mac of network adapter,
|
"""Returns the Naming.hid with the first mac of network adapter,
|
||||||
following an alphabetical order.
|
following an alphabetical order.
|
||||||
"""
|
"""
|
||||||
|
return
|
||||||
self.set_hid()
|
self.set_hid()
|
||||||
if not self.hid:
|
if not self.hid:
|
||||||
return
|
return
|
||||||
|
|
|
@ -120,6 +120,7 @@ class Device(Thing):
|
||||||
dhid = SanitizedStr(
|
dhid = SanitizedStr(
|
||||||
data_key='devicehubID', description=m.Device.devicehub_id.comment
|
data_key='devicehubID', description=m.Device.devicehub_id.comment
|
||||||
)
|
)
|
||||||
|
family = SanitizedStr(validate=Length(max=STR_BIG_SIZE))
|
||||||
|
|
||||||
@pre_load
|
@pre_load
|
||||||
def from_actions_to_actions_one(self, data: dict):
|
def from_actions_to_actions_one(self, data: dict):
|
||||||
|
|
|
@ -302,7 +302,7 @@ class DeviceMergeView(View):
|
||||||
setattr(self.base_device, field_name, value)
|
setattr(self.base_device, field_name, value)
|
||||||
|
|
||||||
self.base_device.hid = self.with_device.hid
|
self.base_device.hid = self.with_device.hid
|
||||||
self.base_device.add_mac_to_hid()
|
self.base_device.set_hid()
|
||||||
|
|
||||||
|
|
||||||
class ManufacturerView(View):
|
class ManufacturerView(View):
|
||||||
|
|
|
@ -93,6 +93,10 @@ class Lot(Thing):
|
||||||
)
|
)
|
||||||
receiver = db.relationship(User, primaryjoin=receiver_address == User.email)
|
receiver = db.relationship(User, primaryjoin=receiver_address == User.email)
|
||||||
|
|
||||||
|
# __table_args__ = (
|
||||||
|
# {'schema': 'dbtest'},
|
||||||
|
# )
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self, name: str, closed: bool = closed.default.arg, description: str = None
|
self, name: str, closed: bool = closed.default.arg, description: str = None
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|
Reference in New Issue