static int _VmDirGetRemoteDBUsingRPC( PCSTR pszHostname, PCSTR dbHomeDir, BOOLEAN *pbHasXlog) { DWORD retVal = 0; PSTR pszLocalErrorMsg = NULL; char dbRemoteFilename[VMDIR_MAX_FILE_NAME_LEN] = {0}; char localDir[VMDIR_MAX_FILE_NAME_LEN] = {0}; char localXlogDir[VMDIR_MAX_FILE_NAME_LEN] = {0}; char localFilename[VMDIR_MAX_FILE_NAME_LEN] = {0}; PSTR pszDcAccountPwd = NULL; PVMDIR_SERVER_CONTEXT hServer = NULL; DWORD low_xlognum = 0; DWORD high_xlognum = 0; DWORD xlognum = 0; DWORD remoteDbSizeMb = 0; DWORD remoteDbMapSizeMb = 0; PBYTE pDbPath = NULL; BOOLEAN bMdbWalEnable = FALSE; #ifndef _WIN32 const char fileSeperator = '/'; #else const char fileSeperator = '\\'; #endif retVal = VmDirAllocateMemory(VMDIR_MAX_FILE_NAME_LEN, (PVOID)&pDbPath ); BAIL_ON_VMDIR_ERROR(retVal); retVal = VmDirReadDCAccountPassword(&pszDcAccountPwd); BAIL_ON_VMDIR_ERROR( retVal ); retVal = VmDirOpenServerA(pszHostname, gVmdirServerGlobals.dcAccountUPN.lberbv_val, NULL, pszDcAccountPwd, 0, NULL, &hServer); BAIL_ON_VMDIR_ERROR_WITH_MSG( retVal, (pszLocalErrorMsg), "_VmDirGetRemoteDBUsingRPC: VmDirOpenServerA() call failed with error: %d, host name = %s", retVal, pszHostname ); VMDIR_LOG_INFO( VMDIR_LOG_MASK_ALL, "_VmDirGetRemoteDBUsingRPC: Connected to the replication partner (%s).", pszHostname ); VmDirGetMdbWalEnable(&bMdbWalEnable); if (bMdbWalEnable) { //Set remote server backend to KEEPXLOGS mode retVal = VmDirSetBackendState (hServer, MDB_STATE_KEEPXLOGS, &low_xlognum, &remoteDbSizeMb, &remoteDbMapSizeMb, pDbPath, VMDIR_MAX_FILE_NAME_LEN); } else { //Set remote server backend to ReadOnly mode retVal = VmDirSetBackendState (hServer, MDB_STATE_READONLY, &low_xlognum, &remoteDbSizeMb, &remoteDbMapSizeMb, pDbPath, VMDIR_MAX_FILE_NAME_LEN); } BAIL_ON_VMDIR_ERROR_WITH_MSG(retVal, (pszLocalErrorMsg), "_VmDirGetRemoteDBUsingRPC: VmDirSetBackendState failed, WalEnabled: %d, error: %d", bMdbWalEnable, retVal); retVal = VmDirStringPrintFA( localDir, VMDIR_MAX_FILE_NAME_LEN, "%s%c%s", dbHomeDir, fileSeperator, LOCAL_PARTNER_DIR); BAIL_ON_VMDIR_ERROR_WITH_MSG( retVal, (pszLocalErrorMsg), "_VmDirGetRemoteDBUsingRPC: VmDirStringPrintFA() call failed with error: %d", retVal ); retVal = _VmDirMkdir(localDir, 0700); BAIL_ON_VMDIR_ERROR( retVal ); if (low_xlognum > 0) { retVal = VmDirStringPrintFA( localXlogDir, VMDIR_MAX_FILE_NAME_LEN, "%s%c%s", localDir, fileSeperator, VMDIR_MDB_XLOGS_DIR_NAME); BAIL_ON_VMDIR_ERROR_WITH_MSG( retVal, (pszLocalErrorMsg), "_VmDirGetRemoteDBUsingRPC: VmDirStringPrintFA() call failed with error: %d", retVal ); retVal = _VmDirMkdir(localXlogDir, 0700); BAIL_ON_VMDIR_ERROR_WITH_MSG( retVal, (pszLocalErrorMsg), "_VmDirGetRemoteDBUsingRPC: _VmDirMkdir() call failed with error: %d %s", retVal ); } retVal = VmDirStringPrintFA( dbRemoteFilename, VMDIR_MAX_FILE_NAME_LEN, "%s/%s", (char *)pDbPath, VMDIR_MDB_DATA_FILE_NAME ); BAIL_ON_VMDIR_ERROR_WITH_MSG( retVal, (pszLocalErrorMsg), "_VmDirGetRemoteDBUsingRPC: VmDirStringPrintFA() call failed with error: %d", retVal ); retVal = VmDirStringPrintFA( localFilename, VMDIR_MAX_FILE_NAME_LEN, "%s%c%s%c%s", dbHomeDir, fileSeperator, LOCAL_PARTNER_DIR, fileSeperator, VMDIR_MDB_DATA_FILE_NAME ); BAIL_ON_VMDIR_ERROR_WITH_MSG( retVal, (pszLocalErrorMsg), "_VmDirGetRemoteDBUsingRPC: VmDirStringPrintFA() call failed with error: %d", retVal ); VMDIR_LOG_INFO( VMDIR_LOG_MASK_ALL, "_VmDirGetRemoteDBUsingRPC: copying remote file %s with data size %ld MB with Map size %ld MB ...", dbRemoteFilename, remoteDbSizeMb, remoteDbMapSizeMb ); retVal = _VmDirGetRemoteDBFileUsingRPC( hServer, dbRemoteFilename, localFilename, remoteDbSizeMb, remoteDbMapSizeMb ); BAIL_ON_VMDIR_ERROR( retVal ); if (low_xlognum == 0) { VMDIR_LOG_INFO(VMDIR_LOG_MASK_ALL, "_VmDirGetRemoteDBUsingRPC: complete MDB cold copy - WAL not supported by remote"); goto cleanup; } //Query current xlog number retVal = VmDirSetBackendState (hServer, MDB_STATE_GETXLOGNUM, &high_xlognum, &remoteDbSizeMb, &remoteDbMapSizeMb, pDbPath, VMDIR_MAX_FILE_NAME_LEN); BAIL_ON_VMDIR_ERROR_WITH_MSG( retVal, (pszLocalErrorMsg), "_VmDirGetRemoteDBUsingRPC: VmDirSetBackendState failed to get current xlog: %d", retVal ); VMDIR_LOG_INFO( VMDIR_LOG_MASK_ALL, "_VmDirGetRemoteDBUsingRPC: start transfering XLOGS from %d to %d", low_xlognum, high_xlognum); for (xlognum = low_xlognum; xlognum <= high_xlognum; xlognum++) { retVal = VmDirStringPrintFA( dbRemoteFilename, VMDIR_MAX_FILE_NAME_LEN, "%s%c%s%c%lu", dbHomeDir, fileSeperator, VMDIR_MDB_XLOGS_DIR_NAME, fileSeperator, xlognum ); BAIL_ON_VMDIR_ERROR_WITH_MSG( retVal, (pszLocalErrorMsg), "_VmDirGetRemoteDBUsingRPC: VmDirStringPrintFA() call failed with error: %d", retVal ); retVal = VmDirStringPrintFA( localFilename, VMDIR_MAX_FILE_NAME_LEN, "%s%c%lu", localXlogDir, fileSeperator, xlognum); BAIL_ON_VMDIR_ERROR_WITH_MSG( retVal, (pszLocalErrorMsg), "_VmDirGetRemoteDBUsingRPC: VmDirStringPrintFA() call failed with error: %d", retVal ); retVal = _VmDirGetRemoteDBFileUsingRPC( hServer, dbRemoteFilename, localFilename, 0, 0); BAIL_ON_VMDIR_ERROR_WITH_MSG( retVal, (pszLocalErrorMsg), "_VmDirGetRemoteDBUsingRPC: _VmDirGetRemoteDBFileUsingRPC() call failed with error: %d", retVal ); } VMDIR_LOG_INFO( VMDIR_LOG_MASK_ALL, "_VmDirGetRemoteDBUsingRPC: complete transfering XLOGS from %d to %d", low_xlognum, high_xlognum); cleanup: if (hServer) { //clear backend transfering xlog files mode. VmDirSetBackendState (hServer, MDB_STATE_CLEAR, &xlognum, &remoteDbSizeMb, &remoteDbMapSizeMb, pDbPath, VMDIR_MAX_FILE_NAME_LEN); VmDirCloseServer( hServer); } VMDIR_SAFE_FREE_MEMORY(pszLocalErrorMsg); VMDIR_SAFE_FREE_MEMORY(pDbPath); VMDIR_SECURE_FREE_STRINGA(pszDcAccountPwd); *pbHasXlog = (low_xlognum > 0); return retVal; error: retVal = LDAP_OPERATIONS_ERROR; VMDIR_LOG_ERROR( VMDIR_LOG_MASK_ALL, "%s", VDIR_SAFE_STRING(pszLocalErrorMsg) ); goto cleanup; }
VOID VdcadminSetSRPAuthData( VOID ) { CHAR inBuf[512] = {0}; DWORD dwError = 0; if (pszUserName) { free(pszUserName); } if (pszDomain) { free(pszDomain); } if (pszPassword) { free(pszPassword); } VmDirReadString( "VMDIR IP address: ", inBuf, sizeof(inBuf), FALSE); if (inBuf[0]) { pszNetworkAddress = strdup(inBuf); } VmDirReadString( "SRP Username: "******"SRP Domain: ", inBuf, sizeof(inBuf), FALSE); if (inBuf[0]) { pszDomain = strdup(inBuf); } VmDirReadString( "SRP Password: "******"VmDirCreateBindingHandleAuthA: failed %x\n", dwError); } dwError = VmDirOpenServerA( pszNetworkAddress, pszUserName, pszDomain, pszPassword, 0, NULL, &g_hServer); if (dwError) { printf("VmDirOpenServerA: failed %x\n", dwError); } }
static OM_uint32 _srp_gss_auth_create_machine_acct_binding( int *bUseLocalIpc, OM_uint32 *minor_status, PVMDIR_SERVER_CONTEXT *hRetServer) { DWORD dwError = 0; OM_uint32 maj = 0; OM_uint32 min = 0; int domainState = 0; char *machine_acct_upn = NULL; char *machine_acct_pwd = NULL; char *hostname = NULL; void *hRegistry = NULL; PVMDIR_SERVER_CONTEXT hServer = NULL; PSTR pEnv = NULL; dwError = srp_reg_get_handle((void **) &hRegistry); if (dwError) { maj = GSS_S_FAILURE; min = dwError; goto error; } /* If invoked by lwraft or other server, it can override domain state * (to value 1) since it could obtain peer's credential from its database */ pEnv = getenv(VMDIR_ENV_OVERRIDE_AFD_DOMAIN_STATE); if (pEnv) { domainState = atoi(pEnv); } else { /* Determine if this system is a management node */ dwError = srp_reg_get_domain_state(hRegistry, &domainState); if (dwError) { /* Assume infra node if registry lookup fails */ domainState = 1; } } /* Value "2" is a management node: Perform SRP pass-through */ if (domainState == 2) { dwError = srp_reg_get_machine_acct_upn( hRegistry, &machine_acct_upn); if (dwError) { maj = GSS_S_FAILURE; min = dwError; goto error; } dwError = srp_reg_get_machine_acct_password( hRegistry, &machine_acct_pwd); if (dwError) { maj = GSS_S_FAILURE; min = dwError; goto error; } dwError = srp_reg_get_dc_name( hRegistry, &hostname); if (dwError) { maj = GSS_S_FAILURE; min = dwError; goto error; } } else if (domainState == 1) { /* Do not create a binding handle when on an infra node; use IPC */ *bUseLocalIpc = 1; goto error; } /* * This will create a remote binding handle when credentials are * provided, or if local, will use ncalrpc. */ dwError = VmDirOpenServerA( hostname, machine_acct_upn, /* UPN doesn't need domain name */ NULL, machine_acct_pwd, 0, NULL, &hServer); BAIL_ON_VMDIR_ERROR_NO_LINE(dwError); *hRetServer = hServer; error: if (machine_acct_upn) { free(machine_acct_upn); } if (machine_acct_pwd) { free(machine_acct_pwd); } if (hostname) { free(hostname); } if (hRegistry) { srp_reg_close_handle(hRegistry); } if (maj) { if (min) { *minor_status = min; } } return maj; }