2010-10-27

导出Google Apps里所有的用户组和组员

Google Apps的管理功能很不错,但用户组多了不好管理,时常要拿出来晒晒,调整一下结构。这就经常需要把所有组和组员列出来,幸亏Google提供了API,懒人的办法就是用脚本搞定。下面是python示例,输出比较简单。知道了如何做,你可以自己改成输出csv或者任何其他格式,都会容易。多说无益,上代码。

#!/usr/bin/env python
# Author: xieyanbo@gmail.com
# dump_google_apps_mail_groups.py
# export mail groups and group members from Google Apps service

import gdata.apps.groups.service

def print_all_members(email, domain, password):
group_service = gdata.apps.groups.service.GroupsService(email=email,
domain=domain, password=password)
group_service.ProgrammaticLogin()

def print_members(group_id):
for user in group_service.RetrieveAllMembers(group_id):
print user['memberId']

def shrink(str, max=20):
if not str:
return ''
str = str.replace('\n', ' ').strip().decode('utf8')
if len(str) > max:
short = str[:max-3] + '...'
else:
short = str
return str.encode('utf8')

def print_groups(groups):
for group in groups:
gid = group['groupId']
print '%s, %s, %s' % (gid, group['groupName'],
shrink(group['description']))
print '='*60
print_members(gid)
print

groups = group_service.RetrieveAllGroups()
print_groups(groups)

def main():
from optparse import OptionParser
parser = OptionParser()

parser.add_option('-e', '--email')
parser.add_option('-d', '--domain')
parser.add_option('-p', '--password')
options, args = parser.parse_args()

if not options.email:
parser.error('need email address to login')
if not options.domain:
parser.error('need domain to login')
if not options.password:
import getpass
password = getpass.getpass('Password: ')
else:
password = options.password or login
print_all_members(options.email, options.domain, password)

if __name__ == '__main__':
main()

2010-07-07

在Gentoo里调试新软件包

最近又开始研究web测试的技术,迷上了西门子开发的robot framework。不过服务器用的Gentoo上还没有这东西,只好自力更生。所以先记录一下给Gentoo添加新软件包的过程,下次也好照抄,以后再说robot framework有多好。

Gentoo的包管理器叫做Portage,描述文件叫Portfile。现在的portage很讲究目录结构,就是Gentoo里的PORTDIR structure,所谓category。robot framework是用python开发的,照例是在dev-python下的某个目录中。没想到的是,现在ebuild对目录的检查很严格,即使在调试时安装本地的portfile也要遵循该结构:
mkdir -p dev-python/robotframework
mv robotframework-2.5.ebuild dev-python/robotframework/
cd dev-python/robotframework


然后利用底层的ebuild包管理命令,对本地包生成数字摘要、测试安装和部署:
sudo ebuild robotframework-2.5.ebuild digest
sudo ebuild robotframework-2.5.ebuild install
sudo ebuild robotframework-2.5.ebuild qmerge

digest是最近新增加的指令?有这个命令省事多了,调试起来很happy。

调试过程需要反复修改,得删除已经用qmerge安装到系统目录中的文件,以及portfile的缓存:
sudo emerge -C robotframework-2.5
sudo rm -rf /var/tmp/portage/dev-python/robotframework-2.5/


把dev-python/robotframework和dev-python/robotframework-seleniumlibrary向Gentoo提交了,不知道审核要多久。

完。