def dep_wrapper(*args, **kwargs): from porcupine.core.runtime import logger upper_stack = traceback.extract_stack()[-2] pfile, line_no, where, line = upper_stack logger.warning("DEPRECATION WARNING\n" + "File \"%s\".\n" % pfile + "Line %d:\n %s\nin \"%s\". " % (line_no, line, where) + "Use \"%s\" instead." % (member or compat.get_func_name(function))) return function(*args, **kwargs)
def dep_wrapper(*args, **kwargs): from porcupine.core.runtime import logger upper_stack = traceback.extract_stack()[-2] pfile, line_no, where, line = upper_stack logger.warning( "DEPRECATION WARNING\n" + "File \"%s\".\n" % pfile + "Line %d:\n %s\nin \"%s\". " % (line_no, line, where) + "Use \"%s\" instead." % (member or compat.get_func_name(function))) return function(*args, **kwargs)
def __init__(self): logger.warning("DEPRECATION WARNING\n" + "OqlCommand is deprecated.\n" + "Use \"porcupine.oql.command.execute\" instead.")
def execute_command(self, cmd, request): try: # DB maintenance commands if cmd == 'DB_BACKUP': output_file = request.data if not os.path.isdir(os.path.dirname(output_file)): raise IOError services.lock_db() try: _db.backup(output_file) finally: services.unlock_db() return (0, 'Database backup completed successfully.') elif cmd == 'DB_RESTORE': backup_set = request.data if not os.path.exists(backup_set): raise IOError services.lock_db() services.close_db() try: _db.restore(backup_set) finally: services.open_db() services.unlock_db() return (0, 'Database restore completed successfully.') elif cmd == 'DB_SHRINK': iLogs = _db.shrink() if iLogs: return (0, 'Successfully removed %d log files.' % iLogs) else: return (0, 'No log files removed.') # package management commands elif cmd == 'PACKAGE': ini_file = request.data my_pkg = None try: my_pkg = Package(ini_file=ini_file) my_pkg.create() finally: if my_pkg is not None: my_pkg.close() return (0, 'The package "%s-%s.ppf" was created succefully.' % (my_pkg.name, my_pkg.version)) elif cmd == 'INSTALL': # some scripts might require a security context from porcupine import context ppf_file = request.data my_pkg = None try: my_pkg = Package(package_file=ppf_file) # install as system context.user = _db.get_item('system') my_pkg.install() finally: if my_pkg is not None: my_pkg.close() context.user = None return (0, 'The package "%s" was installed succefully.' % ppf_file) elif cmd == 'UNINSTALL': # some scripts might require a security context from porcupine import context ppf_file = request.data my_pkg = None try: my_pkg = Package(package_file=ppf_file) # uninstall as system context.user = _db.get_item('system') my_pkg.uninstall() finally: if my_pkg is not None: my_pkg.close() context.user = None return (0, 'The package "%s" was uninstalled succefully.' % ppf_file) # replication commands elif cmd == 'SITE_INFO': rep_mgr = _db.get_replication_manager() if rep_mgr is not None: site_list = list(rep_mgr.get_site_list().values()) site_list.append( rep_mgr.local_site.address + (1,)) #print site_list info = [str.format('{0:25}{1:10}{2:6}', 'SITE', 'STATUS', 'MASTER'), '-' * 41] for site in site_list: site_address = site[:2] if site[2] == 1: s = 'ONLINE' else: s = 'OFFLINE' if rep_mgr.master and \ rep_mgr.master.address == site_address: m = 'X' else: m = '' info.append(str.format('{0:25}{1:10}{2:6}', site_address, s, m)) info.append('') info.append('Total sites: %d' % len(site_list)) return (0, '\n'.join(info)) else: raise NotImplementedError elif cmd == 'REP_JOIN_SITE': rep_mgr = _db.get_replication_manager() if rep_mgr is not None: site = request.data #print('adding remote site %s' % (site.address, )) site_list = rep_mgr.sites.values() + [rep_mgr.local_site] rep_mgr.broadcast(MgtMessage('REP_ADD_REMOTE_SITE', site)) rep_mgr.add_remote_site(site) return (0, [rep_mgr.master, site_list]) else: raise NotImplementedError elif cmd == 'REP_ADD_REMOTE_SITE': rep_mgr = _db.get_replication_manager() if rep_mgr is not None: site = request.data #print('adding remote site %s' % (site.address, )) rep_mgr.add_remote_site(site) return (0, None) else: raise NotImplementedError elif cmd == 'REP_NEW_MASTER': rep_mgr = _db.get_replication_manager() if rep_mgr is not None: master = request.data #print('new master is %s' % (master.address, )) rep_mgr.master = master services.notify(('NEW_MASTER', master)) return (0, None) else: raise NotImplementedError # other elif cmd == 'RELOAD': mod = misc.get_rto_by_name(request.data) misc.reload_module_tree(mod) services.notify(('RELOAD_PACKAGE', request.data)) return (0, 'Reloaded module tree "%s"' % request.data) # unknown command else: logger.warning( 'Management service received unknown command: %s' % cmd) return (-1, 'Unknown command.') except IOError: return (-1, 'Invalid file path.') except NotImplementedError: return (-1, 'Unsupported command.')
def __init__(self): logger.warning( "DEPRECATION WARNING\n" + "OqlCommand is deprecated.\n" + 'Use "porcupine.oql.command.execute" instead.' )
def create(self): # files files = self.config_file.options('files') for fl in files: fname = self.config_file.get('files', fl) logger.info('Adding file ' + fname) self.package_files.append(( self.package_file.gettarinfo(fname, fname), fname)) # directories dirs = self.config_file.options('dirs') for dir in dirs: dirname = self.config_file.get('dirs', dir) logger.info('Adding directory ' + dirname) self._addtree(dirname) # published directories if self.config_file.has_section('pubdir'): pubdirs = self.config_file.options('pubdir') dirsConfig = configfiles.PubDirManager() dir_nodes = [] for dir in pubdirs: dirname = self.config_file.get('pubdir', dir) logger.info('Adding published directory "%s"' % dirname) dir_node = dirsConfig.getDirNode(dirname) if dir_node: dir_nodes.append(dir_node) dir_location = dir_node.getAttribute('path') self._addtree(dir_location) else: logger.warning('Published directory "%s" does not exist' % appname) if dir_nodes: dirsFile = open(self.tmp_folder + '/_pubdir.xml', 'w') dirsFile.write('<?xml version="1.0" encoding="utf-8"?><dirs>') for dir_node in dir_nodes: dirsFile.write(dir_node.toxml('utf-8')) dirsFile.write('</dirs>') dirsFile.close() self.package_files.append(( self.package_file.gettarinfo( dirsFile.name, os.path.basename(dirsFile.name)), dirsFile.name)) dirsConfig.close(False) # database items items = self.config_file.options('items') itemids = [self.config_file.get('items', x) for x in items] for itemid in itemids: item = db._db.get_item(itemid) self._export_item(item) # scripts if self.config_file.has_option('scripts', 'preinstall'): preinstall = self.config_file.get('scripts', 'preinstall') logger.info('Adding pre-install script "%s"' % preinstall) self.package_files.append(( self.package_file.gettarinfo(preinstall, '_pre.py'), preinstall)) if self.config_file.has_option('scripts', 'postinstall'): postinstall = self.config_file.get('scripts', 'postinstall') logger.info('Adding post-install script "%s"' % postinstall) self.package_files.append(( self.package_file.gettarinfo(postinstall, '_post.py'), postinstall)) if self.config_file.has_option('scripts', 'uninstall'): uninstall = self.config_file.get('scripts', 'uninstall') logger.info('Adding uninstall script "%s"' % uninstall) self.package_files.append(( self.package_file.gettarinfo(uninstall, '_uninstall.py'), uninstall)) # definition file self.package_files.append(( self.package_file.gettarinfo(self.ini_file, '_pkg.ini'), self.ini_file)) # compact files logger.info('Compacting...') for tarinfo, fname in self.package_files: if tarinfo.isfile(): self.package_file.addfile(tarinfo, open(fname, 'rb')) # remove temporary if fname[:len(self.tmp_folder)] == self.tmp_folder: os.remove(fname) else: if type(fname) == str: # unicode fname = fname.encode('utf-8') self.package_file.add(fname)
def uninstall(self): logger.info('Uninstalling [%s-%s] package...' % (self.name, self.version)) # database items items = self.config_file.options('items') itemids = [self.config_file.get('items', x) for x in items] if itemids: @db.transactional(auto_commit=True) def _remove_items(): for itemid in itemids: item = db._db.get_item(itemid) if item is not None: logger.info('Removing object %s' % itemid) item._delete() _remove_items() # uninstall script contents = self.package_file.getnames() if '_uninstall.py' in contents: logger.info('Running uninstallation script...') self.package_file.extract('_uninstall.py', self.tmp_folder) self._execute_script(self.tmp_folder + '/_uninstall.py', 'Uninstall script') os.remove(self.tmp_folder + '/_uninstall.py') # files files = self.config_file.options('files') for fl in files: fname = self.config_file.get('files', fl) logger.info('Removing file ' + fname) if os.path.exists(fname): os.remove(fname) # check if it is a python file if fname[-3:] == '.py': [os.remove(fname + x) for x in ('c', 'o') if os.path.exists(fname + x)] # directories dirs = self.config_file.options('dirs') for dir in dirs: dir_path = self.config_file.get('dirs', dir) if os.path.exists(dir_path): logger.info('Removing directory ' + dir_path) shutil.rmtree(dir_path, True) # published dirs if '_pubdir.xml' in contents: logger.info('Uninstalling published directories...') dirsfile = self.package_file.extractfile('_pubdir.xml') _dom = minidom.parse(dirsfile) dirsConfig = configfiles.PubDirManager() dir_nodes = _dom.getElementsByTagName('dir') for dir_node in dir_nodes: #app_node = app_node.cloneNode(True) dir_name = dir_node.getAttribute('name') logger.info('Uninstalling published directory "%s"' % dir_name) old_node = dirsConfig.getDirNode(dir_name) if old_node: dirsConfig.removeDirNode(old_node) else: logger.warning('Published directory "%s" does not exist' % dir_name) # update published directories if dir_name in pubdirs.dirs: del pubdirs.dirs[dir_name] # remove published directory in # multi-processing enviroments services.notify(('REMOVE_PUBDIR', dir_name)) dir_path = dir_node.getAttribute('path') if os.path.exists(dir_path): shutil.rmtree(dir_path, True) _dom.unlink() dirsConfig.close(True)