jenkins_shell 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []