LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2062|回复: 26

自己写的,获取current需要更新的文件列表。

[复制链接]
发表于 2009-6-3 13:35:54 | 显示全部楼层 |阅读模式
我是perl菜鸟,只是胆子大,不怕被人嘲笑,发个根据自己已有的packages获取current上更新的perl脚本,在swaret没有跟上txz的变化之前先用用。
去掉kde,kernel,emacs什么的。

[更新] 2009.06.06
增加一个移除包的脚本 rmpkg.pl,它会生成一个叫rmp2.sh的脚本,查看后以root身份执行。

[重要更新] 2009.06.05
改进了比较新旧软件包的算法,现在生成等待更新的包列表的速度是秒级的。只读一次文件就完成比较了。

每次升级后,在/etc目录下会有一些*.new的文件。我们既不能直接把每个这样的文件都去覆盖原来的文件,也不能把所有的new文件都一股脑儿删了,最痛苦的是要保留哪些文件,每个人都有所不同。所以我写了个脚本,自动地生成要批量覆盖的命令,而保留那些需要手工处理的new文件。这个脚本最好以root用户身份执行,因为/etc中有的目录在搜索时普通用户是进不去的,如果你担心安全性,就自己看看脚本中的方法find生成列表好了。最后生成一个叫repl-new.sh的文件,不好意思,缺了那个脚本头一行,反正以root用户执行”sh repl-new.sh“一样可以运行的。

使用security@slackware.com的公钥,检查下载的包的正确性的脚本。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2009-6-3 20:44:17 | 显示全部楼层
不错,很喜欢你写的。很好!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-4 01:27:43 | 显示全部楼层
filelist-want.txt中是所有可更新的软件包的url,可以用wget -i filelist-want.txt来下载。
看来要发布一点东西还要考虑使它变得更易用啊。
回复 支持 反对

使用道具 举报

发表于 2009-6-4 11:37:57 | 显示全部楼层

哎!!我的xterm里显示乱码,如何用啊?

看来我的语言设置出了问题,我的去改下,
我用cat查看了下,,不知道如何用,中文也看不到

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-4 19:02:44 | 显示全部楼层
我正在开始写教程,并准备再修改一下,目前基本上是用随便什么文本编辑器打开这个文件,修改一下文件开头的几个目录中的“/home/hj_18/”为你自己的家目录,后面的路径名去建立一下,就可以用“perl upgrade-slk.pl”执行,产生的文件中有个filelist-want.txt,就是要自己去下载的更新的软件包的url表,可以用“wget -i filelist-want.txt”来下载,导入到什么下载管理器也没问题。
至于语言的问题,我好像是用的gb2312,但也有可能是utf-8的,我用系统自己的emacs打开没有问题,mousepad也没有问题,另外cat指令可能要设置一个环境变量才能显示中文。今天我已经升级好了,没有什么问题。
  1. if ( $^O eq 'MSWin32' ) {
  2.     $dlcmd="D:/MSYS/bin/wget.exe ";
  3.     $fndcmd=q(D:\MSYS\bin\find.exe );
  4.     $upddir=q(f:\slackware);
  5.     $workdir=q(f:/temp/upgrade-current/slackware/);
  6.     } elsif ( $^O eq 'linux' ) {
  7.     $dlcmd="wget ";
  8.     $fndcmd="find ";
  9.     $upddir='/home/hj_18/slackware';
  10.     $workdir='/home/hj_18/updslk/';
  11. }
复制代码


把  “$upddir='/home/hj_18/slackware';”中的“/home/hj_18/”改为自己的家目录,比如用户名叫blackstar的,就是“/home/blackstar/“,在这个目录下建个文件夹“slackware”,准备放下载的包。
把 “$workdir='/home/hj_18/updslk/';”中的“/home/hj_18/”也改了,并再建一个“updslk”,把upgrade-slk.pl本身放进这个目录,切换到终端进到这个目录,执行“perl upgrade-slk.pl”即可。

另外,这里有兴趣的话可以再自己改,看看哪些包是不要的,在第二个if那里加。
  1. while (<TMP>) {
  2.         @domain1=split( / +/,$_ );
  3.   if ( ($domain1[7]=~ m/\.txz$/) &&
  4.        ( ($domain1[7]=~ m/kdebase-4/) ||
  5.          ($domain1[7]=~ m/kdelibs-/) ||
  6.          ($domain1[7]=~ m/kdebase-w/) )
  7.      ) {
  8.         $domain1[7]=~ s/^\.\///;
  9.         chomp $domain1[7];
  10.         # 现在得到了跳过过滤的txz文件列表
  11.         print OUTPUT $domain1[7]. "\n";
  12.         next;
  13.         }

  14.   if ( ($domain1[7]=~ m/\.txz$/) &&
  15.        !($domain1[7]=~ m/\/kde\//)  &&
  16.        !($domain1[7]=~ m/\/kdei\//) &&
  17.        !($domain1[7]=~ m/emacs-/)  &&
  18.        !($domain1[7]=~ m/kernel-/)
  19.      ) {
  20.         $domain1[7]=~ s/^\.\///;
  21.         chomp $domain1[7];
  22.    # 现在得到了新的整理后的带目录的txz文件列表
  23.         print OUTPUT $domain1[7]. "\n";
  24.         }
  25. }
复制代码


前面的if是在保留被我删除的几大类包中间个别几个我需要的,因为swaret检查依赖性的时候建议我要的。后面的if是剔除我不需要或是我想自己编译的包,不会改的就别改了。
回复 支持 反对

使用道具 举报

发表于 2009-6-4 19:44:25 | 显示全部楼层
根据changelog做不是更好。格式整齐,用sed就可以很容易搞定。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-4 19:50:48 | 显示全部楼层
我写upgrade-slk.pl时的一些想法,与大家交流,这是我的自我批评,希望能得到大家的批评和指正。
      几年来,做为一名slackware的用户,一直习惯于使用swaret同步current版本,到前天为止,世界很清静。但是突然间发现自己错过了包格式变化的新闻,一下子惶惑起来,swaret不管用了,就去下了slackpkg,一运行居然列出的是12.2的包列表,还有它的conf文件里横看竖看找不到version在哪里改。算了,还是自己动手,丰衣足食啊。
      初步思路是这样的:首先要从源那里抓到包列表,这里我只考虑主目录上的包,extra什么的暂时顾不上了。为了确保抓的文件完整,我检查它的最后一行,应该是包含“y/tagfile/”,所以我检查一下,看要是没有这个指纹就要重下。

俗话说有图有真相啊:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-4 20:14:13 | 显示全部楼层
我觉得ChangeLog似乎有个连续性的问题,要是我隔了一段时间再更新,还要去考虑上次更新是什么时候,才能知道究竟要截取changelog到哪一段为止。而FILE_LIST没有这个问题,不用考虑自己的机器究竟上次是什么时候更新过。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-4 20:30:45 | 显示全部楼层
有了下载好的服务器上的列表,我开始考虑要先从中去掉一些东西,比如kde,我使用的是xfce4。比如内核,我是一向自己编译的,emacd,我喜欢cvs的版本,但是swaret在检查依赖性的时候建议我下载的一些包,我还是把他保留在列表中,我管这叫“除外的例外”。脚本的第二部分,就在过滤这东西,也许搞个表格什么的到运行时读进去比较好,但我管他呢,够用就好。目前是测试阶段,程序逻辑简单胜过代码华丽。



保留一下包的分类目录有利于创建下载列表啊。
回复 支持 反对

使用道具 举报

发表于 2009-6-4 20:55:19 | 显示全部楼层
如果是在linux做的,按我的做法,很简单。不需要用到perl这个重量级武器。
主要是有个CHECKSUMS.MD5, 用
md5sum -c CHECKSUMS.MD5 > log
sed -i -e "/OK/d" log
再继续处理一下就好。
要更新的时候用wget 下载 CHECKSUMS.MD5,可以很简单的搞定。
这个样子可以避免有的时候,有包添加或删除的时候 tagfile maketag maketag.ez 文件有变化,但是从filelist中看不出来。

不过最省事的方法是用rsync
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表