星期四, 十二月 07, 2006

crablfs some requirements

lib/cmdline.py 需要变量和环境变量的支持,因此需要 export 内部命令。可能还需要其他一些内部命令。实际上最好有一个比较完善的类 shell 实现,比如 cat >file <<"EOF" 多行输入,当然输入的内容也必须记录。不过还不知道有没有比 python cmd module 更好的替代方案?

另外 cmdline.py 需要 sudo 命令来以 root 身份执行一些操作,因为 userpack fork 子进程并切换到 package user,是一个普通用户。但不同于系统的 sudo 命令,这里需要通过 IPC(进程间通信)来知会父进程执行相关命令。

userpack 切换用户时没有改变 environment 的 $HOME,结果 $HOME 还是 /root,这个需要注意改变。

关于 package admin groups 的支持,目前是 GID 从 950~999,其中 install 为 950,从 /etc/userpack.dirs 读取相关的目录列表并在运行 userpack init 时改变相应目录的权限。而其他的 package admin groups 则不是这样的,比如 GTK 包含 glib2, gtk2, atk,涉及的:
/usr/share/gtk-doc
/usr/share/gtk-doc/html
是由 glib2 安装时执行命令:
chgrp GTK /usr/share/gtk-doc/{,html}
chmod g+w,o+t /usr/share/gtk-doc/{,html}
来解决的。

这造成操作的不一致,并且会有一些潜在的问题,比如安装的顺序。所以现在的想法是,增加一个 /var/crablfs/admins/,其中有 /var/crablfs/admins/{install, GTK, xwindow, alsa, ...} 等文件,即每个 package admin group 一个文件,每个文件即原来的 /etc/userpack.dirs 那样的目录列表,所以 /var/crablfs/admins/install 即原来的 /etc/userpack.dirs。在运行
# userpack init
时会初试化所有的 package admin groups 目录列表。而如果运行:
# userpack init GTK
则只初试化 GTK 这个组的目录列表。

还有一个问题,是当自动执行时,无法从 $HOME/.config 读取(package admin) groups 信息。如:
# upm i -a xfce-4.2.2
会出现权限错误。而:
# upm i -a xfce-4.2.2 -G xwindow
则可以。

原因是,现在所有的配置信息读取步骤都放在 install() 函数中,而不是原来的有 install() 中 fork 子进程后调用的 __user_process(),这时还没有 chdir 到 package user's $HOME,所以不能象之前那样直接设置 confile = '.config',而只能设置为空,因此用户和组配置信息部分会被跳过──当 confile 无效时这一步必须跳过(其他的配置则不能),因为 user/group 可能从命令行得到,也可能直接来自于包的名字。

这个问题目前已经解决。只需要调整一下 home 设置顺序,并在 install() 中重新设置 confile:
109 def install(user='', group='', groups=[], package='', archive='', patches=[]):
......
121 global confile
122
123 try:
124 mo = re.match(pregexp, package)
125 pkgname = mo.group('pkgname')
126 version = mo.group('version')
127 except AttributeError:
128 # 没有匹配
129 strerr = "%s: Not a valid argument, lack of package name or version" % program
130 sys.stderr.write('%s\n' % strerr)
131 sys.exit(1)
132
133 home = os.path.join(homepre, pkgname)
134 # 不使用 version 以方便升级,但注意 home 必须是 pkgname
135 confile = os.path.join(home, '.config')
136
137 # Read user/group name from profile !!!
138 uname = ''
139 gname = ''
140 gnames = ''
141 if os.path.isfile(confile):
142 try:
143 config = open(confile, 'r')
144 optmap = getconf(config, 'norm', 'user', 'group', 'groups')
145 uname = optmap['user']
146 gname = optmap['group']
147 gnames = optmap['groups']
148 config.close()
149 except KeyError:
150 pass
151
152 if not user:
153 if uname: user = '%s' % uname
154 else: user = os.path.join(uprefix, pkgname)
### home = os.path.join(homepre, pkgname)
155 if not group:
156 if gname: group = '%s' % gname
157 else: group = user
158 if not groups:
159 if gnames: groups = gnames.split(',')

没有评论: