arvados-login-sync 2.0.3 → 2.1.2

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 (3) hide show
  1. checksums.yaml +4 -4
  2. data/bin/arvados-login-sync +82 -22
  3. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4e8d00f5d0b84e85c4a68a44ede8613593ad2044a9be5037e838a7e2e8f2affa
4
- data.tar.gz: 6d0df969abbd3628c7ec2e686be808815f2f1cf6b70602fcf88cbadef13eaa22
3
+ metadata.gz: 26bdae065f222a1bf829104d946b977925df1b7ebfa246f6d11e5a362bf45bbf
4
+ data.tar.gz: 26bbc165ea34ef4ced71a09425c5db9cefda73d03d5eacfc0c9fe727fb4e9b12
5
5
  SHA512:
6
- metadata.gz: 1dd958003655139ff6bd9bba12f63d2a7452f26ebce3d9069bbbca5ab8b4f746468d529ea4545dfe78868f88938d74464ce317f0980d5173e715b5199fbe7291
7
- data.tar.gz: d246249663f6578224439542f506237710fa9540dba5c3cfd561b4249f2fac59d044e7e7b6565084dd436fb05f043b644bb101c5e270386dc710acd7d7476b38
6
+ metadata.gz: 614dd9ac71b15ba4f803baad5033d0d0afcaf26ddb05c06e178d5a19d3f9774dde0acea2e971a9dd4342742a716e120236caafa279311103f79f96ecedfbabce
7
+ data.tar.gz: 91ba4b18994e78857592d3d44db7224eb68d4aaab3bc5b1d87b7168d4b583c6e8aed304d123b9550d02378378d8f4f252e0fb09425bfc2652a8091c2f8a6db9d
@@ -31,12 +31,15 @@ keys = ''
31
31
 
32
32
  begin
33
33
  arv = Arvados.new({ :suppress_ssl_warnings => false })
34
+ logincluster_arv = Arvados.new({ :api_host => (ENV['LOGINCLUSTER_ARVADOS_API_HOST'] || ENV['ARVADOS_API_HOST']),
35
+ :api_token => (ENV['LOGINCLUSTER_ARVADOS_API_TOKEN'] || ENV['ARVADOS_API_TOKEN']),
36
+ :suppress_ssl_warnings => false })
34
37
 
35
38
  vm_uuid = ENV['ARVADOS_VIRTUAL_MACHINE_UUID']
36
39
 
37
40
  logins = arv.virtual_machine.logins(:uuid => vm_uuid)[:items]
38
41
  logins = [] if logins.nil?
39
- logins = logins.reject { |l| l[:username].nil? or l[:hostname].nil? or l[:public_key].nil? or l[:virtual_machine_uuid] != vm_uuid }
42
+ logins = logins.reject { |l| l[:username].nil? or l[:hostname].nil? or l[:virtual_machine_uuid] != vm_uuid }
40
43
 
41
44
  # No system users
42
45
  uid_min = 1000
@@ -79,48 +82,77 @@ begin
79
82
  logins.each do |l|
80
83
  keys[l[:username]] = Array.new() if not keys.has_key?(l[:username])
81
84
  key = l[:public_key]
82
- # Handle putty-style ssh public keys
83
- key.sub!(/^(Comment: "r[^\n]*\n)(.*)$/m,'ssh-rsa \2 \1')
84
- key.sub!(/^(Comment: "d[^\n]*\n)(.*)$/m,'ssh-dss \2 \1')
85
- key.gsub!(/\n/,'')
86
- key.strip
87
-
88
- keys[l[:username]].push(key) if not keys[l[:username]].include?(key)
85
+ if !key.nil?
86
+ # Handle putty-style ssh public keys
87
+ key.sub!(/^(Comment: "r[^\n]*\n)(.*)$/m,'ssh-rsa \2 \1')
88
+ key.sub!(/^(Comment: "d[^\n]*\n)(.*)$/m,'ssh-dss \2 \1')
89
+ key.gsub!(/\n/,'')
90
+ key.strip
91
+
92
+ keys[l[:username]].push(key) if not keys[l[:username]].include?(key)
93
+ end
89
94
  end
90
95
 
91
96
  seen = Hash.new()
92
- devnull = open("/dev/null", "w")
97
+
98
+ current_user_groups = Hash.new
99
+ while (ent = Etc.getgrent()) do
100
+ ent.mem.each do |member|
101
+ current_user_groups[member] ||= Array.new
102
+ current_user_groups[member].push ent.name
103
+ end
104
+ end
105
+ Etc.endgrent()
93
106
 
94
107
  logins.each do |l|
95
108
  next if seen[l[:username]]
96
109
  seen[l[:username]] = true
97
110
 
111
+ username = l[:username]
112
+
98
113
  unless pwnam[l[:username]]
99
114
  STDERR.puts "Creating account #{l[:username]}"
100
- groups = l[:groups] || []
101
- # Adding users to the FUSE group has long been hardcoded behavior.
102
- groups << "fuse"
103
- groups.select! { |g| Etc.getgrnam(g) rescue false }
104
115
  # Create new user
105
116
  unless system("useradd", "-m",
106
- "-c", l[:username],
117
+ "-c", username,
107
118
  "-s", "/bin/bash",
108
- "-G", groups.join(","),
109
- l[:username],
110
- out: devnull)
119
+ username)
111
120
  STDERR.puts "Account creation failed for #{l[:username]}: #{$?}"
112
121
  next
113
122
  end
114
123
  begin
115
- pwnam[l[:username]] = Etc.getpwnam(l[:username])
124
+ pwnam[username] = Etc.getpwnam(username)
116
125
  rescue => e
117
126
  STDERR.puts "Created account but then getpwnam() failed for #{l[:username]}: #{e}"
118
127
  raise
119
128
  end
120
129
  end
121
130
 
122
- @homedir = pwnam[l[:username]].dir
123
- userdotssh = File.join(@homedir, ".ssh")
131
+ existing_groups = current_user_groups[username] || []
132
+ groups = l[:groups] || []
133
+ # Adding users to the FUSE group has long been hardcoded behavior.
134
+ groups << "fuse"
135
+ groups << username
136
+ groups.select! { |g| Etc.getgrnam(g) rescue false }
137
+
138
+ groups.each do |addgroup|
139
+ if existing_groups.index(addgroup).nil?
140
+ # User should be in group, but isn't, so add them.
141
+ STDERR.puts "Add user #{username} to #{addgroup} group"
142
+ system("adduser", username, addgroup)
143
+ end
144
+ end
145
+
146
+ existing_groups.each do |removegroup|
147
+ if groups.index(removegroup).nil?
148
+ # User is in a group, but shouldn't be, so remove them.
149
+ STDERR.puts "Remove user #{username} from #{removegroup} group"
150
+ system("deluser", username, removegroup)
151
+ end
152
+ end
153
+
154
+ homedir = pwnam[l[:username]].dir
155
+ userdotssh = File.join(homedir, ".ssh")
124
156
  Dir.mkdir(userdotssh) if !File.exist?(userdotssh)
125
157
 
126
158
  newkeys = "###\n###\n" + keys[l[:username]].join("\n") + "\n###\n###\n"
@@ -148,13 +180,41 @@ begin
148
180
  f.write(newkeys)
149
181
  f.close()
150
182
  end
183
+
184
+ userdotconfig = File.join(homedir, ".config")
185
+ if !File.exist?(userdotconfig)
186
+ Dir.mkdir(userdotconfig)
187
+ end
188
+
189
+ configarvados = File.join(userdotconfig, "arvados")
190
+ Dir.mkdir(configarvados) if !File.exist?(configarvados)
191
+
192
+ tokenfile = File.join(configarvados, "settings.conf")
193
+
194
+ begin
195
+ if !File.exist?(tokenfile)
196
+ user_token = logincluster_arv.api_client_authorization.create(api_client_authorization: {owner_uuid: l[:user_uuid], api_client_id: 0})
197
+ f = File.new(tokenfile, 'w')
198
+ f.write("ARVADOS_API_HOST=#{ENV['ARVADOS_API_HOST']}\n")
199
+ f.write("ARVADOS_API_TOKEN=v2/#{user_token[:uuid]}/#{user_token[:api_token]}\n")
200
+ f.close()
201
+ end
202
+ rescue => e
203
+ STDERR.puts "Error setting token for #{l[:username]}: #{e}"
204
+ end
205
+
151
206
  FileUtils.chown_R(l[:username], nil, userdotssh)
207
+ FileUtils.chown_R(l[:username], nil, userdotconfig)
152
208
  File.chmod(0700, userdotssh)
153
- File.chmod(0750, @homedir)
209
+ File.chmod(0700, userdotconfig)
210
+ File.chmod(0700, configarvados)
211
+ File.chmod(0750, homedir)
154
212
  File.chmod(0600, keysfile)
213
+ if File.exist?(tokenfile)
214
+ File.chmod(0600, tokenfile)
215
+ end
155
216
  end
156
217
 
157
- devnull.close
158
218
  rescue Exception => bang
159
219
  puts "Error: " + bang.to_s
160
220
  puts bang.backtrace.join("\n")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arvados-login-sync
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.3
4
+ version: 2.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arvados Authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-13 00:00:00.000000000 Z
11
+ date: 2021-02-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: arvados
@@ -73,8 +73,8 @@ dependencies:
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0.12'
75
75
  description: Creates and updates local login accounts for Arvados users. Built from
76
- git commit 5f300020c51e8073a9cb6e45ee49991386244510
77
- email: gem-dev@curoverse.com
76
+ git commit 78096170b070a9eb17b37f913798397744fa1ff5
77
+ email: packaging@arvados.org
78
78
  executables:
79
79
  - arvados-login-sync
80
80
  extensions: []