flant/superhosting

View on GitHub
lib/superhosting/controller/user/group.rb

Summary

Maintainability
A
1 hr
Test Coverage
module Superhosting
  module Controller
    class User
      def _group_get(name:)
        Etc.getgrnam(name)
      rescue ArgumentError => _e
        nil
      end

      def _group_get_users(name:)
        if (group = _group_get(name: name))
          gid = group.gid

          users = []
          Etc.passwd do |user|
            users << user if user.gid == gid
          end
          users
        else
          []
        end
      end

      def _group_get_users_names(name:)
        _group_get_users(name: name).map(&:name)
      end

      def _group_get_system_users(name:)
        if (base_user = _get(name: name))
          _group_get_users(name: name).map { |u| u.name.slice(/(?<=#{name}_).*/) if u.uid != base_user.uid }.compact
        else
          []
        end
      end

      def _group_add(name:)
        debug_operation(desc: { code: :group, data: { name: name } }) do |&blk|
          with_dry_run do |dry_run|
            resp = {}
            if _group_get(name: name).nil?
              resp = command!("groupadd #{name}", debug: false) unless dry_run
              blk.call(code: :added)
            else
              blk.call(code: :ok)
            end
            resp
          end
        end
      end

      def _group_del(name:)
        debug_operation(desc: { code: :group, data: { name: name } }) do |&blk|
          with_dry_run do |dry_run|
            resp = {}
            if _group_get(name: name)
              resp = command!("groupdel #{name}", debug: false) unless dry_run
              blk.call(code: :deleted)
            else
              blk.call(code: :ok)
            end
            resp
          end
        end
      end

      def _group_del_users(name:)
        _group_get_users_names(name: name).each { |user| _del(name: user, group: name) }
      end
    end
  end
end