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)
时间: 2024-12-31 04:08:24

Linux内核补丁批量自动下载工具的相关文章

Linux内核调试的方式以及工具集锦

CSDN GitHub Linux内核调试的方式以及工具集锦 LDD-LinuxDeviceDrivers/study/debug 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作 因本人技术水平和知识面有限, 内容如有纰漏或者需要修正的地方, 欢迎大家指正, 也欢迎大家提供一些其他好的调试工具以供收录, 鄙人在此谢谢啦 "调试难度本来就是写代码的两倍. 因此, 如果你写代码的时候聪明用尽, 根据定义, 你就没有能耐去调试它了.&qu

Linux内核设计与实现下载 &#143719;

下载地址: http://www.gqylpy.com/di/15 <Linux内核设计与实现>PDF高清完整版-下载 内容简介 编辑 <Linux内核设计与实现(原书第3版)>基于Linux 2.6.34内核详细介绍了Linux内核系统,覆盖了从核心内核系统的应用到内核设计与实现等各方面的内容.<Linux内核设计与实现(原书第3版)>主要内容包括:进程管理.进程调度.时间管理和定时器.系统调用接口.内存寻址.内存管理和页缓存.VFS.内核同步以及调试技术等.同时&l

linux 商业项目 makefile 自动生成工具Autotools的使用

我们在平时的学习中要编译我们写的源代码生成可执行文件,大家都知道用gcc编译工具就可以完成任务,更复杂一点的,如果我们编写的文件比较多,那单纯在linux环境下写gcc命令进行编译就显得有点效率太低了,这时我们肯定想到写一个makefile来完成这样稍微复杂的编译过程,我想很多人也确实是是这样做的,所以我们回去学习makefile 的语法,其实如果编译 的文件量再多一些,文件之间的依赖关系更复杂一些,那么我们编写一个正确的,效率高的makefile也不是一件很容易的事情吧.其实我之前是有体验过这

Linux部署之批量自动安装系统之TFTP篇

1.         安装:yum install tftp-server –y   2.         配置tftp文件开启tftp功能   3.         开启依赖服务xinetd   4.         安装syslinux   5.         将pxelinux.0文件放在tftpboot目录下   6.         并且复制光盘中如下的文件(内核文件等)   7.         编辑启动管理的配置文件  

linux安装上传上下载工具

安装 [[email protected] ~]# yum -y install lrzsz rz是上传 sz下载

Linux部署之批量自动安装系统之NFS篇

1.         编辑配置文件让远端设备可访问vim /etc/exports   2.         启动服务

Linux部署之批量自动安装系统之DHCP篇

1.         安装:yum install dhcp   2.         Ip配置信息   3.         Dhcp配置文件如下   4.         配置完后检查语法是否错误并且启动  

Linux部署之批量自动安装系统之测试篇

1.         客户端从网络启动如下   2.         复制vesamenu.c32文件可解决上面的问题   3.         客户端再次启动   4.         选择第一个进行全自动安装(以下为途中的随机截图)   5.         完成后自动启动如下   6.         登陆账户并且查看脚本里创建的repo文件(test账户未创建,可能是之前没有useradd程序)   7.         启动到桌面

Linux部署之批量自动安装系统之Kickstart篇

1.         安装   2.         在桌面环境下啊配置   3.         Kickstart之基本配置   4.         Kickstart之安装方法   5.         Kickstart之启动引导选项   6.         Kickstart之磁盘分区相关信息   7.         Kickstart之网络配置   8.         Kickstart之认证相关设置   9.         Kickstart之防火墙及安全级别配置   1