You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
435 lines
12 KiB
435 lines
12 KiB
/*==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 <http://www.gnu.org/licenses/>. |
|
|
|
Additional permissions under GNU GPL version 3 section 7 |
|
|
|
If you modify this Program, or any covered work, by linking or |
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
|
(or a modified version of those libraries), |
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
|
licensors of this Program grant you additional |
|
permission to convey the resulting work. Corresponding Source for a |
|
non-source form of such a combination shall include the source code for |
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
|
work. |
|
|
|
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; |
|
} |
|
|
|
|
|
|