Commit d7a3f878c984040f478064f7ddabe0bfbfa13d8e
Committed by
Georg Hopp
1 parent
f4221819
initial checkin - nothings final
This is the first checkin for some experiments with net-ldap to create an admin tool for my ldap database (user, groups, domains, mail-aliases and mail-accounts) The final tool should make it ease to add, modify and delete each of these with either a terminal- or a webinterface.
Showing
10 changed files
with
304 additions
and
0 deletions
.gitignore
0 → 100644
1 | +.*.swp | ... | ... |
Group.rb
0 → 100644
MailAccount.rb
0 → 100644
1 | +require 'SystemData' | |
2 | + | |
3 | +class MailAccount < SystemData | |
4 | + attr_accessor :mail, :mailbox | |
5 | + | |
6 | + def initialize(args = {}) | |
7 | + super(args) | |
8 | + | |
9 | + @mail = args[:mail] | |
10 | + @home = args[:home] | |
11 | + @mailbox = args[:mailbox] | |
12 | + end | |
13 | + | |
14 | + def site | |
15 | + @mail.sub(/.*@/, '') | |
16 | + end | |
17 | +end | ... | ... |
MailAlias.rb
0 → 100644
1 | +require 'SystemData' | |
2 | + | |
3 | +class MailAlias < SystemData | |
4 | + attr_accessor :mail, :maildrop, :user | |
5 | + | |
6 | + def initialize(args = {}) | |
7 | + super(args) | |
8 | + | |
9 | + @mail = args[:mail] | |
10 | + @maildrop = args[:maildrop] | |
11 | + @user = args[:user] | |
12 | + end | |
13 | + | |
14 | + def site | |
15 | + @mail.sub(/.*@/, '') | |
16 | + end | |
17 | +end | ... | ... |
Site.rb
0 → 100644
SystemData.rb
0 → 100644
SystemDataBackend.rb
0 → 100644
1 | +require 'User' | |
2 | +require 'Group' | |
3 | +require 'Site' | |
4 | +require 'MailAlias' | |
5 | +require 'MailAccount' | |
6 | + | |
7 | +class SystemDataBackend | |
8 | + | |
9 | + def initialize(backend) | |
10 | + @backend = backend | |
11 | + @data = Hash.new | |
12 | + end | |
13 | + | |
14 | + def users | |
15 | + load(:user) | |
16 | + end | |
17 | + | |
18 | + def groups | |
19 | + load(:group) | |
20 | + end | |
21 | + | |
22 | + def sites | |
23 | + load(:site) | |
24 | + end | |
25 | + | |
26 | + def mailAliases | |
27 | + load(:mailAlias) | |
28 | + end | |
29 | + | |
30 | + def mailAccounts | |
31 | + load(:mailAccount) | |
32 | + end | |
33 | + | |
34 | + def userByName(name) | |
35 | + users.find{|user| user.name == name} | |
36 | + end | |
37 | + | |
38 | + def groupByName(name) | |
39 | + groups.find{|group| group.name == name} | |
40 | + end | |
41 | + | |
42 | + def siteByName(name) | |
43 | + sites.find{|site| site.name == name} | |
44 | + end | |
45 | + | |
46 | + def usersInGroup(group) | |
47 | + case | |
48 | + when group.members.instance_of?(Array): | |
49 | + Hash[group.members.map{|uid| [uid, userByName(uid)] if userByName(uid)}] | |
50 | + when goup.members.nil?: | |
51 | + {} | |
52 | + else | |
53 | + {group.members => userByName(group.members)} if userByName(group.members) | |
54 | + end | |
55 | + end | |
56 | + | |
57 | + def mailAliasesBySite(site) | |
58 | + mailAliases.find_all{|mail| mail.site == site.name} | |
59 | + end | |
60 | + | |
61 | + def mailAccountsBySite(site) | |
62 | + mailAccounts.find_all{|mail| mail.site == site.name} | |
63 | + end | |
64 | + | |
65 | + private | |
66 | + | |
67 | + def load(kind) | |
68 | + load!(kind) if ! @data[kind] | |
69 | + @data[kind] | |
70 | + end | |
71 | + | |
72 | + def load!(kind) | |
73 | + @data[kind] = Array.new | |
74 | + class_str = kind.to_s | |
75 | + class_str[0] = class_str[0..0].capitalize | |
76 | + | |
77 | + @backend.load(kind) do |data| | |
78 | + @data[kind].push( | |
79 | + eval(class_str + '.new(data)') | |
80 | + ) | |
81 | + end | |
82 | + end | |
83 | + | |
84 | +end | ... | ... |
SystemDataBackendLdap.rb
0 → 100644
1 | +require 'active_support/secure_random' | |
2 | +require 'net/ldap' | |
3 | + | |
4 | +class SystemDataBackendLdap | |
5 | + | |
6 | + LDAP_USER_MAP = { | |
7 | + :uid => :name, | |
8 | + :userpassword => :pass, | |
9 | + :uidnumber => :uid, | |
10 | + :gidnumber => :gid, | |
11 | + :loginshell => :shell, | |
12 | + :homedirectory => :home | |
13 | + } | |
14 | + | |
15 | + LDAP_GROUP_MAP = { | |
16 | + :cn => :name, | |
17 | + :gidnumber => :gid, | |
18 | + :memberuid => :members | |
19 | + } | |
20 | + | |
21 | + LDAP_SITE_MAP = {:o => :name} | |
22 | + | |
23 | + LDAP_MAP = { | |
24 | + :user => LDAP_USER_MAP, | |
25 | + :group => LDAP_GROUP_MAP, | |
26 | + :site => LDAP_SITE_MAP | |
27 | + } | |
28 | + | |
29 | + LDAP_FILTER = { | |
30 | + :user => Net::LDAP::Filter::eq('objectClass', 'posixAccount'), | |
31 | + :group => Net::LDAP::Filter::eq('objectClass', 'posixGroup'), | |
32 | + :site => Net::LDAP::Filter::eq('objectClass', 'organization') & | |
33 | + (~Net::LDAP::Filter::eq('o', 'hosting')), | |
34 | + :mailAlias => Net::LDAP::Filter::eq('objectClass', 'mailAlias'), | |
35 | + :mailAccount => Net::LDAP::Filter::eq('objectClass', 'mailAccount') | |
36 | + } | |
37 | + | |
38 | + | |
39 | + def initialize(host, port, baseDn, args={}) | |
40 | + @baseDn = baseDn | |
41 | + @systemDn = 'o=system,' + @baseDn | |
42 | + @hostingDn = 'o=hosting,' + @baseDn | |
43 | + | |
44 | + @systemDn = args[:systemDn] if args[:systemDn] | |
45 | + @hostingDn = args[:hostingDn] if args[:hostingDn] | |
46 | + | |
47 | + @ldap = Net::LDAP.new(:host => host, :port => port) | |
48 | + @ldapData = Hash.new | |
49 | + end | |
50 | + | |
51 | + def load!(kind) | |
52 | + @ldapData[kind] = @ldap.search( | |
53 | + :base => ldapBase(kind), | |
54 | + :filter => LDAP_FILTER[kind] | |
55 | + ) | |
56 | + end | |
57 | + | |
58 | + def load(kind) | |
59 | + load!(kind) if ! @ldapData[kind] | |
60 | + | |
61 | + @ldapData[kind].each do |data| | |
62 | + map = { :dn => :id } | |
63 | + map.merge!(LDAP_MAP[kind]) if LDAP_MAP[kind] | |
64 | + | |
65 | + ydata = { :backend => self } | |
66 | + | |
67 | + data.each do |key,value| | |
68 | + ydata.merge!({ map[key] || key => value.size==1?value[0]:value.to_a }) | |
69 | + end | |
70 | + | |
71 | + yield ydata | |
72 | + end | |
73 | + end | |
74 | + | |
75 | + private | |
76 | + | |
77 | + def ldapBase(kind) | |
78 | + case(kind) | |
79 | + when :user, :group: @systemDn | |
80 | + when :site, :mailAlias, :mailAccount: @hostingDn | |
81 | + end | |
82 | + end | |
83 | + | |
84 | +end | ... | ... |
User.rb
0 → 100644
1 | +require 'SystemData' | |
2 | + | |
3 | +class User < SystemData | |
4 | + attr_accessor :name, :pass, :uid, :gid, :shell, :home | |
5 | + | |
6 | + def initialize(args = {}) | |
7 | + super(args) | |
8 | + | |
9 | + @name = args[:name] | |
10 | + @pass = args[:pass] | |
11 | + @uid = args[:uid] | |
12 | + @gid = args[:gid] | |
13 | + @shell = args[:shell] | |
14 | + @home = args[:home] | |
15 | + end | |
16 | +end | ... | ... |
test_dummy.rb
0 → 100644
1 | +require 'SystemDataBackend' | |
2 | +require 'SystemDataBackendLdap' | |
3 | + | |
4 | +backend = SystemDataBackend.new( | |
5 | + SystemDataBackendLdap.new('host.one.virtual', 389, 'dc=weird-web-workers,dc=org') | |
6 | +) | |
7 | + | |
8 | +backend.users.each do |user| | |
9 | + puts 'user: '+user.name+','+user.uid+','+user.gid+','+user.home | |
10 | +end | |
11 | + | |
12 | +puts | |
13 | + | |
14 | +backend.groups.each do |group| | |
15 | + members = backend.usersInGroup(group) | |
16 | + | |
17 | + puts 'group: '+group.name+','+group.gid | |
18 | + puts ' members:' | |
19 | + group.members.each do |name| | |
20 | + print ' ' + name + ': ' | |
21 | + print members[name].uid + ', ' + members[name].home if members[name] | |
22 | + puts | |
23 | + end | |
24 | + puts | |
25 | +end | |
26 | + | |
27 | +backend.sites.each do |site| | |
28 | + puts 'site: ' + site.name | |
29 | + puts ' MailAliases:' | |
30 | + backend.mailAliasesBySite(site).each{|account| puts ' ' + account.mail} | |
31 | + puts | |
32 | + puts ' MailAccounts:' | |
33 | + backend.mailAccountsBySite(site).each{|account| puts ' ' + account.mail} | |
34 | + puts | |
35 | +end | |
36 | + | |
37 | +backend.mailAliases.each do |mailAlias| | |
38 | + puts 'mailAlias: '+mailAlias.mail.inspect+','+mailAlias.maildrop.inspect | |
39 | +end | |
40 | + | |
41 | +puts | |
42 | + | |
43 | +backend.mailAccounts.each do |mailAccount| | |
44 | + puts 'mailAccount: '+mailAccount.mail.inspect+','+mailAccount.mailbox.inspect | |
45 | +end | |
46 | + | ... | ... |
Please
register
or
login
to post a comment