Merge branch 'master' into 2187-enhance-user-setup
[arvados.git] / services / api / script / setup-new-user.rb
1 #!/usr/bin/env ruby
2
3 abort 'Error: Ruby >= 1.9.3 required.' if RUBY_VERSION < '1.9.3'
4
5 require 'logger'
6 require 'trollop'
7
8 log = Logger.new STDERR
9 log.progname = $0.split('/').last
10
11 opts = Trollop::options do
12   banner ''
13   banner "Usage: #{log.progname} " +
14     "{user_uuid_or_email} {user_and_repo_name} {vm_uuid}"
15   banner ''
16   opt :debug, <<-eos
17 Show debug messages.
18   eos
19   opt :openid_prefix, <<-eos, default: 'https://www.google.com/accounts/o8/id'
20 If creating a new user record, require authentication from an OpenID \
21 with this OpenID prefix *and* a matching email address in order to \
22 claim the account.
23   eos
24 end
25
26 log.level = (ENV['DEBUG'] || opts.debug) ? Logger::DEBUG : Logger::WARN
27     
28 if ARGV.count != 3
29   Trollop::die "required arguments are missing"
30 end
31
32 user_arg, user_repo_name, vm_uuid = ARGV
33
34 require 'arvados'
35 arv = Arvados.new(api_version: 'v1')
36
37 # Look up the given user by uuid or, failing that, email address.
38 begin
39   user = arv.user.get(uuid: user_arg)
40 rescue Arvados::TransactionFailedError
41   found = arv.user.list(where: {email: ARGV[0]})[:items]
42          
43   if found.count == 0 
44     if !user_arg.match(/\w\@\w+\.\w+/)
45       abort "About to create new user, but #{user_arg.inspect} " +
46                "does not look like an email address. Stop."
47     end
48            
49     user = arv.user.setup(repo_name: user_repo_name, vm_uuid: vm_uuid, 
50         user: {email: user_arg})
51     log.info { "created user: " + user[:uuid] }
52   elsif found.count != 1
53     abort "Found #{found.count} users " +
54              "with uuid or email #{user_arg.inspect}. Stop."
55   else
56     user = found.first
57     # Found user. Update the user links
58     user = arv.user.setup(user: {email: user[:uuid]}, repo_name: user_repo_name,
59         vm_uuid: vm_uuid, openid_prefix: opts.openid_prefix)
60   end
61
62   puts "USER = #{user.inspect}"
63   log.info { "user uuid: " + user[:uuid] }
64 end