Пример #1
0
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;
}
Пример #2
0
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);
    }
}
Пример #3
0
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;
}