Jelajahi Sumber

adding general purpose commands

Steve Nyemba 5 bulan lalu
induk
melakukan
51c881b801
1 mengubah file dengan 82 tambahan dan 0 penghapusan
  1. 82 0
      smart/cmd/__init__.py

+ 82 - 0
smart/cmd/__init__.py

@@ -0,0 +1,82 @@
+"""
+This file contains class and functions that extract data from running processes like top and stores them into a data store of the calling codes choice
+dependencies:
+    - top (on the os)
+@TODO:
+    Test this thing on windows to see if it works
+"""
+import pandas as pd
+import numpy as np
+import subprocess
+import os
+import datetime
+# from transport import factory
+import sys
+import hashlib
+import re
+from io import StringIO
+import importlib as IL
+import importlib.util
+
+class plugin :
+    """
+    This is a context specific decorator to be used for generic commands. 
+    This decorator should be placed on parsing functions
+    """
+    def __init__(self,**_args):
+        """
+        :name   name of the plugin
+        :mode   restrict to reader/writer
+        :about  tell what the function is about    
+        """
+        self._cmd = _args['cmd'] 
+        self._alias = _args['alias'] if 'alias' in _args else None
+        
+    def __call__(self,pointer,**kwargs):
+        def wrapper(_args,**kwargs):
+            return pointer(_args,**kwargs)
+        #
+        # @TODO:
+        # add attributes to the wrapper object
+        #
+        # self._name = pointer.__name__ if not self._name else self._name
+        # setattr(wrapper,'context',True)
+        setattr(wrapper,'cmd',self._cmd)
+        setattr(wrapper,'alias',self._alias)
+        
+        return wrapper
+      
+def read(**args) :
+    """
+    This function will perform the actual reads of process informations. 
+    @return {user,pid,start,status, name, args, mem,cpu}
+    """
+    # cmd     = args['cmd'] #"ps -eo pid,user,pmem,pcpu,stat,etime,args|awk 'OFS=\";\" {$1=$1; if($5 > 9) print }'"
+    xchar   = ";"
+    
+    try:
+        _parser = args['parser'] if 'parser' in args else None
+        stream = None
+        if _parser and hasattr(_parser,'cmd'):
+            cmd = getattr(_parser,'cmd')
+            handler = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)			
+            stream = str(handler.communicate()[0]).replace("b'",'')
+            return _parser (stream)
+        return stream
+        #
+        # At this point we need to load the parser or return the output as is
+        # if 'parser' in args :
+        #     _parser = args['parser']
+            
+        #     return _parser(stream)
+        # else:
+        #     return stream
+
+    except Exception as e:
+        print (e)
+        pass
+    
+# if __name__ == '__main__' :
+#     #
+#     # Being directly called (external use of the )
+#     print(read())