embulk-input-remote 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +3 -1
- data/build.gradle +1 -1
- data/classpath/embulk-input-remote-0.1.2.jar +0 -0
- data/gradlew.bat +90 -90
- data/src/main/java/org/embulk/input/RemoteFileInputPlugin.java +43 -56
- data/src/main/java/org/embulk/input/remote/SSHClient.java +104 -0
- metadata +3 -2
- data/classpath/embulk-input-remote-0.1.1.jar +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ea2dc9f5f71195a19ac5f0a5a3e96d4020a02b2
|
4
|
+
data.tar.gz: 4081a11e980990e00243581ec48016cd6bd15bbe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 93cfc49c50e5844ad4e9a9b51ea8513d2e8f422866d8c52542f2b306605a78896f1d805bd68a7e21e77114af525e1c3f5510c98b1b74f94743360a79074eb54a
|
7
|
+
data.tar.gz: 34c3fcb851fa472051aeaa77182bfcf89ff2f8b3ee021681cd3904e53ffb31e55719bb33949ed2326ebfc29a2996c4ad3ccd97117358f8abb0c469df5cd67c37
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Remote file input plugin for Embulk
|
1
|
+
# Remote file input plugin for [Embulk](https://github.com/embulk/embulk)
|
2
2
|
|
3
3
|
This plugin load data from Remote hosts by SCP
|
4
4
|
|
@@ -15,6 +15,7 @@ This plugin load data from Remote hosts by SCP
|
|
15
15
|
- **hosts_separator**: Separator for "hosts_command" result (string, default: " ")
|
16
16
|
- **path**: Path of remote host (File or Directory) (string, default: "")
|
17
17
|
- **path_command**: Command for getting path (Windows not supported). If given the option "path" is overwritten. (string, default: null)
|
18
|
+
- **ignore_not_found_hosts**: If the option is true, Hosts which file(or directory) is not found is skipped. (Means it's not included in resume target.) (boolean, default: false)
|
18
19
|
- **auth**: SSH authentication setting (hash, default: {})
|
19
20
|
- **user**: SSH username (string, default: execute user)
|
20
21
|
- **type**: public_key or password (string, default: public_key)
|
@@ -33,6 +34,7 @@ in:
|
|
33
34
|
# hosts_separator: ','
|
34
35
|
path: /some/path/20150414125923
|
35
36
|
# path_command: echo /some/path/`date "+%Y%m%d%H%M%S"`
|
37
|
+
ignore_not_found_hosts: true
|
36
38
|
auth:
|
37
39
|
user: {username}
|
38
40
|
type: public_key
|
data/build.gradle
CHANGED
Binary file
|
data/gradlew.bat
CHANGED
@@ -1,90 +1,90 @@
|
|
1
|
-
@if "%DEBUG%" == "" @echo off
|
2
|
-
@rem ##########################################################################
|
3
|
-
@rem
|
4
|
-
@rem Gradle startup script for Windows
|
5
|
-
@rem
|
6
|
-
@rem ##########################################################################
|
7
|
-
|
8
|
-
@rem Set local scope for the variables with windows NT shell
|
9
|
-
if "%OS%"=="Windows_NT" setlocal
|
10
|
-
|
11
|
-
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
12
|
-
set DEFAULT_JVM_OPTS=
|
13
|
-
|
14
|
-
set DIRNAME=%~dp0
|
15
|
-
if "%DIRNAME%" == "" set DIRNAME=.
|
16
|
-
set APP_BASE_NAME=%~n0
|
17
|
-
set APP_HOME=%DIRNAME%
|
18
|
-
|
19
|
-
@rem Find java.exe
|
20
|
-
if defined JAVA_HOME goto findJavaFromJavaHome
|
21
|
-
|
22
|
-
set JAVA_EXE=java.exe
|
23
|
-
%JAVA_EXE% -version >NUL 2>&1
|
24
|
-
if "%ERRORLEVEL%" == "0" goto init
|
25
|
-
|
26
|
-
echo.
|
27
|
-
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
28
|
-
echo.
|
29
|
-
echo Please set the JAVA_HOME variable in your environment to match the
|
30
|
-
echo location of your Java installation.
|
31
|
-
|
32
|
-
goto fail
|
33
|
-
|
34
|
-
:findJavaFromJavaHome
|
35
|
-
set JAVA_HOME=%JAVA_HOME:"=%
|
36
|
-
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
37
|
-
|
38
|
-
if exist "%JAVA_EXE%" goto init
|
39
|
-
|
40
|
-
echo.
|
41
|
-
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
42
|
-
echo.
|
43
|
-
echo Please set the JAVA_HOME variable in your environment to match the
|
44
|
-
echo location of your Java installation.
|
45
|
-
|
46
|
-
goto fail
|
47
|
-
|
48
|
-
:init
|
49
|
-
@rem Get command-line arguments, handling Windowz variants
|
50
|
-
|
51
|
-
if not "%OS%" == "Windows_NT" goto win9xME_args
|
52
|
-
if "%@eval[2+2]" == "4" goto 4NT_args
|
53
|
-
|
54
|
-
:win9xME_args
|
55
|
-
@rem Slurp the command line arguments.
|
56
|
-
set CMD_LINE_ARGS=
|
57
|
-
set _SKIP=2
|
58
|
-
|
59
|
-
:win9xME_args_slurp
|
60
|
-
if "x%~1" == "x" goto execute
|
61
|
-
|
62
|
-
set CMD_LINE_ARGS=%*
|
63
|
-
goto execute
|
64
|
-
|
65
|
-
:4NT_args
|
66
|
-
@rem Get arguments from the 4NT Shell from JP Software
|
67
|
-
set CMD_LINE_ARGS=%$
|
68
|
-
|
69
|
-
:execute
|
70
|
-
@rem Setup the command line
|
71
|
-
|
72
|
-
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
73
|
-
|
74
|
-
@rem Execute Gradle
|
75
|
-
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
76
|
-
|
77
|
-
:end
|
78
|
-
@rem End local scope for the variables with windows NT shell
|
79
|
-
if "%ERRORLEVEL%"=="0" goto mainEnd
|
80
|
-
|
81
|
-
:fail
|
82
|
-
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
83
|
-
rem the _cmd.exe /c_ return code!
|
84
|
-
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
85
|
-
exit /b 1
|
86
|
-
|
87
|
-
:mainEnd
|
88
|
-
if "%OS%"=="Windows_NT" endlocal
|
89
|
-
|
90
|
-
:omega
|
1
|
+
@if "%DEBUG%" == "" @echo off
|
2
|
+
@rem ##########################################################################
|
3
|
+
@rem
|
4
|
+
@rem Gradle startup script for Windows
|
5
|
+
@rem
|
6
|
+
@rem ##########################################################################
|
7
|
+
|
8
|
+
@rem Set local scope for the variables with windows NT shell
|
9
|
+
if "%OS%"=="Windows_NT" setlocal
|
10
|
+
|
11
|
+
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
12
|
+
set DEFAULT_JVM_OPTS=
|
13
|
+
|
14
|
+
set DIRNAME=%~dp0
|
15
|
+
if "%DIRNAME%" == "" set DIRNAME=.
|
16
|
+
set APP_BASE_NAME=%~n0
|
17
|
+
set APP_HOME=%DIRNAME%
|
18
|
+
|
19
|
+
@rem Find java.exe
|
20
|
+
if defined JAVA_HOME goto findJavaFromJavaHome
|
21
|
+
|
22
|
+
set JAVA_EXE=java.exe
|
23
|
+
%JAVA_EXE% -version >NUL 2>&1
|
24
|
+
if "%ERRORLEVEL%" == "0" goto init
|
25
|
+
|
26
|
+
echo.
|
27
|
+
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
28
|
+
echo.
|
29
|
+
echo Please set the JAVA_HOME variable in your environment to match the
|
30
|
+
echo location of your Java installation.
|
31
|
+
|
32
|
+
goto fail
|
33
|
+
|
34
|
+
:findJavaFromJavaHome
|
35
|
+
set JAVA_HOME=%JAVA_HOME:"=%
|
36
|
+
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
37
|
+
|
38
|
+
if exist "%JAVA_EXE%" goto init
|
39
|
+
|
40
|
+
echo.
|
41
|
+
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
42
|
+
echo.
|
43
|
+
echo Please set the JAVA_HOME variable in your environment to match the
|
44
|
+
echo location of your Java installation.
|
45
|
+
|
46
|
+
goto fail
|
47
|
+
|
48
|
+
:init
|
49
|
+
@rem Get command-line arguments, handling Windowz variants
|
50
|
+
|
51
|
+
if not "%OS%" == "Windows_NT" goto win9xME_args
|
52
|
+
if "%@eval[2+2]" == "4" goto 4NT_args
|
53
|
+
|
54
|
+
:win9xME_args
|
55
|
+
@rem Slurp the command line arguments.
|
56
|
+
set CMD_LINE_ARGS=
|
57
|
+
set _SKIP=2
|
58
|
+
|
59
|
+
:win9xME_args_slurp
|
60
|
+
if "x%~1" == "x" goto execute
|
61
|
+
|
62
|
+
set CMD_LINE_ARGS=%*
|
63
|
+
goto execute
|
64
|
+
|
65
|
+
:4NT_args
|
66
|
+
@rem Get arguments from the 4NT Shell from JP Software
|
67
|
+
set CMD_LINE_ARGS=%$
|
68
|
+
|
69
|
+
:execute
|
70
|
+
@rem Setup the command line
|
71
|
+
|
72
|
+
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
73
|
+
|
74
|
+
@rem Execute Gradle
|
75
|
+
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
76
|
+
|
77
|
+
:end
|
78
|
+
@rem End local scope for the variables with windows NT shell
|
79
|
+
if "%ERRORLEVEL%"=="0" goto mainEnd
|
80
|
+
|
81
|
+
:fail
|
82
|
+
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
83
|
+
rem the _cmd.exe /c_ return code!
|
84
|
+
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
85
|
+
exit /b 1
|
86
|
+
|
87
|
+
:mainEnd
|
88
|
+
if "%OS%"=="Windows_NT" endlocal
|
89
|
+
|
90
|
+
:omega
|
@@ -6,7 +6,6 @@ import java.io.ByteArrayOutputStream;
|
|
6
6
|
import java.io.IOException;
|
7
7
|
import java.io.InputStream;
|
8
8
|
import java.io.InputStreamReader;
|
9
|
-
import java.io.OutputStream;
|
10
9
|
import java.util.ArrayList;
|
11
10
|
import java.util.Arrays;
|
12
11
|
import java.util.Collections;
|
@@ -17,9 +16,6 @@ import com.fasterxml.jackson.annotation.JsonCreator;
|
|
17
16
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
18
17
|
import com.google.common.base.Optional;
|
19
18
|
import com.google.common.collect.ImmutableList;
|
20
|
-
import net.schmizz.sshj.SSHClient;
|
21
|
-
import net.schmizz.sshj.xfer.InMemoryDestFile;
|
22
|
-
import net.schmizz.sshj.xfer.LocalDestFile;
|
23
19
|
import org.embulk.config.CommitReport;
|
24
20
|
import org.embulk.config.Config;
|
25
21
|
import org.embulk.config.ConfigDefault;
|
@@ -28,6 +24,7 @@ import org.embulk.config.ConfigInject;
|
|
28
24
|
import org.embulk.config.ConfigSource;
|
29
25
|
import org.embulk.config.Task;
|
30
26
|
import org.embulk.config.TaskSource;
|
27
|
+
import org.embulk.input.remote.SSHClient;
|
31
28
|
import org.embulk.spi.BufferAllocator;
|
32
29
|
import org.embulk.spi.Exec;
|
33
30
|
import org.embulk.spi.FileInputPlugin;
|
@@ -65,6 +62,10 @@ public class RemoteFileInputPlugin
|
|
65
62
|
@ConfigDefault("{}")
|
66
63
|
public Map<String, String> getAuth();
|
67
64
|
|
65
|
+
@Config("ignore_not_found_hosts")
|
66
|
+
@ConfigDefault("false")
|
67
|
+
public boolean getIgnoreNotFoundHosts();
|
68
|
+
|
68
69
|
@Config("last_target")
|
69
70
|
@ConfigDefault("null")
|
70
71
|
public Optional<Target> getLastTarget();
|
@@ -84,19 +85,21 @@ public class RemoteFileInputPlugin
|
|
84
85
|
@Override
|
85
86
|
public ConfigDiff transaction(ConfigSource config, FileInputPlugin.Control control) {
|
86
87
|
PluginTask task = config.loadConfig(PluginTask.class);
|
88
|
+
try {
|
89
|
+
List<Target> targets = listTargets(task);
|
90
|
+
log.info("Loading targets {}", targets);
|
91
|
+
task.setTargets(targets);
|
92
|
+
|
93
|
+
// number of processors is same with number of targets
|
94
|
+
int taskCount = targets.size();
|
95
|
+
return resume(task.dump(), taskCount, control);
|
87
96
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
// number of processors is same with number of targets
|
93
|
-
int taskCount = targets.size();
|
94
|
-
return resume(task.dump(), taskCount, control);
|
97
|
+
} catch (IOException e) {
|
98
|
+
throw new RuntimeException(e);
|
99
|
+
}
|
95
100
|
}
|
96
101
|
|
97
|
-
private List<Target> listTargets(PluginTask task) {
|
98
|
-
task.getHostsCommand().orNull();
|
99
|
-
|
102
|
+
private List<Target> listTargets(PluginTask task) throws IOException {
|
100
103
|
final List<String> hosts = listHosts(task);
|
101
104
|
final String path = getPath(task);
|
102
105
|
|
@@ -104,7 +107,15 @@ public class RemoteFileInputPlugin
|
|
104
107
|
Target lastTarget = task.getLastTarget().orNull();
|
105
108
|
for (String host : hosts) {
|
106
109
|
Target target = new Target(host, path);
|
110
|
+
|
107
111
|
if (lastTarget == null || target.compareTo(lastTarget) > 0) {
|
112
|
+
if (task.getIgnoreNotFoundHosts()) {
|
113
|
+
// Check with file existing
|
114
|
+
if (!exists(target, task)) {
|
115
|
+
continue;
|
116
|
+
}
|
117
|
+
// This host will fail when "open" method is called.
|
118
|
+
}
|
108
119
|
builder.add(target);
|
109
120
|
}
|
110
121
|
}
|
@@ -182,7 +193,7 @@ public class RemoteFileInputPlugin
|
|
182
193
|
final Target target = task.getTargets().get(taskIndex);
|
183
194
|
|
184
195
|
try {
|
185
|
-
return new PluginFileInput(task, download(target, task
|
196
|
+
return new PluginFileInput(task, download(target, task));
|
186
197
|
} catch (IOException e) {
|
187
198
|
throw new RuntimeException(e);
|
188
199
|
}
|
@@ -227,55 +238,31 @@ public class RemoteFileInputPlugin
|
|
227
238
|
public CommitReport commit() {
|
228
239
|
return Exec.newCommitReport();
|
229
240
|
}
|
241
|
+
}
|
230
242
|
|
243
|
+
private boolean exists(Target target, PluginTask task) throws IOException {
|
244
|
+
try (SSHClient client = new SSHClient()) {
|
245
|
+
client.connect(target.getHost(), task.getAuth());
|
231
246
|
|
232
|
-
|
247
|
+
final String checkCmd = "ls " + target.getPath(); // TODO: windows
|
248
|
+
final int timeout = 5/* second */;
|
249
|
+
final SSHClient.CommandResult commandResult = client.execCommand(checkCmd, timeout);
|
233
250
|
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
InMemoryDestFileImpl memoryDestFile = new InMemoryDestFileImpl();
|
238
|
-
try {
|
239
|
-
client.connect(target.getHost());
|
240
|
-
final String type = auth.get("type") != null ? auth.get("type") : "public_key";
|
241
|
-
final String user = auth.get("user") != null ? auth.get("user") : System.getProperty("user.name");
|
242
|
-
|
243
|
-
if ("password".equals(type)) {
|
244
|
-
client.authPassword(user, auth.get("password"));
|
245
|
-
} else if ("public_key".equals(type)) {
|
246
|
-
final String key_path = auth.get("key_path");
|
247
|
-
if (key_path == null) {
|
248
|
-
client.authPublickey(user);
|
249
|
-
} else {
|
250
|
-
client.authPublickey(user, key_path);
|
251
|
-
}
|
251
|
+
if(commandResult.getStatus() != 0) {
|
252
|
+
log.warn("Remote file not found. {}", target.toString());
|
253
|
+
return false;
|
252
254
|
} else {
|
253
|
-
|
255
|
+
return true;
|
254
256
|
}
|
255
|
-
client.newSCPFileTransfer().download(target.getPath(), memoryDestFile);
|
256
|
-
return new ByteArrayInputStream(memoryDestFile.outputStream.toByteArray());
|
257
|
-
|
258
|
-
} finally {
|
259
|
-
client.disconnect();
|
260
257
|
}
|
261
258
|
}
|
262
259
|
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
}
|
270
|
-
|
271
|
-
@Override
|
272
|
-
public OutputStream getOutputStream() throws IOException {
|
273
|
-
return outputStream;
|
274
|
-
}
|
275
|
-
|
276
|
-
@Override
|
277
|
-
public LocalDestFile getTargetDirectory(String dirname) throws IOException {
|
278
|
-
return this;
|
260
|
+
private InputStream download(Target target, PluginTask task) throws IOException {
|
261
|
+
try (SSHClient client = new SSHClient()) {
|
262
|
+
client.connect(target.getHost(), task.getAuth());
|
263
|
+
final ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
264
|
+
client.scpDownload(target.getPath(), stream);
|
265
|
+
return new ByteArrayInputStream(stream.toByteArray());
|
279
266
|
}
|
280
267
|
}
|
281
268
|
|
@@ -0,0 +1,104 @@
|
|
1
|
+
package org.embulk.input.remote;
|
2
|
+
|
3
|
+
import net.schmizz.sshj.connection.channel.direct.Session;
|
4
|
+
import net.schmizz.sshj.xfer.InMemoryDestFile;
|
5
|
+
import net.schmizz.sshj.xfer.LocalDestFile;
|
6
|
+
|
7
|
+
import java.io.Closeable;
|
8
|
+
import java.io.IOException;
|
9
|
+
import java.io.InputStream;
|
10
|
+
import java.io.OutputStream;
|
11
|
+
import java.util.Map;
|
12
|
+
import java.util.concurrent.TimeUnit;
|
13
|
+
|
14
|
+
public class SSHClient implements Closeable {
|
15
|
+
|
16
|
+
private final net.schmizz.sshj.SSHClient client;
|
17
|
+
|
18
|
+
public SSHClient() {
|
19
|
+
this(new net.schmizz.sshj.SSHClient());
|
20
|
+
}
|
21
|
+
|
22
|
+
/* package for test */
|
23
|
+
SSHClient(net.schmizz.sshj.SSHClient client) {
|
24
|
+
this.client = client;
|
25
|
+
}
|
26
|
+
|
27
|
+
public void connect(String host, Map<String, String> authConfig) throws IOException {
|
28
|
+
client.loadKnownHosts();
|
29
|
+
|
30
|
+
client.connect(host);
|
31
|
+
|
32
|
+
final String type = authConfig.get("type") != null ? authConfig.get("type") : "public_key";
|
33
|
+
final String user = authConfig.get("user") != null ? authConfig.get("user") : System.getProperty("user.name");
|
34
|
+
|
35
|
+
if ("password".equals(type)) {
|
36
|
+
client.authPassword(user, authConfig.get("password"));
|
37
|
+
} else if ("public_key".equals(type)) {
|
38
|
+
final String key_path = authConfig.get("key_path");
|
39
|
+
if (key_path == null) {
|
40
|
+
client.authPublickey(user);
|
41
|
+
} else {
|
42
|
+
client.authPublickey(user, key_path);
|
43
|
+
}
|
44
|
+
} else {
|
45
|
+
throw new UnsupportedOperationException("Unsupported auth type : " + type);
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
public CommandResult execCommand(String command, int timeoutSecond) throws IOException {
|
50
|
+
try (final Session session = client.startSession()) {
|
51
|
+
final Session.Command cmd = session.exec(command);
|
52
|
+
cmd.join(timeoutSecond, TimeUnit.SECONDS);
|
53
|
+
return new CommandResult(cmd.getExitStatus(), cmd.getInputStream());
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
public void scpDownload(String path, OutputStream stream) throws IOException {
|
58
|
+
client.newSCPFileTransfer().download(path, new InMemoryDestFileImpl(stream));
|
59
|
+
}
|
60
|
+
|
61
|
+
private static class InMemoryDestFileImpl extends InMemoryDestFile {
|
62
|
+
|
63
|
+
private OutputStream outputStream;
|
64
|
+
|
65
|
+
public InMemoryDestFileImpl(OutputStream outputStream) {
|
66
|
+
this.outputStream = outputStream;
|
67
|
+
}
|
68
|
+
|
69
|
+
@Override
|
70
|
+
public OutputStream getOutputStream() throws IOException {
|
71
|
+
return outputStream;
|
72
|
+
}
|
73
|
+
|
74
|
+
@Override
|
75
|
+
public LocalDestFile getTargetDirectory(String dirname) throws IOException {
|
76
|
+
return this;
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
@Override
|
81
|
+
public void close() throws IOException {
|
82
|
+
if (client != null) {
|
83
|
+
client.close();
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
public static class CommandResult {
|
88
|
+
int status;
|
89
|
+
InputStream stdout;
|
90
|
+
|
91
|
+
private CommandResult(int status, InputStream stdout) {
|
92
|
+
this.status = status;
|
93
|
+
this.stdout = stdout;
|
94
|
+
}
|
95
|
+
|
96
|
+
public int getStatus() {
|
97
|
+
return status;
|
98
|
+
}
|
99
|
+
|
100
|
+
public InputStream getStdout() {
|
101
|
+
return stdout;
|
102
|
+
}
|
103
|
+
}
|
104
|
+
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embulk-input-remote
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shinichi ISHIMURA
|
@@ -55,10 +55,11 @@ files:
|
|
55
55
|
- gradlew.bat
|
56
56
|
- lib/embulk/input/remote.rb
|
57
57
|
- src/main/java/org/embulk/input/RemoteFileInputPlugin.java
|
58
|
+
- src/main/java/org/embulk/input/remote/SSHClient.java
|
58
59
|
- src/test/java/org/embulk/input/TestRemoteFileInputPlugin.java
|
59
60
|
- classpath/bcpkix-jdk15on-1.51.jar
|
60
61
|
- classpath/bcprov-jdk15on-1.51.jar
|
61
|
-
- classpath/embulk-input-remote-0.1.
|
62
|
+
- classpath/embulk-input-remote-0.1.2.jar
|
62
63
|
- classpath/jzlib-1.1.3.jar
|
63
64
|
- classpath/sshj-0.11.0.jar
|
64
65
|
homepage: https://github.com/kamatama41/embulk-input-remote
|
Binary file
|