Beispiel #1
0
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))
Beispiel #2
0
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))