用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. PHP获取对象的纯数字属性

    php的对象属性 我们知道获取php的对象属性用箭头: echo $obj->name; 如果属性名是一个变量,那么可以用: $var = 'name'; echo $obj->$var; ...

  2. 墨菲定律与 IndexOutOfBoundsException(数组越界异常)

    今天维护又反馈了一问题过来,查询试卷时报数组越界异常: 2017-02-28 10:45:24,827[ERROR] HttpException[10.32.111.7:60446:2D07867BE ...

  3. linux系统root用户登录提示“鉴定故障”的解决办法

    同事第一次创建虚拟机,遇到此问题,此前我未曾遇到,搜索到的解决办法记录在此,以防之后忘记. 一.重启系统解决(搜索到的该解决办法较多):https://www.cnblogs.com/lippor/p ...

  4. 特殊用途语言特性(默认实参/内联函数/constexpr函数/assert预处理宏/NDEBUG预处理变量)

    默认实参: 某些函数有这样一种形参,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参.调用含有默认实参的函数时,可以包含该实参,也可以省略该实参. 需要特别 ...

  5. (转)取消目录与SVN的关联

    第一种方法: 直接.逐级地删除目标目录中的隐藏属性的.svn目录 第二种方法: 如果用的是TortoiseSVN客户端,则先在另外一处建立一个新目录A,右键点住svn目录并拖动到A上松手,在弹出的菜单 ...

  6. 12.谈谈this对象的理解

    1.谈谈this对象的理解? 2.this指向问题   Javascript理解this对象 this是函数运行时自动生成的一个内部对象,只能在函数内部使用,但总指向调用它的对象. 通过以下几个例子加 ...

  7. SQL语句之行操作

    SQL语句系列 1.SQL语句之行操作 2.SQL语句之表操作 3.SQL语句之数据库操作 4.SQL语句之用户管理 关系型数据库的存储形式 在关系型数据库中,数据都是以类似于Excel表格的形式存储 ...

  8. MySql数据库数据类型及约束介绍

    1,MySql中数据类型介绍 整型及浮点型 数据类型 存储范围 字节 TINYINT 有符号值:-2^到2^7-1 无符号值:0到2^8-1 2 SMALLINT 有符号值:-2^15到2^15-1 ...

  9. [BZOJ 3262]陌上开花

    今天写了到偏序问题,发现博主真的是个傻X 传送门 以前的写法 /************************************************************** Probl ...

  10. 最近研究了一个.NET的DHT网络搜索引擎,顺便重新整理了下引擎思路,供大家分享讨论下。

    最近研究了一个.NET的DHT网络搜索引擎,顺便重新整理了下引擎思路,供大家分享讨论下.