001    /**
002     * Copyright 2010-2013 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.common.util.secure;
017    
018    import java.io.File;
019    import java.io.IOException;
020    import java.util.Arrays;
021    
022    import org.apache.commons.lang3.StringUtils;
023    import org.jasypt.util.text.BasicTextEncryptor;
024    import org.junit.Test;
025    import org.kuali.common.util.Assert;
026    import org.kuali.common.util.FormatUtils;
027    import org.kuali.common.util.LocationUtils;
028    import org.kuali.common.util.Str;
029    import org.kuali.common.util.UnixCmds;
030    import org.slf4j.Logger;
031    import org.slf4j.LoggerFactory;
032    
033    public class DefaultSecureChannelTest {
034    
035            private static final Logger logger = LoggerFactory.getLogger(DefaultSecureChannelTest.class);
036    
037            protected SecureChannel getSecureChannel() {
038                    String privateKeyString = LocationUtils.toString("/Users/jeffcaddel/.ssh/ole-key.pem");
039                    BasicTextEncryptor bte = new BasicTextEncryptor();
040                    bte.setPassword("1423Morgan");
041                    String s = bte.encrypt(privateKeyString);
042                    System.out.println(s);
043                    DefaultSecureChannel channel = new DefaultSecureChannel();
044                    channel.setUsername("root");
045                    channel.setHostname("env7.ole.kuali.org");
046                    channel.setStrictHostKeyChecking(false);
047                    channel.setIncludeDefaultPrivateKeyLocations(false);
048                    channel.setUseConfigFile(false);
049                    channel.setPrivateKeyStrings(Arrays.asList(privateKeyString));
050                    return channel;
051            }
052    
053            // @Test
054            public void testExec() {
055                    try {
056                            UnixCmds cmds = new UnixCmds();
057                            SecureChannel channel = getSecureChannel();
058                            channel.open();
059                            show(channel.executeCommand(cmds.rmrf("/root/x")));
060                            show(channel.executeCommand(cmds.su("tomcat", "/usr/local/tomcat/bin/forced-shutdown.sh")));
061                            show(channel.executeCommand(cmds.su("tomcat", "/usr/local/tomcat/bin/cleanup.sh")));
062                            show(channel.executeCommand(cmds.su("tomcat", "/usr/local/tomcat/bin/startup.sh")));
063                            show(channel.executeCommand(cmds.mkdirp("/home/tomcat/x/y/z/foo")));
064                            show(channel.executeCommand("ls -la > /home/tomcat/x/y/z/foo.sh"));
065                            show(channel.executeCommand("cat", "foo\nbar"));
066                            show(channel.executeCommand(cmds.chmod("755", "/home/tomcat/x/y/z/foo.sh")));
067                            show(channel.executeCommand(cmds.chownr("tomcat", "tomcat", "/home/tomcat/x")));
068                            channel.close();
069                    } catch (Exception e) {
070                            e.printStackTrace();
071                    }
072            }
073    
074            protected void show(Result result) throws IOException {
075                    int exitValue = result.getExitValue();
076                    if (exitValue != 0) {
077                            logger.info("Exit value = {}", result.getExitValue());
078                    }
079                    if (result.getStdin() == null) {
080                            Object[] args = { result.getCommand(), FormatUtils.getTime(result.getElapsed()) };
081                            logger.info("[{}] - {}", args);
082                    } else {
083                            Object[] args = { result.getCommand(), Str.flatten(result.getStdin(), "\\r", "\\n"), FormatUtils.getTime(result.getElapsed()) };
084                            logger.info("[{}] < [{}] - {}", args);
085                    }
086                    String[] stdout = StringUtils.split(result.getStdout(), '\n');
087                    for (String line : stdout) {
088                            logger.info(line);
089                    }
090                    String[] stderr = StringUtils.split(result.getStderr(), '\n');
091                    for (String line : stderr) {
092                            logger.info(line);
093                    }
094            }
095    
096            // @Test
097            public void testGetWorkingDirectory() {
098                    SecureChannel channel = null;
099                    try {
100                            channel = getSecureChannel();
101                            channel.open();
102                            RemoteFile file = channel.getWorkingDirectory();
103                            logger.info(file.getAbsolutePath());
104                    } catch (Exception e) {
105                            e.printStackTrace();
106                    } finally {
107                            ChannelUtils.closeQuietly(channel);
108                    }
109            }
110    
111            // @Test
112            public void testRoundTrip() {
113                    SecureChannel channel = null;
114                    try {
115                            String absolutePath = "/root/x/y/z/hello.txt";
116                            File localSrc = new File("/tmp/sftp/src.txt");
117                            File localDst = new File("/tmp/sftp/dst.txt");
118                            channel = getSecureChannel();
119                            channel.open();
120                            RemoteFile remote = channel.getMetaData(absolutePath);
121                            channel.copyFile(localSrc, remote);
122                            Assert.isTrue(channel.exists(absolutePath));
123                            Assert.isFalse(channel.isDirectory(absolutePath));
124                            channel.copyFile(remote, localDst);
125                            channel.deleteFile(absolutePath);
126                            Assert.isTrue(channel.exists(absolutePath));
127                    } catch (Exception e) {
128                            e.printStackTrace();
129                    } finally {
130                            ChannelUtils.closeQuietly(channel);
131                    }
132            }
133    
134            @Test
135            public void test1() {
136                    try {
137                            String filename = "/home/.kuali";
138                            File file = new File(filename);
139                            String url = LocationUtils.getCanonicalURLString(file);
140                            logger.info(url);
141                            String path = LocationUtils.getNormalizedAbsolutePath(filename);
142                            logger.info(path);
143                    } catch (Exception e) {
144                            e.printStackTrace();
145                    }
146            }
147    
148    }