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

Java tutorial

Introduction

Here is the source code for com.vmware.bdd.service.impl.ClusterLdapUserMgmtCfgService.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.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.vmware.bdd.command.CommandUtil;
import com.vmware.bdd.entity.NodeEntity;
import com.vmware.bdd.manager.intf.IClusterEntityManager;
import com.vmware.bdd.usermgmt.SssdConfigurationGenerator;
import com.vmware.bdd.usermgmt.UserMgmtConstants;
import com.vmware.bdd.usermgmt.UserMgmtServerService;

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

    @Autowired
    private IClusterEntityManager clusterEntityManager;

    @Autowired
    private UserMgmtServerService userMgmtServerService;

    @Autowired
    private SssdConfigurationGenerator sssdConfigurationGenerator;

    @Autowired
    private ClusterUserMgmtValidService clusterUserMgmtValidService;

    @Autowired
    private NodeLdapUserMgmtConfService nodeLdapUserMgmtConfService;

    @Autowired
    private ServiceUserConfigService serviceUserConfigService;

    public Map<String, String> getUserMgmtCfg(String clusterName) {
        Map<String, String> userMgmtCfg = clusterEntityManager.findUserMgmtCfg(clusterName);

        if (MapUtils.isEmpty(userMgmtCfg)) {
            LOGGER.info("no need to configure user management for cluster, no usermgmt cfg found in database.");
            return null;
        }

        return userMgmtCfg;
    }

    public void configureUserMgmt(String clusterName) {
        List<NodeEntity> nodeEntityList = clusterEntityManager.findAllNodes(clusterName);

        ArrayList<String> nodeMgmtIpList = new ArrayList<>();
        for (NodeEntity nodeEntity : nodeEntityList) {
            nodeMgmtIpList.add(nodeEntity.getPrimaryMgtIpV4());
        }

        String[] nodeMgmtIps = new String[nodeEntityList.size()];
        nodeMgmtIpList.toArray(nodeMgmtIps);

        configureUserMgmt(clusterName, nodeEntityList);
    }

    public void configureUserMgmt(String clusterName, List<NodeEntity> nodeEntityList) {
        Map<String, String> userMgmtCfg = getUserMgmtCfg(clusterName);
        Map<String, Map<String, String>> serviceUserCfg = serviceUserConfigService
                .getServiceUserConfigs(clusterName);

        //only when user didn't config ldap group in command line and service user in spec file, will the userMgmtCfg be null
        //it means if userMgmt is null, no ldap user or group is configured
        if (userMgmtCfg == null) {
            LOGGER.info("no need to do usermgmt configuration.");
            return;
        }

        if (CollectionUtils.isEmpty(nodeEntityList)) {
            LOGGER.info("the target node list is empty, skip usermgmt configuration.");
            return;
        }

        String adminGroupName = userMgmtCfg.get(UserMgmtConstants.ADMIN_GROUP_NAME);

        Set<String> groupNameSet = new HashSet<>();

        String[] userMgmtGroups = clusterUserMgmtValidService.getGroupNames(userMgmtCfg);
        if (!ArrayUtils.isEmpty(userMgmtGroups)) {
            groupNameSet.addAll(Arrays.asList(userMgmtGroups));
        }

        Set<String> serviceUserGroupSet = serviceUserConfigService.getServiceUserGroups(serviceUserCfg);
        if (!CollectionUtils.isEmpty(serviceUserGroupSet)) {
            groupNameSet.addAll(serviceUserGroupSet);
        }

        String[] groupNames = new String[groupNameSet.size()];
        groupNameSet.toArray(groupNames);

        String sssdConfContent = sssdConfigurationGenerator.getConfigurationContent(
                userMgmtServerService.getByName(UserMgmtConstants.DEFAULT_USERMGMT_SERVER_NAME, false), groupNames);

        File taskDir = CommandUtil.createWorkDir(System.currentTimeMillis());

        File localSssdConfFile = new File(taskDir, "sssd.conf");

        try (FileWriter fileWriter = new FileWriter(localSssdConfFile);) {
            //write sssd.conf for all nodes
            fileWriter.write(sssdConfContent);

        } catch (IOException ioe) {
            throw new RuntimeException("failed to write sssd.conf for usermgmt configuration.", ioe);
        }

        try {
            // scp to one node's tmp folder
            // cp to /etc/sssd
            // sudo authconfig --enablesssd --enablesssdauth --enablemkhomedir --updateall
            nodeLdapUserMgmtConfService.configureLdap(nodeEntityList, localSssdConfFile.getAbsolutePath(),
                    adminGroupName);
        } finally {
            try {
                localSssdConfFile.delete();
            } catch (Exception ex) {
                LOGGER.warn("the local sssd file can not be deleted! please delete it manually!: "
                        + localSssdConfFile.getAbsolutePath(), ex);
            }
        }

        String disableLocalUserFlag = userMgmtCfg.get(UserMgmtConstants.DISABLE_LOCAL_USER_FLAG);

        if (disableLocalUserFlag != null) {
            boolean disableLocalUser = Boolean.parseBoolean(disableLocalUserFlag);
            if (disableLocalUser) {
                nodeLdapUserMgmtConfService.disableLocalUsers(nodeEntityList);
            }
        }
    }

    public void configureUserMgmt(String clusterName, NodeEntity node) {
        configureUserMgmt(clusterName, Arrays.asList(node));
    }
}