系统开发模块的分析
针对系统的设计需求,我们应用了多种开源软件进行整合开发。例如处理磁盘配额问题,采用Quota 来进行管理;对于远程主机调用的问题,采用 SSH方法;我们使用 Apache为用户提供 Web 服务;对于FTP 服务我们采用vsftp;对于系统的数据库,我们采用MySQL软件 。另外,我们需要对虚拟主机信息进行监控,所以选择了Awstats、Cacti和CutyCapt。
我们对系统开发模块进行具体分析。
1.用户登录模块
在虚拟主机网络中所有主机的数据库上都保存一份管理员的用户名和密码。当用户登录时,首先看到的是登录页面,页面上有验证码, 需要用户输入验证码才能进行用户名和密码的验证。在用户提交表单后,先检查验证码是否正确,如果不正确,则返回登录页面,如果正确,则继续进行用户名和密码验证。当所有验证都通过时,将Sessionid写入用户Cookie,返回给用户管理页面。
部分代码实现:
if ($method eq "POST" ) {
my $u= param('user');
my $p= param('passwd');
if($u eq undef||$u eq '')
{
//验证码验证
my $ccode = param('ccode');
my $sid = $q->cookie("CGISESSID") || $q->param('CGISESSID')
||undef;
my $session = new CGI::Session("driver:File", $sid ,
{Directory=>'/tmp'});
my $gcode = $session->param("ccode");
if($ccode ne $gcode)
{
print $q->header(-charset=>'utf8');
print qq{<meta http-equiv="refresh" content="1; url=index.pl">};
print $gt->get("Bad Check Code!");
return 0;
}
my %user;
//连接数据库
my $dbh=DBI->connect("DBI:mysql:database=vhms;
host=localhost","root","",{'RaiseError'=>1});
my $sqr = $dbh->prepare("SELECT name,passwd from vhuser");
$sqr->execute();
while(my @ref = $sqr->fetchrow_array()){
my($a,$b)=($ref[0],$ref[1]);
$user{$a}=$b;
}
$dbh->disconnect();
$p = md5_base64($p);
if (defined($user{$u}) && ($user{$u} eq $p)) {
//加入session cookie
#my $session = new CGI::Session("driver:File", $q ,
{Directory=>'/tmp'});
my $cookie = $q->cookie(CGISESSID =>$session->id );
$session->param('u_name', $u);
$session->param('p_pass', $p);
$session->expire('+1h');
print $q->header(-charset=>'utf-8', -cookie=>$cookie);
print qq{<meta http-equiv="refresh" content="1; url=index.pl">};
print "\n";
print $q->start_html(
-title=>$gt->get('VHMS'),
);
//成功登录
print $q->h1($gt->get("<Center>Login Success!</center>"));
print $gt->get("Redirecting...");
#print $q->redirect("./vhostlist.pl");
2.系统验证登录和退出
用户进行每一步操作时都要进行是否登录的验证,以阻止未登录用户直接调用某个页面进行操作,这是由单独的模块进行:每次用户进行操作时,都对用户sessionid 与已经登录的sessionid进行比较,如果二者相同,则认为用户已经登录。
用户登出时,服务器清空Session。
3.系统新增节点
当系统增加服务器节点时,先在新增加的实体机节点上配置、授权一台虚拟主机管理网络中的主机访问,再在这台授权过的主机上增加节点。增加节点时,虚拟主机管理会更新所有主机上的主机列表,复制当前的列表到新增主机上,授权数据库,并同步RSA公钥,完成授权。
部分代码实现:
my $method = $ENV{"REQUEST_METHOD"};
if($method eq "POST")
{
my $str0 = $gt->get("Add New Node");
print $q->header(-charset=>'utf-8');
print $q->start_html(
-title=>'$str0',
-author=>'lovewilliam@gmail.com',
);
print "<link rel='stylesheet' type='text/css' href='/vhms/css/
c3.css' />";
print $gt->get("Add New Node on Host :");
print $q->br();
my $node_ip = param("node_ip");
my $node_sqlu = param("node_sqlu");
my $node_sqlp = param("node_sqlp");