Skip to content

Commit

Permalink
ctop: Add watch command in UDS server
Browse files Browse the repository at this point in the history
Signed-off-by: iipeace <iipeace5@gmail.com>
  • Loading branch information
iipeace committed Aug 27, 2024
1 parent b6340b3 commit 9b0ebd1
Showing 1 changed file with 152 additions and 27 deletions.
179 changes: 152 additions & 27 deletions guider/guider.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
__credits__ = "Peace Lee"
__license__ = "GPLv2"
__version__ = "3.9.8"
__revision__ = "240826"
__revision__ = "240827"
__maintainer__ = "Peace Lee"
__email__ = "iipeace5@gmail.com"
__repository__ = "https://github.com/iipeace/guider"
Expand Down Expand Up @@ -6736,6 +6736,17 @@ def isArtFile(path, fd=None):
== b"art"
)

@staticmethod
def isSockFile(path):
try:
stat = SysMgr.getPkg("stat", False)
return stat.S_ISSOCK(os.stat(path).st_mode)
except SystemExit:
sys.exit(0)
except:
SysMgr.printErr("failed to check type of '%s'" % path, True)
return None

@staticmethod
def isDexFile(path, fd=None):
def _check(fd):
Expand Down Expand Up @@ -10519,9 +10530,12 @@ def send(self, message, write=False):
except SystemExit:
sys.exit(0)
except:
if self.path:
desInfo = self.path
else:
desInfo = "%s:%s" % (self.ip, self.port)
SysMgr.printErr(
"failed to send data to %s:%s as server"
% (self.ip, self.port),
"failed to send data to '%s' as server" % desInfo,
True,
)
return False
Expand Down Expand Up @@ -27481,6 +27495,7 @@ class SysMgr(object):
thrEvtCondList = {}
thrEvtCntList = {}
thrItemList = {}
eventSubList = []
eventLockList = {}
eventCommandList = {}

Expand Down Expand Up @@ -27974,6 +27989,30 @@ def getMaxPid():
except:
pass

@staticmethod
def getNrFile():
ret = {}
for d in SysMgr.environList.get("MONDIR", []):
d = os.path.realpath(d)
if os.path.isdir(d):
try:
nrFile = len(os.listdir(d))
except SystemExit:
sys.exit(0)
except:
SysMgr.printWarn(
"failed to get the number of files", reason=True
)
continue
elif os.path.exists(d):
nrFile = 1
else:
continue

ret[d] = nrFile

return ret

@staticmethod
def getNrCrash():
try:
Expand Down Expand Up @@ -37703,6 +37742,9 @@ def printHelp(force=False, isExit=True):
- {3:1} all {2:1} and quit when specific files are not found
# {0:1} {1:1} -a -q EXITCONDNOFILE:"/tmp/term"

- {3:1} all {2:1} with the number of files for specific directories
# {0:1} {1:1} -a -q MONDIR:"/tmp/term"

- {3:1} all {2:1} and quit when specific functions return true
# {0:1} {1:1} -a -q EXITCONDFUNC:"/tmp/check.py":"checkFunc":"123"

Expand Down Expand Up @@ -49165,11 +49207,22 @@ def _handleCmd(connObj, cmd, cliProc):
# update event status #
SysMgr.updateEventStatus()

# backup eventCommandList for worker task #
# set final command #
cmdList = cmd.split("|")
mainCmd = cmdList[0]
cmdOpt = cmdList[1:] if len(cmdList) > 1 else []

# handle watch event #
if mainCmd == "watch":
SysMgr.printInfo("registered %s for event watch" % cliProc)
SysMgr.eventSubList.append([cliProc, connObj])
return

# backup items for worker task #
localServObj = SysMgr.localServObj
eventCommandList = SysMgr.eventCommandList

# create a new worker process and parent return #
localServObj = SysMgr.localServObj
pid = SysMgr.createProcess()
if pid > 0:
# close connection to decrease refcnt of socket in parent #
Expand Down Expand Up @@ -49233,11 +49286,6 @@ def _printExecutedCmd():
"executed '%s' command from %s" % (cmd, cliProc)
)

# set final command #
cmdList = cmd.split("|")
mainCmd = cmdList[0]
cmdOpt = cmdList[1:] if len(cmdList) > 1 else []

# check command #
if mainCmd in (
"bdtop",
Expand Down Expand Up @@ -56921,17 +56969,26 @@ def reorderProcBuffer(buf):
buf.reverse()

@staticmethod
def sendEvents(ip, port, event, uptime=None, pid=None, verb=True):
# create a network object #
netObj = NetworkMgr("client", ip, long(port))
ip, port = netObj.ip, netObj.port
def sendEvents(
ip, port, event, uptime=None, pid=None, netObj=None, verb=True
):
if not netObj:
# create a network object #
netObj = NetworkMgr("client", ip, long(port))
ip, port = netObj.ip, netObj.port

# check network object #
if not ip or not port:
SysMgr.printWarn(
"failed to use '%s:%s' as the remote address" % (ip, port)
)
return
# check network object #
if not ip or not port:
SysMgr.printWarn(
"failed to use '%s:%s' as the remote address" % (ip, port)
)
return

# set cli info #
if netObj.path:
cliInfo = "%s" % netObj.path
else:
cliInfo = "%s:%s" % (netObj.ip, netObj.port)

# get uptime #
if not uptime:
Expand All @@ -56948,10 +57005,14 @@ def sendEvents(ip, port, event, uptime=None, pid=None, verb=True):
# send events #
for item in event:
try:
# send an event #
netObj.request = item
netObj.send("%s@%s" % (item, uptime))
ret = netObj.send("%s@%s" % (item, uptime))
if not ret:
raise Exception("send error")

SysMgr.printInfo(
"sent event '%s' to %s:%s%s" % (item, ip, port, procInfo)
"sent event '%s' to %s%s" % (item, cliInfo, procInfo)
)

# check connection events #
Expand Down Expand Up @@ -57011,11 +57072,14 @@ def sendEvents(ip, port, event, uptime=None, pid=None, verb=True):
sys.exit(0)
except:
SysMgr.printWarn(
"failed to send event '%s' to %s:%s%s"
% (item, ip, port, procInfo),
"failed to send event '%s' to %s%s"
% (item, cliInfo, procInfo),
True,
True,
)
return None

return True

@staticmethod
def updateBgProcs(cache=False):
Expand Down Expand Up @@ -60820,8 +60884,9 @@ def initSharedResource(mute, net=True):
# clear threshold condition #
SysMgr.prevThrData = SysMgr.thrData
SysMgr.thrData = {}
SysMgr.eventCommandList = {}
SysMgr.eventSubList = []
SysMgr.eventLockList = {}
SysMgr.eventCommandList = {}

# reset report resource #
SysMgr.reportEnable = False
Expand Down Expand Up @@ -61524,7 +61589,7 @@ def runCliTaskUDS(uds, cmd):
while 1:
data = connMan.recv()
if not data:
if mainCmd in ("logcat"):
if mainCmd in ("logcat", "watch"):
continue
else:
break
Expand Down Expand Up @@ -79339,6 +79404,22 @@ def printSystemInfo(self):
except:
pass

# file #
try:
fileData = SysMgr.getNrFile()
if not fileData:
raise Exception()

for f, c in fileData.items():
SysMgr.infoBufferPrint(
"{0:20} {1:<1}: {2:1}".format("NrFile", f, convNum(c))
)

if SysMgr.jsonEnable:
jsonData["nrFile"] = fileData
except:
pass

# kernel args #
try:
title = "Cmdline"
Expand Down Expand Up @@ -85753,6 +85834,14 @@ def _checkRepeatCnt():
except:
pass

# print FILE stat #
try:
taskManager.printFileCount(len(title))
except SystemExit:
sys.exit(0)
except:
pass

# print resource usage of tasks #
taskManager.printSystemUsage()
taskManager.printTaskUsage()
Expand Down Expand Up @@ -144715,6 +144804,23 @@ def printPeakStat(self, nrIndent):

SysMgr.addPrint("%s\n" % databuf, newline=databuf.count("\n") + 1)

def printFileCount(self, nrIndent):
fdata = SysMgr.getNrFile()
if not fdata:
return

fileData = "%s [FILE > " % (" " * nrIndent)

# add JSON stats #
if SysMgr.jsonEnable:
SysMgr.jsonData["nrFile"] = fdata

# print count of files #
for f, c in fdata.items():
SysMgr.addPrint(
fileData + "{0:1}: {1:1}]\n".format(f, UtilMgr.convNum(c))
)

def printPsiStat(self, nrIndent):
if not SysMgr.prevPsiData:
return
Expand Down Expand Up @@ -150941,7 +151047,7 @@ def _checkResource(item):
)
eventList.append("EVENT_SKIP_%s_TICK" % skip)

# send events #
# send events to myself #
try:
SysMgr.sendEvents(
SysMgr.localServObj.ip,
Expand All @@ -150954,6 +151060,22 @@ def _checkResource(item):
except:
pass

# send events to watching tasks #
eventSubList = list(SysMgr.eventSubList)
SysMgr.eventSubList = []
for winfo in eventSubList:
cliProc, netObj = winfo
ret = SysMgr.sendEvents(
None,
None,
[ename],
netObj=netObj,
pid=SysMgr.pid,
verb=False,
)
if ret:
SysMgr.eventSubList.append(winfo)

# handle oneshot command #
if goneshot:
run = True
Expand Down Expand Up @@ -152325,6 +152447,9 @@ def printSystemStat(self, idIndex=False, targetList=["task"]):
# print PSI stat #
self.printPsiStat(nrIndent)

# print FILE stat #
self.printFileCount(nrIndent)

# print peak stat #
self.printPeakStat(nrIndent)

Expand Down

0 comments on commit 9b0ebd1

Please sign in to comment.