mobilize-ssh 1.0.9 → 1.0.21

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