org.kaaproject.kaa.server.appenders.file.appender.FileSystemLogEventServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.kaaproject.kaa.server.appenders.file.appender.FileSystemLogEventServiceImpl.java

Source

/*
 * Copyright 2014-2016 CyberVision, Inc.
 *
 * 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 org.kaaproject.kaa.server.appenders.file.appender;

import org.apache.commons.io.FileUtils;
import org.apache.tools.ant.taskdefs.Execute;
import org.kaaproject.kaa.common.dto.logs.LogAppenderDto;
import org.kaaproject.kaa.server.appenders.file.config.gen.FileConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

public class FileSystemLogEventServiceImpl implements FileSystemLogEventService {

    private static final Logger LOG = LoggerFactory.getLogger(FileSystemLogEventServiceImpl.class);
    private static final String DEFAULT_SYSTEM_USER = "kaa";

    private static final String CREATE_USER = "create_user";
    private static final String CREATE_ROOT_LOG_DIR = "create_root_log_dir";

    private static void executeCommand(File workingDir, String... command) throws IOException {
        Execute exec = new Execute();
        if (workingDir == null) {
            String homeDir = System.getProperty("user.home");
            if (homeDir != null) {
                workingDir = new File(homeDir);
            }
        }
        if (workingDir != null) {
            exec.setWorkingDirectory(workingDir);
        }
        exec.setCommandline(command);
        exec.execute();
        if (exec.isFailure()) {
            throw new RuntimeException("Process returned bad exit value: " + exec.getExitValue());
        }
    }

    @Override
    public void createDirectory(String path) {
        LOG.debug("Starting create directory with path: {}", path);
        File directory = new File(path);
        if (!directory.exists()) {
            boolean result = directory.mkdir();
            LOG.debug("Creating directory result: {}", result);
        } else {
            LOG.debug("Directory/File with path: {} already exist", path);
        }
    }

    @Override
    public void createUserAndGroup(LogAppenderDto appender, FileConfig config, String path) {
        LOG.debug("Starting create user and group for application with id: {}", appender.getApplicationId());
        String userName = "kaa_log_user_" + appender.getApplicationToken();
        String groupName = "kaa_log_group_" + appender.getApplicationToken();
        String publicKey = config.getPublicKey();

        File tmpKeyFile = null;
        File createUserScript = null;
        try {
            tmpKeyFile = File.createTempFile("app_" + appender.getApplicationToken(), "_pub.key");
            PrintWriter out = new PrintWriter(tmpKeyFile);
            out.write(publicKey);
            out.close();

            createUserScript = prepareScriptFile(CREATE_USER);

            executeCommand(null, "sudo", createUserScript.getAbsolutePath(), userName, groupName, path,
                    tmpKeyFile.getAbsolutePath());

        } catch (IOException ex) {
            LOG.error("Unexpected exception occurred while creating user", ex);
        } finally {
            if (tmpKeyFile != null) {
                tmpKeyFile.delete();
            }
            if (createUserScript != null) {
                createUserScript.delete();
            }
        }
    }

    @Override
    public void createRootLogDirCommand(String logsRootPath) {
        LOG.info("Create root log directory...");
        File createRootLogDirScript = null;
        try {
            createRootLogDirScript = prepareScriptFile(CREATE_ROOT_LOG_DIR);
            executeCommand(null, "sudo", createRootLogDirScript.getAbsolutePath(), logsRootPath,
                    DEFAULT_SYSTEM_USER);
        } catch (IOException ex) {
            LOG.error("Can't create root log dir: " + logsRootPath, ex);
        } finally {
            if (createRootLogDirScript != null) {
                createRootLogDirScript.delete();
            }
        }
    }

    @Override
    public void removeAll(String path) {
        LOG.debug("Starting delete directory with path: {}", path);
        File directory = new File(path);
        try {
            FileUtils.deleteDirectory(directory);
            LOG.debug("Directory was successfully deleted");
        } catch (IOException ex) {
            LOG.error("Unable to delete directory with path: {}, exception catched: {}", path, ex);
        }
    }

    private File prepareScriptFile(String resourceName) throws IOException {

        File scriptFile = File.createTempFile(resourceName, ".sh");
        byte[] data = org.kaaproject.kaa.server.common.utils.FileUtils.readResourceBytes(resourceName);
        FileUtils.writeByteArrayToFile(scriptFile, data);

        executeCommand(null, "sudo", "chmod", "+x", scriptFile.getAbsolutePath());

        return scriptFile;
    }

}