webmin的目录组成如下:
- 一组子目录:绝大多数都是单个webmin管理模块,webmin完全由perl实现;
- 一组perl脚本和几个CGI脚本,这些脚本可以分为以下三类:
- 内置的HTTP服务器:支持CGI、Session、SSL等功能。Miniserv.pl和miniserv.pem实现了这个HTTP服务器。它的配置文件通常是/etc/webmin/miniserv.conf,主要有以下几个重要参数:
port=10000
设置HTTP服务器监听的端口root=/usr/libexec/webmin
Web文件的根目录ssl=0
是否支持SSL,如果设置为1,这个HTTP服务器将提供HTTPS服务session=1
是否支持Session,如果设置为1,在访问web服务之前必须先完成用户登录和认证,用户的登录和认证由session_login.cgi实现userfile=/etc/webmin/miniserv.users
存放HTTP服务器的用户名和密码,changepass.pl可以修改用户密码keyfile=/etc/webmin/miniserv.pem
存放HTTP服务器的私钥和公钥证书
- webmin核心:这部分包含webmin核心库、webmin的首页和模块管理。web-lib.pl是webmin得核心库,包含了webmin中主要的公用函数。web-lib.pl中引用了一些CGI提供一些公用功能,这些CGI包括:
文件 功能 chooser.cgi 文件选择 Frame user_chooser.cgi 用户选择 Frame date_chooser.cgi 日期选择 Frame config.cgi 配置模块配置文件页面 config_save.cgi 保存配置 help.cgi 帮助页面 fastrpc.cgi 启动一个新进程以加快rpc的调用 rpc.cgi 用于截获其他webmin服务器发来的webmin远程调用 referer_save.cgi Redirect到以前的URL switch_user.cgi 切换用户 switch_skill.cgi 改变当前webmin用户的skill level acl_security.cgi 配置全局 ACL选项 index.cgi 实现webmin的首页,它将当前用户可以使用的管理模块按类别分为一个属性页显示 - 安装脚本:这些脚本用于安装配置webmin。 setup.pl是主要的配置脚本,它调用如下脚本:
文件 功能 newmods.pl 用于初始化一个新插入模块的配置文件 oschooser.pl 选择操作系统类型 copyconfig.pl 给管理模块复制配置文件 thirdparty.pl 检查已经安装的模块 perlpath.pl 当perl的路径不是/usr/local/bin/perl时,替换perl脚本中的#!/usr/local/bin/perl
- 内置的HTTP服务器:支持CGI、Session、SSL等功能。Miniserv.pl和miniserv.pem实现了这个HTTP服务器。它的配置文件通常是/etc/webmin/miniserv.conf,主要有以下几个重要参数:
webmin模块
webmin模块实际上是一个压缩过的tar包,可以通过tar zxvf命令解开任何一个webmin模块包。一般webmin模块的结构如下所示:
目录或文件 | 说明 |
---|---|
index.cgi | 该模块的首页 |
config | 缺省的配置文件 |
config.info | 对配置文件中配置选项的说明 |
module.info | 对模块的说明,包括:模块名(name)、模块描述(desc)、类别(category)、依赖(dependency)和模块版本(version) |
acl_security.pl | 模块的访问控制 |
image/ | 存放模块中用到的图片 |
lange/ | 存放页面信息中得各种语言版本 |
webmin模块中的CGI脚本一般都具有相似的结构,通过webmin技术文档中模板文件为例来说明这种结构:
#!/usr/bin/perl
# 这是webmin模块的一个模板
do '../web-lib-pl';
&init_config();
%access=&get_module_acl;
&ReadParse();
## 检查访问控制(ACL)
## 页眉
&header($text{'index_title'},"","intro",1,1,undef,"Written by<lt;BR>;<lt;A HREF=mailto:auther\@email>;Author<lt;/A>;<lt;BR>;<lt;A HREF=http://baidu.com>;Home://page<lt;/A>;");
## 在这输入自己的代码
## 输出一个表格
print "<lt;table>;",
"<lt;tr $tb>;<lt;td>;$text{'title'}<lt;/td>;<lt;/tr>;\n",
"<lt;tr $tb>;<lt;td>;$text{'project1'}<lt;/td>;<lt;/tr>;\n",
"<lt;/table>;";
## 页脚
&footer("/",$text{'index'});
## 模块中的子函数放在这里
### END of index.cgi ###
这个模块文件结构很清晰,它依次由下面几部分组成:
- webmin中的脚本文件必须包含webmin根目录下地web-lib.pl。它是webmin提供的支持库,所有的webmin的API函数都在这个文件中定义;
- 模板文件首先调用init_config获取本模块的配置选项;
- 接着需要调用get_module_acl获取访问控制表;
- 调用ReadParse函数将HTTP请求的参数编译到关联数组%in 中;
- 检查当前用户是否具有访问这个页面的权限;
- --以上是初始化工作,下面将输出页面--
- 函数header由webmin提供,它打印出一个标准的webmin页眉;
- 在输出自己的页面内容后,可以调用footer函数打印出webmin标准的页脚。
编写webmin模块涉及的几个主要问题:
统一的界面风格
webmin要求形形色色的模块具有相同的界面风格和统一的色彩方案。 为了达到这种效果,所有模块应遵循如下规则:
- 所有支持image、table和form的浏览器都能够正确显示管理页面。 应该尽量避免使用frame、DHTML、JS和Java等和浏览器相关的特征;
- 所有产生HTML页面的CGI程序都应该调有header生成页头。它会生成一个显示页面主题的图片,还可能会加入一些主要的连接。所有这些CGI都应该保持字体类型、大小和风格的一致性;
- 应该使用$tb作为表格头的背景色,使用$cb作为表格体的背景色。就像模板文件中得输出表格语句那样;
- 应该避免在Form中包含大量的输入控件,一些UNIX的浏览器处理这样的Form时会比较慢;
国际化支持
webmin提供国际化支持。 任何希望支持国际化的模块都应该包含子目录lang
。lang目录中包含不同国家语言的系统消息翻译文件。这个文件中每一行包含一个消息的定义:
message_code=Message in this language
webmin根目录下地lang_list.txt包含了现在支持的语言和支持的编码格式。因为webmin的缺省语言是英语,所以消息翻译文件lang/en很特殊。当找不到某消息的某语言版时,会用它的英语版本代替。 简体中文的翻译文件是:lang/zh_CN。
当在页面中使用国际化的消息时,应该使用webmin定义的关联数据$text。如当前webmin使用简体中文,某模块的简体中文消息文件中包括:index_title=我喜欢Webmin
,那么CGI程序中print $text{" index_title"};
的输出是:我喜欢Webmin
模块的配置
webmin中的配置参数分为全局参数
和模块参数
。
- 全局配置参数缺省放在/etc/webmin/config中;
- 模块配置参数缺省放在/etc/webmin/$MODULENAME/config中;
在CGI中调用init_config函数可以全局配置参数读入到关联数组%gconfig,把模块配置参数读入到关联数组%config中。
一个完整的模块应该具有config.info文件,它定义了模块配置参数的信息。webmin根目录下地config.cgi使用这个文件产生修改模块配置参数的页面。config.info中每一行说明一个参数的信息:
config_name=description,type[,values]
- config_name 定义了配置参数的描述,description定义配置参数的说明,type定义配置参数值的类型,values定义配置参数的缺省值。
同一个模块可能在不同的UNIX系统中具有不同的缺省配置。 所以完整的模块还应该包含不同操作系统的缺省配置文件。这些配置文件的命名规则是:
- config-osname-osversion
- config-osname
- config
Webmin目录下的os_list.txt列出了当前webmin支持的UNIX系统。
访问控制
webmin支持基于模块的用户访问控制。/etc/webmin/webmin.acl
文件定义了webmin用户可以访问的模块。如果想实现更小粒度的访问控制,可以使用webmin提供的基于模块操作的用户访问控制。在模块的配置目录下,webmin会为每个用户生成一个访问控制文件,它通常被命名为$username.acl(如:root.acl)
。模块可以编写acl_security.pl来操作这个文件。
webmin要求acl_security.pl定义两个函数操作模块访问控制文件:
acl_security_form(acl)
:该函数输出一个HTML的表格项。这个函数的输出提供给管理员修改某个用户对模块某个操作的访问权限。
acl_security_save(acl,input)
:这个函数可以在保存管理员对访问权限修改前做些必要的操作。
如果没有acl_security.pl,webmin会提供一个缺省的访问控制参数isconfig
,它指定一个用户是否拥有修改模块配置参数的权限。
CGI程序调用get_module_acl把当前用户的访问权限读入一个关联数组。下面是在程序检测用户访问权限的例子:
#!/usr/local/bin/perl
require './foo-lib.pl';
%access = $get_module_acl();
$access{'create'} || &error("You are not allowed to create new foo users");
常用函数
最后简单的列举编写webmin模块经常用到的函数和全局变量:
ReadParseMime
:编译具有MIME参数的HTTP请求参数;file_chooser_button
:返回一个JS按钮,它允许用户选择webmin服务器上的一个文件;user_chooser_button
:返回一个JS按钮,它允许用户选择webmin服务器上的系统用户;group_chooser_button
:返回一个JS按钮,它允许用户选择webmin服务器上得用户组;$module_name
:当前模块的名称;$module_config_directory
:当前模块的配置文件目录;