class Chef::Knife::UserCreate

Attributes

user_field[RW]

Public Instance Methods

prompt_for_password() click to toggle source
# File lib/chef/knife/user_create.rb, line 173
def prompt_for_password
  ui.ask("Please enter the user's password: ", echo: false)
end
run() click to toggle source
# File lib/chef/knife/user_create.rb, line 79
def run
  test_mandatory_field(@name_args[0], "username")
  user.username @name_args[0]

  if @name_args.size > 1
    ui.warn "[DEPRECATED] DISPLAY_NAME FIRST_NAME LAST_NAME EMAIL PASSWORD options are deprecated and will be removed in future release. Use USERNAME --email --password TAGS option instead."
    test_mandatory_field(@name_args[1], "display name")
    user.display_name @name_args[1]
    test_mandatory_field(@name_args[2], "first name")
    user.first_name @name_args[2]
    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]
    password = config[:passwordprompt] ? prompt_for_password : @name_args[5]
  else
    test_mandatory_field(config[:email], "email")
    test_mandatory_field(config[:password], "password") unless config[:passwordprompt]
    user.display_name user.username
    user.first_name config[:first_name] || ""
    user.last_name config[:last_name] || ""
    user.email config[:email]
    password = config[:passwordprompt] ? prompt_for_password : config[:password]
  end

  unless password
    ui.fatal "You must either provide a password or use the --prompt-for-password (-p) option"
    exit 1
  end

  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

  if config[:user_key]
    user.public_key File.read(File.expand_path(config[:user_key]))
  end

  if @name_args.size > 1
    user_hash = {
      username: user.username,
      first_name: user.first_name,
      last_name: user.last_name,
      display_name: "#{user.first_name} #{user.last_name}",
      email: user.email,
      password: password,
    }
  else
    user_hash = {
      username: user.username,
      first_name: user.first_name,
      last_name: user.last_name,
      display_name: user.display_name,
      email: user.email,
      password: password,
    }
  end

  # Check the file before creating the user so the api is more transactional.
  if config[:file]
    file = config[:file]
    unless File.exist?(file) ? File.writable?(file) : File.writable?(File.dirname(file))
      ui.fatal "File #{config[:file]} is not writable.  Check permissions."
      exit 1
    end
  end

  final_user = root_rest.post("users/", user_hash)

  if config[:orgname]
    request_body = { user: user.username }
    response = root_rest.post("organizations/#{config[:orgname]}/association_requests", request_body)
    association_id = response["uri"].split("/").last
    root_rest.put("users/#{user.username}/association_requests/#{association_id}", { response: "accept" })
  end

  ui.info("Created #{user.username}")
  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
  end
end
user() click to toggle source
# File lib/chef/knife/user_create.rb, line 75
def user
  @user_field ||= Chef::UserV1.new
end