Explorar o código

adding support for plugin-ix, and managing registry

Steve Nyemba hai 5 meses
pai
achega
964a869058
Modificáronse 5 ficheiros con 166 adicións e 41 borrados
  1. 0 1
      bin/smart-logger
  2. 163 0
      bin/smart-logger
  3. 1 1
      setup.py
  4. 1 38
      smart/__init__.py
  5. 1 1
      smart/logger/__init__.py

+ 0 - 1
bin/smart-logger

@@ -1 +0,0 @@
-../smart/__main__.py

+ 163 - 0
bin/smart-logger

@@ -0,0 +1,163 @@
+#!/usr/bin/env python
+"""
+This framework allows data to be logged to a given data store i.e :
+    - disk, cloud (google, dropbox, box, sugarsync or s3) or a queue server
+The intent of the framework is to work as a standalone or embedded in code as a logging framework
+usage:
+
+dependencies :
+    data-transport  pip install git+https://dev.the-phi.com/git/steve/data-transport.git
+"""
+import smart
+import smart.top
+import smart.folder
+import smart.top
+import smart.logger
+import smart.files
+import uuid
+import typer
+import meta
+import json
+import os
+import transport
+import shutil
+from datetime import datetime
+_cli = typer.Typer()
+
+import plugins
+
+
+# iregistry = plugins.Registry(meta.__home__)
+
+@_cli.command(name='log-intruder')
+def intrusion(path:str='/var/log/auth.log', year:int=datetime.now().year):
+    """
+    This function 
+    """
+    _r = smart.logger.read(path=path,year=year)
+    if _r :
+        for _id in _r :
+            if hasattr(smart.logger,_id):
+                try:
+                    _pointer  = getattr(smart.logger,_id)
+                    _df = _pointer(_r[_id])
+                    
+                    post(_df,_id)
+                except Exception as e:
+                    print (e)
+                    pass
+    else:
+        print ()
+        print ("Nothing out of the ordinary was found in")
+        print (f"{path}")
+@_cli.command(name='top')
+def apply_apps (app:str=None,user:str=None):
+    """
+    This function looks at applications/commands running on the system
+    """
+    
+    _df = smart.top.read(name=app)
+    _id = 'apps' if not app else app
+    # if app  :
+    #     _index = _df.name == app
+    #     if _index.sum() :
+    #         _df = _df[_index]
+    post(_df,_id)
+    
+@_cli.command(name='archive')
+def _archive():
+    """
+    This function will archive the database, by renaming it into
+    """
+    
+    _suffix = datetime.now()
+    _suffix = "-".join([str(_value) for _value in [_suffix.year,_suffix.month,_suffix.day,_suffix.hour,_suffix.minute]])
+    _path = os.sep.join([meta.__home__,meta.__database__]) 
+    _src = _path + '.db3'
+    if os.path.exists(_src):
+        _target = _path +'-archived-on-'+ _suffix+'.db3'
+        shutil.move(_src,_target)
+        _msg = f"""Archive created successfully at:
+        {_target}"""
+    else:
+        _msg = """
+        Archive function is not available at this time, please try after logs have been stored
+        """
+    print(_msg)
+@_cli.command(name='folder')
+def apply_folder(path:str):
+    """
+    This function will read the content of a folder and generate a 
+    """
+    _df = smart.folder.read(path=path)
+    # print (_df)
+    post(_df,'folders')
+    pass
+@_cli.command (name='files')
+def apply_files(folder:str) :
+    _df = smart.files.read(folder)
+    post(_df,'files')
+@_cli.command(name='init')
+# @plugins.cli.appr(name='init')
+def apply_signup (email:str,key:str=None,provider:str='sqlite') :
+    """
+    Initialize smart-logger so it is able to store your if need be
+    """
+    _config = {"system":{"email":email,"uid":str(uuid.uuid4()),"version":meta.__version__},"store":{"provider":provider,"context":"write"}}
+    _db = meta.__database__
+    if provider in ['sqlite','sqlite3'] :
+        _db = os.sep.join([meta.__home__,_db+'.db3'])
+        _config['store']['database'] = _db
+    else:
+        _config['store']['database'] = _db
+    #
+    # Let us store this in a folder
+    _PATH = meta.__home__
+    _verb = "written"
+    if not os.path.exists(_PATH) :
+        os.mkdir(_PATH)
+    else:
+        _verb = "updated"
+    f = open(os.sep.join([_PATH,'config.json']),'w')
+    f.write(json.dumps(_config))
+    f.close()
+    _msg = f"""
+        The configuration file was {_verb} successfully at {meta.__home__}
+        data store: 
+            provider {provider}
+            database {_db}
+
+        If your database has security enabled, consider updating "{meta.__home__}{os.sep}config.json" For appropriate security
+        Visit https://github.com/lnyemba/data-transport for more.metarmation
+    """
+    print ()
+    print (_msg)
+    pass
+def post(_df,_table):
+    """
+    Store data in a given location 
+    """
+    _path = os.sep.join([meta.__home__,'config.json'])
+    f = open (_path)
+    _config = json.loads(f.read())
+    f.close()
+    _store = _config['store']
+    # if _store['provider'] in ['mongodb','mongo','couch','couchdb'] :
+    #     _store['collection'] = _table
+    # else:
+    #     _store['table'] = _table
+   
+    _store['table'] = _table
+        
+    # writer = transport.factory.instance(**_store)
+    writer = transport.get.writer(**_store)
+    writer.write(_df)
+    if hasattr(writer,'close') :
+        writer.close()
+
+if __name__ == '__main__' :
+    os.environ['REGISTRY_FOLDER'] = meta.__home__
+    # print (os.environ['REGISTRY_FOLDER'])
+    _cli.add_typer(plugins.cli.appr,name='registry',help='Initialize smart-logger registry for plugins ')
+    # del os.environ['REGISTRY_FOLDER']
+    _cli()

+ 1 - 1
setup.py

@@ -11,7 +11,7 @@ args    = {
     "version":meta.__version__,
     "version":meta.__version__,
     "author":meta.__author__,"author_email":"meta@the-phi.com",
     "author":meta.__author__,"author_email":"meta@the-phi.com",
     "license":meta.__license__,
     "license":meta.__license__,
-    "packages":["meta","smart","smart.top","smart.folder","smart.logger","smart.files"]
+    "packages":["meta","plugins","smart","smart.top","smart.folder","smart.logger","smart.files"]
     }
     }
 args["keywords"]=['mongodb','couchdb','rabbitmq','file','read','write','s3','sqlite']
 args["keywords"]=['mongodb','couchdb','rabbitmq','file','read','write','s3','sqlite']
 args["install_requires"] = ['typer','pandas','numpy','data-transport@git+https://github.com/lnyemba/data-transport.git']
 args["install_requires"] = ['typer','pandas','numpy','data-transport@git+https://github.com/lnyemba/data-transport.git']

+ 1 - 38
smart/__init__.py

@@ -24,6 +24,7 @@ import shutil
 from datetime import datetime
 from datetime import datetime
 _cli = typer.Typer()
 _cli = typer.Typer()
 
 
+import plugins
 
 
 @_cli.command(name='log-intruder')
 @_cli.command(name='log-intruder')
 def intrusion(path:str='/var/log/auth.log', year:int=datetime.now().year):
 def intrusion(path:str='/var/log/auth.log', year:int=datetime.now().year):
@@ -149,41 +150,3 @@ def post(_df,_table):
 
 
 if __name__ == '__main__' :
 if __name__ == '__main__' :
     _cli()
     _cli()
-
-# from transport import factory
-
-# class logger :
-#     """
-#     This class is a basic logger, it will log data regardless of the types of data, We will have subclasses that will implement various data extraction schemas:
-#     - processes (top), 
-    
-#     """
-#     def __init__(self,**args):
-#         """
-#         :store  data store (disk,mongo,couch,google,dropbox)
-#         :args   arguments to pass for the data-store (read transport documentation)
-#         :notify function that returns true/false for notification
-#         """        
-
-#         self.store = factory.instance(type=store,args=args['args'])
-#         if 'notify' in args :
-#             self.notify = args
-#         pass
-    
-#     def log(self,row):
-#         """
-#         This function will log data to a data store
-#         :row    row to be stored
-#         """
-#         self.store.write(row=row)
-#         if(hasattr(self,'notify')):
-#             if (self.notify(row)) :
-#                 #
-#                 # Let us notify the backend by generating a report and submitting  it
-#                 #
-#                 stream = self.get.report()
-#                 pass
-#             else:
-#                 pass
-#     def report(self)  :
-        

+ 1 - 1
smart/logger/__init__.py

@@ -4,7 +4,7 @@ This file looks into the logs to determine if there is any intrusion or provides
 
 
 import pandas as pd
 import pandas as pd
 import numpy as np
 import numpy as np
-import transport
+# import transport
 import datetime
 import datetime
 import io
 import io
 import json
 import json