Skip to content

Commit 0c95f7d

Browse files
DEFERME BertValantin
authored andcommitted
Zabbix user provider
1 parent 919619d commit 0c95f7d

File tree

2 files changed

+261
-0
lines changed

2 files changed

+261
-0
lines changed
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
# frozen_string_literal: true
2+
3+
require_relative '../zabbix'
4+
Puppet::Type.type(:zabbix_user).provide(:ruby, parent: Puppet::Provider::Zabbix) do
5+
confine feature: :zabbixapi
6+
7+
def initialize(value = {})
8+
super(value)
9+
@property_flush = {}
10+
end
11+
12+
def get_id(username)
13+
zbx.users.get_raw(filter: { username: username }, output: 'userid')[0]['userid']
14+
end
15+
16+
def get_user_by_name(username)
17+
api_user = zbx.users.get_raw(filter: { username: username }, selectUsrgrps: 'extend')
18+
if api_user.empty?
19+
nil
20+
else
21+
{
22+
username: api_user[0]['username'],
23+
firstname: api_user[0]['name'],
24+
surname: api_user[0]['surname'],
25+
autologin: api_user[0]['autologin'],
26+
role: zbx.roles.get_raw(filter: { roleid: api_user[0]['roleid'] })[0]['name'],
27+
usrgrps: api_user[0]['usrgrps'].map { |h| h['name'] }.compact,
28+
}
29+
end
30+
end
31+
32+
def user
33+
@user ||= get_user_by_name(resource[:username])
34+
@user
35+
end
36+
37+
attr_writer :user
38+
39+
def username
40+
user[:username]
41+
end
42+
43+
def username=(value)
44+
@property_flush[:username] = value
45+
end
46+
47+
def passwd
48+
nil
49+
end
50+
51+
def passwd=(value)
52+
@property_flush[:passwd] = value
53+
end
54+
55+
def firstname
56+
user[:firstname]
57+
end
58+
59+
def firstname=(value)
60+
@property_flush[:name] = value
61+
end
62+
63+
def surname
64+
user[:surname]
65+
end
66+
67+
def surname=(value)
68+
@property_flush[:surname] = value
69+
end
70+
71+
def autologin
72+
user[:autologin]
73+
end
74+
75+
def autologin=(int)
76+
@property_flush[:autologin] = int
77+
end
78+
79+
def role
80+
user[:role]
81+
end
82+
83+
def role=(value)
84+
@property_flush[:role] = value
85+
end
86+
87+
def usrgrps
88+
user[:usrgrps]
89+
end
90+
91+
def usrgrps=(array)
92+
@property_flush[:usrgrps] = array
93+
end
94+
95+
def flush
96+
if @property_flush[:ensure] == :absent
97+
delete_user
98+
return
99+
end
100+
101+
return if @property_flush.empty?
102+
103+
update_user
104+
end
105+
106+
def update_user
107+
# Get roleid if needs updating
108+
unless @property_flush[:role].nil?
109+
@property_flush[:roleid] = zbx.roles.get_id(name: @property_flush[:role])
110+
@property_flush.delete(:role)
111+
end
112+
# Get usrgrpids if need updating
113+
unless @property_flush[:usrgrps].nil?
114+
usrgrp_ids = zbx.usergroups.get_raw(filter: { name: @property_flush[:usrgrps] }, output: 'usrgrpid')
115+
@property_flush[:usrgrps] = usrgrp_ids
116+
end
117+
zbx.query(
118+
method: 'user.update',
119+
params: {
120+
userid: get_id(@resource[:username]),
121+
}.merge(@property_flush)
122+
)
123+
end
124+
125+
def delete_user
126+
zbx.users.delete(get_id(@resource[:username]))
127+
end
128+
129+
def check_password
130+
protocol = api_config['default']['apache_use_ssl'] == 'true' ? 'https' : 'http'
131+
begin
132+
zbx_check = ZabbixApi.connect(
133+
url: "#{protocol}://#{api_config['default']['zabbix_url']}/api_jsonrpc.php",
134+
user: @resource[:username],
135+
password: @resource[:passwd],
136+
http_user: @resource[:username],
137+
http_password: @resource[:passwd],
138+
ignore_version: true
139+
)
140+
rescue ZabbixApi::ApiError
141+
ret = false
142+
else
143+
ret = true
144+
zbx_check.query(method: 'user.logout', params: {})
145+
end
146+
ret
147+
end
148+
149+
def create
150+
# Get role id
151+
roleid = zbx.roles.get_id(name: @resource[:role])
152+
# Get usrgrp ids
153+
usrgrps = @resource[:usrgrps].empty? ? {} : zbx.usergroups.get_raw(filter: { name: @resource[:usrgrps] }, output: 'usrgrpid')
154+
155+
zbx.users.create(
156+
username: @resource[:username],
157+
name: @resource[:firstname],
158+
surname: @resource[:surname],
159+
autologin: @resource[:autologin].nil? ? 0 : @resource[:autologin],
160+
roleid: roleid,
161+
usrgrps: usrgrps,
162+
passwd: @resource[:passwd]
163+
)
164+
end
165+
166+
def exists?
167+
user
168+
end
169+
170+
def destroy
171+
@property_flush[:ensure] = :absent
172+
end
173+
end

lib/puppet/type/zabbix_user.rb

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# frozen_string_literal: true
2+
3+
Puppet::Type.newtype(:zabbix_user) do
4+
@doc = %q("Manage zabbix users
5+
6+
zabbix_user{ 'username':
7+
ensure => present,
8+
firstname => 'firstname',
9+
surname => 'surname',
10+
passwd => Sensitive(password),
11+
autologin => 0,
12+
role => 'Admin role',
13+
usrgrps => [ 'Group1' ],
14+
}")
15+
16+
ensurable do
17+
defaultvalues
18+
defaultto :present
19+
end
20+
21+
newparam(:username, namevar: true) do
22+
desc 'user name'
23+
validate do |value|
24+
raise ArgumentError, 'username must be a string' unless value.is_a?(String)
25+
end
26+
end
27+
28+
newproperty(:firstname) do
29+
desc 'user firstname'
30+
validate do |value|
31+
raise ArgumentError, 'firstname must be a string' unless value.is_a?(String)
32+
end
33+
end
34+
35+
newproperty(:surname) do
36+
desc 'user surname'
37+
validate do |value|
38+
raise ArgumentError, 'surname must be a string' unless value.is_a?(String)
39+
end
40+
end
41+
42+
newproperty(:passwd) do
43+
desc 'user password'
44+
def insync?(_is)
45+
provider.check_password
46+
end
47+
end
48+
49+
newproperty(:autologin, boolean: true) do
50+
desc 'Whether auto login is enabled or disabled.'
51+
newvalues(true, false)
52+
defaultto false
53+
54+
munge do |value|
55+
value ? 1 : 0
56+
end
57+
end
58+
59+
newproperty(:role) do
60+
desc 'user role'
61+
defaultto 'User role'
62+
validate do |value|
63+
raise ArgumentError, 'User role must be a string' unless value.nil? || value.is_a?(String)
64+
end
65+
end
66+
67+
newproperty(:usrgrps, array_matching: :all) do
68+
desc 'user groups'
69+
defaultto []
70+
def insync?(is)
71+
is.sort == should.sort
72+
end
73+
end
74+
75+
def set_sensitive_parameters(sensitive_parameters) # rubocop:disable Naming/AccessorMethodName
76+
parameter(:passwd).sensitive = true if parameter(:passwd)
77+
super(sensitive_parameters)
78+
end
79+
80+
validate do
81+
required_properties = %i[firstname surname usrgrps]
82+
required_properties.each do |property|
83+
raise ArgumentError, "You must provide a #{property}" if self[:ensure] == :present && self[property].nil?
84+
end
85+
end
86+
87+
autorequire(:file) { '/etc/zabbix/api.conf' }
88+
end

0 commit comments

Comments
 (0)