如何创建自己的Ubuntu软件源?

每当你发布新软件包时,你都需要通知用户,用户也需要重新手动下载并安装这些软件包。你可以通过创建一个自己的软件源来改变这一切,这样用户只需要设置一下你的软件源,当你发布新软件包时,用户只需要确认更新即可,方便多啦。

前提条件
你需要有一个HTTP空间或匿名的FTP空间,如果你还没有那么先不要继续阅读了。

开始创建
创建过程实在是太简单了,只需要运行一下下面的脚本程序来在本地创建源的一些目录,然后向里面增加软件包,更新一下软件包的索引,再上传至HTTP空间或FTP空间里即可。
命令:

$ mkdir ubuntu        # 新建一个源根目录
$ ./ownss gendir ubuntu   # 运行下面的脚本程序创建源目录
$ ./ownss genrel ubuntu   # 进行下面的脚本程序创建源的 Release 文件
# 向 ubuntu/pool/ 的一些子目录里增加软件包
$ ./ownss update ubuntu   # 更新软件包索引
# 向空间里上传

用户增加源:
Ubuntu 8.04 用户

deb 空间的URL/ubuntu/ hardy main

例如我的源

deb http://archive.heihaier.org/ubuntu/ hardy main

Ubuntu 8.10 用户

deb 空间的URL/ubuntu/ intrepid main

例如我的源

deb http://archive.heihaier.org/ubuntu/ intrepid main
#!/usr/bin/env python
# Update
 
import os
import sys
 
dists = ['hardy', 'intrepid']
sections = ['main', 'universe', 'multiverse', 'restricted']
binary_archs = ['binary-i386', 'binary-amd64']
 
def update(dir):
	for a in dists:
		for b in sections:
			for c in binary_archs:
				path = dir + '/dists/' + a + '/' + b + '/' + c
				if os.path.exists(path):
					print '#### Updating ' + path + ' ####'
					if c == "binary-i386":
						os.system('dpkg-scanpackages -a i386 ' + dir + '/pool/' + b + ' /dev/null | gzip -9 > ' + path + '/Packages.gz')
					else:
						os.system('dpkg-scanpackages -a amd64 ' + dir + '/pool/' + b + ' /dev/null | gzip -9 > ' + path + '/Packages.gz')
 
def gendir(dir):
	os.mkdir(dir + '/dists')
	for a in dists:
		os.mkdir(dir +'/dists/' + a)
		for b in sections:
			os.mkdir(dir + '/dists/' + a + '/' + b)
			for c in binary_archs:
				os.mkdir(dir + '/dists/' + a + '/' + b + '/' + c)
 
	os.mkdir(dir + '/pool')
	for b in sections:
		os.mkdir(dir + '/pool/' + b)
 
def genrel(dir):
	for a in dists:
		for b in sections:
			for c in binary_archs:
				buf = "Archive: " + a + "\nComponent: " + b + "\nLabel: Ubuntu\n"
				if c == "binary-i386":
					buf = buf + "Architecture: i386"
				else:
					buf = buf + "Architecture: amd64"
				path = dir + '/dists/' + a + '/' + b + '/' + c + '/Release'
				f = open(path, 'w')
				f.write(buf)
				f.close()
 
def showhelp():
	print 'ownss [gendir|genrel|update] dir'
 
def main():
	if len(sys.argv) != 3:
		showhelp()
		return
	if sys.argv[1] == 'gendir':
		gendir(sys.argv[2])
	elif sys.argv[1] == 'genrel':
		genrel(sys.argv[2])
	elif sys.argv[1] == 'update':
		update(sys.argv[2])
	else:
		showhelp()
 
main()

Leave a Reply

Your email address will not be published. Required fields are marked *