2.5. Majordomo 的Web界面 Majorcool

Majorcool 是用 Perl 写的 cgi 脚本,提供了 Majordomo 的易用接口。

网络资源:

我在 Linux 上安装 Majorcool,基本上没有费多大周折。按照前面的 Howto 一步步执行即可。在后面的运行维护阶段,曾经遇到过“Majorcool 不能更新列表的问题”:

Majordomo 创建的新的邮件列表,Majorcool 不能显示出来。即 Majorcool 不能更新列表。我的第一个反应是查看 Majorcool 的源代码,看看它是如何获取当前已有的邮件列表。

首先定位到函数 get_lists:


#-----------------------------------------------
# Find all lists matching a certain criteria.
#-----------------------------------------------
sub get_lists {
	local($address,$pattern,$criteria,$list_match) = @_;
	local(@lists);
	#
	# all lists
	if ($criteria eq "available") {
		@lists = sort(keys(%cached_descr));
	}
	#

发现邮件列表初始化自哈希表 %cached_descr,查找 %cached_descr 初始化的代码,自然定位到函数 load_cache:


#-----------------------------------------------
# Create a table of cached keys for each list.
#-----------------------------------------------
sub load_cache {
	&send_error("Cannot Open File <$cache> -- $!")
		unless open(CACHE, "$cache");
	while (<CACHE>) {
		chop;					# remove the trailing \n
		next if /^\s*$/;			# remove blank lines
		local($list,$owner,$spolicy,$upolicy,$descr,$adv,$noadv)
			 = split(/\007/);
		# only add good lists to the cache
		if (&valid_list($listdir,$list)) {
			$cached_owner{$list} = $owner;
			$cached_spolicy{$list} = $spolicy;
			$cached_upolicy{$list} = $upolicy;
			$cached_descr{$list} = &html_encode($descr);
			$cached_adv{$list} = $adv; 
			$cached_noadv{$list} = $noadv;
		}
	}
	close(CACHE);
}

原来是从文件 $cache 初始化的邮件列表。查找 $cache 的定义,找到在文件 majorcool_default.cf 中:


$cache  		= "/usr/local/majordomo/.majordomo_keys";

剩下的事情就简单多了,打开并编辑文件 /usr/local/majordomo/.majordomo_keys,发现 Majorcool 的邮件列表清单有了变化。

再到 Google 上搜一搜,找到了.majordomo_keys 文件初始化的命令。即在安装 Majorcool 过程中,使用了如下命令初始化该文件:

/usr/local/majordomo/wrapper mj_key_cache -v -K /usr/local/majordomo/.majordomo_keys -C /usr/local/majordomo/majordomo.cf

打开文件 /usr/local/majordomo/mj_key_cache,看到文件头中的注释,告诉应该将该命令设置为在 crontab 中自动执行。于是...