/*==LICENSE==* CyanWorlds.com Engine - MMOG client, server and tools Copyright (C) 2011 Cyan Worlds, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . You can contact Cyan Worlds, Inc. by email legal@cyan.com or by snail mail at: Cyan Worlds, Inc. 14617 N Newport Hwy Mead, WA 99021 *==LICENSE==*/ #include "MigrationTask.h" #include "OptionalDialog.h" #include "commctrl.h" #include "resource.h" #include "windowsx.h" #include "shellapi.h" #define SHARENAME "\\\\data.dni\\Parable-Root" #define LIVECLIENTDIR "\\dataservers\\live\\game_Clients\\drcExplorer" #define LIVEEXPANDEDINSTALLDIR "\\dataservers\\live\\game_Install\\Expanded" int MigrationTask_Backup::Run(HINSTANCE hInst, HWND hDlg) { int ret = 0; // SSH In & Run the backup Script... STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); si.dwFlags = STARTF_USECOUNTCHARS | STARTF_USESHOWWINDOW; si.wShowWindow = SW_MINIMIZE; si.lpTitle = "Server Backup Running"; si.dwXCountChars = 80; si.dwYCountChars = 25; ZeroMemory( &pi, sizeof(pi) ); ret = !CreateProcess(NULL,"ssh2 parable@build.bone.cyan.com \"backuplive.sh\"",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); WaitForSingleObject(pi.hProcess,INFINITE); return ret; } int MigrationTask_CleanUp::Run(HINSTANCE hInst, HWND hDlg) { int ret = 0; // Clean up the Test Directory char* dataloc; switch (GetServer()) { case kTest: dataloc = SHARENAME "\\dataservers\\test\\game_Data"; break; case kLast: dataloc = SHARENAME "\\dataservers\\test-last\\game_Data"; break; case kBranch: dataloc = SHARENAME "\\dataservers\\branch\\game_Data"; break; } ShellExecute(hDlg,"open",dataloc,NULL,NULL,SW_SHOWNORMAL); if (MessageBox(hDlg, "Press OK to Continue...","Continue", MB_OKCANCEL) == IDCANCEL) ret = -1; return ret; } int MigrationTask_PatchBuilder::Run(HINSTANCE hInst, HWND hDlg) { // Connect to the Data Servers by mapping the share // Run the patch builder on the Test and Live directories return 0; } int MigrationTask_DataMigration::Run(HINSTANCE hInst, HWND hDlg) { int ret = 0; // SSH In; Copy the Data to the live STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); si.dwFlags = STARTF_USECOUNTCHARS | STARTF_USESHOWWINDOW; si.wShowWindow = SW_MINIMIZE; si.lpTitle = "Migrate the Data sets"; si.dwXCountChars = 80; si.dwYCountChars = 25; ZeroMemory( &pi, sizeof(pi) ); char* migratecmd; switch (GetServer()) { case kTest: migratecmd = "ssh2 parable@build.bone.cyan.com \"migrate-test-data-live.sh\""; break; case kLast: migratecmd = "ssh2 parable@build.bone.cyan.com \"migrate-test-last-data-live.sh\""; break; case kBranch: migratecmd = "ssh2 parable@build.bone.cyan.com \"migrate-branch-data-live.sh\""; break; } ret = !CreateProcess(NULL,migratecmd,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); WaitForSingleObject(pi.hProcess,INFINITE); return ret; } int MigrationTask_InstallClient::Run(HINSTANCE hInst, HWND hDlg) { int ret = 0; // migrate the client support files STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); si.dwFlags = STARTF_USECOUNTCHARS | STARTF_USESHOWWINDOW; si.wShowWindow = SW_MINIMIZE; si.lpTitle = "Migrate Client Support"; si.dwXCountChars = 80; si.dwYCountChars = 25; ZeroMemory( &pi, sizeof(pi) ); char* migratecmd; switch (GetServer()) { case kTest: migratecmd = "ssh2 parable@build.bone.cyan.com \"migrate-test-client-live.sh\""; break; case kLast: migratecmd = "ssh2 parable@build.bone.cyan.com \"migrate-test-last-client-live.sh\""; break; case kBranch: migratecmd = "ssh2 parable@build.bone.cyan.com \"migrate-branch-client-live.sh\""; break; } ret = CreateProcess(NULL,migratecmd,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); WaitForSingleObject(pi.hProcess,INFINITE); // Connect to the Data Servers by mapping the share NETRESOURCE netres; memset(&netres,0,sizeof(netres)); netres.lpRemoteName = SHARENAME; netres.dwDisplayType = RESOURCETYPE_DISK; ret = (WNetAddConnection3(hDlg,&netres,NULL,NULL,CONNECT_INTERACTIVE) != NO_ERROR); if (ret == 0) { char exe[MAX_PATH]; OPENFILENAME ofn; SHFILEOPSTRUCT shFileOpt; // Choose a client to copy across memset(&exe, 0, sizeof(exe)); memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hDlg; ofn.lpstrFile = exe; ofn.nMaxFile = sizeof(exe); ofn.lpstrFilter = "Executable (*.EXE)\0*.EXE\0All (*.*)\0*.*\0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.lpstrTitle = "Choose client exe to be used as drcExplorer.exe"; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; while(!GetOpenFileName(&ofn)); // copy the client across memset(&shFileOpt,0,sizeof(shFileOpt)); shFileOpt.hwnd = hDlg; shFileOpt.wFunc = FO_COPY; shFileOpt.pFrom = exe; shFileOpt.pTo = SHARENAME LIVECLIENTDIR "\\drcExplorer.exe\0"; ret = SHFileOperation(&shFileOpt); // Choose a client config to copy across memset(&exe, 0, sizeof(exe)); memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hDlg; ofn.lpstrFile = exe; ofn.nMaxFile = sizeof(exe); ofn.lpstrFilter = "Executable (*.EXE)\0*.EXE\0All (*.*)\0*.*\0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.lpstrTitle = "Choose client setup exe to be used as drcConfig.exe"; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; while(!GetOpenFileName(&ofn)); // copy the client across memset(&shFileOpt,0,sizeof(shFileOpt)); shFileOpt.hwnd = hDlg; shFileOpt.wFunc = FO_COPY; shFileOpt.pFrom = exe; shFileOpt.pTo = SHARENAME LIVEEXPANDEDINSTALLDIR "\\drcConfig.exe\0"; ret = SHFileOperation(&shFileOpt); // Choose a patcher to copy across memset(&exe, 0, sizeof(exe)); memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hDlg; ofn.lpstrFile = exe; ofn.nMaxFile = sizeof(exe); ofn.lpstrFilter = "Executable (*.EXE)\0*.EXE\0All (*.*)\0*.*\0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.lpstrTitle = "Choose patcher exe to be used as drcPatcher.exe"; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; while(!GetOpenFileName(&ofn)); // copy the client across memset(&shFileOpt,0,sizeof(shFileOpt)); shFileOpt.hwnd = hDlg; shFileOpt.wFunc = FO_COPY; shFileOpt.pFrom = exe; shFileOpt.pTo = SHARENAME LIVEEXPANDEDINSTALLDIR "\\drcPatcher.exe\0"; ret = SHFileOperation(&shFileOpt); // Choose a python.dll to copy across memset(&exe, 0, sizeof(exe)); memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hDlg; ofn.lpstrFile = exe; ofn.nMaxFile = sizeof(exe); ofn.lpstrFilter = "Dynamic Lib (*.DLL)\0*.DLL\0All (*.*)\0*.*\0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.lpstrTitle = "Choose python dll to be used as cypython21.dll"; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; while(!GetOpenFileName(&ofn)); // copy the client across memset(&shFileOpt,0,sizeof(shFileOpt)); shFileOpt.hwnd = hDlg; shFileOpt.wFunc = FO_COPY; shFileOpt.pFrom = exe; shFileOpt.pTo = SHARENAME LIVEEXPANDEDINSTALLDIR "\\cypython21.dll\0"; ret = SHFileOperation(&shFileOpt); } return ret; } int MigrationTask_GenerateClientManifest::Run(HINSTANCE hInst, HWND hDlg) { int ret = 0; // Run generate manifest on the directoy on the server // Connect to the Data Servers by mapping the share NETRESOURCE netres; memset(&netres,0,sizeof(netres)); netres.lpRemoteName = SHARENAME; netres.dwDisplayType = RESOURCETYPE_DISK; ret = (WNetAddConnection3(hDlg,&netres,NULL,NULL,CONNECT_INTERACTIVE) != NO_ERROR); if (ret == 0) { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); ret = !CreateProcess(NULL,"plGenClientManifest.exe client=drcExplorer.exe dir=" SHARENAME LIVECLIENTDIR,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); WaitForSingleObject(pi.hProcess,INFINITE); } return ret; } int MigrationTask_DropStoredGames::Run(HINSTANCE hInst, HWND hDlg) { int ret = 0; // SSH In & Run the drop Script... STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); si.dwFlags = STARTF_USECOUNTCHARS | STARTF_USESHOWWINDOW; si.wShowWindow = SW_MINIMIZE; si.lpTitle = "Live Game Reset"; si.dwXCountChars = 80; si.dwYCountChars = 25; ZeroMemory( &pi, sizeof(pi) ); ret = CreateProcess(NULL,"ssh2 parable@build.bone.cyan.com \"reset-live-games.sh\"",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); WaitForSingleObject(pi.hProcess,INFINITE); return ret; } int MigrationTask_InstallAges::Run(HINSTANCE hInst, HWND hDlg) { int ret = 0; // SSH In; Copy the Age Files from the data to the server AgeFiles folder STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); si.dwFlags = STARTF_USECOUNTCHARS | STARTF_USESHOWWINDOW; si.wShowWindow = SW_MINIMIZE; si.lpTitle = "Install Ages"; si.dwXCountChars = 80; si.dwYCountChars = 25; ZeroMemory( &pi, sizeof(pi) ); ret = !CreateProcess(NULL,"ssh2 parable@build.bone.cyan.com \"install-live-ages.sh\"",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); WaitForSingleObject(pi.hProcess,INFINITE); return ret; } int MigrationTask_CopyTestServers::Run(HINSTANCE hInst, HWND hDlg) { int ret = 0; // SSH In; Delete ~/Servers; copy ~/Servers-Test to ~/Servers STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); si.dwFlags = STARTF_USECOUNTCHARS | STARTF_USESHOWWINDOW; si.wShowWindow = SW_MINIMIZE; si.lpTitle = "Copy Test Servers"; si.dwXCountChars = 80; si.dwYCountChars = 25; ZeroMemory( &pi, sizeof(pi) ); switch (GetServer()) { case kTest: ret = !CreateProcess(NULL, "ssh2 parable@build.bone.cyan.com \"rm -frv ~/Servers; cp -rv ~/Servers-Test ~/Servers\"", NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); break; case kLast: ret = !CreateProcess(NULL, "ssh2 parable@build.bone.cyan.com \"rm -frv ~/Servers; cp -rv ~/Servers-Test-Last ~/Servers\"", NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); break; case kBranch: ret = !CreateProcess(NULL, "ssh2 parable@build.bone.cyan.com \"rm -frv ~/Servers; cp -rv ~/Servers-Branch ~/Servers\"", NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); break; } WaitForSingleObject(pi.hProcess,INFINITE); return ret; } int MigrationTask_StartLiveServers::Run(HINSTANCE hInst, HWND hDlg) { int ret = 0; // SSH In; Start the Live Servers STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); si.dwFlags = STARTF_USECOUNTCHARS | STARTF_USESHOWWINDOW; si.wShowWindow = SW_MINIMIZE; si.lpTitle = "Start Live Servers"; si.dwXCountChars = 80; si.dwYCountChars = 25; ZeroMemory( &pi, sizeof(pi) ); ret = !CreateProcess(NULL,"ssh2 parable@build.bone.cyan.com \"start-live-servers.sh\"",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); WaitForSingleObject(pi.hProcess,INFINITE); return ret; }