236 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			236 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/local/bin/perl
 | 
						|
# ==================================================================
 | 
						|
# Gossamer Links - enhanced directory management system
 | 
						|
#
 | 
						|
#   Website  : http://gossamer-threads.com/
 | 
						|
#   Support  : http://gossamer-threads.com/scripts/support/
 | 
						|
#   CVS Info : 087,071,086,086,085      
 | 
						|
#   Revision : $Id: nph-import.cgi,v 1.22 2005/09/19 23:11:16 brewt Exp $
 | 
						|
# 
 | 
						|
# Copyright (c) 2001 Gossamer Threads Inc.  All Rights Reserved.
 | 
						|
# Redistribution in part or in whole strictly prohibited. Please
 | 
						|
# see LICENSE file for full details.
 | 
						|
# ==================================================================
 | 
						|
 | 
						|
use 5.004_04;
 | 
						|
use strict;
 | 
						|
use lib '/var/home/slowtwitch/slowtwitch.com/cgi-bin/articles/admin';
 | 
						|
use vars qw/$Int $Error_FH $Critical_Warnings $Show_Mild_Warnings/;
 | 
						|
use DBI;
 | 
						|
use Links qw/$IN $CFG/;
 | 
						|
use GT::SQL;
 | 
						|
 | 
						|
$| = 1;
 | 
						|
local $SIG{__DIE__} = \&Links::fatal;
 | 
						|
Links::init('/var/home/slowtwitch/slowtwitch.com/cgi-bin/articles/admin');
 | 
						|
Links::init_admin();
 | 
						|
 | 
						|
main();
 | 
						|
 | 
						|
sub get_rec (\*\%$;\@);
 | 
						|
 | 
						|
sub main {
 | 
						|
# -----------------------------------------------------------------------------
 | 
						|
# Load either the CGI interface or Text interface, and turn off all buffering.
 | 
						|
#
 | 
						|
    select((select(STDERR),$|=1)[0]),$|=1;
 | 
						|
    if ($ENV{REQUEST_METHOD}) {
 | 
						|
        require Links::Import::Interface::CGI;
 | 
						|
        $Int = new Links::Import::Interface::CGI;
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        require Links::Import::Interface::Text;
 | 
						|
        $Int = new Links::Import::Interface::Text;
 | 
						|
    }
 | 
						|
    $Error_FH = \do { local *FH; *FH };
 | 
						|
 | 
						|
# Get Import options.
 | 
						|
    my %option = $Int->get_options();
 | 
						|
    unless (keys %option) {
 | 
						|
        return $Int->start_page();
 | 
						|
    }
 | 
						|
    if ($option{help}) {
 | 
						|
        return $Int->show_help();
 | 
						|
    }
 | 
						|
    if ($option{transfer} eq "S1S2") { # Links SQL 1 to Links SQL 2
 | 
						|
        $option{source}         or $Int->usage("You must provide the path to the Links SQL 1 def files","--source");
 | 
						|
        -d $option{source}      or $Int->usage("The path to the Links SQL 1 def files that you gave does not exist", "--source");
 | 
						|
        $option{destination}    or $Int->usage("You must provide the path to the Links SQL 2 def files","--destination");
 | 
						|
        -d $option{destination} or $Int->usage("The path to the Links SQL 2 def files that you gave does not exist", "--destination");
 | 
						|
    }
 | 
						|
    elsif ($option{transfer} eq "L1S2") { # Links 1.x to Links SQL 2
 | 
						|
        $option{source}         or $Int->usage("You must provide the path to the Links 1.x def and db files","--source");
 | 
						|
        -d $option{source}      or $Int->usage("The path to the Links 1.x def and db files that you gave does not exist", "--source");
 | 
						|
        $option{destination}    or $Int->usage("You must provide the path to the Links SQL 2 def files","--destination");
 | 
						|
        -d $option{destination} or $Int->usage("The path to the Links SQL 2 def files that you gave does not exist", "--destination");
 | 
						|
    }
 | 
						|
    elsif ($option{transfer} eq "L2S2") { # Links 2.x to Links SQL 2
 | 
						|
        $option{source}         or $Int->usage("You must provide the path to the Links 2.x def and db files","--source");
 | 
						|
        -d $option{source}      or $Int->usage("The path to the Links 2.x def and db files that you gave does not exist", "--source");
 | 
						|
        $option{destination}    or $Int->usage("You must provide the path to the Links SQL 2 def files","--destination");
 | 
						|
        -d $option{destination} or $Int->usage("The path to the Links SQL 2 def files that you gave does not exist", "--destination");
 | 
						|
    }
 | 
						|
    elsif ($option{transfer} eq "BKS2") { # Backup File to Links SQL 2
 | 
						|
        $option{source}         or $Int->usage("You must provide the path and filename of the backup file to restore","--source");
 | 
						|
        $option{destination}    or $Int->usage("You must provide the path to the Links SQL 2 def files","--destination");
 | 
						|
        -d $option{destination} or $Int->usage("The path to the Links SQL 2 def files that you gave does not exist","--destination");
 | 
						|
        -f $option{source}      or $Int->usage("The backup filename that you gave does not exist","--source");
 | 
						|
        $option{clear_tables}   or $Int->usage("The 'Clear Tables' option must be enabled when performing a restoration from a backup file", "--clear-tables");
 | 
						|
    }
 | 
						|
    elsif ($option{transfer} eq "S2BK") { # Links SQL 2 to Backup File
 | 
						|
        $option{source}         or $Int->usage("You must provide the path to the Links SQL 2 def files","--source");
 | 
						|
        -d $option{source}      or $Int->usage("The path to the Links SQL 2 def files that you gave does not exist","--source");
 | 
						|
        $option{destination}    or $Int->usage("You must provide a destination filename for the backup file","--destination");
 | 
						|
        $option{delimiter}      = "|"; # Fixed delimiter
 | 
						|
    }
 | 
						|
    elsif ($option{transfer} eq "RDFS2" and ref $Int eq "Links::Import::Interface::Text") { # RDF import - can ONLY be done from shell
 | 
						|
        if (not $option{source}) {
 | 
						|
            $Int->usage("You must provide the path and filename to the RDF file","--source");
 | 
						|
        }
 | 
						|
        elsif (not -r $option{source}) {
 | 
						|
            $Int->usage("The path and filename to the RDF file that you gave does not exist, or does not have read permissions set correctly", "--source");
 | 
						|
        }
 | 
						|
        $option{rdf_category}   or $Int->usage("You must specify an RDF category to import","--rdf-category");
 | 
						|
        if (not $option{rdf_add_date} or $option{rdf_add_date} !~ /^\d{4}-\d\d-\d\d$/) {
 | 
						|
            $Int->usage("You must specify a valid RDF Add_Date in the format `YYYY-MM-DD'","--rdf-add-date");
 | 
						|
        }
 | 
						|
    }
 | 
						|
    elsif (!$option{transfer}) {
 | 
						|
        $Int->usage("You did not specify the import format or backup/restore function","--import, --backup, or --restore");
 | 
						|
        $Int->show_usage;
 | 
						|
        critical("You did not specify the import format or backup/restore function");
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        $Int->usage("Invalid import format specified","--import");
 | 
						|
        $Int->show_usage;
 | 
						|
        critical("Invalid import format specified");
 | 
						|
    }
 | 
						|
    if ($option{straight_import} and not $option{clear_tables}) {
 | 
						|
        $Int->usage("the `Straight Import' option can only be used if `Clear Tables' has been turned on","--straight-import --clear-tables");
 | 
						|
        $Int->show_usage;
 | 
						|
        critical("the `Straight Import' option not allowed unless `Clear Tables' has been turned on");
 | 
						|
    }
 | 
						|
    $Int->has_usage() and $Int->show_usage, exit;
 | 
						|
    if ($option{error_file}) {
 | 
						|
        if (ref $option{error_file} eq "CODE") {
 | 
						|
            $Error_FH = $option{error_file};
 | 
						|
        }
 | 
						|
        elsif (uc $option{error_file} eq 'STDOUT') {
 | 
						|
            open $Error_FH, ">&STDOUT";
 | 
						|
            select +(select($Error_FH),$|=1)[0];
 | 
						|
        }
 | 
						|
        elsif (uc $option{error_file} eq 'STDERR') {
 | 
						|
            open $Error_FH, ">&STDERR";
 | 
						|
            select +(select($Error_FH),$|=1)[0];
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            unless (open $Error_FH,"> $option{error_file}") {
 | 
						|
                $Int->usage("Invalid error file: Cannot open $option{error_file}: $!");
 | 
						|
                $Int->show_usage;
 | 
						|
                exit;
 | 
						|
            }
 | 
						|
            select +(select($Error_FH),$|=1)[0];
 | 
						|
        }
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        open $Error_FH, ">&STDERR";
 | 
						|
        select +(select($Error_FH),$|=1)[0];
 | 
						|
    }
 | 
						|
    $Critical_Warnings = delete $option{critical_warnings};
 | 
						|
    $Show_Mild_Warnings = delete $option{show_mild_warnings};
 | 
						|
 | 
						|
# Switch delims from windows to unix
 | 
						|
    $option{source}      =~ s,\\,/,g;
 | 
						|
    $option{destination} =~ s,\\,/,g;
 | 
						|
 | 
						|
 | 
						|
    do_import(%option);
 | 
						|
    $Int->finished();
 | 
						|
}
 | 
						|
 | 
						|
sub mild_warning {
 | 
						|
# -----------------------------------------------------------------------------
 | 
						|
# Display mild warnings.
 | 
						|
#
 | 
						|
    if ($Show_Mild_Warnings) {
 | 
						|
        for (@_) { error("Warning: $_") }
 | 
						|
    }
 | 
						|
    0;
 | 
						|
}
 | 
						|
 | 
						|
sub warning {
 | 
						|
# -----------------------------------------------------------------------------
 | 
						|
# Display warnings.
 | 
						|
#
 | 
						|
    if ($Critical_Warnings) {
 | 
						|
        goto &critical;
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        for (@_) { error("WARNING: $_") }
 | 
						|
    }
 | 
						|
    0;
 | 
						|
}
 | 
						|
 | 
						|
sub critical {
 | 
						|
# -----------------------------------------------------------------------------
 | 
						|
# Display critical warnings.
 | 
						|
#
 | 
						|
    my ($prog,$line) = (caller(1))[1,2];
 | 
						|
    for (@_) { error("CRITICAL ERROR OCCURED: $_ at $prog line $line\n\n") }
 | 
						|
    print STDERR join('\n',map "CRITICAL ERROR OCCURED: $_", @_)." at $prog line $line\n";
 | 
						|
    exit 0xff; # mimics die()
 | 
						|
}
 | 
						|
 | 
						|
sub error {
 | 
						|
# -----------------------------------------------------------------------------
 | 
						|
# Display error messages.
 | 
						|
#
 | 
						|
    local ($,,$\);
 | 
						|
    if (ref $Error_FH eq "CODE") {
 | 
						|
        $Error_FH->(@_);
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        local $,="\n";
 | 
						|
        local $\="\n";
 | 
						|
        if (defined fileno $Error_FH) {
 | 
						|
            print $Error_FH @_;
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            print @_;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
sub do_import (\%) {
 | 
						|
# -----------------------------------------------------------------------------
 | 
						|
# Do the actual import.
 | 
						|
#
 | 
						|
    my $opt = @_ == 1 ? shift : {@_};
 | 
						|
    $Int->pre_import();
 | 
						|
    if ($$opt{transfer} eq "S1S2") {
 | 
						|
        require Links::Import::S1S2;
 | 
						|
        return Links::Import::S1S2::import($opt,\&warning,\&critical,\&mild_warning);
 | 
						|
    }
 | 
						|
    elsif ($$opt{transfer} eq "S2BK") {
 | 
						|
        require Links::Import::S2BK;
 | 
						|
        return Links::Import::S2BK::import($opt,\&warning,\&critical,\&mild_warning);
 | 
						|
    }
 | 
						|
    elsif ($$opt{transfer} eq "BKS2") {
 | 
						|
        require Links::Import::BKS2;
 | 
						|
        return Links::Import::BKS2::import($opt,\&warning,\&critical,\&mild_warning);
 | 
						|
    }
 | 
						|
    elsif ($$opt{transfer} eq "L1S2") {
 | 
						|
        require Links::Import::L1S2;
 | 
						|
        return Links::Import::L1S2::import($opt,\&warning,\&critical,\&mild_warning);
 | 
						|
    }
 | 
						|
    elsif ($$opt{transfer} eq "L2S2") {
 | 
						|
        require Links::Import::L2S2;
 | 
						|
        return Links::Import::L2S2::import($opt,\&warning,\&critical,\&mild_warning);
 | 
						|
    }
 | 
						|
    elsif ($$opt{transfer} eq "RDFS2") {
 | 
						|
        require Links::Import::RDFS2;
 | 
						|
        return Links::Import::RDFS2::import($opt,\&warning,\&critical,\&mild_warning);
 | 
						|
    }
 | 
						|
}
 |