获取CentOS软件源中的updates包


之前在本地网络中建了一个CentOS软件源,挺好用的,【见 yum局域网软件源搭建  】可是发现有些软件还是装不上,因为系统安装盘中的包并不全,有些软件的依赖在updates源中,updates源在网上,怎么把其中的包拿到呢?一种方法,当然也是最最正常的方法,就是做个计划任务,定时从CentOS官方镜像站中同步。

可是我们也就是在本地用用,不需要同步,于是写了个Java程序,找了个速度比较快的镜像(东北大学的,写程序的时候北理工的镜像站打不开),直接很暴力地把上面的updates目录下的包(http://mirror.neu.edu.cn/centos/6.4/updates/x86_64/Packages/)全都抓下来了,然后createrepo一下就可以用了,抓软件包的代码如下,其中HttpFactoy是自定义的一个封装Apache HttpClient接口的工具类:

package cn.edu.ruc.extract;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.TableColumn;
import org.htmlparser.tags.TableRow;
import org.htmlparser.tags.TableTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.visitors.HtmlPage;

public class Main
{
 public static void main(String[] args)
 {
  try
  {
   //要抓取的目录
   String baseUrl = "http://mirror.neu.edu.cn/centos/6.4/updates/x86_64/Packages/";
   String html = HttpFactory.getInstance().getPageContent(baseUrl);
   //存放软件包的本地目录
   String rootDir = "/home/Hadoop/updates/";
   Parser parser = Parser.createParser(html, "utf-8");
   HtmlPage page = new HtmlPage(parser);
   parser.visitAllNodesWith(page);
   NodeFilter filter = new TagNameFilter("TABLE");
   NodeList nodes = page.getBody().extractAllNodesThatMatch(filter,
     true);
   int num = 0;
   for (int i = 0; i < nodes.size(); ++i)
   {
    TableTag tableTag = (TableTag) nodes.elementAt(i);
    TableRow[] rows = tableTag.getRows();
    for (TableRow row : rows)
    {
     TableColumn[] columns = row.getColumns();
     if (columns != null && columns.length > 0)
     {
      if (num > 0)
      {
       String fileName = columns[0].toPlainTextString().trim();
       String url = baseUrl + fileName;
       System.out.println(url);
       File rpmFile = new File(rootDir + fileName);
       FileOutputStream outputStream = new FileOutputStream(rpmFile);
       InputStream inputStream = HttpFactory.getInstance().getResponseEntity(url).getContent();
       byte b[] = new byte[1024*1024];
       int j = 0;
       while ((j = inputStream.read(b)) != -1)
       {
        outputStream.write(b, 0, j);
       }
       outputStream.flush();
       outputStream.close();
       inputStream.close();
      }
      num++;
     }
    }
   }
   System.out.println(num-1 + " packages downloaded.");
  }
  catch (Exception e)
  {
   e.printStackTrace();
  }
 }
}

换别的镜像站可能需要变变html解析的代码。

相关内容

    暂无相关文章