escualo 1.0.3 → 2.0.0

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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/bin/escualo +5 -7
  3. data/lib/command.rb +6 -7
  4. data/lib/commands/artifact.rb +47 -79
  5. data/lib/commands/bootstrap.rb +30 -25
  6. data/lib/commands/deploy.rb +8 -6
  7. data/lib/commands/env.rb +12 -9
  8. data/lib/commands/globals.rb +7 -36
  9. data/lib/commands/plugin.rb +9 -19
  10. data/lib/commands/rake.rb +3 -5
  11. data/lib/commands/remote.rb +6 -5
  12. data/lib/commands/script.rb +6 -25
  13. data/lib/commands/upload.rb +2 -2
  14. data/lib/escualo/apt_get.rb +10 -0
  15. data/lib/escualo/artifact.rb +40 -43
  16. data/lib/escualo/base.rb +36 -15
  17. data/lib/escualo/env.rb +22 -32
  18. data/lib/escualo/gems.rb +4 -4
  19. data/lib/escualo/plugin/docker.rb +4 -4
  20. data/lib/escualo/plugin/haskell.rb +4 -4
  21. data/lib/escualo/plugin/mongo.rb +6 -10
  22. data/lib/escualo/plugin/monit.rb +16 -17
  23. data/lib/escualo/plugin/nginx.rb +7 -10
  24. data/lib/escualo/plugin/node.rb +6 -8
  25. data/lib/escualo/plugin/postgres.rb +26 -0
  26. data/lib/escualo/plugin/rabbit.rb +9 -14
  27. data/lib/escualo/plugin.rb +1 -6
  28. data/lib/escualo/remote.rb +18 -20
  29. data/lib/escualo/ruby.rb +17 -0
  30. data/lib/escualo/script.rb +7 -61
  31. data/lib/escualo/session/docker_session.rb +56 -0
  32. data/lib/escualo/session/local_session.rb +23 -0
  33. data/lib/escualo/session/remote_session.rb +42 -0
  34. data/lib/escualo/session.rb +83 -0
  35. data/lib/escualo/version.rb +2 -2
  36. data/lib/escualo.rb +13 -1
  37. data/lib/ssh.rb +26 -4
  38. data/lib/templates/codechange.sh.erb +1 -1
  39. data/lib/templates/init.sh.erb +7 -0
  40. data/lib/templates/post-receive.sh.erb +8 -2
  41. metadata +9 -9
  42. data/lib/commands/base.rb +0 -8
  43. data/lib/escualo/bootstrap.rb +0 -37
  44. data/lib/escualo/plugin/postgre.rb +0 -23
  45. data/lib/ssh/local_session.rb +0 -44
  46. data/lib/ssh/perform.rb +0 -9
  47. data/lib/ssh/session.rb +0 -61
  48. data/lib/ssh/upload.rb +0 -9
@@ -1,77 +1,23 @@
1
1
  module Escualo
2
2
  module Script
3
- def self.each_command(script, extra='', &block)
4
- script.map { |it| "escualo #{it} #{extra}" }.each(&block) if script
3
+ def self.commands(escualo, script, extra)
4
+ (script||[]).map { |it| "#{escualo} #{it} #{extra}" }
5
5
  end
6
6
 
7
7
  def self.delegated_options(options)
8
8
  [options.hostname.try { |it| "--hostname #{it}" },
9
9
  options.username.try { |it| "--username #{it}" },
10
- options.password.try { |it| "--password #{it}" },
10
+ options.password.try { |it| "--ssh-password #{it}" },
11
11
  options.ssh_key.try { |it| "--ssh-key #{it}" },
12
12
  options.ssh_port.try { |it| "--ssh-port #{it}" },
13
13
  options.trace && '--trace',
14
- options.verbose && '--verbose'
14
+ options.verbose && '--verbose',
15
15
  ].compact.join(' ')
16
16
  end
17
17
 
18
- class Mode
19
- def run_commands_for!(script, extra='', ssh, options)
20
- Escualo::Script.each_command script, extra do |command|
21
- run_command! command, ssh, options
22
- end
23
- end
24
- end
25
-
26
- class Standard < Mode
27
- def start!(*)
28
- end
29
-
30
- def run_command!(command, ssh, options)
31
- ssh.shell.perform! command, options
32
- end
33
-
34
- def finish!
35
- end
36
- end
37
-
38
- class Dockerized < Mode
39
- attr_accessor :dockerfile
40
-
41
- def start!(options)
42
- @dockerfile = "
43
- FROM #{base_image options}
44
- MAINTAINER #{ENV['USER']}
45
- RUN apt-get update && apt-get install ruby ruby-dev build-essential -y
46
- #{escualo_install options}"
47
- end
48
-
49
- def escualo_install(options)
50
- if options.development
51
- "
52
- COPY escualo-#{Escualo::VERSION}.gem escualo-#{Escualo::VERSION}.gem
53
- RUN gem install escualo-#{Escualo::VERSION}.gem\n"
54
- else
55
- "RUN gem install escualo -v #{Escualo::VERSION}\n"
56
- end
57
- end
58
-
59
- def base_image(options)
60
- if options.base_image == 'ubuntu'
61
- 'ubuntu:xenial'
62
- elsif options.base_image == 'debian'
63
- 'debian:jessie'
64
- else
65
- raise "Unsupported base image #{options.base_image}. Only debian and ubuntu are supported"
66
- end
67
- end
68
-
69
- def run_command!(command, ssh, options)
70
- @dockerfile << "RUN #{command}\n"
71
- end
72
-
73
- def finish!
74
- File.write('Dockerfile', @dockerfile)
18
+ def self.run!(session, escualo, script, extra='')
19
+ Escualo::Script.commands(escualo, script, extra).each do |command|
20
+ session.embed! command
75
21
  end
76
22
  end
77
23
  end
@@ -0,0 +1,56 @@
1
+ class Escualo::Session::Docker < Escualo::Session
2
+ attr_accessor :dockerfile
3
+
4
+ def embed!(command)
5
+ dockerfile << Open3.exec!("#{command} --dockerized")
6
+ end
7
+
8
+ def tell!(command)
9
+ dockerfile << "RUN #{command}\n"
10
+ end
11
+
12
+ def upload!(file, destination)
13
+ dockerfile << "COPY #{file} #{destination}\n"
14
+ end
15
+
16
+ def write_template!(name, template, &block)
17
+ template.write! name
18
+ block.call name
19
+ end
20
+
21
+ def ask(*)
22
+ raise 'can not ask on a docker session'
23
+ end
24
+
25
+ def start!(options)
26
+ if options.write_dockerfile
27
+ @dockerfile = "FROM #{base_image options}\nMAINTAINER #{ENV['USER']}\n"
28
+ else
29
+ @dockerfile = ''
30
+ end
31
+ end
32
+
33
+ def base_image(options)
34
+ if options.base_image == 'ubuntu'
35
+ 'ubuntu:xenial'
36
+ elsif options.base_image == 'debian'
37
+ 'debian:jessie'
38
+ else
39
+ raise "Unsupported base image #{options.base_image}. Only debian and ubuntu are supported"
40
+ end
41
+ end
42
+
43
+ def finish!(options)
44
+ if options.write_dockerfile
45
+ File.write('Dockerfile', dockerfile)
46
+ else
47
+ puts dockerfile
48
+ end
49
+ end
50
+
51
+ def self.started(options = struct)
52
+ new.tap do |it|
53
+ it.start!(options)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,23 @@
1
+ class Escualo::Session::Local < Escualo::Session
2
+ def exec!(command)
3
+ ask command
4
+ nil
5
+ end
6
+
7
+ def ask(command)
8
+ Open3.exec! command
9
+ end
10
+
11
+ def stream!(command)
12
+ Open3.popen2e command do |_input, output, wait|
13
+ output.each do |line|
14
+ $stdout.print line
15
+ end
16
+ raise "command #{command} failed" unless wait.value.success?
17
+ end
18
+ end
19
+
20
+ def upload!(file, destination)
21
+ FileUtils.cp file, destination
22
+ end
23
+ end
@@ -0,0 +1,42 @@
1
+ class Escualo::Session::Remote < Escualo::Session
2
+ def initialize(ssh, options)
3
+ super(options)
4
+ @ssh = ssh
5
+ end
6
+
7
+ def upload!(file, destination)
8
+ @ssh.scp.upload! file, destination
9
+ end
10
+
11
+ def exec!(command)
12
+ ask command
13
+ nil
14
+ end
15
+
16
+ def ask(command)
17
+ out = []
18
+ @ssh.stream! wrap(command) do |_stream, data|
19
+ out << data
20
+ end
21
+ out
22
+ end
23
+
24
+ def stream!(command)
25
+ command = wrap(command)
26
+ @ssh.stream! command do |stream, data|
27
+ if stream == :stdout
28
+ $stdout.print data
29
+ else
30
+ $stderr.print data
31
+ end
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def wrap(command)
38
+ "bash -i -s <<EOBASH
39
+ #{command.gsub('$', '\$')}
40
+ EOBASH"
41
+ end
42
+ end
@@ -0,0 +1,83 @@
1
+ require 'fileutils'
2
+
3
+ class Escualo::Session
4
+ attr_accessor :options
5
+
6
+ def initialize(options=struct)
7
+ @options = options
8
+ end
9
+
10
+ def check?(command, include)
11
+ ask(command).include? include rescue false
12
+ end
13
+
14
+ def embed!(command)
15
+ tell! command
16
+ end
17
+
18
+ def tell_all!(*commands)
19
+ tell! commands.compact.join(' && ')
20
+ end
21
+
22
+ def tell!(command)
23
+ if options.verbose
24
+ stream! command
25
+ else
26
+ exec! command
27
+ end
28
+ end
29
+
30
+ def upload_template!(destination, name, bindings)
31
+ write_template! name, Mumukit::Core::Template.new(File.join(__dir__, '..', 'templates', "#{name}.erb"), bindings) do |file|
32
+ upload! file, destination
33
+ end
34
+ end
35
+
36
+ def write_template!(name, template, &block)
37
+ template.with_tempfile!('template', &block)
38
+ end
39
+
40
+ def self.parse_session_options(options)
41
+ struct username: options.username || 'root',
42
+ hostname: options.hostname || 'localhost',
43
+ ssh_options: {
44
+ keys: [options.ssh_key].compact,
45
+ port: options.ssh_port || 22
46
+ },
47
+ verbose: options.verbose,
48
+ local: options.hostname.blank? && options.username.blank? && options.ssh_key.blank? && options.ssh_port.blank?,
49
+ dockerized: options.dockerized
50
+ end
51
+
52
+ def self.within(options, force_local=false, &block)
53
+ session_options = parse_session_options options
54
+
55
+ if session_options.dockerized
56
+ within_dockerized_session session_options, options, &block
57
+ elsif session_options.local || force_local
58
+ block.call(Escualo::Session::Local.new session_options)
59
+ else
60
+ within_ssh_session(session_options, &block)
61
+ end
62
+ end
63
+
64
+ def self.within_dockerized_session(session_options, options, &block)
65
+ session = Escualo::Session::Docker.new session_options
66
+ session.start! options
67
+ block.call(session)
68
+ session.finish! options
69
+ end
70
+
71
+ def self.within_ssh_session(session_options, &block)
72
+ Net::SSH.start(
73
+ session_options.hostname,
74
+ session_options.username,
75
+ session_options.ssh_options) do |ssh|
76
+ block.call(Escualo::Session::Remote.new ssh, session_options)
77
+ end
78
+ end
79
+ end
80
+
81
+ require_relative './session/docker_session'
82
+ require_relative './session/remote_session'
83
+ require_relative './session/local_session'
@@ -1,4 +1,4 @@
1
1
  module Escualo
2
- VERSION = '1.0.3'
3
- BASE_VERSION = '3.2'
2
+ VERSION = '2.0.0'
3
+ BASE_VERSION = '3.3'
4
4
  end
data/lib/escualo.rb CHANGED
@@ -13,15 +13,27 @@ require 'mumukit/core'
13
13
  module Escualo
14
14
  end
15
15
 
16
+ require 'open3'
17
+
18
+ module Open3
19
+ def self.exec!(command)
20
+ out, status = Open3.capture2e(command)
21
+ raise "command failed #{command}: #{out}" unless status.success?
22
+ out
23
+ end
24
+ end
25
+
16
26
  require_relative './template'
17
27
  require_relative './ssh'
18
28
 
19
29
  require_relative './escualo/version'
30
+ require_relative './escualo/session'
20
31
  require_relative './escualo/env'
21
32
  require_relative './escualo/ppa'
33
+ require_relative './escualo/apt_get'
22
34
  require_relative './escualo/gems'
23
35
  require_relative './escualo/base'
24
- require_relative './escualo/bootstrap'
36
+ require_relative './escualo/ruby'
25
37
  require_relative './escualo/script'
26
38
  require_relative './escualo/plugin'
27
39
  require_relative './escualo/remote'
data/lib/ssh.rb CHANGED
@@ -1,4 +1,26 @@
1
- require_relative './ssh/perform'
2
- require_relative './ssh/upload'
3
- require_relative './ssh/local_session'
4
- require_relative './ssh/session'
1
+ class Net::SSH::Connection::Session
2
+ def stream!(command)
3
+ exit_code = 0
4
+ channel = self.open_channel do |channel|
5
+ channel.exec command do |ch, success|
6
+ raise 'could not execute command' unless success
7
+ ch.on_data do |c, data|
8
+ yield :stdout, data unless garbage? data
9
+ end
10
+ ch.on_extended_data do |c, type, data|
11
+ yield :stderr, data unless garbage? data
12
+ end
13
+ ch.on_request('exit-status') do |c, data|
14
+ exit_code = data.read_long
15
+ end
16
+ end
17
+ end
18
+ channel.wait
19
+ raise "command failed #{command}!" if exit_code != 0
20
+ nil
21
+ end
22
+
23
+ def garbage?(data)
24
+ data.start_with?('bash: cannot set terminal process group') || data.start_with?('bash: no job control in this shell')
25
+ end
26
+ end
@@ -40,5 +40,5 @@ EOMONIT
40
40
 
41
41
  done
42
42
 
43
- monit reload
43
+ service monit reload
44
44
  fi
@@ -1,5 +1,6 @@
1
1
  #!/bin/bash
2
2
  REVISION=$1
3
+ START_TYPE=$2
3
4
 
4
5
  cd /var/www/<%= @name %>
5
6
 
@@ -13,6 +14,12 @@ fi
13
14
  echo "[Escualo] [<%= @name %>] installing dependencies..."
14
15
  <%= @install_command %>
15
16
 
17
+ if [ $START_TYPE = first ] && [ -e .escualo/install/first ]; then
18
+ echo "[Escualo] [<%= @name %>] .escualo/install/start and it is first run. Running it..."
19
+ chmod u+x .escualo/install/first
20
+ .escualo/install/first
21
+ fi
22
+
16
23
  monit unmonitor escualo-<%= @name %>
17
24
  service <%= @name %> stop
18
25
 
@@ -14,11 +14,17 @@ do
14
14
 
15
15
  echo "[Escualo] [<%= @name %>] master branch detected, deploying..."
16
16
  mkdir -p /var/www/<%= @name %>
17
- git --work-tree=/var/www/<%= @name %> --git-dir=/var/repo/<%= @name %>.git checkout master -f
18
17
 
18
+ if [ "$(ls -A /var/www/<%= @name %>)" ]; then
19
+ START_TYPE=restart
20
+ else
21
+ START_TYPE=first
22
+ fi
23
+
24
+ git --work-tree=/var/www/<%= @name %> --git-dir=/var/repo/<%= @name %>.git checkout master -f
19
25
  <% if @service %>
20
26
  /var/scripts/<%= @name %>/codechange $newrev
21
27
  <% end %>
22
- /var/scripts/<%= @name %>/init $newrev
28
+ /var/scripts/<%= @name %>/init $newrev $START_TYPE
23
29
  fi
24
30
  done
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: escualo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Franco Leonardo Bulgarelli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-09 00:00:00.000000000 Z
11
+ date: 2016-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: commander
@@ -135,7 +135,6 @@ files:
135
135
  - bin/escualo
136
136
  - lib/command.rb
137
137
  - lib/commands/artifact.rb
138
- - lib/commands/base.rb
139
138
  - lib/commands/bootstrap.rb
140
139
  - lib/commands/deploy.rb
141
140
  - lib/commands/env.rb
@@ -146,9 +145,9 @@ files:
146
145
  - lib/commands/script.rb
147
146
  - lib/commands/upload.rb
148
147
  - lib/escualo.rb
148
+ - lib/escualo/apt_get.rb
149
149
  - lib/escualo/artifact.rb
150
150
  - lib/escualo/base.rb
151
- - lib/escualo/bootstrap.rb
152
151
  - lib/escualo/env.rb
153
152
  - lib/escualo/gems.rb
154
153
  - lib/escualo/plugin.rb
@@ -158,17 +157,18 @@ files:
158
157
  - lib/escualo/plugin/monit.rb
159
158
  - lib/escualo/plugin/nginx.rb
160
159
  - lib/escualo/plugin/node.rb
161
- - lib/escualo/plugin/postgre.rb
160
+ - lib/escualo/plugin/postgres.rb
162
161
  - lib/escualo/plugin/rabbit.rb
163
162
  - lib/escualo/ppa.rb
164
163
  - lib/escualo/remote.rb
164
+ - lib/escualo/ruby.rb
165
165
  - lib/escualo/script.rb
166
+ - lib/escualo/session.rb
167
+ - lib/escualo/session/docker_session.rb
168
+ - lib/escualo/session/local_session.rb
169
+ - lib/escualo/session/remote_session.rb
166
170
  - lib/escualo/version.rb
167
171
  - lib/ssh.rb
168
- - lib/ssh/local_session.rb
169
- - lib/ssh/perform.rb
170
- - lib/ssh/session.rb
171
- - lib/ssh/upload.rb
172
172
  - lib/template.rb
173
173
  - lib/templates/codechange.sh.erb
174
174
  - lib/templates/init.sh.erb
data/lib/commands/base.rb DELETED
@@ -1,8 +0,0 @@
1
- command 'base' do |c|
2
- c.syntax = 'escualo base'
3
- c.description = 'Install essential libraries'
4
-
5
- c.ssh_action do |_args, options, ssh|
6
- Escualo::Base.install_base ssh, options
7
- end
8
- end
@@ -1,37 +0,0 @@
1
- module Escualo
2
- module Bootstrap
3
- def self.install_ruby(ssh, options)
4
- ssh.shell.perform! 'apt-get purge libruby* -y', options
5
- if options.with_rbenv
6
- ssh.shell.perform! %q{
7
- curl https://raw.githubusercontent.com/fesplugas/rbenv-installer/master/bin/rbenv-installer | bash &&
8
- echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc &&
9
- echo 'eval "$(rbenv init -)"' >> ~/.bashrc
10
- }, options
11
- ssh.shell.perform! 'rbenv install 2.3.1 && rbenv global 2.3.1 && rbenv rehash', options
12
- else
13
- ssh.shell.perform! %Q{
14
- apt-get install software-properties-common -y &&
15
- apt-add-repository '#{Escualo::PPA.for 'brightbox/ruby-ng'}' &&
16
- apt-get update &&
17
- apt-get install -y ruby2.3 ruby2.3-dev
18
- }, options
19
- end
20
- end
21
-
22
- def self.enable_swap(ssh)
23
- ssh.exec! %q{ \
24
- test -e /swapfile ||
25
- fallocate -l 4G /swapfile && \
26
- chmod 600 /swapfile && \
27
- mkswap /swapfile && \
28
- swapon /swapfile && \
29
- swapon -s && \
30
- echo '/swapfile none swap sw 0 0' >> /etc/fstab}
31
- end
32
-
33
- def self.check(ssh)
34
- Escualo::Env.present?(ssh, :ESCUALO_BASE_VERSION) && Escualo::Gems.present?(ssh)
35
- end
36
- end
37
- end
@@ -1,23 +0,0 @@
1
- module Escualo::Plugin
2
- class Postgre
3
- def run(ssh, options)
4
- pg_hba_conf = "/etc/postgresql/#{options.pg_version}/main/pg_hba.conf"
5
-
6
- ssh.shell.perform! %Q{
7
- apt-get install postgresql libpq-dev -y &&
8
- echo 'local all postgres peer' > #{pg_hba_conf} &&
9
- echo 'local all postgres peer' >> #{pg_hba_conf} &&
10
- echo 'local all all password' >> #{pg_hba_conf} &&
11
- echo 'host all all 127.0.0.1/32 md5' >> #{pg_hba_conf} &&
12
- cd / &&
13
- sudo -u postgres PGDATABASE='' psql <<EOF
14
- create role $POSTGRESQL_DB_USERNAME with createdb login password '$POSTGRESQL_DB_PASSWORD';
15
- EOF
16
- }, options
17
- end
18
-
19
- def check(ssh, options)
20
- ssh.shell.exec!('psql --version').include? "psql (PostgreSQL) #{options.pg_version}" rescue false
21
- end
22
- end
23
- end
@@ -1,44 +0,0 @@
1
- require 'fileutils'
2
- require 'open3'
3
-
4
- module Net::SSH
5
- def self.with_session(options, &block)
6
- if options.delete(:local)
7
- block.call(Net::SSH::Connection::LocalSession.new)
8
- else
9
- start(options.delete(:hostname),
10
- options.delete(:username),
11
- options.compact) do |ssh|
12
- block.call(ssh)
13
- end
14
- end
15
- end
16
- end
17
-
18
- class Net::SSH::Connection::LocalSession
19
- include Net::SSH::Connection::Perform
20
- include Net::SSH::Connection::Upload
21
-
22
- def exec!(command)
23
- out, status = Open3.capture2e(command)
24
- raise out unless status.success?
25
- out
26
- end
27
-
28
- def upload_file!(file, destination)
29
- FileUtils.cp file, destination
30
- end
31
-
32
- def tell!(command)
33
- Open3.popen2e command do |_input, output, wait|
34
- output.each do |line|
35
- $stdout.print line
36
- end
37
- raise "command #{command} failed" unless wait.value.success?
38
- end
39
- end
40
-
41
- def shell
42
- self
43
- end
44
- end
data/lib/ssh/perform.rb DELETED
@@ -1,9 +0,0 @@
1
- module Net::SSH::Connection::Perform
2
- def perform!(command, options)
3
- if options.verbose
4
- tell! command
5
- else
6
- exec! command
7
- end
8
- end
9
- end
data/lib/ssh/session.rb DELETED
@@ -1,61 +0,0 @@
1
- class Net::SSH::Connection::Session
2
- include Net::SSH::Connection::Perform
3
- include Net::SSH::Connection::Upload
4
-
5
- def upload_file!(file, destination)
6
- scp.upload! file, destination
7
- end
8
-
9
- def tell!(command)
10
- channel = self.open_channel do |ch|
11
- ch.exec command do |ch, success|
12
- raise 'could not execute command' unless success
13
- ch.on_data do |c, data|
14
- $stdout.print data unless garbage? data
15
- end
16
- ch.on_extended_data do |c, type, data|
17
- $stderr.print data unless garbage? data
18
- end
19
- end
20
- end
21
- channel.wait
22
- end
23
-
24
- def shell
25
- Shell.new self
26
- end
27
-
28
- private
29
-
30
- def garbage?(data)
31
- data.start_with?('bash: cannot set terminal process group') || data.start_with?('bash: no job control in this shell')
32
- end
33
-
34
- class Shell
35
- attr_reader :ssh
36
-
37
- def initialize(ssh)
38
- @ssh = ssh
39
- end
40
-
41
- def perform!(command, options)
42
- ssh.perform! wrap(command), options
43
- end
44
-
45
- def exec!(command)
46
- ssh.exec! wrap(command)
47
- end
48
-
49
- def tell!(command)
50
- ssh.tell! wrap(command)
51
- end
52
-
53
- private
54
-
55
- def wrap(command)
56
- "bash -i -s <<EOBASH
57
- #{command.gsub('$', '\$')}
58
- EOBASH"
59
- end
60
- end
61
- end
data/lib/ssh/upload.rb DELETED
@@ -1,9 +0,0 @@
1
- module Net::SSH::Connection::Upload
2
- def upload_template!(destination, name, bindings)
3
- Mumukit::Core::Template
4
- .new(File.join(__dir__, '..', 'templates', "#{name}.erb"), bindings)
5
- .with_tempfile!('template') do |file|
6
- upload_file! file, destination
7
- end
8
- end
9
- end