class UpdateXmlContrat(object): """class to update new Xml on Oracle database, with restarting contrat """ def __init__(self, logger=None): self.logger = logger or logging.getLogger(__name__) self.__oracle = Oracle(mode="admin") self.__oracle._connect() # self.__oracle._close() def update_xml(self, new_zips): for nzip in new_zips: xml_content_clob = nzip.get('xml') new_xml_clob = self.__oracle.cursor.var(cx_Oracle.CLOB) new_xml_clob.setvalue(0, xml_content_clob) idcontrat = nzip.get("idcontrat") idcontrat_var = self.__oracle.cursor.var(cx_Oracle.NUMBER) idcontrat_var.setvalue(0, idcontrat) # update PARAMETRERAPPLICATION self.__oracle.cursor.execute( """ UPDATE SITECENTRAL.PARAMETREAPPLICATION SET PARAMETRESAPPLICATION = :parametreapp WHERE IDCONTRAT = :idcontrat AND TYPEAPPLICATION = 41""", parametreapp=new_xml_clob, idcontrat=idcontrat_var) self.__oracle.connection.commit() self.logger.info("Success : Update idcontrat %s !!" % idcontrat) # self.__oracle._close() def restart_contrat(self, idcontrat, idlogin, timeout=1): self.__suspend_contrat(idcontrat, idlogin) sleep(timeout) self.__resume_contrat(idcontrat, idlogin) def close(self): self.__oracle._close() def __suspend_contrat(self, idcontrat, idlogin): idcontrat_var = self.__oracle.cursor.var(cx_Oracle.NUMBER) idcontrat_var.setvalue(0, idcontrat) idlogin_var = self.__oracle.cursor.var(cx_Oracle.STRING) idlogin_var.setvalue(0, idlogin) try: self.logger.info("-> (-) Suspend contrat : %s" % idcontrat) self.__oracle.cursor.callproc("APICONTRAT.SuspendreContrat", [idcontrat_var, idlogin_var]) except Exception, ex: self.logger.error( "Error: during suspending contrat : %s, cause: %s" % (idcontrat, ex))
class ExtractXmlContrat(object): """ class to extract and filter active contrat without hostname on run.py script""" ADD_IMPORT_SYSTEM_LINE = "import System" FIND_HOSTNAME_LINE = "System.Environment.GetEnvironmentVariable(" ADD_HOSTNAME_LINE = "scen.addMessage('Probe: ' + System.Environment.GetEnvironmentVariable('computername'))" TMP_DIR = "/opt/iplabel/tmp" def __init__(self, idclient=None, idcontrat=None, logger=None): self.logger = logger or logging.getLogger(__name__) self.__oracle = Oracle() self.xml_contrat = [] self.current_dir = os.path.dirname(os.path.realpath(__file__)) self.idclient = idclient self.idcontrat = idcontrat self.get_xml_active_contrat() def get_xml_active_contrat(self): if self.idclient is not None: _request = r""" SELECT c.idclient, p.idcontrat, p.parametresapplication FROM parametreapplication p INNER JOIN contrat c ON c.idcontrat = p.idcontrat AND c.etatcontrat = 4 AND c.idclient = %s LEFT JOIN descriptioncontrat d ON p.IDCONTRAT = d.IDCONTRAT AND d.TYPEATTRIBUTCONTRAT = 282 AND d.VALEURATTRIBUT = 1 WHERE p.TYPEAPPLICATION = 41 AND d.idcontrat IS NULL ORDER BY c.IDCLIENT""" % self.idclient elif self.idcontrat is not None: if isinstance(self.idcontrat, list): _request = r""" SELECT c.idclient, p.idcontrat, p.parametresapplication FROM parametreapplication p INNER JOIN contrat c ON c.idcontrat = p.idcontrat AND c.etatcontrat = 4 and c.idcontrat in (%s) LEFT JOIN descriptioncontrat d ON p.IDCONTRAT = d.IDCONTRAT AND d.TYPEATTRIBUTCONTRAT = 282 AND d.VALEURATTRIBUT = 1 WHERE p.TYPEAPPLICATION = 41 AND d.idcontrat IS NULL ORDER BY c.IDCLIENT""" % (", ".join( self.idcontrat)) elif isinstance(self.idcontrat, str): if self.idcontrat == "all": _request = r""" SELECT c.idclient, p.idcontrat, p.parametresapplication FROM parametreapplication p INNER JOIN contrat c ON c.idcontrat = p.idcontrat AND c.etatcontrat = 4 --and c.idclient = 18837 LEFT JOIN descriptioncontrat d ON p.IDCONTRAT = d.IDCONTRAT AND d.TYPEATTRIBUTCONTRAT = 282 AND d.VALEURATTRIBUT = 1 WHERE p.TYPEAPPLICATION = 41 AND d.idcontrat IS NULL ORDER BY c.IDCLIENT""" self.logger.info('Connect to Oracle database') self.__oracle._connect() self.xml_contrat = self.__oracle.execute_select_query(_request) # !!! self.__oracle._close() # we need to close after processing def extract_filtered_tzip_contrat(self, directory=None): tzip_without_hostname = [] path = "" if directory is not None: path = os.path.join(ExtractXmlContrat.TMP_DIR, directory) if not os.path.exists(path): os.makedirs(path) self.logger.info("Directory created : %s" % path) else: self.logger.info("Path already exist : %s" % path) else: path = ExtractXmlContrat.TMP_DIR i = 0 for idclient, idcontrat, xml_content in self.xml_contrat: i += 1 tzip_without_hostname_info = {} self.logger.info( "[%s] ------- Select Contrat: %s, idclient: %s ---------" % (i, idcontrat, idclient)) try: current_xml = xml_content.read() tzip = xml.dom.minidom.parseString( current_xml).getElementsByTagName("transaction").item( 0).getAttribute("tzip") decode_zip_file = base64.decodestring(tzip) tmp_filename = "%s_%s.zip" % (idclient, idcontrat) tmp_file_path = os.path.join(path, tmp_filename) self.logger.info("Extracting zip file: %s" % tmp_file_path) with open(tmp_file_path, 'wb') as tmp_file: tmp_file.write(decode_zip_file) if os.path.exists(tmp_file_path): zip_file = zipfile.ZipFile(tmp_file_path, mode='r') if 'run.py' in zip_file.namelist(): self.logger.info("Reading 'run.py' from %s" % tmp_file_path) runpy = zip_file.read('run.py') runpy_encoding = chardet.detect(runpy).get('encoding') runpy_utf8 = runpy.decode(runpy_encoding).encode( 'UTF-8') self.logger.info("Check existing Hostname on run.py") if runpy_utf8.find( ExtractXmlContrat.ADD_HOSTNAME_LINE ) == -1 and runpy_utf8.find( ExtractXmlContrat.FIND_HOSTNAME_LINE) == -1: self.logger.info( '(+) Hostname code not found on run.py, we need update it on : %s' % tmp_file_path) tzip_without_hostname_info['idclient'] = idclient tzip_without_hostname_info['idcontrat'] = idcontrat tzip_without_hostname_info['xml'] = current_xml tzip_without_hostname_info['tzip'] = tzip tzip_without_hostname_info[ 'zip_file_path'] = tmp_file_path tzip_without_hostname.append( tzip_without_hostname_info) else: self.logger.info( "(-) Hostname already exist, we delete zip file: %s" % tmp_file_path) zip_file.close() try: os.remove(tmp_file_path) except OSError, ex: self.logger.error( "Error: During removing tmp file, cause: %s" % ex) else: self.logger.error("File 'run.py' not found on %s" % tmp_file_path) zip_file.close() else: self.logger.error( 'Error: during extraction, %s not found' % tmp_file_path) except Exception, ex: self.logger.error( "Error: during processing extaract ! idcontrat: %s idclient: %s, cause: %s" % (idcontrat, idclient, ex))