mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
284 lines
9.2 KiB
C#
284 lines
9.2 KiB
C#
// 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 log4net;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.ServiceProcess;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Configuration.Install;
|
|
using System.Collections;
|
|
|
|
namespace CloudStack.Plugin.AgentShell
|
|
{
|
|
static class Program
|
|
{
|
|
private static ILog logger = LogManager.GetLogger(typeof(Program));
|
|
public const string serviceName = "CloudStack Hyper-V Agent";
|
|
private static string option = null;
|
|
private static string user = null;
|
|
private static string password = null;
|
|
private const string install = "--install";
|
|
private const string uninstall = "--uninstall";
|
|
private const string console = "--console";
|
|
|
|
/// <summary>
|
|
/// Application entry point allows service to run in console application or as a Windows service.
|
|
/// Add '--console' to the commandline for the former, the latter is the default.
|
|
/// </summary>
|
|
static void Main(params string[] args)
|
|
{
|
|
if (args.Length == 0)
|
|
{
|
|
logger.InfoFormat(serviceName + " running as Windows Service");
|
|
ServiceBase[] ServicesToRun = new ServiceBase[] { new AgentService() };
|
|
ServiceBase.Run(ServicesToRun);
|
|
}
|
|
else if (ParseArguments(args))
|
|
{
|
|
switch (option)
|
|
{
|
|
case install:
|
|
logger.InfoFormat("Installing and running " + serviceName);
|
|
InstallService();
|
|
StartService();
|
|
break;
|
|
case uninstall:
|
|
logger.InfoFormat("Stopping and uninstalling " + serviceName);
|
|
StopService();
|
|
UninstallService();
|
|
break;
|
|
case console:
|
|
logger.InfoFormat(serviceName + " is running as console application");
|
|
new AgentService().RunConsole(args);
|
|
break;
|
|
default:
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
string argumentExample = "--(install/uninstall/console) [-u <hyper-v admin user>] [-p <hyper-v admin password>].\n" +
|
|
" For example:\n " +
|
|
" --install -u domain1\\user1 -p mypwd\n"+
|
|
" --uninstall";
|
|
logger.Error("Invalid arguments passed for installing\\uninstalling the service. \n" + argumentExample);
|
|
}
|
|
}
|
|
|
|
static private Boolean ParseArguments(string[] args)
|
|
{
|
|
logger.DebugFormat(serviceName + " arg is ", args[0]);
|
|
int argIndex = 0;
|
|
while (argIndex < args.Length)
|
|
{
|
|
switch (args[argIndex])
|
|
{
|
|
case install:
|
|
case uninstall:
|
|
case console:
|
|
option = args[argIndex];
|
|
argIndex++;
|
|
break;
|
|
case "-u":
|
|
user = args[argIndex+1];
|
|
argIndex+=2;
|
|
break;
|
|
case "-p":
|
|
password = args[argIndex+1];
|
|
argIndex+=2;
|
|
break;
|
|
default:
|
|
argIndex++;
|
|
// Unrecognised argument. Do nothing;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Validate arguments
|
|
return ValidateArguments();
|
|
}
|
|
|
|
private static Boolean ValidateArguments()
|
|
{
|
|
Boolean argsValid = false;
|
|
switch (option)
|
|
{
|
|
case uninstall:
|
|
case install:
|
|
case console:
|
|
argsValid = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return argsValid;
|
|
}
|
|
|
|
public static string GetPassword()
|
|
{
|
|
return password;
|
|
}
|
|
|
|
public static string GetUser()
|
|
{
|
|
return user;
|
|
}
|
|
|
|
private static bool IsInstalled()
|
|
{
|
|
using (ServiceController controller =
|
|
new ServiceController(serviceName))
|
|
{
|
|
try
|
|
{
|
|
ServiceControllerStatus status = controller.Status;
|
|
}
|
|
catch
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
private static bool IsRunning()
|
|
{
|
|
using (ServiceController controller =
|
|
new ServiceController(serviceName))
|
|
{
|
|
if (!IsInstalled()) return false;
|
|
return (controller.Status == ServiceControllerStatus.Running);
|
|
}
|
|
}
|
|
|
|
private static AssemblyInstaller GetInstaller()
|
|
{
|
|
AssemblyInstaller installer = new AssemblyInstaller(
|
|
typeof(Program).Assembly, null);
|
|
installer.UseNewContext = true;
|
|
return installer;
|
|
}
|
|
|
|
private static void InstallService()
|
|
{
|
|
if (IsInstalled()) return;
|
|
|
|
try
|
|
{
|
|
using (AssemblyInstaller installer = GetInstaller())
|
|
{
|
|
IDictionary state = new Hashtable();
|
|
try
|
|
{
|
|
installer.Install(state);
|
|
installer.Commit(state);
|
|
}
|
|
catch
|
|
{
|
|
try
|
|
{
|
|
installer.Rollback(state);
|
|
}
|
|
catch { }
|
|
throw;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logger.ErrorFormat(" Error occured in installing service " + ex.Message);
|
|
throw;
|
|
}
|
|
}
|
|
|
|
private static void UninstallService()
|
|
{
|
|
if (!IsInstalled()) return;
|
|
try
|
|
{
|
|
using (AssemblyInstaller installer = GetInstaller())
|
|
{
|
|
IDictionary state = new Hashtable();
|
|
try
|
|
{
|
|
installer.Uninstall(state);
|
|
}
|
|
catch
|
|
{
|
|
throw;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logger.ErrorFormat(" Error occured in uninstalling service " + ex.Message);
|
|
throw;
|
|
}
|
|
}
|
|
|
|
private static void StartService()
|
|
{
|
|
if (!IsInstalled()) return;
|
|
|
|
using (ServiceController controller =
|
|
new ServiceController(serviceName))
|
|
{
|
|
try
|
|
{
|
|
if (controller.Status != ServiceControllerStatus.Running)
|
|
{
|
|
controller.Start();
|
|
controller.WaitForStatus(ServiceControllerStatus.Running,
|
|
TimeSpan.FromSeconds(10));
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logger.ErrorFormat(" Error occured in starting service " + ex.Message);
|
|
throw;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void StopService()
|
|
{
|
|
if (!IsInstalled()) return;
|
|
using (ServiceController controller =
|
|
new ServiceController(serviceName))
|
|
{
|
|
try
|
|
{
|
|
if (controller.Status != ServiceControllerStatus.Stopped)
|
|
{
|
|
controller.Stop();
|
|
controller.WaitForStatus(ServiceControllerStatus.Stopped,
|
|
TimeSpan.FromSeconds(10));
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logger.ErrorFormat(" Error occured in stopping service " + ex.Message);
|
|
throw;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|