smeserver-loginscript/root/etc/e-smith/web/functions/loginscript

251 lines
7.5 KiB
Plaintext
Raw Normal View History

#!/usr/bin/perl -wT
#----------------------------------------------------------------------
# heading : Collaboration
# description : Login script manager
# navigation : 3000 3375
#----------------------------------------------------------------------
package esmith;
use strict;
use CGI ':all';
use CGI::Carp qw(fatalsToBrowser);
use esmith::cgi;
use esmith::config;
use esmith::util;
BEGIN
{
# Clear PATH and related environment variables so that calls to
# external programs do not cause results to be tainted. See
# "perlsec" manual page for details.
$ENV {'PATH'} = '';
$ENV {'SHELL'} = '/bin/bash';
delete $ENV {'ENV'};
}
esmith::util::setRealToEffective ();
$CGI::POST_MAX=1024 * 100; # max 100K posts
$CGI::DISABLE_UPLOADS = 1; # no uploads
my %conf;
tie %conf, 'esmith::config';
#------------------------------------------------------------
# examine state parameter and display the appropriate form
#------------------------------------------------------------
my $q = new CGI;
if (! grep (/^state$/, $q->param))
{
showInitial ($q, '', '');
}
elsif ($q->param ('state') eq "perform")
{
performAndShowResult ($q);
}
else
{
esmith::cgi::genStateError ($q, \%conf);
}
exit (0);
#------------------------------------------------------------
# subroutine to display initial form
#------------------------------------------------------------
sub showInitial ($$$)
{
my ($q, $msg, $netlogon) = @_;
#------------------------------------------------------------
# If there's a message, we just finished an operation so show the
# status report. If no message, this is a new list of accounts.
#------------------------------------------------------------
if ($msg eq '')
{
esmith::cgi::genHeaderNonCacheable
($q, \%conf, 'Modify Windows login script');
}
else
{
esmith::cgi::genHeaderNonCacheable
($q, \%conf, 'Operation status report');
print $q->p ($msg);
print $q->hr;
}
#------------------------------------------------------------
# Re-load the netlogon template file if it hasn't been passed
#------------------------------------------------------------
if ( $netlogon eq '' )
{
if ( -e '/home/e-smith/files/samba/netlogon/netlogon.template' )
{
open ( NETLOGON, '< /home/e-smith/files/samba/netlogon/netlogon.template' )
|| die 'Couldn\'t open /home/e-smith/files/samba/netlogon/netlogon.template file!';
my @netlogon = <NETLOGON>;
close NETLOGON;
foreach (@netlogon)
{
$netlogon .= $_;
}
}
else
{
$netlogon = "\@ECHO OFF\015\n\015\n";
}
}
my %driveLabels = ('d' => 'D:','e' => 'E:','f' => 'F:','g' => 'G:','h' => 'H:','i' => 'I:','j' => 'J:','k' => 'K:','l' => 'L:','m' => 'M:','n' => 'N:','o' => 'O:','p' => 'P:','q' => 'Q:','r' => 'R:','s' => 'S:','t' => 'T:','u' => 'U:','v' => 'V:','w' => 'W:','x' => 'X:','y' => 'Y:','z' => 'Z:');
# Define the WinNTLogonDrive conf value if it hasn't been defined
if (! defined ( $conf{'WinNTLogonDrive'} ) )
{
$conf{'WinNTLogonDrive'} = 'h';
}
print $q->startform (-method => 'POST', -action => $q->url (-absolute => 1));
print $q->p ('Below you can modify the login script template.');
print $q->p ("You can use special tags '".
$q->tt($q->b('#ifg groupname1, groupname2...')). "', '".
$q->tt($q->b('#ifu username1, username2...')). "', '".
$q->tt($q->b('#ifm machinename1, machinename2...')). "', '".
$q->tt($q->b('#ifa archtype1, archtype2...')). "' and '".
$q->tt($q->b('#endif')).
"' to create blocks of script that are only included ".
'if those criteria are met.');
print $q->p ('See this ', $q->a({href => '../loginscriptexample.html'}, 'example'), ' to get a better idea.');
print $q->table ({border => 0, cellspacing => 0, cellpadding => 4},
esmith::cgi::genTextRow(
$q, $q->textarea (-name => 'netlogon',
-override => 1,
-default => $netlogon,
-rows => 16,
-columns => 64)),
esmith::cgi::genTextRow
($q, $q->p ('A drive letter will automatically be mapped to the users home folder. ',
'You can specify which drive the clients will use here:')),
esmith::cgi::genWidgetRow ($q,
"Home Drive",
$q->popup_menu (-name => 'logonDrive',
-values => ['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'],
-default => $conf {'WinNTLogonDrive'},
-labels => \%driveLabels)),
$q->Tr (esmith::cgi::genCell
($q, $q->b ($q->submit (-name => 'action', -value => 'Save')))));
print $q->hidden (-name => 'state', -override => 1, -default => 'perform');
print $q->endform;
esmith::cgi::genFooter ($q);
}
#------------------------------------------------------------
# subroutine to perform actions and display result
#------------------------------------------------------------
sub performAndShowResult ($)
{
my ($q) = @_;
my $netlogon = $q->param ('netlogon');
my $logonDrive = $q->param ('logonDrive');
#------------------------------------
# Check the file for mis-matched if's
#------------------------------------
my $line;
my $level = 0;
my $msg = '';
my @netlogonlist = split( "\n", $netlogon );
foreach $line (@netlogonlist)
{
next if ( $msg ne '' );
if ( ( index $line, '#if' ) == 0 )
{
if ( ( index $line, '#ifg' ) == 0 || ( index $line, '#ifu' ) == 0 ||
( index $line, '#ifa' ) == 0 || ( index $line, '#ifm' ) == 0 )
{
$level++;
}
else
{
$msg = 'Error: Unrecognised #if tag found. '.
$q->b('Script NOT saved.');;
}
}
elsif ( ( index $line, '#endif' ) == 0 )
{
$level--;
}
if ( $msg eq '' && $level < 0 )
{
$msg = 'Error: There are misplaced #endif tag(s) or missing '.
'#if tag(s). ' . $q->b('Script NOT saved.');;
}
}
if ( $msg eq '' )
{
if ( $level != 0 )
{
$msg = 'Error: There are misplaced #if tag(s) or missing '.
'#endif tag(s). ' . $q->b('Script NOT saved.');
}
}
if ( $msg eq '' )
{
#------------------------------------------------------
# Write the new netlogon file (if there were no errors)
#------------------------------------------------------
open ( NETLOGON, '> /home/e-smith/files/samba/netlogon/netlogon.template' )
|| die 'Couldn\'t open /home/e-smith/files/samba/netlogon/netlogon.template file!';
print NETLOGON $netlogon;
close NETLOGON;
$msg = 'Login script successfully saved.';
}
#-------------------------------
# Save the WinNTLogonDrive value
#-------------------------------
$conf{'WinNTLogonDrive'} = $logonDrive;
system ("/sbin/e-smith/signal-event", "conf-logondrive") == 0
or die ("Error occurred while saving logon drive.\n");
showInitial( $q, $msg, $netlogon );
}