ソースを参照

Bug fix with factory and actor initialization

Steve Nyemba 7 年 前
コミット
06180c42a8
1 ファイル変更94 行追加22 行削除
  1. 94 22
      src/utils/agents/actor.py

+ 94 - 22
src/utils/agents/actor.py

@@ -22,22 +22,31 @@ from utils.params import PARAMS
 import smtplib
 from email.mime.multipart import MIMEMultipart
 from email.mime.text import MIMEText
-
+from datetime import datetime
+from StringIO import StringIO
+from utils.services import Dropbox, Google
 class Actor():
     @staticmethod
-    def instance(name,args):
+    def instance(name,args,logger=None):
         """
             This function is a singleton that acts as a factory object for all the instances of this subclass
             @param name name of the class to instantiate
             @param args arguments to be passed in {configuration}
         """
-        o = None
-        try:
-            o = eval("".join([name,"()"]))
-            o.init(args)
-        except Exception,e:
-            print str(e)
-        return o
+        r = []
+        if not isinstance(name,list):
+            name  = [name]
+        for id in name :
+            try:
+                o = eval("".join([id,"()"]))
+                o.Initialize(args,logger)
+                r.append(o)
+            except Exception,e:
+                if logger is not None :
+                    logger.log(subject='Actor',object='Factory',action='error',value=e.message)
+                
+                print str(e)
+        return r[0] if len(r) == 1 else r
     def __init__(self):        
         """
             Initializing the class with configuration. The configuration will be specific to each subclass
@@ -51,8 +60,9 @@ class Actor():
     # def getIdentifier(self):
     #     return self.__class__.__name__.lower()
 
-    def init(self,args):
+    def Initialize(self,args,logger=None):
         self.config = args
+        self.logger = logger
         
     def isValid(self,**item):
         return False
@@ -67,6 +77,10 @@ class Actor():
             pass      
     def post(self,**args):    
         pass
+    def log(self,**args):
+        if self.logger :
+            args['subject'] = self.getName()
+            self.logger.log(args)
 class Apps(Actor) :
     """
 	    This class is designed to handle application, restart, if need be.
@@ -99,14 +113,17 @@ class Apps(Actor) :
             @param args {"apps_o":"","app_x":params}
         """
         self.action = action
-        self.params = params     
+        self.params = params  
+        self.log(action='init',object=action,value=params)   
 
     def startup(self,cmd) :
         """
             This function is intended to start a program given the configuration
+            @TODO We need to find the command in case the app has crashed
         """        
         try:
             os.system(cmd +" &")
+            self.log(action='startup',value=cmd)
         except Exception, e:
             print e
         
@@ -206,21 +223,38 @@ class Folders(Actor):
         {threshold:value}
         @params threshold   in terms of size, or age. It will be applied to all folders
     """
-    
-    def init(self,args):
+    def init(self,action,params):
+        self.action = action
+        # print args
+    # def init(self,args):
+        """
+            This is initialized with parameters from the plan.
+            The parameters should be specific to the actor (folder)
+                folder_size
+        """
         #self.lfolders   = args['folders'] #config['folders']
         #self.action     = args['action'] #{clear,archive} config['actions']['folders']
-        self.threshold  = self.get_size( args['threshold']) #self.config['threshold'])
+        
+        plan = params['plan']
+        self.threshold  = self.get_size( plan['folder_size']) #self.config['threshold'])
+        # self.action = action
+        self.params = params 
+        
         
     def isValid(self,**args):
         action = args['action']
+        
+        
         params = args['params']
-        p = action in ['clean','archive','backup']
+        p = len(set(action) & set(['clean','archive','backup'])) > 0
         q = False
         r = False
         if p :
-            q = params.keys()[0] in ['label','folder']
-            r = os.path.exists(params.values[0])
+            q = len(set(params.keys()) & set( ['label','folder'])) > 0
+        if q :
+            folder = params['label'] if 'label' in params else params['folder']
+            r = os.path.exists(folder)
+        
         return p and q and r
     def archive(self,item):
         """
@@ -231,10 +265,13 @@ class Folders(Actor):
         folder = item['label']
         name = folder.split(os.sep)
         name = name[len(name)-1]
-        date = ''.join([str(i) for i in item['date'].values()])
-        signature='-'.join([name,date,str(item['stats']['file_count']),'files'])
+        date =  str(datetime.now()).replace(' ','@')#''.join([str(i) for i in item['date'].values()])
+        
+        # signature='-'.join([name,date,str(item['stats']['file_count']),'files'])
+        signature='-'.join([name,date])
         tarball=os.sep.join([folder,'..',signature])
         shutil.make_archive(tarball,'tar',folder)
+        
         #self.clean(item)
         #
         # @TODO: The archive can be uploaded to the cloud or else where
@@ -242,7 +279,34 @@ class Folders(Actor):
         #   @param key  authorization key for the given service
         #
         pass
-
+        return tarball+".tar"
+    def backup(self,tarball):
+        """
+            This function will initiate backup to the cloud given
+        """
+        if os.path.exists(tarball) :
+            
+            key = self.params['key']
+            
+            sid = self.params['user']['sid']
+            if sid == 'dropbox' :
+                cloud = Dropbox()
+            elif sid == 'google-drive' :
+                cloud = Google()
+            cloud.init(key)
+            file = open(tarball) 
+            out = cloud.upload('backup','application/octet-stream',file)
+            file.close()
+            print out
+            pass
+        else:
+            pass
+        print tarball
+        print self.params['user']['sid']
+        print self.params['key']
+        #
+        # let's upload to the cloud
+        pass
     def clean(self,item):
         """
             This function consists in deleting files from a given folder
@@ -257,7 +321,7 @@ class Folders(Actor):
                 os.remove(path)
         #
         # 
-
+    
     def get_size(self,value):
         """
             converts size values into MB and returns the value without units
@@ -283,7 +347,15 @@ class Folders(Actor):
         p = os.path.exists(item['label']) and item['label'] in self.lfolders    
         q = item['stats']['size']['mean'] >= self.threshold and self.threshold > 0
         return p and q
-    
+    def run(self):
+        tarball = None
+        if 'archive' in self.action :
+            tarball = self.archive(self.params)
+        
+        if 'backup' in self.action and tarball:
+            self.backup(tarball)
+        if 'delete' in self.action and self.can_clean():
+            self.clean()
     def analyze(self,logs):
         r = {'clean':self.clean,'archive':self.archive}
         self.lfolders = [ folder['label'] for folder in logs]