async def forge(self): get_file_name = re.search('forge_(.*)_(.*).jar', self.search_server.jar_name).group(2) if get_file_name == 'unstable' or get_file_name == 'stable': spinner.start('サーバーをセットアップ中です') command = [ 'java', '-jar', f'{self.search_server.jar_name}', '--installServer' ] proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) proc.wait() spinner.succeed('サーバーのセットアップに成功しました').start('インストーラーを削除中') os.remove( re.search('forge_(.*)_(.*)', self.search_server.jar_name).group()) spinner.succeed('インストーラーの削除に成功の削除に成功').start('サーバーの初回起動中') command = [ 'java', '-jar', self.search_server.original_jar_name.replace( '-installer.jar', '-universal.jar') ] proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) if re.search( 'You need to agree to the EULA in order to run the server. Go to eula.txt for more info.', proc.stdout.read().decode().strip()): await self.eula()
async def create_dir(self, file_path): if not os.path.isdir(file_path): os.makedirs(file_path) spinner.succeed('ファイルの作成に成功しました') else: spinner.succeed('ファイルの確認に成功しました') return 'succeed'
def upgrade(self): spinner.start('生成したmigrateファイルを適応中') upgrade_status = self.process(['alembic', 'upgrade', '+1']) if upgrade_status == 0: spinner.succeed('migrateファイルの適応に成功') else: spinner.fail('migrateファイルの適応に失敗しました') exit('再度実行し問題が修正されない場合は作者へご連絡ください') return 0
async def download_file(self, url: str, save_path: str = None, file_name: str = None): file_path_name = f'{save_path}{file_name}' spinner.start('ファイルをダウンロードしています') urllib.request.urlretrieve(url, file_path_name) spinner.succeed('ファイルのダウンロードに成功') checksum = await self.check_sha1_hash(file_path_name) return checksum
def first_launch(self): print("""██╗███╗ ██╗████████╗███████╗██╗ ██████╗ ██╗ ██╗ ██║████╗ ██║╚══██╔══╝██╔════╝██║ ██╔══██╗╚██╗ ██╔╝ ██║██╔██╗ ██║ ██║ ███████╗██║ ██████╔╝ ╚████╔╝ ██║██║╚██╗██║ ██║ ╚════██║██║ ██╔═══╝ ╚██╔╝ ██║██║ ╚████║ ██║ ███████║███████╗ ██║ ██║ ╚═╝╚═╝ ╚═══╝ ╚═╝ ╚══════╝╚══════╝ ╚═╝ ╚═╝ """) print('INTSL PYへようこそ!初回起動の為少々セットアップに時間がかかる可能性があります...') spinner.start('データベースの作成を行います') command = ['alembic', 'revision', '--autogenerate', '-m', '\"init\"'] Migrate(command).generate() spinner.succeed('データベースの作成に成功しました')
def generate(self): os.chdir('./app') spinner.start('migrateファイルの生成を実行中') generate_status = self.process() if generate_status == 0: spinner.succeed('migrateファイルの生成に成功') self.upgrade() elif generate_status == 'revision identified error': spinner.fail('データベースのバージョン管理システムとの整合性が損なわれています') exit('再度実行し問題が修正されない場合は作者へご連絡ください。') else: spinner.fail('migrateファイルの生成に失敗') exit('データベースが使用できないためINTSL PYを終了します') os.chdir('../')
async def eula(self): spinner.succeed('サーバーの初回起動に成功') y_or_n = await Basic().text_input('Minecraftエンドコンテンツ利用規約所に同意しますか: ', ['y', 'n']) if y_or_n == 'y': eula_file_name = 'eula.txt' if os.path.exists(eula_file_name): with open(eula_file_name, 'r') as f: data_lines = f.read() with open(eula_file_name, mode="w") as f: f.write(data_lines.replace('eula=false', 'eula=true')) else: exit('同意しない場合は利用できません') return True
async def official(self): spinner.start('サーバーをテスト起動中です\n') command = ['java', '-jar', f'{self.search_server.jar_name}', '--nogui'] proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) while proc.poll() is None: log = proc.stdout.readline().decode('cp932') if re.search( 'You need to agree to the EULA in order to run the server. Go to eula.txt for more info.', log): spinner.succeed('Eulaの生成に成功') await self.eula() break if re.search('Done (.*)! For help, type \"help\" or \"?\"', log): spinner.succeed('サーバーの起動テストに成功') proc.kill() break
async def register(self, mc_server_name: str = None, mc_server_desc: str = None, mc_server_port: int = None, mc_server_type: str = None, mc_version_result=None): print(f"""最終確認: 登録内容を最後にもう一度よくご確認ください。 サーバー名: {mc_server_name} サーバー概要: {mc_server_desc} サーバーポート: {mc_server_port} サーバーエディション: {mc_server_type} サーバーバージョン: {mc_version_result[0]} """) y_or_n = await Basic().text_input('本当によろしいですか?: ', ['y', 'n']) if y_or_n == 'n': logger.info('登録をキャンセルしました') sys.exit(0) check_dir = await Basic().check_dir(f'./app/server/{mc_server_name}/') if check_dir is True: logger.error(f'すでに使用されているサーバー名です') sys.exit(0) spinner.start('キャッシュを確認しています') tmp_path = await Basic().check_tmp() download_file_path = f'{tmp_path}intsl_py/{mc_server_type}/' download_file_name = await self.get_file_name(mc_server_type, mc_version_result) if os.path.exists( f'{download_file_path}{mc_server_type}_{mc_version_result[0]}_{mc_version_result[2]}.jar' ): spinner.succeed('キャッシュの確認に成功') sha1_hash = await Basic().check_sha1_hash( f'{download_file_path}{mc_server_type}_{mc_version_result[0]}_{mc_version_result[2]}.jar' ) check_database = session.query(Hash).filter( and_( Hash.file_name == f'{mc_version_result[0]}_{mc_version_result[2]}.jar', Hash.sha1 == sha1_hash)) if check_database: spinner.succeed('ハッシュの確認に成功') else: spinner.fail( 'ハッシュの確認に失敗しました。ファイルが改ざんされている可能性があります。安全のためサービスを終了します') sys.exit(1) else: await Basic().create_dir(download_file_path) jar_hash = await Basic().download_file(mc_version_result[1], download_file_path, download_file_name) if jar_hash == mc_version_result[3]: spinner.succeed('ハッシュの確認に成功') os.rename( f'{download_file_path}{download_file_name}', f'{download_file_path}{mc_server_type}_{mc_version_result[0]}_{mc_version_result[2]}.jar' ) await db_manager.commit( Hash(file_name= f'{mc_version_result[0]}_{mc_version_result[2]}.jar', sha1=jar_hash)) else: spinner.fail( 'ハッシュの確認に失敗しました。ファイルが改ざんされている可能性があります。安全のためサービスを終了します') sys.exit(0) await Basic().create_dir(f'./app/server/{mc_server_name}') shutil.copy( f'{download_file_path}{mc_server_type}_{mc_version_result[0]}_{mc_version_result[2]}.jar', f'./app/server/{mc_server_name}/') await db_manager.commit( Server( name=mc_server_name, description=mc_server_desc, port=mc_server_port, path=f'./app/server/{mc_server_name}/', jar_name= f'{mc_server_type}_{mc_version_result[0]}_{mc_version_result[2]}.jar', original_jar_name=download_file_name)) await Setup(server_name=mc_server_name, server_type=mc_server_type).run()