version 1.5, 2010/12/13 05:54:50
|
version 1.6, 2010/12/14 20:32:49
|
Line 13 BEGIN {
|
Line 13 BEGIN {
|
delete @ENV{qw(IFS CDPATH ENV BASH_ENV PATH)}; |
delete @ENV{qw(IFS CDPATH ENV BASH_ENV PATH)}; |
$ENV{PATH} = "/bin:/usr/bin"; |
$ENV{PATH} = "/bin:/usr/bin"; |
$|++; |
$|++; |
# Flip this back on for more detailed error reporting |
$SIG{__DIE__} = sub { require Carp; Carp::confess(@_); } |
# $SIG{__DIE__} = sub { require Carp; Carp::confess(@_); } |
|
} |
} |
|
|
use strict; |
use strict; |
Line 30 use threads;
|
Line 29 use threads;
|
use threads::shared; |
use threads::shared; |
|
|
## |
## |
## Fetch our command line options |
## Fetch our command line and configuration options |
## |
## |
my %opts = &fetchOptions( ); |
my %opts = &fetchOptions( ); |
my $pidFile = "/var/run/telnetbbs.pid"; |
my %cfg = &fetchConfig( ); |
my $EOL = "\015\012"; |
my $EOL = "\015\012"; |
|
|
## |
## |
## These will be moved in to a config file |
## These will be moved in to a config file |
## |
## |
my $DISPLAY = ":0.0"; |
|
my $BBS_NAME = "Hell's Dominion BBS"; |
|
my $BBS_NODE = 0; |
my $BBS_NODE = 0; |
my $DBCONF = "/tmp/dosbox-__NODE__.conf"; |
my $pidFile = $cfg{'pidfile'} || "/tmp/telnetbbs.pid"; |
my $BBS_CMD = "DISPLAY=$DISPLAY /usr/bin/dosbox -conf "; |
my $port = $opts{'port'} || $cfg{'port'} || 23; |
my $LOG = "/var/log/bbs.log"; |
my $DISPLAY = $cfg{'display'} || ":0.0"; |
my $MAX_NODE = 1; |
my $BBS_NAME = $cfg{'bbs_name'} || "Hell's Dominion BBS"; |
my $DOSBOXT = "dosbox.conf.template"; |
my $DBCONF = $cfg{'dosbox_cfg'} || "/tmp/dosbox-__NODE__.conf"; |
my $BASE_PORT = 7000; |
my $BBS_CMD = $cfg{'bbs_cmd'} || "DISPLAY=$DISPLAY /usr/bin/dosbox -conf "; |
my $LOCK_PATH = "/tmp"; |
my $LOGGING = $cfg{'logging'} || 0; |
|
my $LOG = $cfg{'log_path'} || "/tmp/bbs.log"; |
|
my $MAX_NODE = $cfg{'nodes'} || 1; |
|
my $DOSBOXT = $cfg{'dosboxt'} || "dosbox.conf.template"; |
|
my $BASE_PORT = $cfg{'base_port'} || 7000; |
|
my $LOCK_PATH = $cfg{'lock_path'} || "/tmp"; |
|
|
## |
## |
## Check that we are 'root' |
## Check that we are 'root' |
## |
## |
die( "Must be root user to run this.\n" ) |
die( "Must be root user to run this.\n" ) |
if ( getpwuid( $> ) ne "root" ); |
if ( getpwuid( $> ) ne "root" && $port < 1023 ); |
|
|
## |
## |
## Check for a PID |
## Check for a PID |
Line 75 local $SIG{HUP} = $SIG{INT} = $SIG{TERM
|
Line 77 local $SIG{HUP} = $SIG{INT} = $SIG{TERM
|
## |
## |
## Open the Log |
## Open the Log |
## |
## |
#open LOG, ">>$LOG"; |
open LOG, ">>$LOG" if ( $LOGGING ); |
&logmsg( "Starting telnetbbs server" ); |
&logmsg( "Starting telnetbbs server" ); |
|
|
## |
## |
|
## Display running information |
|
## |
|
&display_config_and_options( \%opts, "Options" ); |
|
&display_config_and_options( \%cfg, "Configuration" ); |
|
|
|
## |
## Start the network server |
## Start the network server |
## |
## |
my $netThread = threads->create( \&startNetServer( ) ); |
my $netThread = threads->create( \&startNetServer( ) ); |
Line 99 while( 1 ) { sleep 1; }
|
Line 107 while( 1 ) { sleep 1; }
|
############################################################################### |
############################################################################### |
############################################################################### |
############################################################################### |
|
|
sub logmsg { print STDOUT "$0 $$ ", scalar localtime, ":@_\n" } |
sub logmsg |
|
{ |
|
my $message = "$0 $$ " . scalar( localtime( ) ) . ":@_\n"; |
|
print STDOUT $message; |
|
print LOG $message if ( $LOGGING ); |
|
} |
|
|
|
|
|
############################################################################### |
|
############################################################################### |
|
sub display_config_and_options |
|
{ |
|
my $hr = shift || 0; |
|
my $name = shift || "Unknown"; |
|
my $title = "Displaying $name\n"; |
|
|
|
return $hr if ( ! $hr ); |
|
|
|
print LOG $title . Dumper( $hr ) if ( $LOGGING ); |
|
print STDOUT $title . Dumper( $hr ) if ( $opts{'verbose'}); |
|
} |
|
|
############################################################################### |
############################################################################### |
## startNetServer( ); |
## startNetServer( ); |
Line 112 sub startNetServer
|
Line 140 sub startNetServer
|
{ |
{ |
my $hostConnection; |
my $hostConnection; |
my $childPID; |
my $childPID; |
my $port = $opts{'port'} || 23; |
|
my @nodes = ( ); |
my @nodes = ( ); |
|
|
my $server = IO::Socket::INET->new( |
my $server = IO::Socket::INET->new( |
Line 283 sub shutdown
|
Line 310 sub shutdown
|
## |
## |
## Close Log |
## Close Log |
## |
## |
close( LOG ); |
close( LOG ) if ( $LOGGING ); |
|
|
## |
## |
## Remove the PID |
## Remove the PID |
Line 399 sub processExists
|
Line 426 sub processExists
|
return 0; |
return 0; |
} |
} |
|
|
|
############################################################################### |
|
############################################################################### |
|
sub fetchConfig |
|
{ |
|
my %conf = ( ); |
|
my $cf = &findConfig; |
|
|
|
if ( $cf ) |
|
{ |
|
open( CONF, "<$cf" ) or die ( "Error opening $cf: $!\n" ); |
|
while( <CONF> ) |
|
{ |
|
next if ( $_ =~ m/^#/ ); |
|
if ( $_ =~ m/(.*?)=(.*)/ ) |
|
{ |
|
my $k = $1; my $v = $2; |
|
$k =~ s/\s+//; |
|
$v =~ s/\s+//; |
|
$conf{$k} = $v; |
|
} |
|
} |
|
close( CONF ); |
|
} |
|
|
|
return %conf; |
|
} |
|
|
|
############################################################################### |
|
############################################################################### |
|
sub findConfig |
|
{ |
|
my $cf = 0; |
|
my @paths = qw| ./ ./.telnetbbs /etc /usr/local/etc |; |
|
|
|
foreach ( @paths ) |
|
{ |
|
my $fn = $_ . "/telnetbbs.conf"; |
|
return $fn if ( -f $fn ); |
|
} |
|
|
|
return $cf; |
|
} |
|
|
############################################################################### |
############################################################################### |
## |
## |
Line 414 sub fetchOptions {
|
Line 483 sub fetchOptions {
|
"help|?" => \$opts{'help'}, |
"help|?" => \$opts{'help'}, |
"man" => \$opts{'man'}, |
"man" => \$opts{'man'}, |
"port:i" => \$opts{'port'}, |
"port:i" => \$opts{'port'}, |
|
"verbose" => \$opts{'verbose'}, |
) || &pod2usage( ); |
) || &pod2usage( ); |
&pod2usage( ) if defined $opts{'help'}; |
&pod2usage( ) if defined $opts{'help'}; |
&pod2usage( { -verbose => 2, -input => \*DATA } ) if defined $opts{'man'}; |
&pod2usage( { -verbose => 2, -input => \*DATA } ) if defined $opts{'man'}; |