blob: 9721bcf641bf9fce48126c21acd1288433f2fb9e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Serialization.Formatters;
namespace Apache.Geode.Client.FwkLauncher
{
using Apache.Geode.DUnitFramework;
class LauncherProcess
{
public static IChannel clientChannel = null;
public static string logFile = null;
// This port has been fixed for FwkLauncher.
static void Main(string[] args)
{
string myId = "0";
try
{
int launcherPort = 0;
string driverUrl;
ParseArguments(args, out driverUrl, out myId, out logFile, out launcherPort);
// NOTE: This is required so that remote client receive custom exceptions
RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off;
BinaryServerFormatterSinkProvider serverProvider =
new BinaryServerFormatterSinkProvider();
serverProvider.TypeFilterLevel = TypeFilterLevel.Full;
BinaryClientFormatterSinkProvider clientProvider =
new BinaryClientFormatterSinkProvider();
Dictionary<string, string> properties;
#region Create the communication channel to receive commands from server
properties = new Dictionary<string, string>();
properties["port"] = launcherPort.ToString();
clientChannel = new TcpChannel(properties, clientProvider, serverProvider);
ChannelServices.RegisterChannel(clientChannel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(LauncherComm),
CommConstants.ClientService, WellKnownObjectMode.SingleCall);
#endregion
Util.ClientId = myId;
Util.LogFile = logFile;
if (!string.IsNullOrEmpty(driverUrl))
{
Util.DriverComm = ServerConnection<IDriverComm>.Connect(driverUrl);
Util.ClientListening();
}
}
catch (Exception ex)
{
Util.Log("FATAL: Client {0}, Exception caught: {1}", myId, ex);
}
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
}
private static void ShowUsage(string[] args)
{
if (args != null)
{
Util.Log("Args: ");
foreach (string arg in args)
{
Util.Log("\t{0}", arg);
}
}
string procName = Util.ProcessName;
Util.Log("Usage: " + procName + " [OPTION]");
Util.Log("Options are:");
Util.Log(" --id=ID \t\t ID of the launcher; process ID is used when not provided");
Util.Log(" --port=PORT \t\t Port number where the launcher listens for incoming requests.");
Util.Log(" --driver=URL \t Optional. The URL (e.g. tcp://<host>:<port>/<service>) of the Driver.");
Util.Log(" --log=LOGFILE \t Optional. The name of the logfile; standard output is used when not provided");
Util.Log(" --startdir=DIR \t Optional. Start in the given directory");
Util.Log(" --bg \t Optional. Start in background");
Environment.Exit(1);
}
private static void ParseArguments(string[] args, out string driverUrl, out string myId,
out string logFile, out int launcherPort)
{
if (args == null)
{
ShowUsage(args);
}
string IDOption = "--id=";
string DriverOption = "--driver=";
string LogOption = "--log=";
string StartDirOption = "--startdir=";
string BGOption = "--bg";
string Port = "--port=";
myId = Util.PID.ToString();
driverUrl = null;
logFile = null;
launcherPort = 0;
int argIndx = 0;
while (argIndx <= (args.Length - 1) && args[argIndx].StartsWith("--"))
{
string arg = args[argIndx];
if (arg.StartsWith(IDOption))
{
myId = arg.Substring(IDOption.Length);
}
else if (arg.StartsWith(DriverOption))
{
driverUrl = arg.Substring(DriverOption.Length);
}
else if (arg.StartsWith(LogOption))
{
logFile = arg.Substring(LogOption.Length);
}
else if (arg == BGOption)
{
string procArgs = string.Empty;
foreach (string newArg in args)
{
if (newArg != BGOption)
{
procArgs += '"' + newArg + "\" ";
}
}
procArgs = procArgs.Trim();
System.Diagnostics.Process bgProc;
if (!Util.StartProcess(Environment.GetCommandLineArgs()[0],
procArgs, false, null, false, false, false, true, out bgProc))
{
Util.Log("Failed to start background process with args: {0}",
procArgs);
Environment.Exit(1);
}
Environment.Exit(0);
}
else if (arg.StartsWith(StartDirOption))
{
string startDir = arg.Substring(StartDirOption.Length);
if (startDir.Length > 0)
{
Environment.CurrentDirectory = startDir;
}
}
else if (arg.StartsWith(Port))
{
string port = arg.Substring(Port.Length);
try
{
launcherPort = int.Parse(port);
}
catch
{
Util.Log("Port number should be an integer: {0}", port);
ShowUsage(args);
}
}
else
{
Util.Log("Unknown option: {0}", arg);
ShowUsage(args);
}
argIndx++;
}
if (args.Length != argIndx)
{
Util.Log("Incorrect number of arguments: {0}",
(args.Length - argIndx));
ShowUsage(args);
}
if (launcherPort == 0)
{
Util.Log("Port number is not specified.");
ShowUsage(args);
}
}
}
}