| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- /* --- BEGIN COPYRIGHT BLOCK ---
- * Copyright (C) 2005 Red Hat, Inc.
- * All rights reserved.
- * --- END COPYRIGHT BLOCK --- */
- // Created: 2-8-2005
- // Author(s): Scott Bridges
- #include <windows.h>
- #include <iostream>
- #include "syncserv.h"
- #include "dssynchmsg.h"
- // syncserv.h
- // ntservice.h (modified)
- // ntservice.cpp (modified)
- // sysplat
- // uniutil
- // dssynchmsg
- // Copied: 2-10-2005
- // From: ntsynch.cpp
- //#include "sysplat.h"
- //#include "NTSynch.h"
- //#include "ldapconn.h"
- //#include "dsperson.h"
- #include "synchcmds.h"
- #include "dssynch.h"
- #ifdef _DEBUG
- void doDebug( PassSyncService *pSynch );
- #endif // _DEBUG
- //#include <nspr.h>
- /////////////////////////////////////////////////////////////////
- static void usage()
- {
- printf( "DS Synchronization Service version %s\n",
- SYNCH_VERSION );
- printf( " -%c NUMBER NT polling interval (minutes)\n",
- SYNCH_CMD_NT_POLL_INTERVAL );
- // printf( " -%c NUMBER DS polling interval (minutes)\n",
- // SYNCH_CMD_DS_POLL_INTERVAL );
- // printf( " -%c CALENDAR NT update schedule\n",
- // SYNCH_CMD_NT_CALENDAR );
- // printf( " -%c CALENDAR DS update schedule\n",
- // SYNCH_CMD_DS_CALENDAR );
- printf( " -%c NUMBER NT synchronization start time (minutes)\n",
- SYNCH_CMD_NT_CALENDAR );
- // printf( " -%c NUMBER DS synchronization start time (minutes)\n",
- // SYNCH_CMD_DS_CALENDAR );
- printf( " -%c NAME DS distinguished name\n",
- SYNCH_CMD_ADMIN_DN );
- printf( " -%c USERS_BASE DS users base\n",
- SYNCH_CMD_DIRECTORY_USERS_BASE );
- printf( " -%c GROUPS_BASE DS groups base\n",
- SYNCH_CMD_DIRECTORY_GROUPS_BASE );
- printf( " -%c HOST DS host\n",
- SYNCH_CMD_DS_HOST );
- printf( " -%c NUMBER DS port\n",
- SYNCH_CMD_DS_PORT );
- printf( " -%c PASSWORD DS password\n",
- SYNCH_CMD_ADMIN_PASSWORD );
- printf( " -%c NUMBER Command port\n",
- SYNCH_CMD_NT_PORT );
- printf( " -v Display this message\n",
- SYNCH_CMD_NT_POLL_INTERVAL );
- printf( " -i Install the service\n" );
- printf( " -u Uninstall the service\n" );
- printf( " -%c Synchronize all NT users to DS now\n",
- SYNCH_CMD_SYNCH_FROM_NT );
- // printf( " -%c Synchronize DS users to NT now\n",
- // SYNCH_CMD_SYNCH_FROM_DS );
- printf( " -%c Resynchronize changes to NT users now\n",
- SYNCH_CMD_SYNCH_CHANGES );
- printf( " -%c Load settings from Registry\n",
- SYNCH_CMD_RELOAD_SETTINGS );
- // printf( "Options -t and -k are contradictory, as are -m and -y\n" );
- }
- #define OPT_NONE 0
- #define OPT_START 1
- #define OPT_APP 2
- #define OPT_TERMINATE 3
- #define OPT_START_DIRECT 4
- /////////////////////////////////////////////////////////////////
- static int checkOptions( PassSyncService *pSynch, int& argc, char *argv[] )
- {
- int result = OPT_START; // Default is to start the service
- // Check first for uninstall, since we shouldn't do anything else if set
- int i;
- for( i = 1; i < argc; i++ )
- {
- if ( !strncmp( argv[i], "-u", 2 ) )
- {
- // Uninstall
- if ( !pSynch->IsInstalled() )
- wprintf( L"%s is not installed\n", pSynch->m_szServiceName );
- else
- {
- // Try and remove the copy that's installed
- if ( pSynch->Uninstall() )
- wprintf( L"%s removed\n", pSynch->m_szServiceName );
- else
- wprintf( L"Could not remove %s. Error %d\n",
- pSynch->m_szServiceName, GetLastError() );
- // pSynch->ClearRegistry();
- }
- // Terminate after completion
- result = OPT_TERMINATE;
- argc = 1;
- return result;
- }
- }
- // Check command-line arguments
- for( i = 1; i < argc; )
- {
- if ( '-' != argv[i][0] )
- {
- i++;
- continue;
- }
- char opt = argv[i][1];
- BOOL bLocal = FALSE;
- // Usage
- if ( 'v' == opt )
- {
- result = OPT_NONE;
- usage();
- bLocal = TRUE;
- }
- // Secret option to start as app, not service
- else if ( 'a' == opt )
- {
- result = OPT_APP;
- bLocal = TRUE;
- }
- // Start service
- else if ( 'x' == opt )
- {
- result = OPT_START_DIRECT;
- bLocal = TRUE;
- }
- /*
- // Command port
- else if ( 'c' == opt )
- {
- result = OPT_NONE;
- if ( i < (argc-1) )
- {
- i++;
- pSynch->SetCommandPort( atoi( argv[i] ) );
- bLocal = TRUE;
- }
- }
- */
- // Install
- else if ( 'i' == opt )
- {
- result = OPT_NONE;
- if ( pSynch->IsInstalled() )
- printf( "%S is already installed\n", pSynch->m_szServiceName );
- else
- {
- // Try and install the copy that's running
- if ( pSynch->Install() )
- {
- printf( "%S installed\n", pSynch->m_szServiceName );
- }
- else
- {
- printf( "%S failed to install. Error %d\n",
- pSynch->m_szServiceName, GetLastError() );
- }
- }
- bLocal = TRUE;
- }
- // Synchronize from NT to DS
- // Terminate after completion
- else if ( 'n' == opt )
- {
- result = OPT_NONE;
- }
- // Synchronize from DS to NT
- // Terminate after completion
- else if ( 's' == opt )
- {
- result = OPT_NONE;
- }
- // Synchronize both ways
- // Terminate after completion
- else if ( 'r' == opt )
- {
- result = OPT_NONE;
- }
- if ( bLocal )
- {
- for( int j = i; j < (argc-1); j++ )
- {
- argv[j] = argv[j+1];
- }
- argc--;
- }
- else
- {
- i++;
- if ( i >= argc )
- break;
- }
- }
- return result;
- }
- static int initialize( PassSyncService *pSynch, int argc, char *argv[] )
- {
- // Check command-line arguments
- for( int i = 1; i < argc; i++ )
- {
- if ( '-' != argv[i][0] )
- continue;
- char opt = argv[i][1];
- // pSynch->argToSynch( opt, argv[i] );
- if ( i >= argc )
- break;
- }
- if ( argc > 1 )
- {
- // Save settings to Registry
- // pSynch->SaveConfig();
- }
- return 0;
- }
- /////////////////////////////////////////////////////////////////
- int
- main( int argc, char *argv[] )
- {
- // Global single instance
- PassSyncService theSynch("Password Synchronization Service");
- // Process special install/uninstall switches; this does install/uninstall
- // It returns non-zero to actually start the service
- int nStart = checkOptions( &theSynch, argc, argv );
- // Set up configuration
- if ( OPT_TERMINATE != nStart )
- initialize( &theSynch, argc, argv );
- // Started by Service Control Manager
- if ( OPT_START == nStart )
- {
- // Start the service; doesn't return until the service is started
- BOOL bStarted = theSynch.StartService();
- if ( !bStarted )
- {
- printf( "Service could not be started\n" );
- return(1);
- }
- return 0;
- }
- #if 0
- // Started from command line
- else if ( OPT_START_DIRECT == nStart )
- {
- // This may fail, but the rest still succeeds
- BOOL bStarted = theSynch.StartService();
- bStarted = theSynch.StartServiceDirect();
- if ( !bStarted )
- {
- printf( "Service could not be started\n" );
- return(1);
- }
- return 0;
- }
- #endif
- // Secret debugging option - run as app instead of as service
- else if ( OPT_APP == nStart )
- {
- if ( theSynch.OnInit() )
- theSynch.Run();
- }
- exit(theSynch.m_Status.dwWin32ExitCode);
- ////////// That's it - the rest is debugging stuff //////
- #ifdef _DEBUG
- doDebug( &theSynch );
- #endif
- return 0;
- }
|