用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. python—Celery异步分布式

    python—Celery异步分布式 Celery  是一个python开发的异步分布式任务调度模块,是一个消息传输的中间件,可以理解为一个邮箱,每当应用程序调用celery的异步任务时,会向brok ...

  2. Java面向对象之构造代码块 入门实例

    一.基础概念 1.构造代码块,给所有对象进行初始化. 2.构造函数,只给对应的对象初始化. 3.局部代码块,控制局部变量的生命周期. 二.实例代码 class Person { private int ...

  3. django 部署到Ubuntu-apache2遇到的问题汇总

    1.x86_64-linux-gnu-gcc: error: unrecognized command line option ‘-fstack-protector-strong’ Turns out ...

  4. javaweb面试一

    1.forward与redirect区别,说一下你知道的状态码,redirect的状态码是多少? 状态码 说明 200 客户端请求成功 302 请求重定向,也是临时跳转,跳转的地址通过Location ...

  5. Sql server inner join......on

    --查询的时候,如果表中有重名的列,此时,应该在通过 表名.列名 的方式来限定指定的列是哪张表中的.select PhoneNum.pid, PhoneNum.pname, PhoneNum.pcel ...

  6. Python学习【第五篇】:面向对象及相关

    面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 1 2 3 4 5 6 c ...

  7. Qt 学习之路 2(40):隐式数据共享

    Qt 学习之路 2(40):隐式数据共享 豆子 2013年1月21日 Qt 学习之路 2 14条评论 Qt 中许多 C++ 类使用了隐式数据共享技术,来最大化资源利用率和最小化拷贝时的资源消耗.当作为 ...

  8. Android中include标签的使用(打开引用布局,隐藏当前布局)

    在开发app的时候,有时候一个布局会反复用到,可以把反复用到的布局单独写一个xml文件,什么时候用到就用includ标签引入xml 下面是我写的反复用到的一个xml,里面有2个button,一个Tex ...

  9. mysql 表的分区

    如何判断当前MySQL是否支持分区 命令:show variables like '%partition%' 运行结果: mysql> show variables like '%partiti ...

  10. C++_标准模板库STL概念介绍2-泛型编程

    有了之前使用STL的经验后,接下来讨论泛型编程及其底层的理念: 首先我们知道STL只是泛型编程的一种: 而面向对象的编程方式关注的是编程的数据方面: 而泛型编程关注的是算法: 但是,他们之间的一个重要 ...