LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: hj_18

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

[复制链接]
 楼主| 发表于 2009-6-5 18:41:27 | 显示全部楼层
类似的,假如我有一个月没更新,那么可能有几十乃至上百个包要更新。查changelog写脚本也蛮搞的,然后我假设这样一个情景:家里的网速慢,单位的网速在下班后很快,而在单位的电脑上装个虚拟机跑current的时候,虚拟机分配的磁盘空间容量不大,怎么可能保存个安装目录在虚拟机里?可是我又想在单位的机器上来下载更新的包,再拷回去安装。
这时,我的脚本给我这样的自由:就像swaret一样,无须安装树,无须保存上次的changelog。直接给出要下载的包的url,用随便什么下载软件来下载,不依赖任何特定的程序,还能在要排除的某一类包里保留需要下载的包。
回复 支持 反对

使用道具 举报

发表于 2009-6-5 20:14:26 | 显示全部楼层
你这个,有没有考虑,有新添加的包,或者去除的包这种情况。这些包在/var/log/package里面,新添加的没有,去除的还保留。
回复 支持 反对

使用道具 举报

发表于 2009-6-5 20:16:56 | 显示全部楼层
按照你的需求,完全可以用changelog来做,我以前就是这么做的。除了tagfile, maketag maketag.ez 有的时候不知道,其他的包完全可以从changelog中解出url来。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-6 07:42:26 | 显示全部楼层
新添加包没有问题,现在已经可以做到了,去除包的脚本也很容易,这倒是用changelog比较方便,我准备写个脚本一次解出所有的remove行,从中提取出包名称,再和/var/log/packages的列表去比对,然后删除。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-6 08:06:07 | 显示全部楼层
刚才看了changelog,一共只有8个包被删除。
当然我会把这个功能写进脚本的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-6 13:10:26 | 显示全部楼层
为什么说changelog不是用来获得当前需要更新包的好参照呢,请看下面这一段从changelog中截取的片段:

  1. a/kernel-modules-2.6.29.4-i486-1.tgz:  Upgraded to Linux 2.6.29.4 modules.
  2. a/kernel-modules-smp-2.6.29.4_smp-i686-1.tgz:
  3.   Upgraded to Linux 2.6.29.4 modules.
  4. ap/vim-7.2.191-i486-1.txz:  Patched vimrc to add the option
  5.   'set backupskip+=/var/spool/cron/*', which should fix the problems with
  6.   using vim with "crontab -e".  Note that if a global vimrc already exists
  7.   the new one will be installed as vimrc.new and must be moved into place.
  8.   Thanks to Rodrigo Bistolfi for the patch.
  9. d/gettext-tools-0.17-i486-3.txz:  Recompiled against libgcj.
  10. d/kernel-headers-2.6.29.4_smp-x86-1.tgz:  Upgraded to Linux 2.6.29.4 headers.
  11. k/kernel-source-2.6.29.4_smp-noarch-1.tgz:  Upgraded to Linux 2.6.29.4 source.
  12. xap/MPlayer-r29328-i486-1.txz:  Upgraded to MPlayer-r29328.
  13. xap/vim-gvim-7.2.191-i486-1.txz:  Recompiled.
  14. xap/xine-lib-1.1.16.3-i486-3.txz:  Recompiled.
  15. extra/linux-2.6.29.4-nosmp-sdk/:  Regenerated SMP to no-SMP kernel source patch.
  16. isolinux/initrd.img:  Rebuilt with newly compiled kernel modules.
  17. kernels/*:  Rebuilt.
复制代码


当然,它是有模式的,而且我们可以用这种模式来过滤出自己需要的东西,只是你要考虑太多的东西,比如关键词有“Recompiled”、“Patched”、“Upgraded”等等,甚至冒号后它还换行!

再让我们搜索一下“xap/vim-gvim”,嗯,有四个地方都有,所以你不仅在过滤时要考虑位置,关键词,还有次数或时间。

事情还可以变得更奇怪,当我是在2008年底安装current的话,changlog要怎样过滤呢?是整个文件都过滤,还是过滤到2008年底为止?我相信应该是没什么关系的,可是电脑不是用来从事这种有技巧的工作的,它更喜欢的是格式化,重复化。

让我们来看看FILE_LIST,我认为它是“ls -lR”命令的输出,所以这里的格式是很清楚的,

  1. -rw-r--r--  1 root root      197 2008-12-03 01:13 ./a/aaa_base-12.2.0-noarch-1.txz.asc
  2. -rw-r--r--  1 root root      568 2009-04-02 00:24 ./a/aaa_elflibs-12.34-i486-1.txt
  3. -rw-r--r--  1 root root  3697036 2009-04-02 00:24 ./a/aaa_elflibs-12.34-i486-1.txz
  4. -rw-r--r--  1 root root      197 2009-04-02 00:24 ./a/aaa_elflibs-12.34-i486-1.txz.asc
  5. -rw-r--r--  1 root root      505 2009-02-21 23:24 ./a/aaa_terminfo-5.7-noarch-1.txt
  6. -rw-r--r--  1 root root    42164 2009-02-21 23:24 ./a/aaa_terminfo-5.7-noarch-1.txz
  7. -rw-r--r--  1 root root      197 2009-02-21 23:24 ./a/aaa_terminfo-5.7-noarch-1.txz.asc
  8. -rw-r--r--  1 root root      365 2008-04-01 04:59 ./a/acl-2.2.47_1-i486-1.txt
  9. -rw-r--r--  1 root root   128964 2008-04-01 04:59 ./a/acl-2.2.47_1-i486-1.txz
  10. -rw-r--r--  1 root root      197 2008-04-01 04:59 ./a/acl-2.2.47_1-i486-1.txz.asc
复制代码

所有的文件名都在行的第8个域结尾是txz的,并且每个包的名字只出现一次,这个包的版本只要和自己机器上的不一样,就是需要更新的包,逻辑就是这么简单,而且其原理同rsync是一模一样的。

rsync的问题是它要有硬盘上放了所有的包之后才能工作,占地方太多,当然现在的硬盘不缺这点空间,但要是我想在随便什么地方的电脑上都来同步下载更新的包呢?比如我要是有几十台机器组成的网络,其中有的机器还不是一直开机的,这样就无法与别的机器一起更新,比方说a1-a5已经更新到最新的包,但是a6请病假,一周没来,a8出差半个月,等他们回来开机,怎么知道到底该向这些机器提供哪些被他们错过的更新?
所以下次难道我要在这些机器上每台都搞个current树的副本?

因此我提供这样的解决方案,下载当前服务器上的文件列表,和本地机器上的文件列表对照,这个过程现在一眨眼就完成,输出所有有待更新的包的下载地址,然后随便在什么系统,什么地方,用随便什么下载软件都可以下载。

当然,changelog还是有用的,毕竟我的机器上还有许多自己编译的包,所以要移除官方的包,还是过滤changelog最有效,那个“Removed.”还是够独一无二的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-13 18:34:35 | 显示全部楼层
今天可是slackware-current的X系统大更新啊,近300多个包的更新,呵呵。
回复 支持 反对

使用道具 举报

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

本版积分规则

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