Linux内核补丁批量自动下载工具
Linux kernel官网cgit工具不支持按变更代码进行补丁搜索,想到个办法就是把补丁都抓下来,这样可以在本地搜索。花了2个小时写了个小工具,话不多说,直接看效果:
E:\docs\TOOLS\python\patch_spider>python patch_spider.py linux-3.10.y fs/ubifs 2013-08-15:
get patches info...
2016-08-27 eed1a4028c96cabb79747ee01e17b1057b01027c UBIFS: Implement ->migratepage()
2014-11-14 6f1aec53eded9399e6b44cab8c9aa36c65a8f402 UBIFS: fix free log space calculation
2014-11-14 918ecf66a11bb3bdc818a264319dcaf984c11a3f UBIFS: fix a race condition
2014-11-14 c4e70e76860cc84cebd719fbd89637fdd226cf94 UBIFS: remove mst_mutex
2014-07-07 6f02490b96062bdd8a7914e1287a70c5a01d6a3d UBIFS: Remove incorrect assertion in shrink_tnc()
2014-07-07 ac8df9ec7b4e25b87d5a71dfd9af4d8076d66bff UBIFS: fix an mmap and fsync race condition
saving patches into...
[1/6] save fs_ubifs\UBIFS__Implement___gt_migratepage__.patch
[2/6] save fs_ubifs\UBIFS__fix_free_log_space_calculation.patch
[3/6] save fs_ubifs\UBIFS__fix_a_race_condition.patch
[4/6] save fs_ubifs\UBIFS__remove_mst_mutex.patch
[5/6] save fs_ubifs\UBIFS__Remove_incorrect_assertion_in_shrink_tnc__.patch
[6/6] save fs_ubifs\UBIFS__fix_an_mmap_and_fsync_race_condition.patch
done
源码
#!/usr/bin/python
# -*- coding: utf-8 -*-
######################################################################
# Purpose: auto download kernel module patch from offical web
# Useage: ./patch_spider.py
# example: patch_spider.py linux-3.10.y fs/ubifs 2013-08-15:2016-11-11
# Version: Initial Version by Alex
###################################################################### import httplib, urllib, urllib2
import sys, os
import datetime
import re DEBUG = 0
if DEBUG: from pprint import * class PatchSpider(object):
def __init__(self):
pass def run(self):
# main function
print 'get patches info...'
patch_ids = self.get_patch_id()
print 'saving patches into...'
ret = self.save_patch_file(patch_ids)
print 'done' return 0 def get_patch_id(self):
# get online data
response_data = []
urlstr = "http://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/log/%s?h=%s&ofs=%d"
dt_format = '%Y-%m-%d' start, end = args['date-range'].split(':')
if not start.strip(): start = datetime.datetime.now().strftime(dt_format)
if not end.strip(): end = datetime.datetime.now().strftime(dt_format)
dt_start = datetime.datetime.strptime(start, dt_format)
dt_end = datetime.datetime.strptime(end, dt_format) for ofs in range(0, 10000, 50):
url = urlstr % (args['module'], args['version'], ofs)
req = urllib2.Request(url) try:
response = urllib2.urlopen(req).read() for item in self.extract_from(response):
date, id, msg = item
dt_date = datetime.datetime.strptime(date, dt_format)
if dt_start <= dt_date <= dt_end:
print date, id, msg
response_data.append(item)
else:
return response_data except urllib2.HTTPError, e:
print('HTTPError = ' + str(e.code))
except urllib2.URLError, e:
print('URLError = ' + str(e.reason))
except httplib.HTTPException, e:
print('HTTPException')
except Exception:
raise return response_data def save_patch_file(self, l):
format = 'http://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/patch/%s?id=%s'
folder = self.assemble_path(args['module']) if os.path.exists(folder):
print '%s existed, please backup your data!' %folder
return -1
else:
os.makedirs(folder) log = ["%s %s %s\n" %(i[0],i[1],i[2]) for i in l]
open(os.path.join(folder, 'patches.log'), 'w').writelines(log) total = len(l)
for index, item in enumerate(l): _,id,msg = item
patch = format % (args['module'], id)
file = os.path.join(folder, self.assemble_path(msg) + '.patch') urllib.urlretrieve(patch, file)
print "[%d/%d] save %s" %(index+1, total, file) def extract_from(self, html):
res = r"""<tr><td>.*?
<span\ title.*?>(?P<date>\d+-\d+-\d+)</span>.*?
<a\ href.*?id=(?P<id>\w+)'>(?P<msg>.*?)</a>.*?
</td></tr>"""
rec = re.compile(res, re.DOTALL|re.VERBOSE)
return re.findall(rec,html) def assemble_path(self, msg):
path = ''
for c in msg:
path += c if c.isalnum() else '_' return path # default args
args = {
"version": "linux-3.10.y",
"module": "fs/ubifs",
"date-range": "2013-08-15:",
} if len(sys.argv) > 1:
args['version'] = sys.argv[1]
if len(sys.argv) > 2:
args['module'] = sys.argv[2]
if len(sys.argv) > 3:
args['date-range'] = sys.argv[3] ret = PatchSpider().run()
sys.exit(ret)
Linux内核补丁批量自动下载工具的更多相关文章
- Linux内核调试的方式以及工具集锦【转】
转自:https://blog.csdn.net/gatieme/article/details/68948080 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...
- Linux内核调试的方式以及工具集锦
原文:https://blog.csdn.net/gatieme/article/details/68948080 CSDN GitHubLinux内核调试的方式以及工具集锦 LDD-LinuxDev ...
- linux下常用网页查看下载工具--wget
http://www.linuxidc.com/Linux/2015-06/118256.htm 5 个基于Linux命令行的文件下载和网站浏览工具 rTorrent.wget.cURL.w3m.El ...
- Linux内核补丁升级
如果机器已经联网,直接利用包管理工具更新,需要注意的是现在3.0以上的内核引入了签名机制,需要导入签名的key,参考步骤如下: 1.导入keyrpm --import https://www.elre ...
- Linux部署之批量自动安装系统之TFTP篇
1. 安装:yum install tftp-server –y 2. 配置tftp文件开启tftp功能 3. 开启依赖服务xinetd 4 ...
- linux内核开源代码地址下载
https://www.kernel.org/pub/linux/kernel/v2.6/
- Linux部署之批量自动安装系统之测试篇
1. 客户端从网络启动如下 2. 复制vesamenu.c32文件可解决上面的问题 3. 客户端再次启动 4. 选择第一个进 ...
- Linux部署之批量自动安装系统之Kickstart篇
1. 安装 2. 在桌面环境下啊配置 3. Kickstart之基本配置 4. Kickstart之安装方法 5. ...
- Linux部署之批量自动安装系统之NFS篇
1. 编辑配置文件让远端设备可访问vim /etc/exports 2. 启动服务
随机推荐
- HDU5934 强连通分量
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5934 根据距离关系建边 对于强连通分量来说,只需引爆话费最小的炸弹即可引爆整个强连通分量 将所有的强连通分 ...
- C#实现快速排序
网上很多关于快速排序的教程,嗯,不错,版本也很多,有的试了一下还报错..呵呵 于是乎低智商的朕花了好几天废了8张草稿纸才弄明白.. 快速排序的采用的分治啊挖坑填数啊之类的网上到处都是,具体过程自己百度 ...
- org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [XXX] in DispatcherServlet with name 'springMVC'
在web.xml中添加 <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern ...
- 《PHP数组函数》笔记
① in_array() 检查数组中是否存在某个值;有两个参数,第一个参数是要查找的值,第二个参数是数组名,返回值为布尔,找到则ture否则false; ② array_search 在数组中搜索给定 ...
- 额。。万恶之源就是c
http://blog.csdn.net/feeltouch/article/details/45155529
- Google Code Jam 2016 Round 1B B
题意:给出两个数字位数相同,分别中间有若干位不知道,用问号表示.现在要求补全这两个数字,使得差值的绝对值最小,多解则取第一个数字的值最小的,再多解就取第二个数字最小的. 分析: 类似数位dp,但是很多 ...
- 转载一篇关于unicode字符编码的文章
很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们认为8个开关状态作为原子单位很好,于是他们把这称为"字节". 再后来,他们又做了一 ...
- C# 程序异常管理方案
C# 程序异常管理方案 1.程序出现未处理异常(程序中未捕获异常.添加异常处理) 2.程序添加全局异常捕获 tip:程序已处理异常不在捕获范围内. /// <summary> /// 应用 ...
- cocos2d-x for android配置 & 运行 Sample on Linux OS
1.从http://www.cocos2d-x.org/download下载稳定版 比如cocos2d-x-2.2 2.解压cocos2d-x-2.2.zip,比如本文将其解压到 /opt 目录下 3 ...
- 开发维护大型 Java 项目的建议
假设你是正在开发和维护一个包含2000个类并使用了很多框架的Java开发者.你要如何理解这些代码?在一个典型的Java企业项目小组中,大部 分能够帮你的高级工程师看起来都很忙.文档也很少.你需要尽快交 ...