Package io.fathom.cloud.compute.actions

Source Code of io.fathom.cloud.compute.actions.ApplydContext

package io.fathom.cloud.compute.actions;

import io.fathom.cloud.CloudException;
import io.fathom.cloud.compute.scheduler.SshCommand;
import io.fathom.cloud.sftp.RemoteFile;
import io.fathom.cloud.sftp.Sftp;
import io.fathom.cloud.ssh.SftpStat;
import io.fathom.cloud.ssh.SshConfig;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.base.Charsets;
import com.google.common.base.Objects;
import com.google.common.io.ByteStreams;

public class ApplydContext {
    private static final Logger log = LoggerFactory.getLogger(ApplydContext.class);

    final Sftp sftp;

    public ApplydContext(Sftp sftp) {
        this.sftp = sftp;
    }

    public boolean updateConfig(String path, String data) throws CloudException {
        return updateConfig(path, data.getBytes(Charsets.UTF_8));
    }

    public boolean updateConfig(String path, byte[] data) throws CloudException {
        File base = new File("/etc/apply.d/");
        File confFile = new File(base, path);

        log.debug("SFTP writing config file {}", confFile);

        try {
            byte[] src = sftp.readAllBytes(confFile);
            if (src != null) {
                if (Arrays.equals(src, data)) {
                    log.debug("SFTP config file unchanged; won't write: {}", confFile);
                    return false;
                }
            }

            int mode = 0660;
            sftp.writeAtomic(new RemoteFile(confFile), ByteStreams.asByteSource(data), mode);
        } catch (IOException e) {
            throw new CloudException("Error updating applyd configuration", e);
        }
        return true;
    }

    public boolean removeConfig(String path) throws CloudException {
        File base = new File("/etc/apply.d/");
        File confFile = new File(base, path);

        log.debug("SFTP deleting config file {}", confFile);

        try {
            SftpStat stat = sftp.stat(confFile);
            if (stat == null) {
                return false;
            }

            sftp.delete(confFile);
        } catch (IOException e) {
            throw new CloudException("Error updating applyd configuration", e);
        }
        return true;
    }

    public void apply(SshConfig sshConfig) throws CloudException {
        String cmd;
        if (Objects.equal("root", sshConfig.getUser())) {
            cmd = "/usr/sbin/applyd";
        } else {
            // TODO: Make suid?
            cmd = "sudo /usr/sbin/applyd";
        }

        try {
            SshCommand sshCommand = new SshCommand(sshConfig, cmd);
            sshCommand.run();
        } catch (IOException e) {
            throw new CloudException("Error applying applyd configuration", e);
        }
    }

}
TOP

Related Classes of io.fathom.cloud.compute.actions.ApplydContext

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.