Browse Source
initial checkin - nothings final
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.master
10 changed files with 304 additions and 0 deletions
-
1.gitignore
-
14Group.rb
-
17MailAccount.rb
-
17MailAlias.rb
-
9Site.rb
-
16SystemData.rb
-
84SystemDataBackend.rb
-
84SystemDataBackendLdap.rb
-
16User.rb
-
46test_dummy.rb
@ -0,0 +1 @@ |
|||
.*.swp |
|||
@ -0,0 +1,14 @@ |
|||
require 'SystemData' |
|||
|
|||
class Group < SystemData |
|||
attr_accessor :name, :gid, :members |
|||
|
|||
def initialize(args = {}) |
|||
super(args) |
|||
|
|||
@name = args[:name] |
|||
@gid = args[:gid] |
|||
@members = args[:members] |
|||
@members = Array.new if @members.nil? |
|||
end |
|||
end |
|||
@ -0,0 +1,17 @@ |
|||
require 'SystemData' |
|||
|
|||
class MailAccount < SystemData |
|||
attr_accessor :mail, :mailbox |
|||
|
|||
def initialize(args = {}) |
|||
super(args) |
|||
|
|||
@mail = args[:mail] |
|||
@home = args[:home] |
|||
@mailbox = args[:mailbox] |
|||
end |
|||
|
|||
def site |
|||
@mail.sub(/.*@/, '') |
|||
end |
|||
end |
|||
@ -0,0 +1,17 @@ |
|||
require 'SystemData' |
|||
|
|||
class MailAlias < SystemData |
|||
attr_accessor :mail, :maildrop, :user |
|||
|
|||
def initialize(args = {}) |
|||
super(args) |
|||
|
|||
@mail = args[:mail] |
|||
@maildrop = args[:maildrop] |
|||
@user = args[:user] |
|||
end |
|||
|
|||
def site |
|||
@mail.sub(/.*@/, '') |
|||
end |
|||
end |
|||
@ -0,0 +1,9 @@ |
|||
require 'SystemData' |
|||
|
|||
class Site < SystemData |
|||
attr_accessor :name, :mailAccounts, :mailAliases |
|||
|
|||
def initialize(args = {}) |
|||
@name = args[:name] |
|||
end |
|||
end |
|||
@ -0,0 +1,16 @@ |
|||
class SystemData |
|||
attr_reader :id |
|||
|
|||
def initialize(args = {}) |
|||
@backend = args[:backend] |
|||
@id = args[:id] |
|||
end |
|||
|
|||
def save |
|||
if @id |
|||
@backend.update(self) |
|||
else |
|||
@backend.insert(self) |
|||
end |
|||
end |
|||
end |
|||
@ -0,0 +1,84 @@ |
|||
require 'User' |
|||
require 'Group' |
|||
require 'Site' |
|||
require 'MailAlias' |
|||
require 'MailAccount' |
|||
|
|||
class SystemDataBackend |
|||
|
|||
def initialize(backend) |
|||
@backend = backend |
|||
@data = Hash.new |
|||
end |
|||
|
|||
def users |
|||
load(:user) |
|||
end |
|||
|
|||
def groups |
|||
load(:group) |
|||
end |
|||
|
|||
def sites |
|||
load(:site) |
|||
end |
|||
|
|||
def mailAliases |
|||
load(:mailAlias) |
|||
end |
|||
|
|||
def mailAccounts |
|||
load(:mailAccount) |
|||
end |
|||
|
|||
def userByName(name) |
|||
users.find{|user| user.name == name} |
|||
end |
|||
|
|||
def groupByName(name) |
|||
groups.find{|group| group.name == name} |
|||
end |
|||
|
|||
def siteByName(name) |
|||
sites.find{|site| site.name == name} |
|||
end |
|||
|
|||
def usersInGroup(group) |
|||
case |
|||
when group.members.instance_of?(Array): |
|||
Hash[group.members.map{|uid| [uid, userByName(uid)] if userByName(uid)}] |
|||
when goup.members.nil?: |
|||
{} |
|||
else |
|||
{group.members => userByName(group.members)} if userByName(group.members) |
|||
end |
|||
end |
|||
|
|||
def mailAliasesBySite(site) |
|||
mailAliases.find_all{|mail| mail.site == site.name} |
|||
end |
|||
|
|||
def mailAccountsBySite(site) |
|||
mailAccounts.find_all{|mail| mail.site == site.name} |
|||
end |
|||
|
|||
private |
|||
|
|||
def load(kind) |
|||
load!(kind) if ! @data[kind] |
|||
@data[kind] |
|||
end |
|||
|
|||
def load!(kind) |
|||
@data[kind] = Array.new |
|||
class_str = kind.to_s |
|||
class_str[0] = class_str[0..0].capitalize |
|||
|
|||
@backend.load(kind) do |data| |
|||
@data[kind].push( |
|||
eval(class_str + '.new(data)') |
|||
) |
|||
end |
|||
end |
|||
|
|||
end |
|||
@ -0,0 +1,84 @@ |
|||
require 'active_support/secure_random' |
|||
require 'net/ldap' |
|||
|
|||
class SystemDataBackendLdap |
|||
|
|||
LDAP_USER_MAP = { |
|||
:uid => :name, |
|||
:userpassword => :pass, |
|||
:uidnumber => :uid, |
|||
:gidnumber => :gid, |
|||
:loginshell => :shell, |
|||
:homedirectory => :home |
|||
} |
|||
|
|||
LDAP_GROUP_MAP = { |
|||
:cn => :name, |
|||
:gidnumber => :gid, |
|||
:memberuid => :members |
|||
} |
|||
|
|||
LDAP_SITE_MAP = {:o => :name} |
|||
|
|||
LDAP_MAP = { |
|||
:user => LDAP_USER_MAP, |
|||
:group => LDAP_GROUP_MAP, |
|||
:site => LDAP_SITE_MAP |
|||
} |
|||
|
|||
LDAP_FILTER = { |
|||
:user => Net::LDAP::Filter::eq('objectClass', 'posixAccount'), |
|||
:group => Net::LDAP::Filter::eq('objectClass', 'posixGroup'), |
|||
:site => Net::LDAP::Filter::eq('objectClass', 'organization') & |
|||
(~Net::LDAP::Filter::eq('o', 'hosting')), |
|||
:mailAlias => Net::LDAP::Filter::eq('objectClass', 'mailAlias'), |
|||
:mailAccount => Net::LDAP::Filter::eq('objectClass', 'mailAccount') |
|||
} |
|||
|
|||
|
|||
def initialize(host, port, baseDn, args={}) |
|||
@baseDn = baseDn |
|||
@systemDn = 'o=system,' + @baseDn |
|||
@hostingDn = 'o=hosting,' + @baseDn |
|||
|
|||
@systemDn = args[:systemDn] if args[:systemDn] |
|||
@hostingDn = args[:hostingDn] if args[:hostingDn] |
|||
|
|||
@ldap = Net::LDAP.new(:host => host, :port => port) |
|||
@ldapData = Hash.new |
|||
end |
|||
|
|||
def load!(kind) |
|||
@ldapData[kind] = @ldap.search( |
|||
:base => ldapBase(kind), |
|||
:filter => LDAP_FILTER[kind] |
|||
) |
|||
end |
|||
|
|||
def load(kind) |
|||
load!(kind) if ! @ldapData[kind] |
|||
|
|||
@ldapData[kind].each do |data| |
|||
map = { :dn => :id } |
|||
map.merge!(LDAP_MAP[kind]) if LDAP_MAP[kind] |
|||
|
|||
ydata = { :backend => self } |
|||
|
|||
data.each do |key,value| |
|||
ydata.merge!({ map[key] || key => value.size==1?value[0]:value.to_a }) |
|||
end |
|||
|
|||
yield ydata |
|||
end |
|||
end |
|||
|
|||
private |
|||
|
|||
def ldapBase(kind) |
|||
case(kind) |
|||
when :user, :group: @systemDn |
|||
when :site, :mailAlias, :mailAccount: @hostingDn |
|||
end |
|||
end |
|||
|
|||
end |
|||
@ -0,0 +1,16 @@ |
|||
require 'SystemData' |
|||
|
|||
class User < SystemData |
|||
attr_accessor :name, :pass, :uid, :gid, :shell, :home |
|||
|
|||
def initialize(args = {}) |
|||
super(args) |
|||
|
|||
@name = args[:name] |
|||
@pass = args[:pass] |
|||
@uid = args[:uid] |
|||
@gid = args[:gid] |
|||
@shell = args[:shell] |
|||
@home = args[:home] |
|||
end |
|||
end |
|||
@ -0,0 +1,46 @@ |
|||
require 'SystemDataBackend' |
|||
require 'SystemDataBackendLdap' |
|||
|
|||
backend = SystemDataBackend.new( |
|||
SystemDataBackendLdap.new('host.one.virtual', 389, 'dc=weird-web-workers,dc=org') |
|||
) |
|||
|
|||
backend.users.each do |user| |
|||
puts 'user: '+user.name+','+user.uid+','+user.gid+','+user.home |
|||
end |
|||
|
|||
puts |
|||
|
|||
backend.groups.each do |group| |
|||
members = backend.usersInGroup(group) |
|||
|
|||
puts 'group: '+group.name+','+group.gid |
|||
puts ' members:' |
|||
group.members.each do |name| |
|||
print ' ' + name + ': ' |
|||
print members[name].uid + ', ' + members[name].home if members[name] |
|||
puts |
|||
end |
|||
puts |
|||
end |
|||
|
|||
backend.sites.each do |site| |
|||
puts 'site: ' + site.name |
|||
puts ' MailAliases:' |
|||
backend.mailAliasesBySite(site).each{|account| puts ' ' + account.mail} |
|||
puts |
|||
puts ' MailAccounts:' |
|||
backend.mailAccountsBySite(site).each{|account| puts ' ' + account.mail} |
|||
puts |
|||
end |
|||
|
|||
backend.mailAliases.each do |mailAlias| |
|||
puts 'mailAlias: '+mailAlias.mail.inspect+','+mailAlias.maildrop.inspect |
|||
end |
|||
|
|||
puts |
|||
|
|||
backend.mailAccounts.each do |mailAccount| |
|||
puts 'mailAccount: '+mailAccount.mail.inspect+','+mailAccount.mailbox.inspect |
|||
end |
|||
|
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue