用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. 51nod1832(二叉树/高精度模板+dfs)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1832 题意: 中文题诶~ 思路: 若二叉树中有 k 个节点只 ...

  2. Unity---动画系统学习(5)---使用MatchTarget来匹配动画

    1. 介绍 做好了走.跑.转弯后,我们就需要来点更加高级的动画了. 我们使用自带动画学习笔记2中的FQVault动画,来控制人物FQ. 在动画学习笔记4的基础上添加Vault动画. 添加一个参数Vau ...

  3. [ADB Shell]Android Debug Bridge常用命令

    ADB用法 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important ...

  4. 解压与压缩(把dataset转为string、、 )

    /// <summary> /// 压缩 解压 /// </summary> public class ZipHelper { #region 压缩解缩 /// <sum ...

  5. sublime text3文本字体大小设置

    1.perferences->settings-user 4·将以下代码粘贴进入即可 { "font_face": "source code pro, " ...

  6. clustalX2使用以及相关的问题

    Clustalx的操作 第一步:输入序列文件. 第二步:设定比对的一些参数. 参数设定窗口. 第三步:开始序列比对. 第四步:比对完成,选择保存结果文件的格式 相关问题 CLUSTALX-是CLUST ...

  7. C++_友元3-其他友元关系

    友元和类的关系还可以更复杂. 举个例子,假设出现了交互式遥控器,交互式遥控器能够让您回答电视节目中的问题,如果回答错误,电视将在控制器上产生嗡嗡声. 这个例子的问题,可以使用新的友元关系来解决.我把它 ...

  8. pip不是内部或外部命令也不是可运行的程序或批处理文件的问题

    当我用windows电脑 pip install missingno 时 它居然会报pip不是内部或外部命令也不是可运行的程序或批处理文件的问题! 解决方法: 1)找到 pip.exe 所在位置,一般 ...

  9. setlocal enabledelayedexpansion 解释

    看字面的意思是:设置本地为延迟扩展.其实也就是:延迟变量,全称"延迟环境变量扩展", 在cmd执行命令前会对脚本进行预处理,其中有一个过程是变量识别过程,在这个过程中,如果有两个% ...

  10. 学习掌握oracle外表(external table)

    [转自] http://blog.chinaunix.net/uid-10697776-id-2935685.html 定义 External tables access data in extern ...