Files
raven-launcher/Program.cs
2021-11-30 22:44:47 +00:00

218 lines
8.3 KiB
C#

global using System.Diagnostics;
global using System.Text.Json;
// Prevent from ending if CTL+C is pressed.
Console.TreatControlCAsInput = true;
Console.WriteLine($"AyaNova server launcher {AyaNovaVersion.VersionString}");
//Locate the ayanova executable folder as the basis point for all other paths later
var AyaNovaProgramFolder = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), ".."));
#if(DEBUG)
AyaNovaProgramFolder = @"c:\Program Files\ayanova\";
#endif
//read in the config.json file to get it's current values
var ConfigFile = Path.Combine(AyaNovaProgramFolder, "config.json");
if (!File.Exists(ConfigFile))
{
Console.WriteLine($"FAIL: Unable to find expected configuration file: '{ConfigFile}'");
return;
}
string ConfigText = File.ReadAllText(ConfigFile);
if (string.IsNullOrWhiteSpace(ConfigText))
{
Console.WriteLine($"FAIL: empty configuration file: '{ConfigFile}'");
return;
}
string? DataPath = null;
try
{
var ConfigJSON = JsonDocument.Parse(ConfigText);
var element = ConfigJSON.RootElement.GetProperty("AYANOVA_DATA_PATH");
DataPath = element.GetString();
if (DataPath == null || string.IsNullOrWhiteSpace(DataPath))
{
throw new System.ArgumentNullException("AYANOVA_DATA_PATH configuration property is empty or missing but required to locate database");
}
DataPath = System.Environment.ExpandEnvironmentVariables(DataPath);//%ProgramData% expansion
}
catch (Exception ex)
{
Console.WriteLine($"FAIL: error getting database location from configuration file: '{ConfigFile}'\nError was {ex.Message}");
return;
}
// Console.WriteLine($"DataPath resolved to: {DataPath}");
// Console.WriteLine($"AyaNovaProgramFolder resolved to: {AyaNovaProgramFolder}");
//================== LAUNCH POSTGRES SERVER ==================
//https://notepad.onghu.com/2021/portable-postgresql-on-windows-without-installation/
ProcessStartInfo PGStartInfo = new ProcessStartInfo(Path.Combine(AyaNovaProgramFolder, "local-postgres", "bin","pg_ctl.exe"));
PGStartInfo.EnvironmentVariables["PGDATA"] = Path.Combine(DataPath, "database");
//PGStartInfo.EnvironmentVariables["PGDATABASE"] = "AyaNova";
PGStartInfo.EnvironmentVariables["PGUSER"] = "postgres";
PGStartInfo.EnvironmentVariables["PGPORT"] = "5432";
PGStartInfo.EnvironmentVariables["PGLOCALEDIR"] = Path.Combine(AyaNovaProgramFolder, "local-postgres", "share", "locale");
PGStartInfo.EnvironmentVariables["PGLOGS "] = Path.Combine(DataPath, "logs");
//ARGUMENTS DOC: https://www.postgresql.org/docs/11/app-postgres.html
//PGStartInfo.Arguments = $"-D {Path.Combine(DataPath, "database")} -o \"-p 5432\" -l {Path.Combine(DataPath, "logs","postgres.log")} start";
PGStartInfo.Arguments = "start";
//PGStartInfo.FileName = "pg_ctl_test.exe";
//PGStartInfo.WorkingDirectory = Path.Combine(DataPath, "database");
PGStartInfo.WorkingDirectory = Path.Combine(AyaNovaProgramFolder, "local-postgres", "bin");
PGStartInfo.UseShellExecute = false;
//Console.WriteLine($"PGStartInfo environment: {string.Join(",",PGStartInfo.EnvironmentVariables.Values.GetEnumerator())}");
var PGProcess = Process.Start(PGStartInfo);
/*"-D C:\ProgramData\ayanova\database -p 5432 -l C:\ProgramData\ayanova\logs start"
old batch file settings required for postgres
SET PATH="%~dp0postgres\bin";%PATH%
SET PGDATA=%~dp0data\database
SET PGDATABASE=AyaNova
SET PGUSER=postgres
SET PGPORT=5432
SET PGLOCALEDIR=%~dp0postgres\share\locale
set AYANOVA_USE_URLS=http://*:7575;
set AYANOVA_DB_CONNECTION=Server=localhost;Username=postgres;Password=mypasswordforpostgres;Database=AyaNova;
set AYANOVA_DEFAULT_TRANSLATION=en
set AYANOVA_BACKUP_PG_DUMP_PATH=%~dp0postgres\bin\
set AYANOVA_DATA_PATH=%~dp0data
"%~dp0\postgres\bin\pg_ctl" -D "%~dp0/data/database" -l %~dp0data\logs\postgreslog start
*/
//================== LAUNCH AYANOVA SERVER ==================
//Go UP one folder from the current launcher folder which should *always* be contained within the AyaNova.exe containing folder if it was installed
ProcessStartInfo ServerStartInfo = new ProcessStartInfo(Path.Combine(AyaNovaProgramFolder, "AyaNova.exe"));
//ServerStartInfo.FileName = "AyaNova.exe";
ServerStartInfo.WorkingDirectory = AyaNovaProgramFolder;
ServerStartInfo.UseShellExecute = false;
var ServerProcess = Process.Start(ServerStartInfo);
//================== WAIT FOR SHUTDOWN ================
Console.WriteLine("Waiting for server to exit; do not close this window");
if (ServerProcess != null)
ServerProcess.WaitForExit();
//shutdown postgres
if (PGProcess != null)
{
PGProcess.CloseMainWindow();
PGProcess.WaitForExit();
}
// ####################### OLD SHIT ################################
//This works but launches three windows
/*
//================== LAUNCH POSTGRES SERVER ==================
//https://notepad.onghu.com/2021/portable-postgresql-on-windows-without-installation/
ProcessStartInfo PGStartInfo = new ProcessStartInfo();
//PGStartInfo.EnvironmentVariables["PGDATA"] = Path.Combine(DataPath, "database");
////PGStartInfo.EnvironmentVariables["PGDATABASE"] = "AyaNova";
//PGStartInfo.EnvironmentVariables["PGUSER"] = "postgres";
//PGStartInfo.EnvironmentVariables["PGPORT"] = "5432";
//PGStartInfo.EnvironmentVariables["PGLOCALEDIR"] = Path.Combine(AyaNovaProgramFolder, "local-postgres", "share", "locale");
//PGStartInfo.EnvironmentVariables["PGLOGS "] = Path.Combine(DataPath, "logs");
//ARGUMENTS DOC: https://www.postgresql.org/docs/11/app-postgres.html
PGStartInfo.Arguments = $"-D {Path.Combine(DataPath, "database")} -o \"-p 5432\" -l {Path.Combine(DataPath, "logs","postgres.log")} start";
PGStartInfo.FileName = "pg_ctl.exe";
//PGStartInfo.WorkingDirectory = Path.Combine(DataPath, "database");
PGStartInfo.WorkingDirectory = Path.Combine(AyaNovaProgramFolder, "local-postgres", "bin");
PGStartInfo.UseShellExecute = true;
var PGProcess = Process.Start(PGStartInfo);
// "-D C:\ProgramData\ayanova\database -p 5432 -l C:\ProgramData\ayanova\logs start"
// old batch file settings required for postgres
// SET PATH="%~dp0postgres\bin";%PATH%
// SET PGDATA=%~dp0data\database
// SET PGDATABASE=AyaNova
// SET PGUSER=postgres
// SET PGPORT=5432
// SET PGLOCALEDIR=%~dp0postgres\share\locale
// set AYANOVA_USE_URLS=http://*:7575;
// set AYANOVA_DB_CONNECTION=Server=localhost;Username=postgres;Password=mypasswordforpostgres;Database=AyaNova;
// set AYANOVA_DEFAULT_TRANSLATION=en
// set AYANOVA_BACKUP_PG_DUMP_PATH=%~dp0postgres\bin\
// set AYANOVA_DATA_PATH=%~dp0data
// "%~dp0\postgres\bin\pg_ctl" -D "%~dp0/data/database" -l %~dp0data\logs\postgreslog start
//================== LAUNCH AYANOVA SERVER ==================
//Go UP one folder from the current launcher folder which should *always* be contained within the AyaNova.exe containing folder if it was installed
ProcessStartInfo ServerStartInfo = new ProcessStartInfo();
ServerStartInfo.FileName = "AyaNova.exe";
ServerStartInfo.WorkingDirectory = AyaNovaProgramFolder;
ServerStartInfo.UseShellExecute = true;
var ServerProcess = Process.Start(ServerStartInfo);
//================== WAIT FOR SHUTDOWN ================
Console.WriteLine("Waiting for server to exit; do not close this window");
if (ServerProcess != null)
ServerProcess.WaitForExit();
//shutdown postgres
if (PGProcess != null)
{
PGProcess.CloseMainWindow();
PGProcess.WaitForExit();
}
*/
//############################################################################
//this was original ctr.-c shutdown from one window concept
// Console.WriteLine("#############################################");
// Console.WriteLine("Press CTL-C key to shut down AyaNova Server");
// Console.WriteLine("#############################################");
// bool Quit = false;
// ConsoleKeyInfo cki;
// do
// {
// cki = Console.ReadKey(false);
// if (cki.Key == ConsoleKey.C && (cki.Modifiers & ConsoleModifiers.Control) != 0)
// {
// Quit = true;
// }
// else
// {
// Console.WriteLine("Press CTL-C key to shut down AyaNova Server");
// }
// //Console.WriteLine(cki.Key.ToString());
// } while (!Quit);
// if (ServerProcess != null)
// {
// ServerProcess.CloseMainWindow();
// ServerProcess.Close();
// }