|
|
|
/*==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;
|
|
|
|
}
|
|
|
|
|
|
|
|
|