用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. vim文本编辑

    6.1 vi/vim 的使用 基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),插入模式(Insert mode)和底线命令模式(Last line mode). 6. ...

  2. 最新cenos执行service httpd restart 报错Failed to restart httpd.service: Unit not found.

    原来是需要将Apache注册到Linux服务里面啊!注册Apache到Linux服务在Linux下用源代码方式编译安装完Apache后,启动关闭Apache可以通过如下命令实现: /usr/local ...

  3. Windows Server 2008 R2中IIS7.5配置完网站权限不足问题的解决办法:

    Windows Server 2008 R2中IIS7.5配置完网站权限不足问题的解决办法:常见问题:HTTP 错误 500.0 - Internal Server Error无法显示页面,因为发生内 ...

  4. JavaWeb学习笔记(一)—— Http协议

    一.什么是HTTP协议 HTTP,超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览 ...

  5. 【转】Cannot add or update a child row: a foreign key constraint fails 解决办法

    原因:设置的外键和对应的另一个表的主键值不匹配.解决方法:找出不匹配的值修改.或者清空两表数据. 转自https://blog.csdn.net/qq_29405421/article/details ...

  6. C++_代码重用4-多重继承

    继承使用时要注意,默认是私有派生.所以要公有派生时必须记得加关键字Public. MI(Multi Inheritance)会带来哪些问题?以及如何解决它们? 两个主要问题: 从两个不同的基类继承同名 ...

  7. HDU6396 (贪心+fread 挂)

    题意:初始值你有k个属性的攻击vi,有n个怪兽,每个怪兽有k种属性的血量ai,并且有k种属性的加成bi,当你的k种属性的值全部大于等于某只怪兽的k种属性的血量,你可以杀死他,并且你的攻击力vi会升级, ...

  8. 加、减、乘、除 高精度 string

    #include<stdio.h> #include<string> #include<string.h> #include<iostream> usi ...

  9. Codeforces - 185A 简单矩阵快速幂

    题意:求第n个三角形内部的上三角形个数 对每个三角形分别维护上下三角形个数,记为\(dp[1][i],dp[2][i]\) 规律很明显是 \(dp[1][i+1]=3*dp[1][i]+dp[2][i ...

  10. hbuilder设置自动px 转换成rem

    hbuilder里面有自动换算的 需要设置一下:工具–>选项–>Hbuilder–>代码助手设置.里面有个px自动转rem设置,按自己的实际情况设置就可以在每次输入px的时候有提示了 ...