sometimesfood/wright

View on GitHub
lib/wright/resource/user.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'wright/resource'
require 'wright/dsl'

module Wright
  class Resource
    # User resource, represents a user.
    #
    # @example
    #   johndoe = Wright::Resource::User.new('johndoe', home: '/home/johndoe')
    #   johndoe.create
    class User < Wright::Resource
      # @return [Integer] the user's intended user id
      attr_accessor :uid

      # @return [String] the user's intended full name
      attr_accessor :full_name

      # @return [Array<String>] the user's intended groups
      attr_accessor :groups

      # @return [String] the user's intended shell
      attr_accessor :shell

      # @return [String] the user's intended home directory path
      attr_accessor :home
      alias homedir home

      # @return [String, Integer] the user's intended primary group
      attr_accessor :primary_group
      alias login_group primary_group

      # @return [Bool] true if the user should be a system
      #   user. Ignored if {#uid} is set.
      attr_accessor :system

      # Initializes a user.
      #
      # @param name [String] the user's name
      # @param args [Hash] the arguments
      # @option args [Symbol] :action (:create) the action
      # @option args [Integer] :uid the user's uid
      # @option args [String] :full_name the user's full name
      # @option args [Array<String>] :groups the user's groups
      # @option args [String] :shell the user's shell
      # @option args [String] :home the user's home directory
      # @option args [String] :primary_group the user's primary group
      # @option args [Bool] :system (false) denotes whether the user
      #   should be a system user or not
      def initialize(name, args = {})
        super
        @action        = args.fetch(:action, :create)
        @uid           = args.fetch(:uid, nil)
        @full_name     = args.fetch(:full_name, nil)
        @groups        = args.fetch(:groups, nil)
        @shell         = args.fetch(:shell, nil)
        @home          = fetch_last(args, [:home, :homedir], nil)
        @primary_group = fetch_last(args, [:primary_group, :login_group], nil)
        @system        = args.fetch(:system, false)
      end

      # Creates or updates the user.
      #
      # @return [Bool] true if the user was updated and false
      #   otherwise
      def create
        might_update_resource do
          provider.create
        end
      end

      # Removes the user.
      #
      # @return [Bool] true if the user was updated and false
      #   otherwise
      def remove
        might_update_resource do
          provider.remove
        end
      end

      private

      def fetch_last(hash, candidate_keys, default = nil)
        Wright::Util.fetch_last(hash, candidate_keys, default)
      end
    end
  end
end

Wright::DSL.register_resource(Wright::Resource::User)

user_providers = {
  'debian'  => 'Wright::Provider::User::Gnu',
  'fedora'  => 'Wright::Provider::User::Gnu',
  'rhel'    => 'Wright::Provider::User::Gnu',
  'openbsd' => 'Wright::Provider::User::Openbsd',
  'osx'     => 'Wright::Provider::User::DarwinDirectoryService'
}
Wright::Config[:resources][:user] ||= {}
Wright::Config[:resources][:user][:provider] ||=
  user_providers[Wright::Util.os_family]