mobilize-ssh 1.0.9 → 1.0.21

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.
data/README.md CHANGED
@@ -81,18 +81,10 @@ The Ssh configuration consists of:
81
81
  over to the nodes. They will be deleted afterwards, unless the job
82
82
  fails in mid-copy. By default this is tmp/file/.
83
83
  * nodes, identified by aliases, such as `test_node`. This alias is what you should
84
- pass into the "node" param over in the ssh.run task.
85
-
86
- Each node has:
87
- * a host;
88
- * a gateway (optional); If you don't need a gateway, remove that row from the configuration file.
89
- * sudoers; these are user names that are allowed to pass su_user params
90
- to the run call. This requires passwordless sudo for the host user.
91
- * su_all_users true/false option, which ensures that commands are executed by the
92
- user on the Runner. It prefixes all commands with sudo su <user_name> before executing the
93
- command. This is strongly recommended if possible as it ensures users do
94
- not overstep their permissions. This requires passwordless sudo for the
95
- host user and accounts on the host machine for each user.
84
+ pass into the "node_alias" param over in the ssh.run task.
85
+
86
+ Each node has a host, and optionally has a gateway. If you don't need a
87
+ gateway, remove that row from the configuration file.
96
88
 
97
89
  Each host and gateway has a series of ssh params:
98
90
  * name - the ip address or name of the host
@@ -133,12 +125,10 @@ Start
133
125
  ### Create Job
134
126
 
135
127
  * For mobilize-ssh, the following task is available:
136
- * ssh.run `node: <node_alias>, cmd: <command>, su_user: su_user, sources:[*<gsheet_full_paths>]`, which reads
128
+ * ssh.run `<node_alias>,<command>,*<gsheet_full_paths>`, which reads
137
129
  all gsheets, copies them to a temporary folder on the selected node, and
138
130
  runs the command inside that folder.
139
- * su_user and sources are optional; node and cmd are required. su_user
140
- will cause the command to be prefixed with sudo su <su_user> -c.
141
- * The test uses `ssh.run node:"test_node", cmd:"ruby code.rb", su_user: "root", sources:["Runner_mobilize(test)/code.rb","Runner_mobilize(test)/code.sh"]`
131
+ * The test uses `ssh.run "test_node", "ruby code.rb", "Runner_mobilize(test)/code.rb", "Runner_mobilize(test)/code.sh"`
142
132
 
143
133
  <a name='section_Start_Run_Test'></a>
144
134
  ### Run Test
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
2
 
3
- require 'mobilize-base/tasks'
4
- require 'mobilize-ssh/tasks'
3
+ require 'mobilize-base/rakes'
4
+ require 'mobilize-ssh/rakes'
5
5
 
6
6
  #
7
7
  # Tests
@@ -16,14 +16,6 @@ module Mobilize
16
16
  Ssh.config['nodes'][node]['gateway']
17
17
  end
18
18
 
19
- def Ssh.sudoers(node)
20
- Ssh.config['nodes'][node]['sudoers']
21
- end
22
-
23
- def Ssh.su_all_users(node)
24
- Ssh.config['nodes'][node]['su_all_users']
25
- end
26
-
27
19
  #determine if current machine is on host domain, needs gateway if one is provided and it is not
28
20
  def Ssh.needs_gateway?(node)
29
21
  host_domain_name = Ssh.host(node)['name'].split(".")[-2..-1].join(".")
@@ -42,17 +34,9 @@ module Mobilize
42
34
  return true if file_hash.keys.length>0
43
35
  end
44
36
 
45
- def Ssh.set_key_permissions(key_path)
46
- #makes sure permissions are set as appropriate for ssh key
47
- "chmod a-rwx #{key_path}".bash
48
- "chmod u+rw #{key_path}".bash
49
- return true
50
- end
51
-
52
37
  def Ssh.scp(node,from_path,to_path)
53
38
  name,key,port,user = Ssh.host(node).ie{|h| ['name','key','port','user'].map{|k| h[k]}}
54
39
  key_path = "#{Base.root}/#{key}"
55
- Ssh.set_key_permissions(key_path)
56
40
  opts = {:port=>(port || 22),:keys=>key_path}
57
41
  if Ssh.needs_gateway?(node)
58
42
  gname,gkey,gport,guser = Ssh.gateway(node).ie{|h| ['name','key','port','user'].map{|k| h[k]}}
@@ -68,9 +52,9 @@ module Mobilize
68
52
  end
69
53
 
70
54
  def Ssh.run(node,command,file_hash=nil,su_user=nil)
71
- key,user = Ssh.host(node).ie{|h| ['key','user'].map{|k| h[k]}}
55
+ name,key,port,user = Ssh.host(node).ie{|h| ['name','key','port','user'].map{|k| h[k]}}
72
56
  key_path = "#{Base.root}/#{key}"
73
- Ssh.set_key_permissions(key_path)
57
+ opts = {:port=>(port || 22),:keys=>key_path}
74
58
  su_user ||= user
75
59
  file_hash ||= {}
76
60
  #make sure the dir for this command is clear
@@ -80,55 +64,46 @@ module Mobilize
80
64
  Ssh.pop_comm_dir(comm_dir,file_hash)
81
65
  #move any files up to the node
82
66
  rem_dir = nil
83
- #make sure user starts in rem_dir
84
- rem_dir = "#{comm_md5}/"
85
- #make sure the rem_dir is gone
86
- Ssh.fire!(node,"rm -rf #{rem_dir}")
87
67
  if File.exists?(comm_dir)
68
+ #make sure user starts in rem_dir
69
+ rem_dir = "#{comm_md5}/"
70
+ command = ["cd #{rem_dir}",command].join(";")
88
71
  Ssh.scp(node,comm_dir,rem_dir)
89
72
  "rm -rf #{comm_dir}".bash
90
- else
91
- #create folder
92
- mkdir_command = "mkdir #{rem_dir}"
93
- Ssh.fire!(node,mkdir_command)
73
+ if su_user
74
+ chown_command = "sudo chown -R #{su_user} #{rem_dir}"
75
+ Ssh.run(node,chown_command)
76
+ end
94
77
  end
95
- #create cmd_file in rem_folder
96
- cmd_file = "#{comm_md5}.sh"
97
- cmd_path = "#{rem_dir}#{cmd_file}"
98
- Ssh.write(node,command,cmd_path)
99
- full_cmd = "(cd #{rem_dir} && sh #{cmd_file})"
100
- #fire_cmd runs sh on cmd_path, optionally with sudo su
101
- fire_cmd = if su_user != user
102
- %{sudo su #{su_user} -c "#{full_cmd}"}
103
- else
104
- full_cmd
105
- end
106
- result = Ssh.fire!(node,fire_cmd)
107
- #remove the directory after you're done
108
- rm_cmd = "rm -rf #{rem_dir}"
109
- Ssh.fire!(node,rm_cmd)
110
- result
111
- end
112
-
113
- def Ssh.fire!(node,cmd)
114
- name,key,port,user = Ssh.host(node).ie{|h| ['name','key','port','user'].map{|k| h[k]}}
115
- key_path = "#{Base.root}/#{key}"
116
- Ssh.set_key_permissions(key_path)
117
- opts = {:port=>(port || 22),:keys=>key_path}
78
+ if su_user != user
79
+ #wrap the command in sudo su -c
80
+ command = %{sudo su #{su_user} -c "#{command}"}
81
+ end
82
+ result = nil
83
+ #one with gateway, one without
118
84
  if Ssh.needs_gateway?(node)
119
- gname,gkey,gport,guser = Ssh.gateway(node).ie{|h| ['name','key','port','user'].map{|k| h[k]}}
120
- gkey_path = "#{Base.root}/#{gkey}"
121
- gopts = {:port=>(gport || 22),:keys=>gkey_path}
122
- Net::SSH::Gateway.run(gname,guser,name,user,cmd,gopts,opts)
85
+ gname,gkey,gport,guser = Ssh.gateway(node).ie{|h| ['name','key','port','user'].map{|k| h[k]}}
86
+ gkey_path = "#{Base.root}/#{gkey}"
87
+ gopts = {:port=>(gport || 22),:keys=>gkey_path}
88
+ result = Net::SSH::Gateway.run(gname,guser,name,user,command,gopts,opts)
123
89
  else
124
- Net::SSH.start(name,user,opts) do |ssh|
125
- ssh.run(cmd)
90
+ Net::SSH.start(name,user,opts) do |ssh|
91
+ result = ssh.run(command)
92
+ end
93
+ end
94
+ #delete remote dir if necessary
95
+ if rem_dir
96
+ del_cmd = "rm -rf #{rem_dir}"
97
+ if su_user
98
+ del_cmd = %{sudo su #{su_user} -c "#{del_cmd}"}
126
99
  end
100
+ Ssh.run(node,del_cmd)
127
101
  end
102
+ result
128
103
  end
129
104
 
130
105
  def Ssh.read(node,path)
131
- Ssh.fire!(node,"cat #{path}")
106
+ Ssh.run(node,"cat #{path}")
132
107
  end
133
108
 
134
109
  def Ssh.write(node,fdata,to_path,binary=false)
@@ -149,47 +124,28 @@ module Mobilize
149
124
  return tmp_file_path
150
125
  end
151
126
 
152
- def Ssh.file_hash_by_stage_path(stage_path)
153
- #this is not meant to be called directly
154
- #from the Runner -- it's used by run_by_stage_path
155
- s = Stage.where(:path=>stage_path).first
156
- params = s.params
157
- gsheet_paths = if params['sources']
158
- params['sources']
159
- elsif params['source']
160
- [params['source']]
161
- end
162
- if gsheet_paths and gsheet_paths.length>0
163
- gdrive_slot = Gdrive.slot_worker_by_path(stage_path)
164
- file_hash = {}
165
- gsheet_paths.map do |gpath|
166
- string = Gsheet.find_by_path(gpath,gdrive_slot).to_tsv
167
- fname = gpath.split("/").last
168
- {fname => string}
169
- end.each do |f|
170
- file_hash = f.merge(file_hash)
171
- end
172
- Gdrive.unslot_worker_by_path(stage_path)
173
- return file_hash
174
- end
175
- end
176
-
177
- def Ssh.run_by_stage_path(stage_path)
178
- s = Stage.where(:path=>stage_path).first
179
- u = s.job.runner.user
180
- params = s.params
181
- node, command = [params['node'],params['cmd']]
182
- file_hash = Ssh.file_hash_by_stage_path(stage_path)
183
- su_user = s.params['su_user']
184
- if su_user and !Ssh.sudoers(node).include?(u.name)
185
- raise "You do not have su permissions for this node"
186
- elsif su_user.nil? and Ssh.su_all_users(node)
187
- su_user = u.name
127
+ def Ssh.get_file_hash(gsheet_paths,gdrive_slot)
128
+ file_hash = {}
129
+ gsheet_paths.map do |gpath|
130
+ string = Gsheet.find_by_path(gpath,gdrive_slot).to_tsv
131
+ fname = gpath.split("/").last
132
+ {fname => string}
133
+ end.each do |f|
134
+ file_hash = f.merge(file_hash)
188
135
  end
189
- out_tsv = Ssh.run(node,command,file_hash,su_user)
190
- #use Gridfs to cache result
191
- out_url = "gridfs://#{s.path}/out"
192
- Dataset.write_to_url(out_url,out_tsv)
136
+ file_hash
137
+ end
138
+
139
+ def Ssh.run_by_task_path(task_path)
140
+ t = Task.where(:path=>task_path).first
141
+ params = t.params
142
+ node, command = [params[0],params[1]]
143
+ file_hash = if params[2]
144
+ gsheet_paths = params[2..-1] if params[2]
145
+ gdrive_slot = Gdrive.slot_worker_by_path(task_path)
146
+ Ssh.get_file_hash(gsheet_paths,gdrive_slot)
147
+ end
148
+ Ssh.run(node,command,file_hash)
193
149
  end
194
150
  end
195
151
  end
File without changes
@@ -1,5 +1,5 @@
1
1
  module Mobilize
2
2
  module Ssh
3
- VERSION = "1.0.9"
3
+ VERSION = "1.0.21"
4
4
  end
5
5
  end
data/lib/samples/ssh.yml CHANGED
@@ -2,23 +2,17 @@ development:
2
2
  tmp_file_dir: "tmp/file/"
3
3
  nodes:
4
4
  dev_node:
5
- sudoers: [sudo_user]
6
- su_all_users: true
7
5
  host: {name: dev-host.com, key: "config/mobilize/ssh_private.key", port: 22, user: host_user}
8
6
  gateway: {name: dev-gateway.com, key: "config/mobilize/ssh_private.key", port: 22, user: gateway_user}
9
7
  test:
10
8
  tmp_file_dir: "tmp/file/"
11
9
  nodes:
12
10
  test_node:
13
- sudoers: [sudo_user]
14
- su_all_users: true
15
11
  host: {name: test-host.com, key: "config/mobilize/ssh_private.key", port: 22, user: host_user}
16
12
  gateway: {name: test-gateway.com, key: "config/mobilize/ssh_private.key", port: 22, user: gateway_user}
17
13
  production:
18
14
  tmp_file_dir: "tmp/file/"
19
15
  nodes:
20
16
  prod_node:
21
- sudoers: [sudo_user]
22
- su_all_users: true
23
17
  host: {name: prod-host.com, key: "config/mobilize/ssh_private.key", port: 22, user: host_user}
24
18
  gateway: {name: prod-gateway.com, key: "config/mobilize/ssh_private.key", port: 22, user: gateway_user}
data/mobilize-ssh.gemspec CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |gem|
16
16
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
17
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
18
  gem.require_paths = ["lib"]
19
- gem.add_runtime_dependency "mobilize-base","1.0.9"
19
+ gem.add_runtime_dependency "mobilize-base","1.0.51"
20
20
  gem.add_runtime_dependency "net-ssh"
21
21
  gem.add_runtime_dependency "net-scp"
22
22
  gem.add_runtime_dependency "net-ssh-gateway"
@@ -18,10 +18,6 @@ describe "Mobilize" do
18
18
  u = Mobilize::User.where(:name=>user_name).first
19
19
  r = u.runner
20
20
 
21
- rb_code_sheet = Mobilize::Gsheet.find_by_path("#{r.path.split("/")[0..-2].join("/")}/code.rb",gdrive_slot)
22
- sh_code_sheet = Mobilize::Gsheet.find_by_path("#{r.path.split("/")[0..-2].join("/")}/code.sh",gdrive_slot)
23
- [rb_code_sheet,sh_code_sheet].each {|s| s.delete if s}
24
-
25
21
  puts "add test code"
26
22
  rb_code_sheet = Mobilize::Gsheet.find_or_create_by_path("#{r.path.split("/")[0..-2].join("/")}/code.rb",gdrive_slot)
27
23
  rb_code_tsv = File.open("#{Mobilize::Base.root}/test/code.rb").read
@@ -33,32 +29,20 @@ describe "Mobilize" do
33
29
 
34
30
  jobs_sheet = r.gsheet(gdrive_slot)
35
31
 
36
- #delete target sheets if they exist
37
- ssh_target_sheet_1 = Mobilize::Gsheet.find_by_path("#{r.path.split("/")[0..-2].join("/")}/test_ssh_1.out",gdrive_slot)
38
- ssh_target_sheet_2 = Mobilize::Gsheet.find_by_path("#{r.path.split("/")[0..-2].join("/")}/test_ssh_2.out",gdrive_slot)
39
- ssh_target_sheet_3 = Mobilize::Gsheet.find_by_path("#{r.path.split("/")[0..-2].join("/")}/test_ssh_3.out",gdrive_slot)
40
- [ssh_target_sheet_1,ssh_target_sheet_2,ssh_target_sheet_3].each {|s| s.delete if s}
41
-
42
32
  ssh_job_rows = ::YAML.load_file("#{Mobilize::Base.root}/test/ssh_job_rows.yml")
43
- ssh_job_rows.map{|j| r.jobs(j['name'])}.each{|j| j.delete if j}
44
33
  jobs_sheet.add_or_update_rows(ssh_job_rows)
45
34
 
46
- puts "job row added, force enqueue runner, wait 150s"
35
+ puts "job row added, force enqueued runner, wait 90s"
47
36
  r.enqueue!
48
- sleep 150
37
+ sleep 90
49
38
 
50
39
  puts "update job status and activity"
51
40
  r.update_gsheet(gdrive_slot)
52
41
 
53
42
  puts "jobtracker posted data to test sheet"
54
- ssh_target_sheet_1 = Mobilize::Gsheet.find_by_path("#{r.path.split("/")[0..-2].join("/")}/test_ssh_1.out",gdrive_slot)
55
- ssh_target_sheet_2 = Mobilize::Gsheet.find_by_path("#{r.path.split("/")[0..-2].join("/")}/test_ssh_2.out",gdrive_slot)
56
- ssh_target_sheet_3 = Mobilize::Gsheet.find_by_path("#{r.path.split("/")[0..-2].join("/")}/test_ssh_3.out",gdrive_slot)
57
-
58
- assert ssh_target_sheet_1.to_tsv.length > 100
59
- assert ssh_target_sheet_2.to_tsv.length > 100
60
- assert ssh_target_sheet_3.to_tsv.length > 3
43
+ ssh_target_sheet = Mobilize::Gsheet.find_by_path("#{r.path.split("/")[0..-2].join("/")}/test_ssh.out",gdrive_slot)
61
44
 
45
+ assert ssh_target_sheet.to_tsv.length > 100
62
46
  end
63
47
 
64
48
  end
@@ -1,18 +1,6 @@
1
- - name: test_ssh_1
1
+ - name: test_ssh
2
2
  active: true
3
3
  trigger: once
4
4
  status: ""
5
- stage1: 'ssh.run node:"test_node", cmd:"ruby code.rb", su_user:"root", sources:["Runner_mobilize(test)/code.rb", "Runner_mobilize(test)/code.sh"]'
6
- stage2: 'gsheet.write source:"stage1", target:"Runner_mobilize(test)/test_ssh_1.out"'
7
- - name: test_ssh_2
8
- active: true
9
- trigger: "after test_ssh_1"
10
- status: ""
11
- stage1: 'ssh.run node:"test_node", cmd:"sh code.sh", su_user:"root", source:"Runner_mobilize(test)/code.sh"'
12
- stage2: 'gsheet.write source:"stage1", target:"Runner_mobilize(test)/test_ssh_2.out"'
13
- - name: test_ssh_3
14
- active: true
15
- trigger: "after test_ssh_2"
16
- status: ""
17
- stage1: 'ssh.run node:"test_node", cmd:"whoami"'
18
- stage2: 'gsheet.write source:"stage1", target:"Runner_mobilize(test)/test_ssh_3.out"'
5
+ task1: 'ssh.run "test_node", "ruby code.rb", "Runner_mobilize(test)/code.rb", "Runner_mobilize(test)/code.sh"'
6
+ task2: 'gsheet.write "task1", "Runner_mobilize(test)/test_ssh.out"'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mobilize-ssh
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.9
4
+ version: 1.0.21
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: 2012-12-22 00:00:00.000000000 Z
12
+ date: 2012-12-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mobilize-base
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - '='
20
20
  - !ruby/object:Gem::Version
21
- version: 1.0.9
21
+ version: 1.0.51
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - '='
28
28
  - !ruby/object:Gem::Version
29
- version: 1.0.9
29
+ version: 1.0.51
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: net-ssh
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -93,7 +93,7 @@ files:
93
93
  - lib/mobilize-ssh/extensions/socket.rb
94
94
  - lib/mobilize-ssh/extensions/string.rb
95
95
  - lib/mobilize-ssh/handlers/ssh.rb
96
- - lib/mobilize-ssh/tasks.rb
96
+ - lib/mobilize-ssh/rakes.rb
97
97
  - lib/mobilize-ssh/version.rb
98
98
  - lib/samples/ssh.yml
99
99
  - mobilize-ssh.gemspec
@@ -115,12 +115,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
115
115
  - - ! '>='
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
+ segments:
119
+ - 0
120
+ hash: 871259298100733038
118
121
  required_rubygems_version: !ruby/object:Gem::Requirement
119
122
  none: false
120
123
  requirements:
121
124
  - - ! '>='
122
125
  - !ruby/object:Gem::Version
123
126
  version: '0'
127
+ segments:
128
+ - 0
129
+ hash: 871259298100733038
124
130
  requirements: []
125
131
  rubyforge_project:
126
132
  rubygems_version: 1.8.24
@@ -134,4 +140,3 @@ test_files:
134
140
  - test/redis-test.conf
135
141
  - test/ssh_job_rows.yml
136
142
  - test/test_helper.rb
137
- has_rdoc: