jenkins_shell 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/jsh +136 -0
- data/lib/jenkins_shell.rb +52 -0
- data/lib/jenkins_shell/wish/cd_wish.rb +29 -0
- data/lib/jenkins_shell/wish/cmd_wish.rb +24 -0
- data/lib/jenkins_shell/wish/ls_wish.rb +22 -0
- data/lib/jenkins_shell/wish/pwd_wish.rb +24 -0
- metadata +111 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 62684f8fbf197dfe7f84b10e6f1360da5bf35ab0eb27007c8b13a6e284441679
|
4
|
+
data.tar.gz: 6dbcab48ec5d32b1c1a84c50c96f242cc40d7b7197a507f4e693be51e63f3eb4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a1ee32220ec85235db0fd0c0e0251d66afc9dcf1b3d6a6882653b0811586c3c4590bef39bc3d1ae0fc2765176a0861f4ba7c236704d82a386de01d2ac861e86c
|
7
|
+
data.tar.gz: d6ef8f8919d86791d3c1ffe7e393fe1e9df2c68629e04f9e41d42ab08788ccee98ad776d1694fb967f928e1d16699de72f087b749333a08ccddad3c16f33d28d
|
data/bin/jsh
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "djinni"
|
4
|
+
require "hilighter"
|
5
|
+
require "io/wait"
|
6
|
+
require "jenkins_shell"
|
7
|
+
require "optparse"
|
8
|
+
|
9
|
+
class JShExit
|
10
|
+
GOOD = 0
|
11
|
+
INVALID_OPTION = 1
|
12
|
+
INVALID_ARGUMENT = 2
|
13
|
+
MISSING_ARGUMENT = 3
|
14
|
+
EXTRA_ARGUMENTS = 4
|
15
|
+
EXCEPTION = 5
|
16
|
+
AMBIGUOUS_ARGUMENT = 6
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse(args)
|
20
|
+
options = Hash.new
|
21
|
+
options["port"] = "8080"
|
22
|
+
options["verbose"] = false
|
23
|
+
|
24
|
+
info = "Simulate a cmd prompt using Jenkins script functionality"
|
25
|
+
|
26
|
+
parser = OptionParser.new do |opts|
|
27
|
+
opts.summary_width = 16
|
28
|
+
|
29
|
+
opts.banner = "Usage: #{File.basename($0)} [OPTIONS] <host>"
|
30
|
+
|
31
|
+
opts.on("")
|
32
|
+
|
33
|
+
info.scan(/\S.{0,80}\S(?=\s|$)|\S+/).each do |line|
|
34
|
+
opts.on("#{line}")
|
35
|
+
end
|
36
|
+
|
37
|
+
opts.on("", "OPTIONS")
|
38
|
+
|
39
|
+
opts.on("-h", "--help", "Display this help message") do
|
40
|
+
puts opts
|
41
|
+
exit JShExit::GOOD
|
42
|
+
end
|
43
|
+
|
44
|
+
opts.on("--nocolor", "Disable colorized output") do
|
45
|
+
Hilighter.disable
|
46
|
+
end
|
47
|
+
|
48
|
+
opts.on(
|
49
|
+
"-p",
|
50
|
+
"--port=PORT",
|
51
|
+
"Use specified port (default: #{options["port"]})"
|
52
|
+
) do |port|
|
53
|
+
options["port"] = port
|
54
|
+
end
|
55
|
+
|
56
|
+
opts.on(
|
57
|
+
"-v",
|
58
|
+
"--verbose",
|
59
|
+
"Show backtrace when error occurs"
|
60
|
+
) do
|
61
|
+
options["verbose"] = true
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
begin
|
66
|
+
parser.parse!(args)
|
67
|
+
rescue OptionParser::InvalidOption => e
|
68
|
+
puts e.message
|
69
|
+
puts parser
|
70
|
+
exit JShExit::INVALID_OPTION
|
71
|
+
rescue OptionParser::InvalidArgument => e
|
72
|
+
puts e.message
|
73
|
+
puts parser
|
74
|
+
exit JShExit::INVALID_ARGUMENT
|
75
|
+
rescue OptionParser::MissingArgument => e
|
76
|
+
puts e.message
|
77
|
+
puts parser
|
78
|
+
exit JShExit::MISSING_ARGUMENT
|
79
|
+
rescue OptionParser::AmbiguousOption => e
|
80
|
+
puts e.message
|
81
|
+
puts parser
|
82
|
+
exit JShExit::AMBIGUOUS_ARGUMENT
|
83
|
+
end
|
84
|
+
|
85
|
+
if (args.empty?)
|
86
|
+
puts parser
|
87
|
+
exit JShExit::MISSING_ARGUMENT
|
88
|
+
elsif (args.length == 1)
|
89
|
+
options["host"] = args[0]
|
90
|
+
else
|
91
|
+
puts parser
|
92
|
+
exit JShExit::EXTRA_ARGUMENTS
|
93
|
+
end
|
94
|
+
|
95
|
+
return options
|
96
|
+
end
|
97
|
+
|
98
|
+
options = parse(ARGV)
|
99
|
+
|
100
|
+
begin
|
101
|
+
jsh = JenkinsShell.new(options["host"], options["port"])
|
102
|
+
|
103
|
+
djinni = Djinni.new
|
104
|
+
djinni.fallback = "cmd"
|
105
|
+
djinni.load_wishes(
|
106
|
+
"#{File.dirname(__FILE__)}/../lib/jenkins_shell/wish"
|
107
|
+
)
|
108
|
+
djinni.prompt({"jsh" => jsh}, "#{jsh.pwd}> ".light_white)
|
109
|
+
rescue SystemExit
|
110
|
+
# Quite from djinni
|
111
|
+
# Exit gracefully
|
112
|
+
rescue Interrupt
|
113
|
+
# ^C
|
114
|
+
# Exit gracefully
|
115
|
+
rescue Errno::EPIPE
|
116
|
+
# Do nothing. This can happen if piping to another program such as
|
117
|
+
# less. Usually if less is closed before we're done with STDOUT.
|
118
|
+
rescue Exception => e
|
119
|
+
$stderr.puts "Oops! Looks like an error has occured! If the " \
|
120
|
+
"error persists, file a bug at:".wrap
|
121
|
+
$stderr.puts
|
122
|
+
$stderr.puts " https://gitlab.com/mjwhitta/todo/issues"
|
123
|
+
$stderr.puts
|
124
|
+
$stderr.puts "Maybe the message below will help. If not, you " \
|
125
|
+
"can use the --verbose flag to get a backtrace.".wrap
|
126
|
+
$stderr.puts
|
127
|
+
|
128
|
+
$stderr.puts e.message.white.on_red
|
129
|
+
if (options["verbose"])
|
130
|
+
e.backtrace.each do |line|
|
131
|
+
$stderr.puts line.light_yellow
|
132
|
+
end
|
133
|
+
end
|
134
|
+
exit JShExit::EXCEPTION
|
135
|
+
end
|
136
|
+
exit JShExit::GOOD
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "net/http"
|
2
|
+
require "rexml/document"
|
3
|
+
require "uri"
|
4
|
+
|
5
|
+
class JenkinsShell
|
6
|
+
attr_reader :cwd
|
7
|
+
attr_reader :host
|
8
|
+
attr_reader :port
|
9
|
+
|
10
|
+
def cd(dir = nil)
|
11
|
+
return true if (dir.nil? || dir.empty?)
|
12
|
+
|
13
|
+
new_cwd = pwd("#{@int_cwd}/#{dir}")
|
14
|
+
|
15
|
+
return false if (new_cwd.empty? || (new_cwd == @cwd))
|
16
|
+
|
17
|
+
@cwd = new_cwd
|
18
|
+
@int_cwd = "#{@int_cwd}/#{dir}".gsub(%r{[^/]+/\.\.}, "")
|
19
|
+
|
20
|
+
return true
|
21
|
+
end
|
22
|
+
|
23
|
+
def command(cmd, dir = @int_cwd)
|
24
|
+
# Create and encode Groovy script
|
25
|
+
fix = dir.gsub(/\\/, "\\\\\\")
|
26
|
+
gs = "println(\"cmd /c cd #{fix} && #{cmd}\".execute().text)"
|
27
|
+
enc = URI::encode(URI::encode(gs), "&()/").gsub("%20", "+")
|
28
|
+
|
29
|
+
# Establish connection and send script
|
30
|
+
http = Net::HTTP.new(@host, @port)
|
31
|
+
xml = REXML::Document.new(
|
32
|
+
http.post("/script", "script=#{enc}").body
|
33
|
+
)
|
34
|
+
|
35
|
+
# Parse response and return script output
|
36
|
+
return xml.get_elements("html/body/div/div/pre")[1].text
|
37
|
+
end
|
38
|
+
|
39
|
+
def initialize(host, port = 8080)
|
40
|
+
@int_cwd = "."
|
41
|
+
@host = host.gsub(/^https?:\/\/|(:[0-9]+)?\/.+/, "")
|
42
|
+
@port = port
|
43
|
+
@cwd = pwd
|
44
|
+
end
|
45
|
+
|
46
|
+
def pwd(dir = @int_cwd)
|
47
|
+
command("dir", dir).match(/^\s+Directory of (.+)/) do |m|
|
48
|
+
return m[1]
|
49
|
+
end
|
50
|
+
return ""
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "djinni"
|
2
|
+
require "hilighter"
|
3
|
+
|
4
|
+
class CDWish < Djinni::Wish
|
5
|
+
def aliases
|
6
|
+
return ["cd"]
|
7
|
+
end
|
8
|
+
|
9
|
+
def description
|
10
|
+
return "Change to new directory"
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute(args, djinni_env = Hash.new)
|
14
|
+
usage if (args.empty?)
|
15
|
+
|
16
|
+
jsh = djinni_env["jsh"]
|
17
|
+
if (!jsh.cd(args))
|
18
|
+
puts "Directory not found"
|
19
|
+
return
|
20
|
+
end
|
21
|
+
|
22
|
+
djinni_env["djinni_prompt"] = "#{jsh.cwd}> ".light_white
|
23
|
+
end
|
24
|
+
|
25
|
+
def usage
|
26
|
+
puts "#{aliases.join(", ")} <directory>"
|
27
|
+
puts " #{description}."
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "djinni"
|
2
|
+
|
3
|
+
class CmdWish < Djinni::Wish
|
4
|
+
def aliases
|
5
|
+
return ["cmd"]
|
6
|
+
end
|
7
|
+
|
8
|
+
def description
|
9
|
+
return "Run command as if in cmd (default behavior)"
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute(args, djinni_env = Hash.new)
|
13
|
+
usage if (args.empty?)
|
14
|
+
|
15
|
+
jsh = djinni_env["jsh"]
|
16
|
+
puts jsh.command(args)
|
17
|
+
djinni_env["djinni_prompt"] = "#{jsh.cwd}> ".light_white
|
18
|
+
end
|
19
|
+
|
20
|
+
def usage
|
21
|
+
puts "#{aliases.join(", ")} <commands>"
|
22
|
+
puts " #{description}."
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "djinni"
|
2
|
+
|
3
|
+
class LSWish < Djinni::Wish
|
4
|
+
def aliases
|
5
|
+
return ["ls", "dir"]
|
6
|
+
end
|
7
|
+
|
8
|
+
def description
|
9
|
+
return "List directory contents"
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute(args, djinni_env = Hash.new)
|
13
|
+
jsh = djinni_env["jsh"]
|
14
|
+
puts jsh.command("dir #{args}")
|
15
|
+
djinni_env["djinni_prompt"] = "#{jsh.cwd}> ".light_white
|
16
|
+
end
|
17
|
+
|
18
|
+
def usage
|
19
|
+
puts "#{aliases.join(", ")} [directory]"
|
20
|
+
puts " #{description}."
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "djinni"
|
2
|
+
|
3
|
+
class PwdWish < Djinni::Wish
|
4
|
+
def aliases
|
5
|
+
return ["pwd"]
|
6
|
+
end
|
7
|
+
|
8
|
+
def description
|
9
|
+
return "Show path of current path"
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute(args, djinni_env = Hash.new)
|
13
|
+
usage if (!args.empty?)
|
14
|
+
|
15
|
+
jsh = djinni_env["jsh"]
|
16
|
+
puts jsh.cwd if (args.empty?)
|
17
|
+
djinni_env["djinni_prompt"] = "#{jsh.cwd}> ".light_white
|
18
|
+
end
|
19
|
+
|
20
|
+
def usage
|
21
|
+
puts aliases.join(", ")
|
22
|
+
puts " #{description}."
|
23
|
+
end
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jenkins_shell
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Miles Whittaker
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-03-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '12.3'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 12.3.0
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '12.3'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 12.3.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: djinni
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '2.2'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 2.2.0
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '2.2'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 2.2.0
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: hilighter
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '1.2'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 1.2.1
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '1.2'
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 1.2.1
|
73
|
+
description: This gem will use the scripting functionality of Jenkins to simulate
|
74
|
+
a Windows cmd prompt.
|
75
|
+
email: mjwhitta@gmail.com
|
76
|
+
executables:
|
77
|
+
- jsh
|
78
|
+
extensions: []
|
79
|
+
extra_rdoc_files: []
|
80
|
+
files:
|
81
|
+
- bin/jsh
|
82
|
+
- lib/jenkins_shell.rb
|
83
|
+
- lib/jenkins_shell/wish/cd_wish.rb
|
84
|
+
- lib/jenkins_shell/wish/cmd_wish.rb
|
85
|
+
- lib/jenkins_shell/wish/ls_wish.rb
|
86
|
+
- lib/jenkins_shell/wish/pwd_wish.rb
|
87
|
+
homepage: https://mjwhitta.github.io/jenkins_shell
|
88
|
+
licenses:
|
89
|
+
- GPL-3.0
|
90
|
+
metadata: {}
|
91
|
+
post_install_message:
|
92
|
+
rdoc_options: []
|
93
|
+
require_paths:
|
94
|
+
- lib
|
95
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
requirements: []
|
106
|
+
rubyforge_project:
|
107
|
+
rubygems_version: 2.7.6
|
108
|
+
signing_key:
|
109
|
+
specification_version: 4
|
110
|
+
summary: Simulate a cmd prompt using Jenkins.
|
111
|
+
test_files: []
|