#!/usr/local/bin/perl
#
# MiniVend session dumper
#
# $Id: dump,v 2.3 1997/01/07 01:40:44 mike Exp $
#
# This program is largely based on Vend 0.2
# Copyright 1995 by Andrew M. Wilcox <awilcox@world.std.com>
#
# Portions from Vend 0.3
# Copyright 1995 by Andrew M. Wilcox <awilcox@world.std.com>
#
# Enhancements made by and
# Copyright 1996 by Michael J. Heins <mikeh@iac.net>
#
# See the file 'Changes' for information.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

BEGIN {
$Global::VendRoot = '/home/minivend';
}
### END CONFIGURABLE VARIABLES

$Global::ConfigFile = 'minivend.cfg';
$Global::HammerLock = 20;
$Global::ErrorFile = "$Global::VendRoot/error.log";

$Vend::SessionName = 'utility';

use lib $Global::VendRoot;

my $DEBUG = 1;

use strict;
use Fcntl;

#select a DBM

BEGIN {
	$Global::GDBM = $Global::DB_File = $Global::NDBM = $Global::Msql = 0;
    AUTO: {
        last AUTO if
            (defined $ENV{MINIVEND_DBFILE} and $Global::DB_File = 1);
        eval {require GDBM_File and $Global::GDBM = 1} ||
        eval {require DB_File and $Global::DB_File = 1};
    }
	if($Global::GDBM) {
		require Vend::Table::GDBM;
		import GDBM_File;
		$Global::GDBM = 1;
	}
	elsif($Global::DB_File) {
		require Vend::Table::DB_File;
		import DB_File;
		$Global::DB_File = 1;
	}
	else {
		die "No DBM defined! (File sessions can be viewed without this program.)\n";
	}
}

use Vend::Session;
use Vend::Config qw(get_catalog_default);

my $USAGE = <<EOF;
usage: dump -c catalog 
           or
       dump sessionfile [sessionfile.lock]
EOF

my $catalog;
my (%wanted) = qw(	sessiondatabase SessionDatabase
					sessionlockfile SessionLockFile
					errorfile       ErrorFile);

$Vend::Cfg = {};

GETOPT: {

if($ARGV[0] eq '-c') {
	shift(@ARGV);
	$catalog = shift(@ARGV);
	last GETOPT;
}
else {
	$Vend::Cfg->{SessionDatabase} = shift
		|| die $USAGE;
	$Vend::Cfg->{SessionDatabase} =~ s/\.(gdbm|db)$//;
	warn "Session Database: $Vend::Cfg->{SessionDatabase}\n" if $DEBUG;
	$Vend::Cfg->{SessionLockFile} = shift;
	if (defined $Vend::Cfg->{SessionLockFile}) { 
		die <<EOF unless -f $Vend::Cfg->{SessionLockFile};
Session lock file '$Vend::Cfg->{SessionLockFile}' doesn't exist.
Create one if you are sure the MiniVend server is down, then try
again.
EOF
	}
	elsif (-f "$Vend::Cfg->{SessionDatabase}.lock") {
		$Vend::Cfg->{SessionLockFile} = 
				"$Vend::Cfg->{SessionDatabase}.lock";
	}
	else {
		my $dir = $Vend::Cfg->{SessionDatabase};
		my $file;
		$dir =~ s:/?([^/]+)$::;
		$file = $1;
		die "Aborting, no lock files found, even in $dir/etc/$file.lock!\n"
			unless -f "$dir/etc/$file.lock";
		$Vend::Cfg->{SessionLockFile} ="$dir/etc/$file.lock";
	}

}

} # END GETOPT

die "too many args, aborting.\n" 
		if @ARGV;

if(defined $catalog) {
	my($name,$dir,$param);
	chdir $Global::VendRoot;
	open(GLOBAL, $Global::ConfigFile) or
		die "No global configuration file? Aborting.\n";
	while(<GLOBAL>) {
		next unless /^\s*catalog\s+$catalog\s+/i;
		chomp;
		s/^\s+//;
		(undef,$name,$dir,$param) = split /\s+/, $_, 4;
		last;
	}
	close GLOBAL;
	die "Catalog $catalog not found in $Global::ConfigFile.\n"
		unless defined $name;
	chdir $dir or die "chdir to $dir: $!\n";
	open(CATALOG, 'catalog.cfg') or
		die "No catalog configuration file? Aborting.\n";
	my (%seen);
	while(<CATALOG>) {
		next unless /\S/;
		next if /^\s*#/;
		chomp;
		s/^\s+//;
		s/\s+$//;
		($name,$param) = split /\s+/, $_, 2;
		next unless defined $wanted{lc $name};
		$seen{$wanted{lc $name}} = $param;
	}
	close CATALOG;
	for(values %wanted) {
		next if defined $seen{$_};
		$seen{$_} = get_catalog_default($_);
	}
	for(keys %seen) {
		$Vend::Cfg->{$_} = $seen{$_};
		warn "$_: $Vend::Cfg->{$_}\n"
			if $DEBUG;
	}
}

die $USAGE unless defined $Vend::Cfg->{SessionLockFile};

get_session();
dump_sessions();
release_session();

