284 lines
7.4 KiB
C#
284 lines
7.4 KiB
C#
/***********************************************************************
|
|
*
|
|
* Copyright (C) 2005-2006 Novell, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; version 2.1
|
|
* of the License.
|
|
*
|
|
* This library 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
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free
|
|
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*
|
|
* To contact Novell about this file by physical or electronic mail,
|
|
* you may find current contact information at www.novell.com.
|
|
*
|
|
***********************************************************************/
|
|
|
|
using System;
|
|
using System.Threading;
|
|
using System.Collections;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Diagnostics;
|
|
using System.ServiceProcess;
|
|
using System.Configuration.Install ;
|
|
|
|
using sscs.communication;
|
|
using sscs.constants;
|
|
using sscs.common;
|
|
|
|
namespace sscs.init
|
|
{
|
|
public class WinSecretStoreClientService : System.ServiceProcess.ServiceBase
|
|
{
|
|
/// <summary>
|
|
/// Required designer variable.
|
|
/// </summary>
|
|
private System.ComponentModel.Container components = null;
|
|
private static Communication server;
|
|
private static Thread listeningThread;
|
|
|
|
public static string sServiceName = "Novell Identity Store";
|
|
|
|
public WinSecretStoreClientService()
|
|
{
|
|
// This call is required by the Windows.Forms Component Designer.
|
|
InitializeComponent();
|
|
|
|
// TODO: Add any initialization after the InitComponent call
|
|
}
|
|
|
|
#region Component Designer generated code
|
|
/// <summary>
|
|
/// Required method for Designer support - do not modify
|
|
/// the contents of this method with the code editor.
|
|
/// </summary>
|
|
private void InitializeComponent()
|
|
{
|
|
//
|
|
// SecretStoreClientService
|
|
//
|
|
this.CanHandlePowerEvent = true;
|
|
this.ServiceName = "SecretStoreService";
|
|
|
|
}
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// Clean up any resources being used.
|
|
/// </summary>
|
|
protected override void Dispose( bool disposing )
|
|
{
|
|
if( disposing )
|
|
{
|
|
if (components != null)
|
|
{
|
|
components.Dispose();
|
|
}
|
|
}
|
|
base.Dispose( disposing );
|
|
}
|
|
|
|
static void Main(string[] args)
|
|
{
|
|
string opt = null ;
|
|
if ( args.Length > 0)
|
|
{
|
|
opt = args [0];
|
|
}
|
|
|
|
if (opt != null && opt.ToLower () == "/install")
|
|
{
|
|
stopService();
|
|
uninstallService();
|
|
installService();
|
|
startService();
|
|
return;
|
|
}
|
|
else if (opt != null && opt.ToLower () == "/uninstall")
|
|
{
|
|
stopService();
|
|
uninstallService();
|
|
return;
|
|
}
|
|
|
|
if (opt != null && opt.ToLower() == "/standalone")
|
|
{
|
|
MainInternal(args);
|
|
}
|
|
else
|
|
{
|
|
System.ServiceProcess.ServiceBase[] ServicesToRun;
|
|
|
|
// More than one user Service may run within the same process. To add
|
|
// another service to this process, change the following line to
|
|
// create a second service object. For example,
|
|
//
|
|
// ServicesToRun = new System.ServiceProcess.ServiceBase[] {new Service1(), new MySecondUserService()};
|
|
//
|
|
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new WinSecretStoreClientService() };
|
|
|
|
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
|
|
}
|
|
}
|
|
|
|
|
|
private static void installService()
|
|
{
|
|
TransactedInstaller ti = new TransactedInstaller ();
|
|
ProjectInstaller mi = new ProjectInstaller ();
|
|
ti.Installers.Add (mi);
|
|
String path = String.Format ("/assemblypath={0}",
|
|
System.Reflection.Assembly.GetExecutingAssembly ().Location);
|
|
String[] cmdline = {path};
|
|
InstallContext ctx = new InstallContext ("", cmdline );
|
|
ti.Context = ctx;
|
|
try
|
|
{
|
|
ti.Install ( new Hashtable ());
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Console.WriteLine(e.ToString());
|
|
}
|
|
}
|
|
|
|
private static void uninstallService()
|
|
{
|
|
TransactedInstaller ti = new TransactedInstaller ();
|
|
ProjectInstaller mi = new ProjectInstaller ();
|
|
ti.Installers.Add (mi);
|
|
String path = String.Format ("/assemblypath={0}",
|
|
System.Reflection.Assembly.GetExecutingAssembly ().Location);
|
|
String[] cmdline = {path};
|
|
InstallContext ctx = new InstallContext ("", cmdline );
|
|
ti.Context = ctx;
|
|
try
|
|
{
|
|
ti.Uninstall ( null );
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Console.WriteLine(e.ToString());
|
|
}
|
|
}
|
|
|
|
private static void stopService()
|
|
{
|
|
ServiceController[] services=ServiceController.GetServices();
|
|
foreach(ServiceController x in services)
|
|
{
|
|
if(x.DisplayName.Equals(sServiceName))
|
|
{
|
|
if (x.Status==System.ServiceProcess.ServiceControllerStatus.Running)
|
|
{
|
|
x.Stop();
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
private static void startService()
|
|
{
|
|
ServiceController[] services=ServiceController.GetServices();
|
|
// Iterating each service to check that if a service named
|
|
// 'Novell Identity Store' is found then check that its status whether
|
|
// it is running or stopped. If found running then it will
|
|
// stop that service; else it starts that service
|
|
foreach(ServiceController x in services)
|
|
{
|
|
if(x.DisplayName.Equals(sServiceName))
|
|
{
|
|
CSSSLogger.DbgLog("Checking service: " + x.DisplayName);
|
|
if (x.Status==System.ServiceProcess.ServiceControllerStatus.Stopped)
|
|
{
|
|
x.Start();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Set things in motion so your service can do its work.
|
|
/// </summary>
|
|
///
|
|
protected override void OnStart(string[] args)
|
|
{
|
|
AcquireLock();
|
|
|
|
server = CommunicationFactory.CreateCommunicationEndPoint();
|
|
|
|
listeningThread = new Thread(new ThreadStart(StartServer));
|
|
listeningThread.Start();
|
|
//listeningThread.Join();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Stop this service.
|
|
/// </summary>
|
|
protected override void OnStop()
|
|
{
|
|
listeningThread.Abort();
|
|
}
|
|
|
|
/* The thread which listens and spawns threads on every accept
|
|
* starts its execution from this method.
|
|
*/
|
|
private static void StartServer()
|
|
{
|
|
server.StartCommunicationEndPoint();
|
|
}
|
|
|
|
/* This ensures that there is only one instance of
|
|
* SSCS at any point.
|
|
*/
|
|
private static int AcquireLock()
|
|
{
|
|
return RetCodes.SUCCESS;
|
|
}
|
|
|
|
private static void MainInternal(string[] args)
|
|
{
|
|
CSSSLogger.ExecutionTrace(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
|
|
|
try
|
|
{
|
|
int retVal = AcquireLock();
|
|
if( retVal != RetCodes.SUCCESS )
|
|
{
|
|
CSSSLogger.DbgLog("Acquiring lock failed. Terminating CSSS.");
|
|
// Terminate();
|
|
}
|
|
|
|
// RegisterAtExit();
|
|
|
|
CSSSLogger.DbgLog("Client Side SecretStore Service has started.");
|
|
|
|
server = CommunicationFactory.CreateCommunicationEndPoint();
|
|
|
|
listeningThread = new Thread(new ThreadStart(StartServer));
|
|
listeningThread.Start();
|
|
listeningThread.Join();
|
|
}
|
|
catch(Exception e)
|
|
{
|
|
// Terminate();
|
|
}
|
|
}
|
|
|
|
/* The thread which listens and spawns threads on every accept
|
|
* starts its execution from this method.
|
|
*/
|
|
|
|
}
|
|
}
|