科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道用Perl管理Linux操作系统的配置文件 (2)

用Perl管理Linux操作系统的配置文件 (2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

一般的开发者用于定位、学习和调试配置文件的所花费的时间,比您预期的要更长。不过,使用一个您可能每天都在用的工具:CVS 树,您就可以节约那些时间——并减轻精力和挫折的负担。

作者:Teodor Zlatanov 来源:IBM DW中国 2007年10月20日

关键字: 文件 操作系统 Linux PERL

  • 评论
  • 分享微博
  • 分享邮件

现在您已经在主目录下查验了 config CVS 模块的一个拷贝;我们将以此为出发点。本文中我将使用我的用户名 tzz 以及主目录 /home/tzz,不过,当然,您应该恰当地使用您自己的用户名和目录。

让我们来创建一个单独的文件。CVS 选项文件 cvsrc 看起来比较合适,因为我将会更多地用到 CVS。

清单 3. 创建并添加 cvsrc 文件

> cd ~/config
> echo "cvs -z3" > cvsrc
> echo "update -P -d" >> cvsrc
> cvs add cvsrc
# you really don't need log messages here
> cvs commit -m ''
> ln -s ~/config/cvsrc ~/.cvsrc

从此以后,您的所有的 CVS 选项都将位于 ~/config/cvsrc 中,您将更新那个文件而不是 ~/.cvsrc。您所添加的特定选项告诉 CVS 当目录不存在时重新找回目录,以及删除空目录。这通常是用户所期望的。对于其他您希望这样设置的机器来说,您需要再次查验 config 模块,并重新做链接。

清单 4. 查验 config 模块并构造 cvsrc 链接

> cd ~
# set the following two for remote access
> setenv CVSROOT ...
> setenv CVS_RSH ...
# now check out "config" -- this will get all the files
> cvs checkout config
> cd ~/config
> ln -s ~/config/cvsrc ~/.cvsrc

除了刚才您创建的符号链接以外,您可能知道 Linux 也支持硬链接。出于硬链接的局限性,它们不适用于这一模式。例如,假设您创建了一个 ~/.cvsrc 到 ~/config/cvsrc 的硬链接,而后来您又移动了 ~/config/cvsrc (很多条件下会发生这种情况)。~/.cvsrc 文件将仍然持有 ~/config/cvsrc 的原有的旧内容。现在,您再次查验 ~/config/cvsrc。不过,~/.cvsrc 文件将不会被更新。这就是为什么符号链接在这种情形下更好的原因。

让我们假定您修改 cvsrc 以添加更多选项:

清单 5. 修改并提交 cvsrc

> cd ~/config
> echo "checkout -P" > cvsrc
> cvs commit -m ''

现在,为了更新您所使用的每一台机器上的 ~/.cvsrc,只需要做下面的工作:

清单 6: 修改并提交 cvsrc

> cd ~/config
> cvs update

这很简单。更令人满意的是,上面所展示的 CVS 更新将更新 ~/config 中的 每一个 文件,所以,使用一个命令您就可以立即使得在这种 CVS 模式下保持的文件成为最新的。这是这里所展示的配置模式的本质;其他的只是起辅助作用。

注意,一旦您查验了一个模块,在其中就会有一个名为“CVS”的目录。CVS 目录中有关于 CVS 的足够的信息,不需要指定 CVSROOT 变量您就可以做更新、提交以及其他 CVS 操作。


自动更新和提交

为了自动更新和提交,我已经编写了一个特别简单的 Perl 程序,maintain.pl。程序中最长的部分是帮助文本,所以您可以想像到它不全是复杂的代码。不管怎样,我将详细描述它,不过不要忘记,如果需要,shell 脚本可以完成同样的任务。

maintain.pl 唯一不做的事情是构造符号链接。由于符号链接只能构造一次,而且在一些系统上您 不 希望大规模构造链接,所以任务的复杂相对于手工完成此任务的简单就一目了然了。我之所以知道是因为我曾经编写了符号链接代码,后来又删除了。

我不得不编写并维持另一个映射到很多操作系统的配置文件。会有很多异常;例如,我使用的 Linux 和 Solaris 系统有着本质上不同的设置。有太多的事情需要考虑,而我发现手工安装链接更为简单。当然,您的体验可能是不同的——我鼓励您去尝试找出最适合您自己的环境的方法。maintain.pl 脚本的开头是按惯例的定义,包括配置选项、命令行参数的加载以及帮助文本。

清单 7. maintain.pl 脚本的预备工作

#!/usr/local/bin/perl -w

# {{{ modules and constants
use strict;
use AppConfig qw/:expand :argcount/;
# }}}

$| = 1;				# autoflush the output

my $config = AppConfig->new();
$config->define(
 'HELP'     =>
 { ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0, ALIAS => 'H'},
# update level, higher checks out more
 'LEVEL'    =>
 { ARGCOUNT => ARGCOUNT_ONE,  DEFAULT => 5 },
 'CONFFILE' =>
 { ARGCOUNT => ARGCOUNT_ONE,  ALIAS => 'F',
   DEFAULT => glob("~/config/maintain.conf") },
 'CVS'      =>
 { ARGCOUNT => ARGCOUNT_ONE,  DEFAULT => 'cvs' },
 'CVS_RSH'  =>
 { ARGCOUNT => ARGCOUNT_ONE,  DEFAULT => 'ssh' },
 'UPDATE'   =>
 { ARGCOUNT => ARGCOUNT_HASH },
 'DRYRUN'   =>
 { ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0, ALIAS => 'N' },
 'COMMIT'   =>
 { ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0, ALIAS => 'C' },
);

$config->args();
if (-r $config->CONFFILE() && -f $config->CONFFILE())
{
 $config->file($config->CONFFILE());
}
else
{
 print "The file " . $config->CONFFILE() .
       " was not readable, skipping\n";
}

if ($config->HELP())
{
 print <<EOHIPPUS;

$0

Run $0 without any arguments to load
@{[$config->CONFFILE()]}
and update everything in it at level
@{[$config->LEVEL()]} or less.

Switches:
 -level (default @{[$config->LEVEL()]}) :
   check out everything at this level or less

 -help (-h) : print this help

 -conffile (-f, default @{[$config->CONFFILE()]}) :
   load this configuration

 -cvs (default @{[$config->CVS()]}) :
   where to find the cvs program

 -cvs_rsh (default @{[$config->CVS_RSH()]}) :
   sets the CVS_RSH environment variable

 -update : populate the UPDATE hash in the configuration
           file or like this:
           -update /home/tzz/           see below for explanation

 -commit (-c) : don't just update, also do a commit of
                anything changed

 -dryrun (-n) : don't run anything, just test directories
                and levels

Configuration file:

Very simple AppConfig format; everything in the switches can be
specified in the configuration file as well, e.g.

COMMIT = 1
UPDATE /home/tzz/config = 0

The example above says that /home/tzz/config will be updated at level
0 or higher, and that you always want to commit when you run this
program.

EOHIPPUS

 exit 0;

}

$ENV{CVS_RSH} = $config->CVS_RSH();

如果您不熟悉 AppConfig 模块,那么您应该查看 参考资料 部分,以获得关于管理配置的实用资料。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章