使用tcl语言unknown指令操作形如LDAP的dn形式对象的方法

这是很久之前的一个工作了,简单回忆下思路。

我们的某系统中以树的形式保存了复杂系统的各种配置信息,并且给每个节点分配了形如LDAP的dn那样的名字,这就是一个dn:cn=somenone,ou=Group,dc=example,dc=com,但是我们把这个顺序反过来了,这样更符合国人的思考方式吧,就成了dc=com,dc=example,ou=Group,cn=somenone。这个系统又基本以增删改查的形式提供管理接口,以及别的一些管理接口。我们就以此为基础对常用功能开发了一套更简单的管理方法,使用的语言就是tcl,充分利用了tcl提供的expect等优秀功能,特别是我直接利用了tcl的unknown。使用unknown的机制给我们的dn添加各种动作,等于实现了它的对象化。
举例:

# Group中增加一个名为newuser的人
dc=com,dc=example,ou=Group.AddUser newuser
# 实际上我们的对象都是查出来的或根据规则动态生成的
set mygroup dc=com,dc=example,ou=Group
# 那之前增加用户的指令就成了
$mygroup.AddUser newuser

set userobj $mygroup,cn=newuser
# 修改年龄
$userobj.SetAttribute age 23

这里面就用了unknown,因为形如dc=com,dc=example,ou=Group.AddUser这个命令肯定查不到啊,我们定制个unknown处理函数,检查一下命令的格式,发现它符合我们的规则,就调用我们为它写的专门的处理函数。那处理函数在哪里呢?这点我们肯定也要采取些技巧了啊。
把它写在ou.tcl里,当然对于dc=com,dc=example,ou=Group,cn=newuser我们就写在cn.tcl中。这里我们补充一下,我们的系统里并不会出现LDAP这样有两级都叫dc,树的每一层都是不同的类型。这样我们只需要检查一下dn最终那一级是什么类型就去加载相应的tcl文件进来就可以了。那这个tcl文件就有dc=com,dc=example,ou=Group.AddUser这个命令么?当然没有了,这个dn好多呢,怎么可能每个都写一个过程呢。dc=com,dc=example,ou=Group.AddUser newuser这个命令被我们的unknown处理函数翻译成了AddUser dc=com,dc=example,ou=Group newuser,哦,原来那个函数叫AddUser,就放在ou.tcl文件里,轻松多了吧。

真他娘的的是个人才!

使用LDAP管理ssh登陆的key

无论如何先配置一个LDAP服务器,账号管理比较方便,几乎各种网络应用都支持LDAP,这样就可直接使用统一的账号体系。
但是注意,下面的账号并不是个人的LDAP账号,而是针对的登陆主机上的账号,一般使用posixAccount类,而一般的只能登陆网络应用的账号体系使用的是inetOrgPerson类。关键点我在/etc/ldap.conf中注释。 继续阅读使用LDAP管理ssh登陆的key