com.vmware.bdd.service.impl.NodeLdapUserMgmtConfService.java Source code

Java tutorial

Introduction

Here is the source code for com.vmware.bdd.service.impl.NodeLdapUserMgmtConfService.java

Source

/******************************************************************************
 *   Copyright (c) 2014-2015 VMware, Inc. All Rights Reserved.
 *   Licensed 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.
 *****************************************************************************/
package com.vmware.bdd.service.impl;

import java.io.IOException;
import java.util.List;

import com.vmware.bdd.usermgmt.UserMgmtConstants;
import com.vmware.bdd.utils.CommonUtil;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteWatchdog;
import org.apache.commons.exec.PumpStreamHandler;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.vmware.aurora.global.Configuration;
import com.vmware.bdd.entity.NodeEntity;
import com.vmware.bdd.manager.intf.IClusterEntityManager;
import com.vmware.bdd.ssh.SshExecService;
import com.vmware.bdd.usermgmt.job.ExecOutputLogger;
import com.vmware.bdd.utils.Constants;

/**
 * Created By xiaoliangl on 12/31/14.
 */
@Component
public class NodeLdapUserMgmtConfService {
    private static final Logger LOGGER = Logger.getLogger(NodeLdapUserMgmtConfService.class);

    private String sshUser;
    private int sshPort;

    private SshExecService sshExecService = new SshExecService();

    @Autowired
    private IClusterEntityManager clusterEntityManager;

    private int TIMEOUT = Configuration.getInt("usermgmt.command.exec.timeout", 60);

    public NodeLdapUserMgmtConfService() {
        this.sshUser = Configuration.getString(Constants.SSH_USER_CONFIG_NAME, Constants.DEFAULT_SSH_USER_NAME);
        this.sshPort = Configuration.getInt(Constants.SSH_PORT_CONFIG_NAME, Constants.DEFAULT_SSH_PORT);
    }

    public void disableLocalUsers(List<NodeEntity> nodeEntityList) {
        String sudoCmd = CommonUtil.getCustomizedSudoCmd();
        String[] remoteCmds = new String[] { sudoCmd + " usermod -L serengeti", sudoCmd + " usermod -L root" };

        for (NodeEntity nodeEntity : nodeEntityList) {
            clusterEntityManager.updateNodeAction(nodeEntity, "Disabling Local Users");
            try {
                sshExecService.exec(nodeEntity.getPrimaryMgtIpV4(), sshPort, sshUser, remoteCmds, TIMEOUT);
                nodeEntity.setAction("Disable Local Users successfully!");
            } catch (Exception e) {
                LOGGER.error("failed to disable local users for node: " + nodeEntity, e);
                nodeEntity.setAction("Disable Local Users failed!");
                nodeEntity.setActionFailed(true);
            } finally {
                clusterEntityManager.update(nodeEntity);
            }
        }
    }

    public void configureLdap(List<NodeEntity> nodeEntityList, String localSssdConfFile, String adminGroupName) {
        String uploadedSssdConfFilePath = "/tmp/sssd.conf." + System.currentTimeMillis();
        String sudoCmd = CommonUtil.getCustomizedSudoCmd();
        String[] remoteCmds = new String[] {
                sudoCmd + " " + UserMgmtConstants.CONFIG_LDAP_SCRIPT + " " + uploadedSssdConfFilePath };
        String enableSudoCmd = "echo 'Do not need to enable sudo'";
        if (adminGroupName != null) {
            enableSudoCmd = sudoCmd + " " + UserMgmtConstants.ENABLE_SUDO_SCRIPT + " " + adminGroupName;
        }
        String[] enableSudoCmds = new String[] { enableSudoCmd };

        for (NodeEntity nodeEntity : nodeEntityList) {
            clusterEntityManager.updateNodeAction(nodeEntity, "Enabling LDAP");
            try {
                transferFile(localSssdConfFile, nodeEntity.getPrimaryMgtIpV4(), uploadedSssdConfFilePath);
                sshExecService.exec(nodeEntity.getPrimaryMgtIpV4(), sshPort, sshUser, remoteCmds, TIMEOUT);
                sshExecService.exec(nodeEntity.getPrimaryMgtIpV4(), sshPort, sshUser, enableSudoCmds, TIMEOUT);

                nodeEntity.setAction("Enable LDAP succeeded");
            } catch (Exception e) {
                //Todo(qjin: error handling need to be enhanced here.)
                LOGGER.error("failed to configure LDAP for node: " + nodeEntity, e);
                nodeEntity.setAction("Enable LDAP failed");
                nodeEntity.setActionFailed(true);
                nodeEntity.setErrMessage(e.getMessage());
            } finally {
                clusterEntityManager.update(nodeEntity);
            }
        }
    }

    private void transferFile(String srcFilePath, String ip, String targetFilePath) {
        CommandLine cmdLine = new CommandLine("scp").addArgument(srcFilePath)
                .addArgument(ip + ":" + targetFilePath);

        DefaultExecutor executor = new DefaultExecutor();

        executor.setStreamHandler(new PumpStreamHandler(new ExecOutputLogger(LOGGER, false), //output logger
                new ExecOutputLogger(LOGGER, true)) //error logger
        );

        executor.setWatchdog(new ExecuteWatchdog(1000l * 120l));

        try {
            int exitVal = executor.execute(cmdLine);
            if (exitVal != 0) {
                throw new RuntimeException("CFG_LDAP_FAIL", null);
            }
        } catch (IOException e) {
            throw new RuntimeException("CFG_LDAP_FAIL", e);
        }
    }

    public IClusterEntityManager getClusterEntityManager() {
        return clusterEntityManager;
    }

    public void setClusterEntityManager(IClusterEntityManager clusterEntityManager) {
        this.clusterEntityManager = clusterEntityManager;
    }
}