4
5
2011
6

添加软件仓库到系统的小程序:addrepo(Fedora-Only)

代码已经推送到我的github,这里不再更新了

https://github.com/ekd123/ekode/tree/master/RepoUtilities (还有delrepo)

看ubuntu的一句话添加仓库的命令很眼红,为什么fedora没有?

为了让仓库添加更方便,我花了一个小时写了一个100行的python程序(看来我python才入门,Orz,其实都用在查找怎么下载文件上了)。

刚开始准备用shell写,刚写10行就又用Python写了(想了一会,shell基本上无力高级情况)

(比较丰富的例子,入门python可以看看~)

(本来里面用到了try..catch..,用来处理网址无效的,但是他居然说has no,一怒之下删掉了)

#!/usr/bin/python

## addrepo (GNU LGPLv3+)
## Written by Mike Ma
##
## This file can help you add a repo
## to your system

import os
import getpass
import sys
import urllib

#def var
repo_dir="/etc/yum.repos.d"
type=""
info1=""
info2=""
sfp_header="http://repos.fedorapeople.org/repos"

#def func
def show_usage():
    print ("""Usage: addrepo TYPE INFO [INFO]
TYPE:
     www       download repo from Internet.
                   info1: URL.
     sfp       standard fedora people repo. need two information
                   info1: group name.
                   info2: software name.
     fp        fedora people repo. need two information
                   info1: The username in FedoraPeople.
                   info2: repo file name. (no .repo)""")

def download_by_url(url,filename):
    print ("downloading " + url + " to " + filename)
    data = urllib.urlopen(url).read()
    f = file(filename,"w")
    f.write(data)
    f.close()
    print (data)
    print ("Done. Please check the file (if it's wrong, please delete that file and try the correct URL again)")

def check_http_and_add(url):
    if url.find("http://") == -1:
        return "http://" + url
    return url

def get_filename_from_url(url):
    arr=url.split("/")
    return arr[len(arr)-1]

def check_string(sstr):
    if sstr==None: return False
    if sstr==""  : return False
    return True

def show_error_and_exit_info():
    print ("information is invalid!")
    exit(-1)

# is it fedora?
if os.path.exists("/etc/fedora-release") == False:
    print ("You must run addrepo in Fedora");
    exit(-1)

# arg...
if len(sys.argv) < 3:
    show_usage()
    exit(-1)
if len(sys.argv) > 4:
    print ("Too many arguments")
    show_usage()
    exit (-1)
# is it root?
if getpass.getuser() != "root":
    print ("You must run addrepo as root")
    exit(-1)
# check dir
if os.path.exists(repo_dir) == False:
    print ("Can't find "+repo_dir)
    exit(-1)

############################################
type = sys.argv[1]  # doesn't need to check
info1 = sys.argv[2]
if check_string(info1) == False: show_error_and_exit_info()
if len(sys.argv) == 4: info2 = sys.argv[3]
if check_string(info2) == False: show_error_and_exit_info()

if type == "www":
    print ("Type: Repo from Internet")
    info1 = check_http_and_add(info1)
    download_by_url(info1, repo_dir + "/" + get_filename_from_url(info1))
    exit (0)
elif type == "sfp":
    print ("Type: Standard Fedorapeople.org Repo")
    url = sfp_header+"/"+info1+"/" + info2 + "/fedora-"+info2+".repo"
    download_by_url(url, repo_dir + "/" + get_filename_from_url(url))
    exit (0)
elif type == "fp":
    print ("Type: Non-standard Fedorapeople.org Repo")
    url = "http://"+info1+".fedorapeople.org/"+info2+".repo"
    download_by_url(url, repo_dir + "/" + get_filename_from_url(url))
    exit (0)
else:
    print ("Invalid type")
    show_usage()
    exit (0)

把它丢在/usr/bin下面,命名为addrepo,然后chmod +x addrepo就能用了。

有了这个东东,你就可以这样添加iceplayer的RPM源:

addrepo sfp zhtx iceplayer

(已死,别用)

这样添加chromium源:

addrepo sfp spot chromium

这样安装163源:

addrepo www mirrors.163.com/.help/fedora-163.repo
addrepo www mirrors.163.com/.help/fedora-updates-163.repo

(这里有自动判断有无http://功能)

哇咔咔,很方便吧?

其实我最大的希望是让这个东东成为Fedora的预装组件

如果有py大牛,修改了一定要给我说说啊,我当然也想用更好的~

PS:如果你在非Fedora的Linux上使用,结果会是……嘿嘿

Category: 技术 | Tags: | Read Count: 3439

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Powered by Chito | Hosted at is-Programmer | Theme: Aeros 2.0 by TheBuckmaker.com