@@ -1044,6 +1044,74 @@ def _get_params(self):
10441044exports ["IPMIPowerPort" ] = IPMIPowerPortExport
10451045
10461046
1047+ @attr .s (eq = False )
1048+ class AMTPowerPortExport (ResourceExport ):
1049+ """ResourceExport for AMTPowerPort devices"""
1050+
1051+ def __attrs_post_init__ (self ):
1052+ super ().__attrs_post_init__ ()
1053+ self .data ["cls" ] = self .cls
1054+ from ..resource .power import AMTPowerPort
1055+ self .local = AMTPowerPort (target = None , name = None , ** self .local_params )
1056+
1057+ self .lastpoll = 0
1058+ self .job = None
1059+ self .local .avail = False
1060+ self .status = None
1061+
1062+ def poll (self ):
1063+ now = time .monotonic ()
1064+ if self .job :
1065+ self .lastpoll = now
1066+ if self .job .poll () is None :
1067+ return super ().poll ()
1068+ self .status = self ._amt_parse (self .job .returncode )
1069+
1070+ if self .job .returncode != 0 :
1071+ self .local .avail = False
1072+ else :
1073+ self .local .avail = True
1074+ self .job = None
1075+ return super ().poll ()
1076+
1077+ if now - self .lastpoll < self .local .polling :
1078+ return super ().poll ()
1079+ self .lastpoll = now
1080+
1081+ if self .local .polling > 0 :
1082+ self .job = self ._amt_power ('status' )
1083+
1084+ return super ().poll ()
1085+
1086+ def _amt_power (self , cmd ):
1087+ runstr = f"amtctrl { self .local .host } { cmd } -p"
1088+ p = subprocess .Popen (runstr .split (' ' ), text = True ,
1089+ stdout = subprocess .PIPE , stderr = subprocess .PIPE ,
1090+ stdin = subprocess .PIPE )
1091+ p .stdin .write (self .local .password )
1092+ p .stdin .close ()
1093+ return p
1094+
1095+ def _amt_parse (self , ret ):
1096+ out = self .job .stdout .read () + self .job .stderr .read ()
1097+ if ret != 0 :
1098+ out = out .split (']' )[- 1 ]
1099+ out = '' .join (x for x in out if not x in ['(' ,')' ,'"' , "'" ])
1100+ return out .strip ().upper ()
1101+
1102+ def _get_params (self ):
1103+ """Helper function to return parameters"""
1104+ return {
1105+ ** self .local_params ,
1106+ "extra" : {
1107+ "status" : self .status ,
1108+ }
1109+ }
1110+
1111+
1112+ exports ["AMTPowerPort" ] = AMTPowerPortExport
1113+
1114+
10471115class ExporterSession (ApplicationSession ):
10481116 def onConnect (self ):
10491117 """Set up internal datastructures on successful connection:
0 commit comments