source: syncer/trunk/fuentes/syncer.install/usr/lib/syncer/lib/SyncerTypes.py @ 4039

Last change on this file since 4039 was 4039, checked in by mabarracus, 4 years ago

First release

File size: 8.4 KB
Line 
1from yapsy.IPlugin import IPlugin
2from yapsy.PluginManager import PluginManager
3
4import sys,os
5import json
6import codecs
7
8def debug(msg):
9    DEBUG=True
10    if DEBUG:
11        print(msg,file=sys.stderr)
12
13def get_params(*args,**kwargs):
14    paramnames=kwargs['paramnames']
15    params={}
16    for x in paramnames:
17        try:
18            idx=paramnames.index(x)
19            params[x] = args[idx]
20        except:
21            try:
22                params[x] = kwargs[x]
23            except:
24                raise Exception('ErrorParameter')
25    return params
26
27class IPlugin(IPlugin):
28    def __init__(self):
29        super().__init__()
30        self.syncer=None
31        self.is_blocker = False
32        self.typeplug='Base'
33        self.params=['param1','param2']
34        self.data_input = {}
35        self.data_output = {}
36        self.init_plugin()
37
38    def syntax(self):
39        return [self.typeplug] + self.params
40
41    def activate(self,*args,**kwargs):
42        super().activate()
43
44    def deactivate(self,*args,**kwargs):
45        super().deactivate()
46
47    def input(self,*args,**kwargs):
48        if not self.is_activated:
49            self.activate()
50        dparam={}
51        params = get_params(*args,paramnames=['trans_id','params'], **kwargs)
52        iterparam=iter(params['params'])
53
54        for param in self.params:
55                dparam[param]=next(iterparam)
56        self.store_input(trans_id=params['trans_id'],**dparam)
57
58    def store_output(self,transid,status,output_list):
59        if type(status) != type(bool()) or type(output_list) != type(list()):
60            raise Exception('Error store_output on %s plugin!'%self.typeplug)
61        self.data_output[transid]={'status':status,'output':output_list}
62
63    def store_input(self,*args,**kwargs):
64        dparam={}
65        params = get_params(*args,  paramnames=['trans_id'],**kwargs)
66        for paramname in self.params:
67            dparam[paramname]=kwargs[paramname]
68        self.data_input[params['trans_id']]=dparam
69
70
71    def end_process(self,*args,**kwargs):
72        params = get_params(*args, paramnames=['transid','status', 'output'], **kwargs)
73        self.store_output(params['transid'], params['status'], [params['output']])
74
75
76    def init_process(self,*args,**kwargs):
77        try:
78            transid=kwargs['transid']
79            status,output=self.process(*args,params=self.data_input[transid], **kwargs)
80        except Exception as e:
81            status=False
82            output=str(e)
83        self.end_process(*args,status=status,output=output, **kwargs)
84
85    def process(self,*args,**kwargs):
86        debug('Using process (transid {}): on {} '.format(kwargs['transid'],self.typeplug ))
87        return True,[ 'Dummy' ,kwargs['transid'] ]
88
89    def output(self,*args,**kwargs):
90        if not self.is_activated:
91            raise Exception('Plugin %s not activated'%self.typeplug)
92        params = get_params(*args, paramnames=['transid'], **kwargs)
93        return self.data_output[params['transid']]
94
95class SyncerClass(PluginManager):
96
97    def __init__(self,plugin_path=['plugins'],ext='syncplugin'):
98        super().__init__(categories_filter={'Default':IPlugin},plugin_info_ext=ext,directories_list=plugin_path)
99        self.syncplugins={}
100        self.sid=0
101
102        self.collectPlugins()
103        self.reorder_plugins()
104
105    def get_plugin(self,pluginname):
106        return self.syncplugins[pluginname]['obj']
107
108    def get_parameters_from_plugin(self,pluginname):
109        return self.syncplugins[pluginname]['params']
110
111    def action_plugins(self,action=None,typeplug=None):
112        if typeplug == None:
113            for plugin in (self.syncplugins[plugintype] for plugintype in self.syncplugins):
114                if action == 'activate':
115                    plugin['obj'].activate()
116                else:
117                    plugin['obj'].deactivate()
118
119    def deactivate_plugins(self,typeplug=None):
120        self.action_plugins('deactivate')
121
122    def activate_plugins(self,typeplug=None):
123        self.action_plugins('activate')
124
125    def reorder_plugins(self):
126        for plugin in self.getAllPlugins():
127     #       plugin.plugin_object.make_attributes(plugin.plugin_object.params)
128            # TODO: realizar metodo en syncer para evitar el acceso al syncer , se podria enganchar una funcion que permita ejecutar algunas cosas en syncer despues de un filtrado, en vez de todo el syncer
129            plugin.plugin_object.syncer=self
130            self.syncplugins[plugin.plugin_object.typeplug]={'obj':plugin.plugin_object,'params':plugin.plugin_object.params,'trans_ids':[]}
131
132    def get_info_parser(self):
133        dparser_info={}
134        for plugtype in self.syncplugins:
135            dparser_info[plugtype]=self.syncplugins[plugtype]['params']
136        return {'choices': list(self.syncplugins.keys()), 'parser_info': dparser_info}
137
138    def get_active_plugins(self):
139        lactive=[]
140        for plugtype in self.syncplugins:
141            if self.get_plugin(plugtype).is_activated:
142                lactive.append(plugtype)
143        return lactive
144    def get_plugin_from_transid(self,transid):
145        for pluginname in self.get_active_plugins():
146            if transid in self.syncplugins[pluginname]['trans_ids']:
147                return pluginname
148        return None
149    def get_pluginobj_from_transid(self,transid):
150        #Equivalente de get_plugin_from_transid + get_plugin
151        for pluginname in self.get_active_plugins():
152            if transid in self.syncplugins[pluginname]['trans_ids']:
153                return self.syncplugins[pluginname]['obj']
154        return None
155    def plugin_input(self,plugin,params):
156        self.sid+=1
157        self.syncplugins[plugin]['trans_ids'].append(self.sid)
158        self.syncplugins[plugin]['obj'].input(self.sid,params)
159
160class SyncerSession(object):
161    def __init__(self,*args,**kwargs):
162        params=get_params(*args,paramnames=['path','lock','file'], **kwargs)
163        self.syncpath=params['path']
164        self.synclockfile=params['lock']
165        self.syncsessionfile=params['file']
166
167    def destroy(self,*args,**kwargs):
168        self.validate_session(msg='Session not initiated')
169        os.remove(self.synclockfile)
170        os.remove(self.syncsessionfile)
171
172    def init(self,*args,**kwargs):
173        if not os.path.isdir(self.syncpath):
174            os.mkdir(self.syncpath,mode=0o777)
175        else:
176            if os.path.isfile(self.synclockfile):
177                raise Exception('Session already initiated')
178            else:
179                open(self.synclockfile, 'w').close()
180                with open(self.syncsessionfile, 'w') as f:
181                    json.dump([], f, separators=(',', ':'))
182
183    def put_in_session(self,*args, **kwargs):
184        self.validate_session(msg='Error writting into session')
185        params = get_params(*args, paramnames=['data'], **kwargs)
186        with open(self.syncsessionfile, 'r+') as f:
187            jsdata = json.load(f)
188            lresult = []
189            plugin = params['data']['plugin']
190            params = params['data']['content']
191            lresult.append((plugin, params))
192            jsdata.extend(lresult)
193            f.seek(0)
194            json.dump(jsdata, f, separators=(',', ':'))
195
196    def put_file_in_session(self,*args, **kwargs):
197        self.validate_session()
198        params = get_params(*args,paramnames=['data_file'], **kwargs)
199
200        if type(params['data_file']) == type(str()):
201            f = open(params['data_file'], 'rb')
202        else:
203            f = params['data_file']
204
205        reader = codecs.getreader('utf-8')(f)
206        jsdata = json.load(reader)
207        f.close()
208
209        with open(self.syncsessionfile, 'r') as sf:
210            jsdata_session = json.load(sf)
211            jsdata_session.extend(jsdata)
212        with open(self.syncsessionfile, 'w') as sf:
213            json.dump(jsdata_session, sf, separators=(',', ':'))
214
215    def validate_session(self,*args, **kwargs):
216        if not os.path.isdir(self.syncpath) or not os.path.isfile(self.syncsessionfile) or not os.path.isfile(self.synclockfile):
217            if 'msg' in kwargs and type(kwargs['msg']) == type(str()):
218                raise Exception(kwargs['msg'])
219            else:
220                raise Exception('Error reading session')
221        return True
222
223    def get_session_data(self,*args, **kwargs):
224        self.validate_session()
225        with open(self.syncsessionfile, 'r') as f:
226            return f.readlines()
227
228    def load_session(self,*args, **kwargs):
229        self.validate_session()
230        with open(self.syncsessionfile, 'r') as f:
231            jsdata = json.load(f)
232        return jsdata
Note: See TracBrowser for help on using the repository browser.