forked from platypush/platypush
Convert system.connected_users
to the new data model.
This commit is contained in:
parent
259b42bdd6
commit
387616ea96
7 changed files with 91 additions and 47 deletions
|
@ -8,30 +8,6 @@ class SystemResponse(Response):
|
|||
pass
|
||||
|
||||
|
||||
class ConnectUserResponse(SystemResponse):
|
||||
def __init__(
|
||||
self,
|
||||
name: str,
|
||||
terminal: str,
|
||||
host: str,
|
||||
started: datetime,
|
||||
pid: Optional[int] = None,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
super().__init__(
|
||||
*args,
|
||||
output={
|
||||
'name': name,
|
||||
'terminal': terminal,
|
||||
'host': host,
|
||||
'started': started,
|
||||
'pid': pid,
|
||||
},
|
||||
**kwargs
|
||||
)
|
||||
|
||||
|
||||
class ProcessResponse(SystemResponse):
|
||||
def __init__(
|
||||
self,
|
||||
|
@ -93,11 +69,6 @@ class SystemResponseList(SystemResponse):
|
|||
super().__init__(output=[r.output for r in responses], *args, **kwargs)
|
||||
|
||||
|
||||
class ConnectedUserResponseList(SystemResponseList):
|
||||
def __init__(self, responses: List[ConnectUserResponse], *args, **kwargs):
|
||||
super().__init__(responses=responses, *args, **kwargs)
|
||||
|
||||
|
||||
class ProcessResponseList(SystemResponseList):
|
||||
def __init__(self, responses: List[ProcessResponse], *args, **kwargs):
|
||||
super().__init__(responses=responses, *args, **kwargs)
|
||||
|
|
|
@ -24,8 +24,6 @@ from platypush.entities.system import (
|
|||
SystemTemperature,
|
||||
)
|
||||
from platypush.message.response.system import (
|
||||
ConnectedUserResponseList,
|
||||
ConnectUserResponse,
|
||||
ProcessResponseList,
|
||||
ProcessResponse,
|
||||
)
|
||||
|
@ -56,6 +54,8 @@ from platypush.schemas.system import (
|
|||
SystemInfoSchema,
|
||||
Temperature,
|
||||
TemperatureSchema,
|
||||
User,
|
||||
UserSchema,
|
||||
)
|
||||
|
||||
|
||||
|
@ -403,26 +403,17 @@ class SystemPlugin(SensorPlugin, EntityManager):
|
|||
battery = self._sensors_battery()
|
||||
return BatterySchema().dump(battery) if battery else None # type: ignore
|
||||
|
||||
def _connected_users(self) -> List[User]:
|
||||
return UserSchema().load(psutil.users(), many=True) # type: ignore
|
||||
|
||||
@action
|
||||
def connected_users(self) -> ConnectedUserResponseList:
|
||||
def connected_users(self) -> List[dict]:
|
||||
"""
|
||||
Get the list of connected users.
|
||||
:return: List of :class:`platypush.message.response.system.ConnectUserResponse`.
|
||||
"""
|
||||
users = psutil.users()
|
||||
|
||||
return ConnectedUserResponseList(
|
||||
[
|
||||
ConnectUserResponse(
|
||||
name=u.name,
|
||||
terminal=u.terminal,
|
||||
host=u.host,
|
||||
started=datetime.fromtimestamp(u.started),
|
||||
pid=u.pid,
|
||||
)
|
||||
for u in users
|
||||
]
|
||||
)
|
||||
:return: .. schema:: system.UserSchema
|
||||
"""
|
||||
return UserSchema().dump(self._connected_users(), many=True)
|
||||
|
||||
@action
|
||||
def processes(self, filter: Optional[str] = '') -> ProcessResponseList:
|
||||
|
|
|
@ -18,6 +18,7 @@ from ._model import SystemInfo
|
|||
from ._network import NetworkInterface, NetworkInterfaceSchema
|
||||
from ._schemas import SystemInfoSchema
|
||||
from ._temperature import Temperature, TemperatureSchema
|
||||
from ._user import User, UserSchema
|
||||
|
||||
|
||||
__all__ = [
|
||||
|
@ -48,4 +49,6 @@ __all__ = [
|
|||
"SystemInfoSchema",
|
||||
"Temperature",
|
||||
"TemperatureSchema",
|
||||
"User",
|
||||
"UserSchema",
|
||||
]
|
||||
|
|
4
platypush/schemas/system/_user/__init__.py
Normal file
4
platypush/schemas/system/_user/__init__.py
Normal file
|
@ -0,0 +1,4 @@
|
|||
from ._model import User
|
||||
from ._schemas import UserSchema
|
||||
|
||||
__all__ = ['User', 'UserSchema']
|
22
platypush/schemas/system/_user/_base.py
Normal file
22
platypush/schemas/system/_user/_base.py
Normal file
|
@ -0,0 +1,22 @@
|
|||
from datetime import datetime
|
||||
|
||||
from dateutil.tz import gettz
|
||||
from marshmallow import pre_load
|
||||
|
||||
from .._base import SystemBaseSchema
|
||||
|
||||
|
||||
class UserBaseSchema(SystemBaseSchema):
|
||||
"""
|
||||
Base schema for system users.
|
||||
"""
|
||||
|
||||
@pre_load
|
||||
def pre_load(self, data: dict, **_) -> dict:
|
||||
data = super().pre_load(data)
|
||||
started_ts = data.pop('started', None)
|
||||
if started_ts is not None:
|
||||
data['started'] = datetime.fromtimestamp(started_ts).replace(tzinfo=gettz())
|
||||
|
||||
data['username'] = data.pop('name', data.pop('username', None))
|
||||
return data
|
46
platypush/schemas/system/_user/_model.py
Normal file
46
platypush/schemas/system/_user/_model.py
Normal file
|
@ -0,0 +1,46 @@
|
|||
from dataclasses import dataclass, field
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
|
||||
@dataclass
|
||||
class User:
|
||||
"""
|
||||
System user wrapper.
|
||||
"""
|
||||
|
||||
username: str = field(
|
||||
metadata={
|
||||
'metadata': {
|
||||
'description': 'Username',
|
||||
'example': 'root',
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
terminal: Optional[str] = field(
|
||||
metadata={
|
||||
'metadata': {
|
||||
'description': 'Identifier of the terminal the user is connected to',
|
||||
'example': 'pts/1',
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
started: Optional[datetime] = field(
|
||||
metadata={
|
||||
'metadata': {
|
||||
'description': 'When the user session started',
|
||||
'example': 'pts/1',
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
pid: Optional[int] = field(
|
||||
metadata={
|
||||
'metadata': {
|
||||
'description': 'PID of the process that holds the session',
|
||||
'example': 12345,
|
||||
}
|
||||
}
|
||||
)
|
7
platypush/schemas/system/_user/_schemas.py
Normal file
7
platypush/schemas/system/_user/_schemas.py
Normal file
|
@ -0,0 +1,7 @@
|
|||
from marshmallow_dataclass import class_schema
|
||||
|
||||
from ._base import UserBaseSchema
|
||||
from ._model import User
|
||||
|
||||
|
||||
UserSchema = class_schema(User, base_schema=UserBaseSchema)
|
Loading…
Reference in a new issue