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