New project for the system command execution command in gclc
Signed-off-by: Emmanuel Bigeon <emmanuel@bigeon.fr>
This commit is contained in:
parent
7289fc12ad
commit
ecc10994ca
4
gclc.system/.gitignore
vendored
Normal file
4
gclc.system/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/target/
|
||||||
|
/.classpath
|
||||||
|
/.project
|
||||||
|
/.settings/
|
41
gclc.system/pom.xml
Normal file
41
gclc.system/pom.xml
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>net.bigeon</groupId>
|
||||||
|
<artifactId>gclc.system</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<url>http://www.bigeon.net</url>
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.11</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>fr.bigeon</groupId>
|
||||||
|
<artifactId>gclc</artifactId>
|
||||||
|
<version>1.2.5</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<name>GCLC system command</name>
|
||||||
|
<description>Provide an exec command to execute system commands</description>
|
||||||
|
<inceptionYear>2016</inceptionYear>
|
||||||
|
<scm>
|
||||||
|
<developerConnection>scm:git:gogs@git.code.bigeon.net:emmanuel/gclc.git</developerConnection>
|
||||||
|
<tag>HEAD</tag>
|
||||||
|
</scm>
|
||||||
|
<parent>
|
||||||
|
<groupId>fr.bigeon</groupId>
|
||||||
|
<artifactId>ebigeon-config</artifactId>
|
||||||
|
<version>1.7.0</version>
|
||||||
|
</parent>
|
||||||
|
</project>
|
@ -0,0 +1,139 @@
|
|||||||
|
/**
|
||||||
|
* gclc.system:net.bigeon.gclc.system.ExecSystemCommand.java
|
||||||
|
* Created on: Jun 20, 2016
|
||||||
|
*/
|
||||||
|
package net.bigeon.gclc.system;
|
||||||
|
|
||||||
|
import java.io.BufferedWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import fr.bigeon.gclc.command.Command;
|
||||||
|
import fr.bigeon.gclc.exception.CommandRunException;
|
||||||
|
import fr.bigeon.gclc.exception.CommandRunExceptionType;
|
||||||
|
import fr.bigeon.gclc.manager.ConsoleManager;
|
||||||
|
|
||||||
|
/** <p>
|
||||||
|
* TODO
|
||||||
|
*
|
||||||
|
* @author Emmanuel Bigeon */
|
||||||
|
public class ExecSystemCommand extends Command {
|
||||||
|
|
||||||
|
private static final String EOL = System.lineSeparator();
|
||||||
|
/** The class logger */
|
||||||
|
private static final Logger LOGGER = Logger
|
||||||
|
.getLogger(ExecSystemCommand.class.getName());
|
||||||
|
private final ConsoleManager manager;
|
||||||
|
|
||||||
|
/** @param name
|
||||||
|
* @param manager */
|
||||||
|
public ExecSystemCommand(String name, ConsoleManager manager) {
|
||||||
|
super(name);
|
||||||
|
this.manager = manager;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param name
|
||||||
|
* @param manager */
|
||||||
|
public ExecSystemCommand(ConsoleManager manager) {
|
||||||
|
super("exec");
|
||||||
|
this.manager = manager;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.bigeon.gclc.command.ICommand#execute(java.lang.String[]) */
|
||||||
|
@Override
|
||||||
|
public void execute(String... args) throws CommandRunException {
|
||||||
|
Process proc;
|
||||||
|
try {
|
||||||
|
proc = Runtime.getRuntime().exec(args);
|
||||||
|
} catch (IOException e2) {
|
||||||
|
LOGGER.log(Level.SEVERE, "Unable to run process", e2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final InputStream is = proc.getInputStream();
|
||||||
|
Thread th = new Thread(new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
readToEnd(is);
|
||||||
|
} catch (CommandRunException e) {
|
||||||
|
LOGGER.log(Level.WARNING,
|
||||||
|
"Manager was closed in the meantime...", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
th.start();
|
||||||
|
manager.setPrompt("");
|
||||||
|
final OutputStream os = proc.getOutputStream();
|
||||||
|
try (BufferedWriter writer = new BufferedWriter(
|
||||||
|
new OutputStreamWriter(os))) {
|
||||||
|
while (th.isAlive()) {
|
||||||
|
String user;
|
||||||
|
try {
|
||||||
|
user = manager.prompt();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new CommandRunException(
|
||||||
|
CommandRunExceptionType.INTERACTION,
|
||||||
|
"manager was closed", e, this);
|
||||||
|
}
|
||||||
|
writer.write(user + EOL);
|
||||||
|
}
|
||||||
|
} catch (IOException e1) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param is the input stream
|
||||||
|
* @throws CommandRunException */
|
||||||
|
protected void readToEnd(InputStream is) throws CommandRunException {
|
||||||
|
int c;
|
||||||
|
try {
|
||||||
|
while ((c = is.read()) != -1) {
|
||||||
|
try {
|
||||||
|
manager.print(Character.valueOf((char) c).toString());
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new CommandRunException(
|
||||||
|
CommandRunExceptionType.INTERACTION,
|
||||||
|
"manager was closed", e, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOGGER.log(Level.INFO, "input stream reading failed", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.bigeon.gclc.command.Command#usageDetail() */
|
||||||
|
@Override
|
||||||
|
protected String usageDetail() {
|
||||||
|
return " The system command is a system dependend command like sh on linux or" +
|
||||||
|
System.lineSeparator() + "powershell on windows." +
|
||||||
|
System.lineSeparator() + System.lineSeparator() +
|
||||||
|
" As an example if you give \"cat /etc/hostname\" as argument, on a linux" +
|
||||||
|
System.lineSeparator() +
|
||||||
|
"system, you would get the computer name." +
|
||||||
|
System.lineSeparator();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.bigeon.gclc.command.Command#usagePattern() */
|
||||||
|
@Override
|
||||||
|
protected String usagePattern() {
|
||||||
|
return " CMD <system command>";
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.bigeon.gclc.command.ICommand#tip() */
|
||||||
|
@Override
|
||||||
|
public String tip() {
|
||||||
|
return "Execute a system command";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package net.bigeon.gclc.system;
|
||||||
|
|
||||||
|
import junit.framework.Test;
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
import junit.framework.TestSuite;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit test for simple App.
|
||||||
|
*/
|
||||||
|
public class AppTest
|
||||||
|
extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Create the test case
|
||||||
|
*
|
||||||
|
* @param testName name of the test case
|
||||||
|
*/
|
||||||
|
public AppTest( String testName )
|
||||||
|
{
|
||||||
|
super( testName );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the suite of tests being tested
|
||||||
|
*/
|
||||||
|
public static Test suite()
|
||||||
|
{
|
||||||
|
return new TestSuite( AppTest.class );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rigourous Test :-)
|
||||||
|
*/
|
||||||
|
public void testApp()
|
||||||
|
{
|
||||||
|
assertTrue( true );
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user