About
Newer posts are loading.
You are at the newest post.
Click here to check if anything new just came in.
Click here to check if anything new just came in.
February 09 2011
October 26 2010
导出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)
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()
September 02 2010
August 26 2010
个位人数的小团队最好。有个说法,是一个人管理七个人是最合适的,再多就无法保证了。 RT @laiyonghao: 大赞这篇文章!《别为大公司拼命》 www.ruanyifeng.com/...
写得不错,不过重点不在于TDD吧,这是测试的全面介绍吧 RT @zoomq: TDD@Python :http://is.gd/eERuv
RT @CNBorn: 8.28 Beijing #OpenParty "清雨榕香" 活动话题现已发布,包括淘宝Scrum实践、豆瓣Chrome应用、百度地图API、读书会等话题,欢迎各位朋友报名参与。报名地址: http://app.beijing-open-party ...
August 25 2010
恩,这个小站装修的好! RT @pengyu: site.douban.com/... 这个小站很赞阿
August 23 2010
给程序员的歌曲:Code Monkey, www.douban.com/... 在这里下载: www.jonathancoulton.com/...
August 17 2010
太悲剧了,DNS设置错误,邮件服务堵了好几天的信都没发出去。狂刷邮件队列中
RT @delphij: Debian celebrates its 17th birthday http://thank.debian.net/
August 16 2010
玩了会儿同事的iphone4,震撼了
August 13 2010
RT @khsing: 到到网诚聘男女PHP程序员和前端工程师,如有意者请与我联系,无意者请帮RT。 www.daodao.com
August 09 2010
在豆瓣举办BPUG活动,欢迎北京的pythoner来捧场 http://bit.ly/btImEg
August 02 2010
实践证明,svn的本地目录结构太臃肿了,用内存文件系统能极大提高本地svn操作的速度
August 01 2010
unix里写shell脚本取目录的real path,一般用readlink -f <dir>。可惜这命令在osx里不兼容。偶然想起bash里的pushd/popd,这个命令会输出真实路径,这在各个系统里行为都一致!但是,home目录会转义成~。
java/python启动网络服务、连接网络服务时,出现莫名的情况。最后发现是/etc/hosts里把ipv6定义的::1 localhost放到ipv4的127.0.0.1 localhost前面了。。
上youtube看了南京大爆炸的视频,太可怕了,周围所有树叶全部掉光,砖房都成了砖头堆
今天人品大爆发,竟然正点坐上了火车。最近四个周末,碰到的京九线所有列车全都晚点。早前火车站还说是因为水灾,最近两周连误点的原因也搞不清楚了
July 28 2010
Older posts are this way
If this message doesn't go away, click anywhere on the page to continue loading posts.
Could not load more posts
Maybe Soup is currently being updated? I'll try again automatically in a few seconds...
Maybe Soup is currently being updated? I'll try again automatically in a few seconds...
Just a second, loading more posts...
You've reached the end.
