add new hid in devices

This commit is contained in:
Cayo Puigdefabregas 2022-11-16 11:51:31 +01:00
parent 0ae12e71a6
commit 236fcac0b8
9 changed files with 146 additions and 9 deletions

View File

@ -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)

View File

@ -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()}')

View File

@ -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

View File

@ -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(

View File

@ -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()

View File

@ -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

View File

@ -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):

View File

@ -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):

View File

@ -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: