用java实现从kernel.ubuntu.com下载内核的小工具

现在的最新的LTS版本是4.19,目前已经更新到4.19.13了。

Kernel的更新通知里,经常有下面的陈述:

  

作为一个听劝的人,没事就刷一刷https://www.kernel.org/,看看有没有更新。

有更新之后,再刷一刷kernel.ubuntu.com看看Ubuntu有没有更新内核。

下载deb包,执行下面安装内核之后在重启。

sudo dpkg -i *.deb

思路

希望通过下面命令行,可以从kernel.ubuntu.com下载内核的deb文件。

java -jar getKernel.jar v4.19.13

java程序getkernel.jar先通过命令行参数获得版本。

将版本拼接成网址https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.19.13/

从网址读取网页,HttpURLConnection

并从中解析deb的超链接,java.util.regex.Pattern、Matcher

在把amd64的所有包都保存成文件。  

估计用脚本调用wget可能更快。

贴代码

App.java

 package getKernel;

 import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class App { public static void main(String[] args) {
String targetIndex = "https://kernel.ubuntu.com/~kernel-ppa/mainline/" + args[0] + "/"; String strHeaderAll=null;
String strHeaderAmd64=null;
String strImageUnsignedAmd64=null;
String strModulesAmd64=null; boolean foundHeaderAll = false;
boolean foundHeaderAmd64 = false;
boolean foundImageAmd64 = false;
boolean foundModulesAmd64 = false; // 1 get file
FileOutputStream fs = null;
BufferedReader br = null;
Pattern pattern = null;
Matcher matcher = null; try {
URL url = new URL(targetIndex);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
if (conn.getResponseCode() == 200) {
InputStream inStream = conn.getInputStream();
br = new BufferedReader(new InputStreamReader(inStream));
String str;
while ((str = br.readLine()) != null) { if (!foundHeaderAll) {
pattern = Pattern.compile("href=\"(linux-headers-\\S+all.deb)\"", Pattern.CASE_INSENSITIVE);
matcher = pattern.matcher(str);
if (matcher.find()) {
strHeaderAll = targetIndex + matcher.group(1);
System.out.println(strHeaderAll);
foundHeaderAll = true;
}
}
if (!foundHeaderAmd64) {
pattern = Pattern.compile("href=\"(linux-headers-\\S+amd64.deb)\"", Pattern.CASE_INSENSITIVE);
matcher = pattern.matcher(str);
if (matcher.find()) {
strHeaderAmd64 = targetIndex + matcher.group(1);
System.out.println(strHeaderAmd64);
foundHeaderAmd64 = true;
}
}
if (!foundImageAmd64) {
pattern = Pattern.compile("href=\"(linux-image-unsigned\\S+amd64.deb)\"",
Pattern.CASE_INSENSITIVE);
matcher = pattern.matcher(str);
if (matcher.find()) {
strImageUnsignedAmd64 = targetIndex + matcher.group(1);
System.out.println(strImageUnsignedAmd64);
foundImageAmd64 = true;
} }
if (!foundModulesAmd64) {
pattern = Pattern.compile("href=\"(linux-modules\\S+amd64.deb)\"", Pattern.CASE_INSENSITIVE);
matcher = pattern.matcher(str);
if (matcher.find()) {
strModulesAmd64 = targetIndex + matcher.group(1);
System.out.println(strModulesAmd64);
foundModulesAmd64 = true;
}
}
} SaveFile.saveUrl2file(strHeaderAll);
SaveFile.saveUrl2file(strHeaderAmd64);
SaveFile.saveUrl2file(strImageUnsignedAmd64);
SaveFile.saveUrl2file(strModulesAmd64); } } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (fs != null) {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} }

SaveFile.java

 package getKernel;

 import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL; public class SaveFile { public static void saveUrl2file(String strPath) {
if (strPath == null)
return;
FileOutputStream fs = null;
try {
int bytesum = 0;
int byteread = 0; URL url = new URL(strPath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
if (conn.getResponseCode() == 200) {
InputStream inStream = conn.getInputStream();
int size = conn.getContentLength();
String filename = strPath.substring(strPath.lastIndexOf('/')+1, strPath.length());
System.out.println(filename);
fs = new FileOutputStream(filename); byte[] buffer = new byte[1024*1024];
while ((byteread = inStream.read(buffer)) != -1) {
bytesum += byteread;
fs.write(buffer, 0, byteread);
String strPgs = "Progress:"+bytesum * 100 / size;
System.out.printf(strPgs);
for (int k = 0; k < strPgs.length(); k++)
System.out.print("\b");
}
} } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally { if (fs != null) {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

人生苦短,快用python

#!/usr/bin/env python
# coding: utf-8 import urllib.request
import threading
import re
import sys patterns = [
r'linux-headers-[_.\-\d]*all.deb',
r'linux-headers-[_.\-\d]*\-generic[_.\-\d]*amd64.deb',
r'linux-image-unsigned-[_.\-\d]*\-generic[_.\-\d]*amd64.deb',
r'linux-modules-[_.\-\d]*\-generic[_.\-\d]*amd64.deb'
] file_type = [
'header-all',
'header-generic-amd64',
'image-unsigned-amd64',
'modules-generic-amd64',
] class Downloader(threading.Thread):
def __init__(self, version, index_str, file_index):
threading.Thread.__init__(self)
self.file_index = file_index
self.version = version
try:
print('Searching', file_type[self.file_index], 'URL.')
self.file = re.search(
patterns[self.file_index], index_str).group(0)
self.url = 'https://kernel.ubuntu.com/~kernel-ppa/mainline/' + \
self.version + '/' + self.file
print('Found', self.url)
except Exception as identifier:
print('File Not Found!', file_type[self.file_index], identifier) def report_hook(self, count, block_size, total_size):
new_progress = int(100.0 * count * block_size / total_size)
print('{0}:{1},{2}%'.format(
file_type[self.file_index], '['+str(count)+' / ' + str(int(total_size/block_size))+']', new_progress)) def run(self):
print('Start to download', self.file)
try:
urllib.request.urlretrieve(
self.url, self.file, reporthook=self.report_hook)
except Exception as identifier:
print('Cannot download', self.file, identifier) if __name__ == '__main__':
if len(sys.argv) != 2:
print('Please enter the kernel version.')
sys.exit(-1) kernel_version = sys.argv[1]
target_index = 'https://kernel.ubuntu.com/~kernel-ppa/mainline/' + kernel_version + '/' # get the file names and urls of the kernel files.
try:
index_str = ''
print('Get', kernel_version, 'index from kernel.ubuntu.com.')
with urllib.request.urlopen(target_index) as f:
index_str = str(f.read())
print('Got! Try to get kernel files for', kernel_version)
threads = []
for i in range(4):
threads.append(Downloader(kernel_version, index_str, i)) for t in threads:
t.start()
for t in threads:
t.join() print('All files for', kernel_version, 'downloaded!')
except Exception as e:
print(e)

java程序: 从kernel.ubuntu.com下载kernel - HttpURLConnection的更多相关文章

  1. JAVA程序员常用软件类库下载地址整理

    IT行业是个发展更新特别快的领域,每个程序员在职业生涯中都会经历各类技术和工具的更新迭代. 俗话说:工欲善其事,必先利其器.本着独乐乐不如众乐乐的精神(其实是自己健忘)本人把经常要用到的软件工具官方下 ...

  2. JAVA程序员常用软件整理下载

    ********为了大家学习方便,特意整理软件下载如下:*************Java类软件:-------------------------------JDK7.0:http://pan.ba ...

  3. 如何注册java程序为windows服务

    如何注册java 程序为windows 服务 最近想找个软件来控制电脑的关机时间,在网上找了几个,都是可视化界面的可以设置具体的关机时间的软件.由于我想编写的关机程序是运行在别人机器上,只能让该机器在 ...

  4. 使用eclipse编写和运行java程序(基础)

    1.首先java程序的运行你需要下载和安装JDK,这是java运行的必备环境. 2.在桌面上找到eclipes,双击打开. 3.在eclipes启动的过程中,会弹出一个窗口,让你填写java工作区的保 ...

  5. 在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6564592 在前一篇文章提到,从源代码树下载下 ...

  6. 02.将uboot,kernel,rootfs下载到开发板上

    转载,侵删 将uboot,kernel,rootfs下载到开发板上 1.为什么要下载 所谓下载,也称烧录,部署. 1.1.什么是u-boot Hi3518EV200 单板的 Bootloader 采用 ...

  7. linux(ubuntu) 搭建java程序运行环境

    一:简介 ubuntu 系统的和linux差不多,我们需要在系统上搭建java程序运行环境,需要安装jdk,mysql这两个软件,tomcat是绿色版,直接通过taz -zxvf tomcat 就可以 ...

  8. 9本java程序员必读的书(附下载地址)

    本文列出的9本书在Java程序员界都是被认为很棒的书.当一个程序员开始初学Java时,他的第一个问题应该是如何选择一本书来作为指导学习Java.这个问题也就表明,相对于其他的教程和博客,Java书籍还 ...

  9. 【转】java架构师之路:JAVA程序员必看的15本书的电子版下载地址

    作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水 ...

随机推荐

  1. 【bzoj4514】: [Sdoi2016]数字配对 图论-费用流

    [bzoj4514]: [Sdoi2016]数字配对 好像正常的做法是建二分图? 我的是拆点然后 S->i cap=b[i] cost=0 i'->T cap=b[i] cost=0 然后 ...

  2. DHCP与PPPOE 区别

    1.静态IP的方式,如果是占用一个INTERNET的IP的话,上网都是很贵的,当然这个也是最方便的,开机就能上网,不用做任何拨号或者认证的过程.2.PPPOE,只是多了一个获得IP的过程,一旦获得了I ...

  3. TFS 30177 错误

    不知道什么原因,创建团队项目失败.   参考 下面链接成功解决,表示感谢.   http://www.cnblogs.com/Wendy_Yu/archive/2012/07/26/TFS2010_T ...

  4. JAVA基础——编程练习(三)

    熟悉String方法的使用之判断文件名是否合法 学习之余,写个小练习来巩固一下String的方法应用. 任务: 1.判断用户选择要输入的内容的类型 2.如果是java文件,输出“您输入的是java文件 ...

  5. [转][Java]使用Spring配合Junit进行单元测试的总结

    http://www.51testing.com/html/14/n-1408814.html 1.直接对spring中注入的bean进行测试(以DAO为例): 在测试类上添加@RunWith注解指定 ...

  6. scrapy 请求和响应

    scrapy Request类的一些参数意义 url: 就是需要请求,并进行下一步处理的url callback: 指定该请求返回的Response,由那个函数来处理. method: 一般不需要指定 ...

  7. 基于JsonPath和XmlPath的对象映射(Object Mapping)

    rest-assured支持映射Java对象到Json和XML以及从Json和XML中映射到Java对象.Json映射需要在classpath 中有Jackson.Jackson 2或者是Gson,X ...

  8. myeclipse启动后,卡在loading workbench界面

    今天在修改svn的配置文件的时候,电脑重启了几次,然后myeclipse启动的时候就一直卡在loading workbeach动不了了. 重启了几次也不行,后来查的百度,找到的解决方法如下: 找到my ...

  9. 建立链表的虚拟头结点 203 Remove Linked List Element,82,147,148,237

    该逻辑对于删除第一个元素不适用. 这样的代码不优美 /** * Definition for singly-linked list. * struct ListNode { * int val; * ...

  10. python-global全局变量

    在函数内部定义变量时,他们与函数外部具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是局部的,这称为变量的作用域,示例如下: def func_local(x): print 'x is', ...