class InstallAction(InstallController): def prepare(self): super(InstallAction, self).prepare() self.errors = [] def post(self, *args, **kwargs): self.config = Config( dict([(key, value.pop()) for key, value in self.request.arguments.items()]) ) # mysql settings if not self.request.arguments.has_key(Config.MYSQL_HOST): self.errors.append(u'Вы должны определить хост для MySQL') elif not self.request.arguments.has_key(Config.MYSQL_DBNAME): self.errors.append(u'Вы должны определить имя базы данных') else: conn_str = 'mysql://' if self.config.get(Config.MYSQL_USER): conn_str += self.config.get(Config.MYSQL_USER) if self.config.get(Config.MYSQL_PASSWORD): conn_str += ':' + self.config.get(Config.MYSQL_PASSWORD) conn_str += '@' conn_str += self.config.get(Config.MYSQL_HOST) engine = create_engine(conn_str + '/?init_command=set%20names%20%22utf8%22', encoding='utf8', convert_unicode=True) try: connection = engine.connect() except OperationalError as op_error: self.errors.append(u'Ошибка соединения с MySQL: ' + op_error.message) except BaseException as ex: self.errors.append(u'Исключение SQLALCHEMY: ' + ex.message) else: try: connection.execute('CREATE DATABASE IF NOT EXISTS `{0}` CHARACTER SET utf8 COLLATE utf8_general_ci'. format(self.config.get(Config.MYSQL_DBNAME))) except BaseException as ex: self.errors.append(u'Исключение при создании БД: ' + ex.message) finally: connection.close() if not self.errors: # save config file raw_config = self.config.getRawConfig() try: configfile = open(self.application.appRoot + '/server.cfg', 'wb') except BaseException as exception: self.errors.append(u'Ошибка при записи файла конфигурации: ' + exception.message) else: raw_config.write(configfile) configfile.close() self.redirect('/install/final') return self.run() def get(self, *args, **kwargs): self.config = Config() # create folders if not os.access(self.application.appRoot, os.W_OK): self.errors.append(u'Корневая директория закрыта на запись! ('+self.application.appRoot + ')') if not os.path.exists(self.application.getLogPath()): try : os.mkdir(self.application.getLogPath(), 0644) except BaseException as ex: self.errors.append(u'Невозможно создать директорию для логов:' + ex.message) elif not os.access(self.application.getLogPath(), os.W_OK): self.errors.append(u'Директория для логов создана, но закрыта на запись! (' + self.application.getLogPath() + ')') if not os.path.exists(self.application.getAppConfigPath()): try : os.mkdir(self.application.getAppConfigPath(), 0644) except BaseException as ex: self.errors.append(u'Невозможно создать директорию для конфигураций:' + ex.message) elif not os.access(self.application.getAppConfigPath(), os.W_OK): self.errors.append(u'Директория для конфигураций создана, но закрыта на запись! (' + self.application.getAppConfigPath() + ')') if not os.path.exists(self.application.getResultPath()): try : os.mkdir(self.application.getResultPath(), 0644) except BaseException as ex: self.errors.append(u'Невозможно создать директорию для результатов:' + ex.message) elif not os.access(self.application.getResultPath(), os.W_OK): self.errors.append(u'Директория для результатов создана, но закрыта на запись! (' + self.application.getResultPath() + ')') self.run() def run(self): self.render('install/install.jinja2', {'config': self.config, 'curdir': os.path.abspath(os.curdir), 'errors':self.errors}) def createFolder(self, folder): path = os.path.abspath(folder) if not os.path.exists(path): os.makedirs(path, mode=0644) return path