\FF\D8\FF\E0\00JFIF\00\00\00d\00d\00\00\FF\FE\00\border bs:0 bc:#000000 ps:0 pc:#ffffff es:0 ec:#000000 ck:feee6c715d26fd9f38b0ca4278c05026\FF\DB\00C\00P7<F<2PFAFZUP_xxnnx\F5\AF\B9\91\C8\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\DB\00CUZZxix‚\EB\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\C0\00\00b\00d\00\FF\C4\00\00\00\00\00\00\00\00\00\00\00\00\00\00\FF\C4\00\00\00\00\00\00\00\00\00\00\001A!Q\FF\C4\00\00\00\00\00\00\00\00\00\00\00\00\00\FF\C4\00\00\00\00\00\00\00\00\00\00!1AQ\FF\DA\00\00\00?\00\F6\00\00\00\00\00\00\00\00\00\00\A0\00\00\C5\CF\F8\E7Ó\FCjD~\B9^\AD\%\B3]\D8cs-\BBs,-\A0\00"\80\00%\B83rÏ^K~F\A4ea\00E\00\C6\EE=u\B1\9B\D1\00@\00r\BE8\F9:\FE5#.M\00\E7\CB\C9q\CBq\D6\F2\BE\B7\C7>\C9n5×\D6?\BDê\9Ds\EBp\9F[`8m\B7)o\B5\E8\E6I\99\FE3]]A2\BA\8Cw\D6E\93\\DEv\C8\009\F2\F1NI?uc\\F5\EA\96k\xN<~buv\EA\C8\D7	\8B\84\CEcxI\BBg\AE\9E=\D6+n\EC\80\C8A\8C\AE\EB\CF\D5\DA\E9"2\A4\B9j5\EB\F3W\B63\96\B30Yu\DA\FC8\ED\DF\E7Ms\FB\F1\8E\B3\FA\EA\E8\E6(\883zs\F2_\8DFk\8Bh
\00\8C\DCw\D3R\B5+6X\BA\B2\C4j\AB0\B4\FCMw\C2I\8E\9B\E3\A9~9u\FA\D3l\80\C8%p\EE\FDn2€
\00$\FEj\C4e\A9\DB\~\95\A7\A5\80EK\BB\8DDsP\00@@AD'k\CF\E8\DB\D2(\80\9AK\D3\85\D6lb\F2\BA\8C*\80\00)\95
59\A3R:\F3\CE"\B6\80\88\00\00i1u4ê\E9\F2á\A6\A2\FACM\93WMb*\E0*\00\00\00\00\00(\A8\80\00\00\80\00\00\00\00\00\00\00\00\00\FF\D9<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>C///</title>
</head>
# coding=utf-8
#
# Copyright Â© Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2019 All Rights Reserved
#
# Licensed under CLOUD LINUX LICENSE AGREEMENT
# http://cloudlinux.com/docs/LICENSE.TXT
from uuid import uuid4

from clcommon.clconfpars import change_settings, load
from lvestats.lib import config, lveinfolib
from lvestats.orm.history import history, history_x60
from lvestats.orm.history_gov import history_gov
from lvestats.orm.incident import incident
from lvestats.orm.servers import servers
from lvestats.orm.user import user


class UpdateOrCreateServerID(object):
    """Change old-style server ID 'localhost' to auto-generated uuid
    User can set his own server ID
    """

    restricted_server_id_list = ('localhost',)
    server_id_length = 10

    def __init__(self, engine, config_path=None):
        """
        :type engine: sqlalchemy.engine.base.Engine
        :type config_path: Union[str, None]
        """
        self.engine = engine
        self.config_path = config_path or config.GLOBAL_CONFIG_LOCATION

    def _get_current_server_id_cfg(self):
        """
        :rtype: Union[None, str]
        """
        try:
            cfg = load(path=self.config_path)
            return cfg.get('server_id')
        except Exception as e:
            print(f'Error: {e}')
            return None

    def _set_server_id_cfg(self, server_id):
        """Sets option 'server_id' in config file
        :type server_id: str
        :rtype: Union[None, str]
        """
        try:
            change_settings({'server_id': server_id}, self.config_path)
            return server_id
        except Exception as e:
            print(f'Error: {e}')
            return None

    def _update_server_id_table(self, conn, table, current_server_id, new_server_id):
        """
        updates server_id in one of the tables
        :type conn: sqlalchemy.engine.base.Connection
        :type table: Union[history, history_gov, incident, user, history_x60]
        :type current_server_id: str
        :type new_server_id: str
        """
        sql_update = table.__table__.update().where(
            table.server_id == current_server_id
        )
        conn.execute(sql_update.values(
            {'server_id': new_server_id}
        ))

    def _update_server_id_db(self, current_server_id, new_server_id):
        """
        updates server_id for all tables in the database
        :type current_server_id: str
        :type new_server_id: str
        :rtype: Union[None, str]
        """
        sql_tables = [history, history_gov, incident, user, history_x60]
        lve_version = lveinfolib.get_lve_version(self.engine, current_server_id)
        conn = self.engine.connect()
        tx = conn.begin()
        try:
            for table in sql_tables:
                self._update_server_id_table(conn, table, current_server_id, new_server_id)

            # update servers table, where server_id is a primary key
            conn.execute(servers.__table__.insert().values(
                {'server_id': new_server_id, "lve_version": lve_version}
            ))
            conn.execute(servers.__table__.delete().where(servers.server_id == current_server_id))
        except Exception as e:
            tx.rollback()
            conn.close()
            print(f'Error: {e}')
            return None
        else:
            tx.commit()
            conn.close()
            return new_server_id

    def _resolve_localhost(self, prompt=True, current_server_id=None):
     