diff options
Diffstat (limited to 'lib/chef/knife/user_create.rb')
-rw-r--r-- | lib/chef/knife/user_create.rb | 131 |
1 files changed, 95 insertions, 36 deletions
diff --git a/lib/chef/knife/user_create.rb b/lib/chef/knife/user_create.rb index 4130f06878..e73f6be8b6 100644 --- a/lib/chef/knife/user_create.rb +++ b/lib/chef/knife/user_create.rb @@ -1,6 +1,7 @@ # -# Author:: Steven Danna (<steve@opscode.com>) -# Copyright:: Copyright (c) 2012 Opscode, Inc. +# Author:: Steven Danna (<steve@chef.io>) +# Author:: Tyler Cloke (<tyler@chef.io>) +# Copyright:: Copyright (c) 2012, 2015 Chef Software, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,11 +18,14 @@ # require 'chef/knife' +require 'chef/knife/osc_user_create' class Chef class Knife class UserCreate < Knife + attr_accessor :user_field + deps do require 'chef/user' require 'chef/json_compat' @@ -30,63 +34,118 @@ class Chef option :file, :short => "-f FILE", :long => "--file FILE", - :description => "Write the private key to a file" + :description => "Write the private key to a file if the server generated one." + + option :user_key, + :long => "--user-key FILENAME", + :description => "Set the initial default key for the user from a file on disk (cannot pass with --prevent-keygen)." + + option :prevent_keygen, + :short => "-k", + :long => "--prevent-keygen", + :description => "API V1 only. Prevent server from generating a default key pair for you. Cannot be passed with --user-key.", + :boolean => true option :admin, :short => "-a", :long => "--admin", - :description => "Create the user as an admin", + :description => "DEPRECATED: Open Source Chef 11 only. Create the user as an admin.", :boolean => true option :user_password, :short => "-p PASSWORD", :long => "--password PASSWORD", - :description => "Password for newly created user", + :description => "DEPRECATED: Open Source Chef 11 only. Password for newly created user.", :default => "" - option :user_key, - :long => "--user-key FILENAME", - :description => "Public key for newly created user. By default a key will be created for you." + banner "knife user create USERNAME DISPLAY_NAME FIRST_NAME LAST_NAME EMAIL PASSWORD (options)" + + def user + @user_field ||= Chef::User.new + end + + def create_user_from_hash(hash) + Chef::User.from_hash(hash).create + end + + def osc_11_warning +<<-EOF +IF YOU ARE USING CHEF SERVER 12+, PLEASE FOLLOW THE INSTRUCTIONS UNDER knife user create --help. +You only passed a single argument to knife user create. +For backwards compatibility, when only a single argument is passed, +knife user create assumes you want Open Source 11 Server user creation. +knife user create for Open Source 11 Server is being deprecated. +Open Source 11 Server user commands now live under the knife osc_user namespace. +For backwards compatibility, we will forward this request to knife osc_user create. +If you are using an Open Source 11 Server, please use that command to avoid this warning. +EOF + end - banner "knife user create USER (options)" + def run_osc_11_user_create + # run osc_user_create with our input + ARGV.delete("user") + ARGV.unshift("osc_user") + Chef::Knife.run(ARGV, Chef::Application::Knife.options) + end def run - @user_name = @name_args[0] + # DEPRECATION NOTE + # Remove this if statement and corrosponding code post OSC 11 support. + # + # If only 1 arg is passed, assume OSC 11 case. + if @name_args.length == 1 + ui.warn(osc_11_warning) + run_osc_11_user_create + else # EC / CS 12 user create - if @user_name.nil? - show_usage - ui.fatal("You must specify a user name") - exit 1 - end + test_mandatory_field(@name_args[0], "username") + user.username @name_args[0] - if config[:user_password].length == 0 - show_usage - ui.fatal("You must specify a non-blank password") - exit 1 - end + test_mandatory_field(@name_args[1], "display name") + user.display_name @name_args[1] - user = Chef::User.new - user.name(@user_name) - user.admin(config[:admin]) - user.password config[:user_password] + test_mandatory_field(@name_args[2], "first name") + user.first_name @name_args[2] - if config[:user_key] - user.public_key File.read(File.expand_path(config[:user_key])) - end + test_mandatory_field(@name_args[3], "last name") + user.last_name @name_args[3] + + test_mandatory_field(@name_args[4], "email") + user.email @name_args[4] + + test_mandatory_field(@name_args[5], "password") + user.password @name_args[5] + + if config[:user_key] && config[:prevent_keygen] + show_usage + ui.fatal("You cannot pass --user-key and --prevent-keygen") + exit 1 + end + + if !config[:prevent_keygen] && !config[:user_key] + user.create_key(true) + end - output = edit_data(user) - user = Chef::User.from_hash(output).create + if config[:user_key] + user.public_key File.read(File.expand_path(config[:user_key])) + end - ui.info("Created #{user}") - if user.private_key - if config[:file] - File.open(config[:file], "w") do |f| - f.print(user.private_key) + output = edit_data(user) + final_user = create_user_from_hash(output) + + ui.info("Created #{user}") + if final_user.private_key + if config[:file] + File.open(config[:file], "w") do |f| + f.print(final_user.private_key) + end + else + ui.msg final_user.private_key end - else - ui.msg user.private_key end end + + end end end |