cli_tool 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -13,12 +13,13 @@ module CliTool
13
13
  attr_accessor :environment
14
14
  attr_accessor :indent
15
15
 
16
- def initialize
17
- @environment = {}
16
+ def initialize(indent = 2, opts = {})
17
+ @environment = opts[:environment] || {}
18
18
  @commands = []
19
19
  @apt = {}
20
20
  @remote_installed = 0
21
- @indent = 0
21
+ @indent = indent
22
+ @sudo = opts[:sudo] || false
22
23
  end
23
24
  alias reset initialize
24
25
 
@@ -106,15 +107,31 @@ module CliTool
106
107
  if?((exist ? '' : '! ') + %{-f "#{file}"}, &block)
107
108
  end
108
109
 
109
- def directory_exist(directory, exist = true, &block)
110
- if?((exist ? '' : '! ') + %{-d "#{file}"}, &block)
110
+ def directory_exist?(directory, exist = true, &block)
111
+ if?((exist ? '' : '! ') + %{-d "#{directory}"}, &block)
112
+ end
113
+
114
+ def for_in(value, source, &block)
115
+ for_script = "for #{value} in #{source}\n#{"\t" * (@indent + 2)}do\n\n"
116
+ for_script << Script.new(@indent + 2, environment: @environment).__send__(:instance_exec, &block).to_s(env: false)
117
+ for_script << "\n#{"\t" * @indent}done"
118
+ @commands << for_script << ''
119
+ self
120
+ end
121
+
122
+ def if?(condition, &block)
123
+ if_script = "if [ #{condition} ]\n#{"\t" * (@indent + 2)}then\n\n"
124
+ if_script << Script.new(@indent + 2, environment: @environment).__send__(:instance_exec, &block).to_s(env: false)
125
+ if_script << "\n#{"\t" * @indent}fi"
126
+ @commands << if_script << ''
127
+ self
111
128
  end
112
129
 
113
130
  ##########
114
131
  #= Exec =#
115
132
  ##########
116
133
 
117
- def exec(script, sudo = false, sudouser = :root)
134
+ def exec(script, use_sudo = false, sudo_user = :root)
118
135
  if File.exist?(script)
119
136
  script = File.read(script)
120
137
  end
@@ -126,19 +143,44 @@ module CliTool
126
143
  script = script.map { |x| x.gsub(/#{indents}/, '') }.join("\n")
127
144
  end
128
145
 
129
- # Wrap the script in a sudoers block
130
- if sudo || sudo == :sudo
131
- sudo_script = %{sudo su -c "/bin/bash" #{sudouser || :root}}
132
- sudo_script << %{ <<-EOF\n#{get_environment_exports}#{script.rstrip}\nEOF}
133
- script = sudo_script
146
+ # Use sudo if requested
147
+ if use_sudo && ! @sudo
148
+ return sudo(sudo_user) do
149
+ exec(script)
150
+ end
134
151
  end
135
152
 
136
- @commands << script.rstrip.gsub('$', '\$')
153
+ @commands << script.rstrip
154
+ self
155
+ end
156
+
157
+ def sudo(user = :root, &block)
158
+ sudo_script = %{sudo su -c "/bin/bash -i -s --" #{user} <<-SCRIPT\n}
159
+ sudo_script << Script.new(@indent + 2, sudo: true, environment: @environment).__send__(:instance_exec, &block).to_s(heredoc: true)
160
+ sudo_script << "\n#{"\t" * @indent}SCRIPT"
161
+ @commands << sudo_script << ''
137
162
  self
138
163
  end
139
164
 
140
- def to_s(indent = 0)
141
- @commands.reduce([get_environment_exports(@indent)]){ |out, x| out << ((' ' * @indent) + x) }.join("\n")
165
+ def to_s(opts = {})
166
+ env = opts[:env] == false ? [] : (get_environment_exports << '')
167
+ result = env.concat(@commands).map! do |line|
168
+ ("\t" * @indent) + line
169
+ end
170
+
171
+ # Join the commands
172
+ result = result.join("\n")
173
+
174
+ if @indent < 3
175
+ result = result.gsub('$', '\$')
176
+ result << "\n"
177
+ end
178
+
179
+ if opts[:heredoc] == true
180
+ result = result.gsub('$', '\\\\\$')
181
+ end
182
+
183
+ result
142
184
  end
143
185
 
144
186
  private
@@ -163,15 +205,10 @@ module CliTool
163
205
  self
164
206
  end
165
207
 
166
- def if?(condition, &block)
167
- exec(%{if [ #{condition} ]; then\n"} << Script.new.__send__(:instance_exec, &block).to_s(@indent + 2) << "\nfi")
168
- self
169
- end
170
-
171
- def get_environment_exports(indent = 0)
172
- @environment.reduce([]) { |out, (key, val)|
173
- out << %{export #{(' ' * indent)}#{key.upcase}=#{val}}
174
- }.join("\n") << "\n"
208
+ def get_environment_exports
209
+ @environment.reduce([]) do |out, (key, val)|
210
+ out << "export #{key.upcase}=#{val}"
211
+ end
175
212
  end
176
213
  end
177
214
 
@@ -294,15 +331,16 @@ module CliTool
294
331
  end
295
332
 
296
333
  def remote_exec!(script)
297
- ssh_cmd =[ 'ssh -t -t' ]
334
+ ssh_cmd =[ 'ssh' ]
298
335
  ssh_cmd << "-i #{@identity}" if @identity
299
336
  ssh_cmd << "-p #{@port}" if @port
300
337
  ssh_cmd << "#{@username}@#{@host}"
301
- ssh_cmd << "/bin/bash -s"
338
+ ssh_cmd << "/bin/bash -i -s --"
339
+ ssh_cmd << "<<-EOF\n#{script}\nexit;\nEOF"
302
340
 
303
341
  # Show debug script
304
342
  if self.debug
305
- pretty_cmd = ssh_cmd.concat(["<<-SCRIPT\n#{script}\nexit;\nSCRIPT"]).join(' ')
343
+ pretty_cmd = ssh_cmd.join(' ')
306
344
  message = "About to run remote process over ssh on #{@username}@#{@host}:#{@port}"
307
345
  puts message, :blue
308
346
  puts '#' * message.length, :blue
@@ -313,10 +351,6 @@ module CliTool
313
351
  sleep 2
314
352
  end
315
353
 
316
- #ssh_cmd << %{"#{script.gsub(/"/, '\\\1')}"}
317
- ssh_cmd << "<<-SCRIPT\n#{script}\nexit;\nSCRIPT"
318
- ssh_cmd << %{| grep -v 'stdin: is not a tty'}
319
-
320
354
  puts "Running Script", [:blue, :italic]
321
355
 
322
356
  # Run command if a connection is available
@@ -1,3 +1,3 @@
1
1
  module CliTool
2
- VERSION = "0.1.5"
2
+ VERSION = "0.1.6"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cli_tool
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-02-27 00:00:00.000000000 Z
12
+ date: 2014-02-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler