Module: VCAP::UserPoolUtil

Defined in:
lib/vcap/user_pools/user_pool_util.rb

Class Method Summary collapse

Class Method Details

.group_from_name(name) ⇒ Object



18
19
20
# File 'lib/vcap/user_pools/user_pool_util.rb', line 18

def group_from_name(name)
  "user-pool-#{name}"
end

.init(logger = nil) ⇒ Object



10
11
12
# File 'lib/vcap/user_pools/user_pool_util.rb', line 10

def init(logger = nil)
  @logger = logger ||  Logger.new(STDOUT)
end

.install_pool(name, size) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/vcap/user_pools/user_pool_util.rb', line 27

def install_pool(name, size)
  raise ArgumentError("pool name must not contain dashes") if name =~ /-/
  group_name = group_from_name(name)

  @logger.info("Creating user pool #{name} with #{size} users.")
  if VCAP::UserOps.group_exists?(group_name)
    raise ArgumentError.new("group #{group_name} already exists")
  end
  VCAP::UserOps.install_group(group_name)
  kill_group_procs(group_name)

  begin
    1.upto(size) do |number|
      user_name = user_from_num(name, number)
      if VCAP::UserOps.user_exists?(user_name)
        VCAP::UserOps.remove_user(user_name)
        @logger.warn("User reset occured for user #{user_name}!")
      end
      @logger.debug("installing user #{user_name}")
      VCAP::UserOps.install_user(user_name, group_name)
    end
  rescue => e
    @logger.error e.to_s
    @logger.error("pool creation failed, cleaning up")
    remove_pool(name)
  end
end

.kill_group_procs(group_name) ⇒ Object



22
23
24
25
# File 'lib/vcap/user_pools/user_pool_util.rb', line 22

def kill_group_procs(group_name)
  @logger.debug("killing all procs in group #{group_name}")
  #XXX -- fixme VCAP::Subprocess.run("pkill -9 -G #{group_name}" , 0)
end

.open_pool(name) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/vcap/user_pools/user_pool_util.rb', line 80

def open_pool(name)
  group_name = group_from_name(name)
  pool_users = Hash.new
  unless VCAP::UserOps.group_exists?(group_name)
    raise ArgumentError.new("no group named #{group_name} exists - can't open pool.")
  end
  Etc.passwd { |u|
    if u.name.split('-')[2] == name
      pool_users[u.name] = {:user_name => u.name, :uid => u.uid, :gid => u.gid}
    end
  }
  pool_users
end

.pool_exists?(name) ⇒ Boolean

Returns:

  • (Boolean)


75
76
77
78
# File 'lib/vcap/user_pools/user_pool_util.rb', line 75

def pool_exists?(name)
  group_name = group_from_name(name)
  VCAP::UserOps.group_exists?(group_name)
end

.pool_listObject



94
95
96
97
98
99
100
101
102
103
# File 'lib/vcap/user_pools/user_pool_util.rb', line 94

def pool_list
  list = []
  Etc.group { |g|
    if ['user','pool'] == g.name.split('-')[0..1]
      list.push(g.name.split('-')[2])
    end
  }
  Etc.endgrent
  list.map {|name| "#{name} #{open_pool(name).size}"}
end

.remove_pool(name) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/vcap/user_pools/user_pool_util.rb', line 55

def remove_pool(name)
  @logger.info("Removing user pool #{name}.")
  group_name = group_from_name(name)
  kill_group_procs(group_name)

  Etc.passwd { |u|
    if u.name.split('-')[2] == name
      @logger.debug "removed user #{u.name}"
      VCAP::UserOps.remove_user(u.name)
    end
  }
  Etc.endpwent

  if VCAP::UserOps.group_exists?(group_name)
    VCAP::UserOps.remove_group(group_name)
  else
    @logger.warn "Pool group #{group_name} missing!!"
  end
end

.user_from_num(name, num) ⇒ Object



14
15
16
# File 'lib/vcap/user_pools/user_pool_util.rb', line 14

def user_from_num(name, num)
  "user-pool-#{name}-#{num}"
end