add framework for running Mason components standalone
authorivan <ivan>
Mon, 21 Jul 2008 18:58:47 +0000 (18:58 +0000)
committerivan <ivan>
Mon, 21 Jul 2008 18:58:47 +0000 (18:58 +0000)
FS/FS/CGI.pm
FS/FS/Mason.pm [new file with mode: 0644]
FS/FS/Mason/Request.pm [new file with mode: 0644]
FS/MANIFEST
Makefile
htetc/handler.pl

index 96047f6..7ad1dc2 100644 (file)
@@ -194,16 +194,24 @@ sub myexit {
   }
 }
 
-=item popurl LEVEL
+=item popurl LEVEL [URL]
 
-Returns current URL with LEVEL levels of path removed from the end (default 0).
+Returns current (or, optionally, passed) URL with LEVEL levels of path removed
+from the end (default 0).
 
 =cut
 
 sub popurl {
-  my($up)=@_;
-  my $cgi = &FS::UID::cgi;
-  my $url_string = $cgi->isa('Apache') ? $cgi->uri : $cgi->url;
+  my $up = shift;
+
+  my $url_string;
+  if ( scalar(@_) ) {
+    $url_string = shift;
+  } else {
+    my $cgi = &FS::UID::cgi;
+    $url_string = $cgi->isa('Apache') ? $cgi->uri : $cgi->url;
+  }
+
   $url_string =~ s/\?.*//;
   my $url = new URI::URL ( $url_string );
   my(@path)=$url->path_components;
diff --git a/FS/FS/Mason.pm b/FS/FS/Mason.pm
new file mode 100644 (file)
index 0000000..219f6b7
--- /dev/null
@@ -0,0 +1,371 @@
+package FS::Mason;
+
+use strict;
+use vars qw( @ISA @EXPORT_OK );
+use Exporter;
+use HTML::Mason 1.27; #http://www.masonhq.com/?ApacheModPerl2Redirect
+use HTML::Mason::Interp;
+use HTML::Mason::Compiler::ToObject;
+
+@ISA = qw( Exporter );
+@EXPORT_OK = qw( mason_interps );
+
+=head1 NAME
+
+FS::Mason - Initialize the Mason environment
+
+=head1 SYNOPSIS
+
+  use FS::Mason qw( mason_interps );
+
+  my( $fs_interp, $rt_interp ) = mason_interps('apache');
+
+  #OR
+
+  my( $fs_interp, $rt_interp ) = mason_interps('standalone'); #XXX name?
+
+=head1 DESCRIPTION
+
+Initializes the Mason environment, loads all Freeside and RT libraries, etc.
+
+=cut
+
+# List of modules that you want to use from components (see Admin
+# manual for details)
+{
+  package HTML::Mason::Commands;
+
+  use strict;
+  use vars qw( %session );
+  use CGI 3.29 qw(-private_tempfiles); #3.29 to fix RT attachment problems
+  #use CGI::Carp qw(fatalsToBrowser);
+  use CGI::Cookie;
+  use List::Util qw( max min );
+  use Data::Dumper;
+  use Date::Format;
+  use Date::Parse;
+  use Time::Local;
+  use Time::Duration;
+  use DateTime;
+  use DateTime::Format::Strptime;
+  use Lingua::EN::Inflect qw(PL);
+  use Tie::IxHash;
+  use URI::URL;
+  use URI::Escape;
+  use HTML::Entities;
+  use HTML::TreeBuilder;
+  use HTML::FormatText;
+  use JSON;
+  use MIME::Base64;
+  use IO::Handle;
+  use IO::File;
+  use IO::Scalar;
+  #not actually using this yet anyway...# use IPC::Run3 0.036;
+  use Net::Whois::Raw qw(whois);
+  if ( $] < 5.006 ) {
+    eval "use Net::Whois::Raw 0.32 qw(whois)";
+    die $@ if $@;
+  }
+  use Text::CSV_XS;
+  use Spreadsheet::WriteExcel;
+  use Business::CreditCard 0.30; #for mask-aware cardtype()
+  use NetAddr::IP;
+  use String::Approx qw(amatch);
+  use Chart::LinesPoints;
+  use Chart::Mountain;
+  use Color::Scheme;
+  use HTML::Widgets::SelectLayers 0.07; #should go away in favor of
+                                        #selectlayers.html
+  use Locale::Country;
+  use Business::US::USPS::WebTools::AddressStandardization;
+  use FS;
+  use FS::UID qw( getotaker dbh datasrc driver_name );
+  use FS::Record qw( qsearch qsearchs fields dbdef
+                    str2time_sql str2time_sql_closing
+                   );
+  use FS::Conf;
+  use FS::CGI qw(header menubar table itable ntable idiot
+                 eidiot myexit http_header);
+  use FS::UI::Web qw(svc_url);
+  use FS::UI::Web::small_custview qw(small_custview);
+  use FS::UI::bytecount;
+  use FS::Msgcat qw(gettext geterror);
+  use FS::Misc qw( send_email send_fax states_hash counties state_label );
+  use FS::Report::Table::Monthly;
+  use FS::TicketSystem;
+
+  use FS::agent;
+  use FS::agent_type;
+  use FS::domain_record;
+  use FS::cust_bill;
+  use FS::cust_bill_pay;
+  use FS::cust_credit;
+  use FS::cust_credit_bill;
+  use FS::cust_main qw(smart_search);
+  use FS::cust_main_county;
+  use FS::cust_pay;
+  use FS::cust_pkg;
+  use FS::part_pkg_taxclass;
+  use FS::cust_pkg_reason;
+  use FS::cust_refund;
+  use FS::cust_credit_refund;
+  use FS::cust_pay_refund;
+  use FS::cust_svc;
+  use FS::nas;
+  use FS::part_bill_event;
+  use FS::part_event;
+  use FS::part_event_condition;
+  use FS::part_pkg;
+  use FS::part_referral;
+  use FS::part_svc;
+  use FS::part_svc_router;
+  use FS::part_virtual_field;
+  use FS::pay_batch;
+  use FS::pkg_svc;
+  use FS::port;
+  use FS::queue qw(joblisting);
+  use FS::raddb;
+  use FS::session;
+  use FS::svc_acct;
+  use FS::svc_acct_pop qw(popselector);
+  use FS::acct_rt_transaction;
+  use FS::svc_domain;
+  use FS::svc_forward;
+  use FS::svc_www;
+  use FS::router;
+  use FS::addr_block;
+  use FS::svc_broadband;
+  use FS::svc_external;
+  use FS::type_pkgs;
+  use FS::part_export;
+  use FS::part_export_option;
+  use FS::export_svc;
+  use FS::msgcat;
+  use FS::rate;
+  use FS::rate_region;
+  use FS::rate_prefix;
+  use FS::payment_gateway;
+  use FS::agent_payment_gateway;
+  use FS::XMLRPC;
+  use FS::payby;
+  use FS::cdr;
+  use FS::inventory_class;
+  use FS::inventory_item;
+  use FS::pkg_category;
+  use FS::pkg_class;
+  use FS::access_user;
+  use FS::access_user_pref;
+  use FS::access_group;
+  use FS::access_usergroup;
+  use FS::access_groupagent;
+  use FS::access_right;
+  use FS::AccessRight;
+  use FS::svc_phone;
+  use FS::reason_type;
+  use FS::reason;
+  use FS::cust_main_note;
+  use FS::tax_class;
+  use FS::cust_tax_location;
+  use FS::part_pkg_taxproduct;
+  use FS::part_pkg_taxoverride;
+  use FS::part_pkg_taxrate;
+  use FS::tax_rate;
+
+  if ( %%%RT_ENABLED%%% ) {
+    eval '
+      use lib ( "/opt/rt3/local/lib", "/opt/rt3/lib" );
+      use vars qw($Nobody $SystemUser);
+      use RT;
+      use RT::Tickets;
+      use RT::Transactions;
+      use RT::Users;
+      use RT::CurrentUser;
+      use RT::Templates;
+      use RT::Queues;
+      use RT::ScripActions;
+      use RT::ScripConditions;
+      use RT::Scrips;
+      use RT::Groups;
+      use RT::GroupMembers;
+      use RT::CustomFields;
+      use RT::CustomFieldValues;
+      use RT::ObjectCustomFieldValues;
+
+      #blah.  manually updated from RT::Interface::Web::Handler
+      use RT::Interface::Web;
+      use MIME::Entity;
+      use Text::Wrapper;
+      use Time::ParseDate;
+      use Time::HiRes;
+      use HTML::Scrubber;
+
+      #blah.  not even in RT::Interface::Web::Handler, just in 
+      #html/NoAuth/css/dhandler and rt-test-dependencies.  ask for it here
+      #to throw a real error instead of just a mysterious unstyled RT
+      use CSS::Squish 0.06;
+
+      #slow, unreliable, segfaults and is optional
+      #see rt/html/Ticket/Elements/ShowTransactionAttachments
+      #use Text::Quoted;
+
+      #?#use File::Path qw( rmtree );
+      #?#use File::Glob qw( bsd_glob );
+      #?#use File::Spec::Unix;
+
+    ';
+    die $@ if $@;
+  }
+
+  *CGI::redirect = sub {
+    my $self = shift;
+    my $cookie = '';
+    if ( $_[0] eq '-cookie' ) { #this isn't actually used at the moment
+      (my $x, $cookie) = (shift, shift);
+      $HTML::Mason::r->err_headers_out->add( 'Set-cookie' => $cookie );
+    }
+    my $location = shift;
+
+    use vars qw($m);
+
+    # false laziness w/below
+    if ( defined(@DBIx::Profile::ISA) ) { #profiling redirect
+
+      my $page =
+        qq!<HTML><BODY>Redirect to <A HREF="$location">$location</A>!.
+        '<BR><BR><PRE>'.
+          ( UNIVERSAL::can(dbh, 'sprintProfile')
+              ? encode_entities(dbh->sprintProfile())
+              : 'DBIx::Profile missing sprintProfile method;'.
+                'unpatched or too old?'                        ).
+        #"\n\n". &sprintAutoProfile().  '</PRE>'.
+        "\n\n".                         '</PRE>'.
+        '</BODY></HTML>';
+      dbh->{'private_profile'} = {};
+      return $page;
+
+    } else { #normal redirect
+
+      $m->redirect($location);
+      '';
+
+    }
+
+  };
+  
+  sub include {
+    use vars qw($m);
+    $m->scomp(@_);
+  }
+
+  sub errorpage {
+    use vars qw($m);
+    $m->comp('/elements/errorpage.html', @_);
+  }
+
+  sub redirect {
+    my( $location ) = @_;
+    use vars qw($m);
+    $m->clear_buffer;
+    #false laziness w/above
+    if ( defined(@DBIx::Profile::ISA) ) { #profiling redirect
+
+      $m->print(
+        qq!<HTML><BODY>Redirect to <A HREF="$location">$location</A>!.
+        '<BR><BR><PRE>'.
+          ( UNIVERSAL::can(dbh, 'sprintProfile')
+              ? encode_entities(dbh->sprintProfile())
+              : 'DBIx::Profile missing sprintProfile method;'.
+                'unpatched or too old?'                        ).
+        #"\n\n". &sprintAutoProfile().  '</PRE>'.
+        "\n\n".                         '</PRE>'.
+        '</BODY></HTML>'
+      );
+      dbh->{'private_profile'} = {};
+
+    } else { #normal redirect
+
+      $m->redirect($location);
+
+    }
+
+  }
+
+} # end package HTML::Mason::Commands;
+
+=head1 SUBROUTINE
+
+=over 4
+
+=item mason_interps [ MODE ]
+
+Returns a list consisting of two HTML::Mason::Interp objects, the first for
+Freeside pages, and the second for RT pages.
+
+#MODE can be 'apache' or 'standalone'.  If not specified, defaults to 'apache'.
+
+=cut
+
+sub mason_interps {
+  my $mode = shift || 'apache';
+  my %opt = @_;
+
+  #my $request_class = 'HTML::Mason::Request'.
+                      #( $mode eq 'apache' ? '::ApacheHandler' : '' );
+  my $request_class = 'FS::Mason::Request';
+
+  #not entirely sure it belongs here, but what the hey
+  if ( %%%RT_ENABLED%%% ) {
+    RT::LoadConfig();
+  }
+
+  my %interp = (
+    request_class        => $request_class,
+    data_dir             => '%%%MASONDATA%%%',
+    error_mode           => 'output',
+    error_format         => 'html',
+    ignore_warnings_expr => '.',
+    comp_root            => [
+                              [ 'freeside'=>'%%%FREESIDE_DOCUMENT_ROOT%%%'    ],
+                              [ 'rt'      =>'%%%FREESIDE_DOCUMENT_ROOT%%%/rt' ],
+                            ],
+  );
+
+  $interp{out_method} = $opt{outbuf} if $mode eq 'standalone' && $opt{outbuf};
+
+  my $fs_interp = new HTML::Mason::Interp (
+    %interp,
+    escape_flags => { 'js_string' => sub {
+                        #${$_[0]} =~ s/(['\\\n])/'\\'.($1 eq "\n" ? 'n' : $1)/ge;
+                        ${$_[0]} =~ s/(['\\])/\\$1/g;
+                        ${$_[0]} =~ s/\n/\\n/g;
+                        ${$_[0]} = "'". ${$_[0]}. "'";
+                      }
+                    },
+  );
+
+  my $rt_interp = new HTML::Mason::Interp (
+    %interp,
+    escape_flags => { 'h' => \&RT::Interface::Web::EscapeUTF8 },
+    compiler     => HTML::Mason::Compiler::ToObject->new(
+                      default_escape_flags => 'h',
+                      allow_globals        => [qw(%session)],
+                    ),
+  );
+
+  ( $fs_interp, $rt_interp );
+
+}
+
+=back
+
+=head1 BUGS
+
+Lurking in the darkness...
+
+=head1 SEE ALSO
+
+L<HTML::Mason>, L<FS>, L<RT>
+
+=cut
+
+1;
diff --git a/FS/FS/Mason/Request.pm b/FS/FS/Mason/Request.pm
new file mode 100644 (file)
index 0000000..0a1df87
--- /dev/null
@@ -0,0 +1,78 @@
+package FS::Mason::Request;
+
+use strict;
+use warnings;
+use vars qw( $FSURL $QUERY_STRING );
+use base 'HTML::Mason::Request';
+
+$FSURL = 'http://Set/FS_Mason_Request_FSURL/in_standalone_mode/';
+$QUERY_STRING = '';
+
+sub new {
+    my $class = shift;
+
+    my $superclass = $HTML::Mason::ApacheHandler::VERSION ?
+                     'HTML::Mason::Request::ApacheHandler' :
+                     $HTML::Mason::CGIHandler::VERSION ?
+                     'HTML::Mason::Request::CGI' :
+                     'HTML::Mason::Request';
+
+    $class->alter_superclass( $superclass );
+
+    #huh... shouldn't alter_superclass take care of this for us?
+    __PACKAGE__->valid_params( %{ $superclass->valid_params() } );
+
+    my %opt = @_;
+    my $mode = $superclass =~ /Apache/i ? 'apache' : 'standalone';
+    freeside_setup($opt{'comp'}, $mode);
+
+    $class->SUPER::new(@_);
+
+}
+
+sub freeside_setup {
+
+    my( $filename, $mode ) = @_;
+
+    #warn "initializing for $filename\n";
+
+    if ( $filename !~ /\/rt\/.*NoAuth/ ) { #not RT images/JS
+
+      package HTML::Mason::Commands;
+      use vars qw( $cgi $p $fsurl );
+      use FS::UID qw( cgisuidsetup );
+      use FS::CGI qw( popurl rooturl );
+
+      if ( $mode eq 'apache' ) {
+        $cgi = new CGI;
+        &cgisuidsetup($cgi);
+        #&cgisuidsetup($r);
+        $fsurl = rooturl();
+        $p = popurl(2);
+      } elsif ( $mode eq 'standalone' ) {
+        $cgi = new CGI $FS::Mason::Request::QUERY_STRING; #better keep setting
+                                                          #if you set it once
+        $FS::UID::cgi = $cgi;
+        $fsurl = $FS::Mason::Request::FSURL; #kludgy, but what the hell
+        $p = popurl(2, "$fsurl$filename");
+      } else {
+        die "unknown mode $mode";
+      }
+
+    } elsif ( $filename =~ /\/rt\/REST\/.*NoAuth/ ) {
+
+      package HTML::Mason::Commands; #?
+      use FS::UID qw( adminsuidsetup );
+
+      #need to log somebody in for the mail gw
+
+      ##old installs w/fs_selfs or selfserv??
+      #&adminsuidsetup('fs_selfservice');
+
+      &adminsuidsetup('fs_queue');
+
+    }
+
+}
+
+1;
index 48a58b0..aa07d01 100644 (file)
@@ -45,6 +45,8 @@ FS/Report/Table/Monthly.pm
 FS/SearchCache.pm
 FS/UI/Web.pm
 FS/UID.pm
+FS/Mason.pm
+FS/Mason/Request.pm
 FS/Msgcat.pm
 FS/Pony.pm
 FS/acct_snarf.pm
index a280889..2ad1915 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -3,8 +3,8 @@
 #solaris and perhaps other very weirdass /bin/sh
 #SHELL="/bin/ksh"
 
-DB_TYPE = Pg
-#DB_TYPE = mysql
+#DB_TYPE = Pg
+DB_TYPE = mysql
 
 DB_USER = freeside
 DB_PASSWORD=
@@ -108,11 +108,14 @@ FREESIDE_URL = "http://localhost/freeside/"
 #for now, same db as specified in DATASOURCE... eventually, otherwise?
 RT_DB_DATABASE = freeside
 
+# for cvs-upgrade-deploy target, the username who checked out the CVS copy.
+CVS_USER = ivan
+
+# for auto-version updates, so we can "make release" more things automatically
 RPM_SPECFILE = rpm/freeside.spec
 
 #---
 
-
 #rt/config.layout.in
 RT_PATH = /opt/rt3
 
@@ -129,6 +132,7 @@ help:
        @echo "supported targets:"
        @echo "                   create-database create-config"
        @echo "                   install deploy"
+       @echo "                   cvs-upgrade-deploy"
        @echo "                   configure-rt create-rt"
        @echo "                   clean help"
        @echo
@@ -165,11 +169,6 @@ install-docs: docs
        cp -r masondocs ${FREESIDE_DOCUMENT_ROOT}
        chown -R freeside:freeside ${FREESIDE_DOCUMENT_ROOT}
        cp htetc/handler.pl ${MASON_HANDLER}
-         perl -p -i -e "\
-           s'%%%FREESIDE_DOCUMENT_ROOT%%%'${FREESIDE_DOCUMENT_ROOT}'g; \
-           s'%%%RT_ENABLED%%%'${RT_ENABLED}'g; \
-           s'%%%MASONDATA%%%'${MASONDATA}'g;\
-         " ${MASON_HANDLER}
        [ ! -e ${MASONDATA} ] && mkdir ${MASONDATA} || true
        chown -R freeside ${MASONDATA}
 
@@ -178,14 +177,10 @@ dev-docs:
        ln -s ${FREESIDE_PATH}/httemplate ${FREESIDE_DOCUMENT_ROOT}
        cp htetc/handler.pl ${MASON_HANDLER}
        perl -p -i -e "\
-         s'%%%FREESIDE_DOCUMENT_ROOT%%%'${FREESIDE_DOCUMENT_ROOT}'g; \
-         s'%%%RT_ENABLED%%%'${RT_ENABLED}'g; \
-         s'%%%MASONDATA%%%'${MASONDATA}'g;\
          s'###use Module::Refresh;###'use Module::Refresh;'; \
          s'###Module::Refresh->refresh;###'Module::Refresh->refresh;'; \
        " ${MASON_HANDLER} || true
 
-
 perl-modules:
        cd FS; \
        [ -e Makefile ] || perl Makefile.PL; \
@@ -196,6 +191,9 @@ perl-modules:
        perl -p -i -e "\
          s|%%%FREESIDE_CONF%%%|${FREESIDE_CONF}|g;\
          s|%%%FREESIDE_CACHE%%%|${FREESIDE_CACHE}|g;\
+         s'%%%FREESIDE_DOCUMENT_ROOT%%%'${FREESIDE_DOCUMENT_ROOT}'g; \
+         s'%%%RT_ENABLED%%%'${RT_ENABLED}'g; \
+         s'%%%MASONDATA%%%'${MASONDATA}'g;\
        " blib/lib/FS/*.pm;\
        perl -p -i -e "\
          s|%%%FREESIDE_EXPORT%%%|${FREESIDE_EXPORT}|g;\
@@ -277,6 +275,12 @@ deploy: install
        ${HTTPD_RESTART}
        ${FREESIDE_RESTART}
 
+cvs-upgrade-deploy:
+       su ${CVS_USER} -c 'cvs update -d -P'
+       make install-perl-modules
+       su freeside -c "freeside-upgrade ${CVS_USER}" #not really the same user
+       make deploy
+
 dev: dev-perl-modules dev-docs
 
 create-database:
index 77a1f64..1dd16ec 100644 (file)
@@ -3,10 +3,10 @@
 package HTML::Mason;
 
 use strict;
-use vars qw($r);
-use HTML::Mason 1.27; #http://www.masonhq.com/?ApacheModPerl2Redirect
-use HTML::Mason::Interp;
-use HTML::Mason::Compiler::ToObject;
+use warnings;
+use FS::Mason qw( mason_interps );
+
+#use vars qw($r);
 
 # Bring in ApacheHandler, necessary for mod_perl integration.
 # Uncomment the second line (and comment the first) to use
@@ -16,59 +16,14 @@ use HTML::Mason::ApacheHandler;
 
 ###use Module::Refresh;###
 
-# List of modules that you want to use from components (see Admin
-# manual for details)
-#{  package HTML::Mason::Commands;
-#   use CGI;
-#}
-
-if ( %%%RT_ENABLED%%% ) {
- eval '
-   use lib ( "/opt/rt3/local/lib", "/opt/rt3/lib" );
-   use RT;
-   use vars qw($Nobody $SystemUser);
-   RT::LoadConfig();
- ';
- die $@ if $@;
-}
-
 # Create Mason objects
 
-my %interp = (
-  request_class        => 'HTML::Mason::Request::ApacheHandler',
-  data_dir             => '%%%MASONDATA%%%',
-  error_mode           => 'output',
-  error_format         => 'html',
-  ignore_warnings_expr => '.',
-  comp_root            => [
-                            [ 'freeside' => '%%%FREESIDE_DOCUMENT_ROOT%%%'    ],
-                            [ 'rt'       => '%%%FREESIDE_DOCUMENT_ROOT%%%/rt' ],
-                          ],
-);
-
-my $fs_interp = new HTML::Mason::Interp (
-  %interp,
-  escape_flags => { 'js_string' => sub {
-                      #${$_[0]} =~ s/(['\\\n])/'\\'.($1 eq "\n" ? 'n' : $1)/ge;
-                      ${$_[0]} =~ s/(['\\])/\\$1/g;
-                      ${$_[0]} =~ s/\n/\\n/g;
-                      ${$_[0]} = "'". ${$_[0]}. "'";
-                    }
-                  },
-);
-
-my $rt_interp = new HTML::Mason::Interp (
-  %interp,
-  escape_flags => { 'h' => \&RT::Interface::Web::EscapeUTF8 },
-  compiler     => HTML::Mason::Compiler::ToObject->new(
-                    default_escape_flags => 'h',
-                    allow_globals        => [qw(%session)],
-                  ),
-);
+my( $fs_interp, $rt_interp ) = mason_interps('apache');
 
 my $ah = new HTML::Mason::ApacheHandler (
-  interp      => $fs_interp,
-  args_method => 'CGI', #(and FS too)
+  interp        => $fs_interp,
+  request_class => 'FS::Mason::Request',
+  args_method   => 'CGI', #(and FS too)
 );
 
 # Activate the following if running httpd as root (the normal case).
@@ -78,7 +33,8 @@ my $ah = new HTML::Mason::ApacheHandler (
 
 sub handler
 {
-    ($r) = @_;
+    #($r) = @_;
+    my $r = shift;
 
     # If you plan to intermix images in the same directory as
     # components, activate the following to prevent Mason from
@@ -86,289 +42,6 @@ sub handler
     #
     #return -1 if $r->content_type && $r->content_type !~ m|^text/|i;
 
-    #rar
-    { package HTML::Mason::Commands;
-      use strict;
-      use vars qw( $cgi $p $fsurl);
-      use vars qw( %session );
-      use CGI 3.29 qw(-private_tempfiles); #3.29 to fix RT attachment problems
-      #use CGI::Carp qw(fatalsToBrowser);
-      use CGI::Cookie;
-      use List::Util qw( max min );
-      use Data::Dumper;
-      use Date::Format;
-      use Date::Parse;
-      use Time::Local;
-      use Time::Duration;
-      use DateTime;
-      use DateTime::Format::Strptime;
-      use Lingua::EN::Inflect qw(PL);
-      use Tie::IxHash;
-      use URI::URL;
-      use URI::Escape;
-      use HTML::Entities;
-      use HTML::TreeBuilder;
-      use HTML::FormatText;
-      use JSON;
-      use MIME::Base64;
-      use IO::Handle;
-      use IO::File;
-      use IO::Scalar;
-      #not actually using this yet anyway...# use IPC::Run3 0.036;
-      use Net::Whois::Raw qw(whois);
-      if ( $] < 5.006 ) {
-        eval "use Net::Whois::Raw 0.32 qw(whois)";
-        die $@ if $@;
-      }
-      use Text::CSV_XS;
-      use Spreadsheet::WriteExcel;
-      use Business::CreditCard 0.30; #for mask-aware cardtype()
-      use NetAddr::IP;
-      use String::Approx qw(amatch);
-      use Chart::LinesPoints;
-      use Chart::Mountain;
-      use Color::Scheme;
-      use HTML::Widgets::SelectLayers 0.07; #should go away in favor of
-                                            #selectlayers.html
-      use Locale::Country;
-      use Business::US::USPS::WebTools::AddressStandardization;
-      use FS;
-      use FS::UID qw( adminsuidsetup cgisuidsetup getotaker
-                      dbh datasrc driver_name
-                    );
-      use FS::Record qw( qsearch qsearchs fields dbdef
-                        str2time_sql str2time_sql_closing
-                       );
-      use FS::Conf;
-      use FS::CGI qw(header menubar popurl rooturl table itable ntable idiot
-                     eidiot myexit http_header);
-      use FS::UI::Web qw(svc_url);
-      use FS::UI::Web::small_custview qw(small_custview);
-      use FS::UI::bytecount;
-      use FS::Msgcat qw(gettext geterror);
-      use FS::Misc qw( send_email send_fax states_hash counties state_label );
-      use FS::Report::Table::Monthly;
-      use FS::TicketSystem;
-
-      use FS::agent;
-      use FS::agent_type;
-      use FS::domain_record;
-      use FS::cust_bill;
-      use FS::cust_bill_pay;
-      use FS::cust_credit;
-      use FS::cust_credit_bill;
-      use FS::cust_main qw(smart_search);
-      use FS::cust_main_county;
-      use FS::cust_pay;
-      use FS::cust_pkg;
-      use FS::part_pkg_taxclass;
-      use FS::cust_pkg_reason;
-      use FS::cust_refund;
-      use FS::cust_credit_refund;
-      use FS::cust_pay_refund;
-      use FS::cust_svc;
-      use FS::nas;
-      use FS::part_bill_event;
-      use FS::part_event;
-      use FS::part_event_condition;
-      use FS::part_pkg;
-      use FS::part_referral;
-      use FS::part_svc;
-      use FS::part_svc_router;
-      use FS::part_virtual_field;
-      use FS::pay_batch;
-      use FS::pkg_svc;
-      use FS::port;
-      use FS::queue qw(joblisting);
-      use FS::raddb;
-      use FS::session;
-      use FS::svc_acct;
-      use FS::svc_acct_pop qw(popselector);
-      use FS::acct_rt_transaction;
-      use FS::svc_domain;
-      use FS::svc_forward;
-      use FS::svc_www;
-      use FS::router;
-      use FS::addr_block;
-      use FS::svc_broadband;
-      use FS::svc_external;
-      use FS::type_pkgs;
-      use FS::part_export;
-      use FS::part_export_option;
-      use FS::export_svc;
-      use FS::msgcat;
-      use FS::rate;
-      use FS::rate_region;
-      use FS::rate_prefix;
-      use FS::payment_gateway;
-      use FS::agent_payment_gateway;
-      use FS::XMLRPC;
-      use FS::payby;
-      use FS::cdr;
-      use FS::inventory_class;
-      use FS::inventory_item;
-      use FS::pkg_category;
-      use FS::pkg_class;
-      use FS::access_user;
-      use FS::access_user_pref;
-      use FS::access_group;
-      use FS::access_usergroup;
-      use FS::access_groupagent;
-      use FS::access_right;
-      use FS::AccessRight;
-      use FS::svc_phone;
-      use FS::reason_type;
-      use FS::reason;
-      use FS::cust_main_note;
-      use FS::tax_class;
-      use FS::cust_tax_location;
-      use FS::part_pkg_taxproduct;
-      use FS::part_pkg_taxoverride;
-      use FS::part_pkg_taxrate;
-      use FS::tax_rate;
-
-      if ( %%%RT_ENABLED%%% ) {
-        eval '
-          use RT::Tickets;
-          use RT::Transactions;
-          use RT::Users;
-          use RT::CurrentUser;
-          use RT::Templates;
-          use RT::Queues;
-          use RT::ScripActions;
-          use RT::ScripConditions;
-          use RT::Scrips;
-          use RT::Groups;
-          use RT::GroupMembers;
-          use RT::CustomFields;
-          use RT::CustomFieldValues;
-          use RT::ObjectCustomFieldValues;
-
-          #blah.  manually updated from RT::Interface::Web::Handler
-          use RT::Interface::Web;
-          use MIME::Entity;
-          use Text::Wrapper;
-          use Time::ParseDate;
-          use Time::HiRes;
-          use HTML::Scrubber;
-
-          #blah.  not even in RT::Interface::Web::Handler, just in 
-          #html/NoAuth/css/dhandler and rt-test-dependencies.  ask for it here
-          #to throw a real error instead of just a mysterious unstyled RT
-          use CSS::Squish 0.06;
-
-          #slow, unreliable, segfaults and is optional
-          #see rt/html/Ticket/Elements/ShowTransactionAttachments
-          #use Text::Quoted;
-
-          #?#use File::Path qw( rmtree );
-          #?#use File::Glob qw( bsd_glob );
-          #?#use File::Spec::Unix;
-
-        ';
-        die $@ if $@;
-      }
-
-      *CGI::redirect = sub {
-        my $self = shift;
-        my $cookie = '';
-        if ( $_[0] eq '-cookie' ) { #this isn't actually used at the moment
-          (my $x, $cookie) = (shift, shift);
-          $HTML::Mason::r->err_headers_out->add( 'Set-cookie' => $cookie );
-        }
-        my $location = shift;
-
-        use vars qw($m);
-
-        # false laziness w/below
-        if ( defined(@DBIx::Profile::ISA) ) { #profiling redirect
-
-          my $page =
-            qq!<HTML><BODY>Redirect to <A HREF="$location">$location</A>!.
-            '<BR><BR><PRE>'.
-              ( UNIVERSAL::can(dbh, 'sprintProfile')
-                  ? encode_entities(dbh->sprintProfile())
-                  : 'DBIx::Profile missing sprintProfile method;'.
-                    'unpatched or too old?'                        ).
-            #"\n\n". &sprintAutoProfile().  '</PRE>'.
-            "\n\n".                         '</PRE>'.
-            '</BODY></HTML>';
-          dbh->{'private_profile'} = {};
-          return $page;
-
-        } else { #normal redirect
-
-          $m->redirect($location);
-          '';
-
-        }
-
-      };
-      
-      if ( $HTML::Mason::r->filename !~ /\/rt\/.*NoAuth/ ) { #not RT images/JS
-
-        $cgi = new CGI;
-        &cgisuidsetup($cgi);
-        #&cgisuidsetup($r);
-        $p = popurl(2);
-        $fsurl = rooturl();
-
-      } elsif ( $HTML::Mason::r->filename =~ /\/rt\/REST\/.*NoAuth/ ) {
-
-        #need to log somebody in for the mail gw
-
-        ##old installs w/fs_selfs or selfserv??
-        #&adminsuidsetup('fs_selfservice');
-
-        &adminsuidsetup('fs_queue');
-
-      }
-
-      sub include {
-        use vars qw($m);
-        $m->scomp(@_);
-      }
-
-      sub errorpage {
-        use vars qw($m);
-        $m->comp('/elements/errorpage.html', @_);
-      }
-
-      sub redirect {
-        my( $location ) = @_;
-        use vars qw($m);
-        $m->clear_buffer;
-        #false laziness w/above
-        if ( defined(@DBIx::Profile::ISA) ) { #profiling redirect
-
-          $m->print(
-            qq!<HTML><BODY>Redirect to <A HREF="$location">$location</A>!.
-            '<BR><BR><PRE>'.
-              ( UNIVERSAL::can(dbh, 'sprintProfile')
-                  ? encode_entities(dbh->sprintProfile())
-                  : 'DBIx::Profile missing sprintProfile method;'.
-                    'unpatched or too old?'                        ).
-            #"\n\n". &sprintAutoProfile().  '</PRE>'.
-            "\n\n".                         '</PRE>'.
-            '</BODY></HTML>'
-          );
-          dbh->{'private_profile'} = {};
-
-          #whew.  removing this is all that's needed to fix the annoying
-          #blank-page-instead-of-profiling-redirect-when-called-from-an-include
-          #bug triggered by mason 1.32
-          #my $rv = $m->abort(200);
-
-        } else { #normal redirect
-
-          $m->redirect($location);
-
-        }
-
-      }
-
-    } # end package HTML::Mason::Commands;
-
     ###Module::Refresh->refresh;###
 
     $r->content_type('text/html');