Merge Alan's NCIP.pm and NCIPResponder.pm.
authorAlan Rykhus <alan.rykhus@mnsu.edu>
Tue, 3 Sep 2013 14:53:50 +0000 (10:53 -0400)
committerJason Stephenson <jstephenson@mvlc.org>
Tue, 3 Sep 2013 14:53:50 +0000 (10:53 -0400)
He had no copyright headers on those files.

We could not merge his other files because the copyright header
specified GPL version 2.  We want GPL version 2 or later.

This branch is not going into master.  It is for review purposes
only.

Signed-off-by: Jason Stephenson <jstephenson@mvlc.org>
16 files changed:
NCIP.pm [deleted file]
NCIP/Configuration.pm [deleted file]
NCIP/Configuration/Account.pm [deleted file]
NCIP/Configuration/Institution.pm [deleted file]
NCIPResponder.pm [deleted file]
bin/start_server.pl [new file with mode: 0755]
lib/NCIP.pm [new file with mode: 0644]
lib/NCIP/Configuration.pm [new file with mode: 0644]
lib/NCIP/Configuration/Service.pm [new file with mode: 0644]
lib/NCIP/User.pm [new file with mode: 0644]
lib/NCIPResponder.pm [new file with mode: 0644]
lib/NCIPServer.pm [new file with mode: 0644]
t/NCIPServer.t [new file with mode: 0644]
t/NCIP_Configuration.t [new file with mode: 0644]
t/NCIP_User.t [new file with mode: 0644]
t/config_sample/NCIP.xml [new file with mode: 0644]

diff --git a/NCIP.pm b/NCIP.pm
deleted file mode 100644 (file)
index 1f66106..0000000
--- a/NCIP.pm
+++ /dev/null
@@ -1,29 +0,0 @@
-
-package NCIPServer::NCIP;
-use strict;
-use warnings;
-
-use NCIPServer::NCIP::Configuration;
-
-use FileHandle;
-
-sub new {
-  my $self = shift;
-  my $config_file = shift;
-
-  my $config = NCIPServer::NCIP::Configuration->new($config_file);
-    
-  return bless $config, $self;
-
-}
-
-sub process_request {
-  my $self = shift;
-  my $xml = shift;
-
-  my $response = "<HTML> <HEAD> <TITLE>Hello There</TITLE> </HEAD> <BODY> <H1>Hello You Big JERK!</H1> Who would take this book seriously if the first eaxample didn't say \"hello world\"?  </BODY> </HTML>";
-
-  return $response;
-}
-
-1;
diff --git a/NCIP/Configuration.pm b/NCIP/Configuration.pm
deleted file mode 100644 (file)
index 6d0efbe..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-#
-# Copyright (C) 2013  MnSCU/PALS
-# 
-# Author: Alan Rykhus
-# 
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of version 2 of the GNU General Public
-# License as published by the Free Software Foundation.
-# 
-# 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., 59 Temple Place, Suite 330, Boston,
-# MA 02111-1307 USA
-# 
-# parse-config: Parse an XML-format
-# ACS configuration file and build the configuration
-# structure.
-#
-
-package NCIPServer::NCIP::Configuration;
-
-our $VERSION = 0.02;
-
-use strict;
-use warnings;
-use XML::Simple qw(:strict);
-
-use NCIPServer::NCIP::Configuration::Account;
-use NCIPServer::NCIP::Configuration::Institution;
-
-my $parser = new XML::Simple(
-    KeyAttr => {
-        login       => '+id',
-        institution => '+id',
-    },
-    GroupTags => {
-        accounts     => 'login',
-        institutions => 'institution',
-    },
-    ForceArray => [ 'login', 'institution' ],
-);
-
-sub new {
-    my ($class, $config_file) = @_;
-    my $cfg = $parser->XMLin($config_file);
-
-    foreach my $acct (values %{$cfg->{accounts}}) {
-        new NCIPServer::NCIP::Configuration::Account $acct;
-    }
-
-    foreach my $inst (values %{$cfg->{institutions}}) {
-        new NCIPServer::NCIP::Configuration::Institution $inst;
-    }
-
-    return bless $cfg, $class;
-}
-
-sub accounts {
-    my $self = shift;
-    return values %{$self->{accounts}};
-}
-
-sub institutions {
-    my $self = shift;
-    return values %{$self->{institutions}};
-}
-
-1;
-__END__
-
-=head1 NAME
-
-NCIPServer::NCIP::Configuration - abstraction/accessor for NCIP configs
-
-=head1 SYNOPSIS
-
-use NCIPServer::NCIP::Configuration;
-my $config = NCIPServer::NCIP::Configuration->new($ARGV[0]);
-
-foreach my $acct ($config->accounts) {
-    print "Found account: '", $acct->id, "', part of '";
-    print $acct->institution, "'\n";
-}
-
-=cut
-
diff --git a/NCIP/Configuration/Account.pm b/NCIP/Configuration/Account.pm
deleted file mode 100644 (file)
index 47d48f4..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-#
-# Copyright (C) 2013 MnSCU/PALS
-# 
-# Author: Alan Rykhus
-# 
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of version 2 of the GNU General Public
-# License as published by the Free Software Foundation.
-# 
-# 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., 59 Temple Place, Suite 330, Boston,
-# MA 02111-1307 USA
-#
-
-package NCIPServer::NCIP::Configuration::Account;
-
-use strict;
-use warnings;
-
-sub new {
-    my ($class, $obj) = @_;
-    my $type = ref($class) || $class;
-
-    if (ref($obj) eq "HASH") {
-        return bless $obj, $type; # Just bless the object
-    }
-
-    return bless {}, $type;
-}
-
-sub id {
-    my $self = shift;
-    return $self->{id};
-}
-
-sub institution {
-    my $self = shift;
-    return $self->{institution};
-}
-
-sub password {
-    my $self = shift;
-    return $self->{password};
-}
-
-1;
diff --git a/NCIP/Configuration/Institution.pm b/NCIP/Configuration/Institution.pm
deleted file mode 100644 (file)
index 6ea58e1..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# Copyright (C) 2013 MnSCU/PALS
-# 
-# Author: Alan Rykhus
-# 
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of version 2 of the GNU General Public
-# License as published by the Free Software Foundation.
-# 
-# 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., 59 Temple Place, Suite 330, Boston,
-# MA 02111-1307 USA
-#
-
-package NCIPServer::NCIP::Configuration::Institution;
-
-use strict;
-use warnings;
-
-sub new {
-    my ($class, $obj) = @_;
-    my $type = ref($class) || $class;
-
-    if (ref($obj) eq "HASH") {
-        return bless $obj, $type;   # Just bless the object
-    }
-
-    return bless {}, $type;
-}
-
-sub id {
-    my $self = shift;
-    return $self->{id};
-}
-
-sub implementation {
-    my $self = shift;
-    return $self->{implementation};
-}
-
-1;
diff --git a/NCIPResponder.pm b/NCIPResponder.pm
deleted file mode 100644 (file)
index 29c4651..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-
-package NCIPServer::NCIPResponder;
-use strict;
-use warnings;
-
-use FileHandle;
-
-use Apache2::Const -compile => qw(OK :log :http :methods :cmd_how :override);
-use Apache2::RequestRec ();
-use Apache2::RequestIO ();
-use NCIPServer::NCIP;
-
-sub handler {
-  my $r = shift;
-
-  return Apache2::Const::HTTP_METHOD_NOT_ALLOWED unless $r->method_number eq Apache2::Const::M_POST;
-
-  my $NCIPConfigFile = $r->dir_config('NCIPConfigFile');
-
-  if (!defined($NCIPConfigFile)) {
-    die sprintf "error: There is no NCIPConfigFile defined\n";
-  } else {
-    if (! (-r $NCIPConfigFile)) {
-      die sprintf "error: NCIPConfigFile %s does not exist or is not readable\n", $NCIPConfigFile;
-    }
-  }
-
-  my $ncip = NCIPServer::NCIP->new($NCIPConfigFile);
-
-  $r->content_type('text/html');
-  my $tmp_buf;
-  my $input_xml;
-
-  while ($r->read($tmp_buf, 1024))
-  { 
-    $input_xml .= $tmp_buf;
-  }
-
-  my $response_xml = $ncip->process_request($input_xml);
-
-  $r->print($response_xml);
-  return Apache2::Const::OK;
-}
-
-1;
diff --git a/bin/start_server.pl b/bin/start_server.pl
new file mode 100755 (executable)
index 0000000..814130d
--- /dev/null
@@ -0,0 +1,59 @@
+#!/usr/bin/perl 
+#===============================================================================
+#
+#         FILE: test_server.pl
+#
+#        USAGE: ./test_server.pl
+#
+#  DESCRIPTION:
+#
+#      OPTIONS: ---
+# REQUIREMENTS: ---
+#         BUGS: ---
+#        NOTES: ---
+#       AUTHOR: Chris Cormack (rangi), chrisc@catalyst.net.nz
+# ORGANIZATION: Koha Development Team
+#      VERSION: 1.0
+#      CREATED: 28/08/13 14:12:51
+#     REVISION: ---
+#===============================================================================
+
+use strict;
+use warnings;
+
+use lib "lib";
+
+use NCIPServer;
+use Getopt::Long;
+
+my $help;
+my $config_dir;
+
+GetOptions(
+    'h|help'     => \$help,
+    'c|config:s' => \$config_dir,
+);
+my $usage = << 'ENDUSAGE';
+
+This script will start an NCIP server, using the configuration set in the config dir you pass
+
+This script has the following parameters :
+    -h --help:   this message
+    -c --config: path to the configuration directory
+
+ENDUSAGE
+
+if ($help) {
+    print $usage;
+    exit;
+}
+
+if ( !$config_dir ) {
+    print "You must specify a configuration directory\n";
+    print $usage;
+    exit;
+}
+
+my $server = NCIPServer->new( { config_dir => $config_dir } );
+
+$server->run();
diff --git a/lib/NCIP.pm b/lib/NCIP.pm
new file mode 100644 (file)
index 0000000..d1f1521
--- /dev/null
@@ -0,0 +1,26 @@
+package NCIP;
+use NCIP::Configuration;
+use Modern::Perl;
+
+
+use FileHandle;
+
+sub new {
+    my $self = shift;
+    my $config_file = shift;
+
+    my $config = NCIP::Configuration->new($config_file);
+    return bless $config, $self;
+
+}
+
+sub process_request {
+    my $self = shift;
+    my $xml = shift;
+
+    my $response = "<HTML> <HEAD> <TITLE>Hello There</TITLE> </HEAD> <BODY> <H1>Hello You Big JERK!</H1> Who would take this book seriously if the first eaxample didn't say \"hello world\"?  </BODY> </HTML>";
+
+    return $response;
+}
+
+1;
diff --git a/lib/NCIP/Configuration.pm b/lib/NCIP/Configuration.pm
new file mode 100644 (file)
index 0000000..1add3e3
--- /dev/null
@@ -0,0 +1,80 @@
+package NCIP::Configuration;
+
+# Copyright 2013 Catalyst IT <chrisc@catalyst.net.nz>
+
+# This file is part of NCIPServer
+#
+# NCIPServer 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.
+#
+# NCIPServer 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 NCIPServer; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+
+=head1 NAME
+  
+  NCIP::Configuration
+
+=head1 SYNOPSIS
+
+  use NCIP::Configuration;
+  my $config = NCIP::Configuration->new($config_dir);
+
+=cut
+
+use Modern::Perl;
+
+use NCIP::Configuration::Service;
+use base qw(Config::Merge);
+
+sub new {
+    my $class = shift;
+    my $self  = $class->SUPER::new(@_);
+    my @services;
+
+    # we might have a few services set them up safely
+    if ( ref( $self->('NCIP.listeners.service') ) eq 'ARRAY' ) {
+        @services = $self->('NCIP.listeners.service');
+    }
+    else {
+        @services = ( $self->('NCIP.listeners')->{'service'} );
+    }
+    my %listeners;
+    foreach my $service (@services) {
+        my $serv_object = NCIP::Configuration::Service->new($service);
+        $listeners{ lc $service->{'port'} } = $serv_object;
+    }
+    $self->{'listeners'} = \%listeners;
+    return $self;
+}
+
+=head1 FUNCTIONS
+
+=head2 find_service
+
+  my $service = $config->($sockaddr, $port, $proto);
+
+  Used to find which service you should be using to answer an incoming request
+
+=cut
+
+sub find_service {
+    my ( $self, $sockaddr, $port, $proto ) = @_;
+    my $portstr;
+    foreach my $addr ( '', '*:', "$sockaddr:" ) {
+        $portstr = sprintf( "%s%s/%s", $addr, $port, lc $proto );
+        Sys::Syslog::syslog( "LOG_DEBUG",
+            "Configuration::find_service: Trying $portstr" );
+        last if ( exists( ( $self->{listeners} )->{$portstr} ) );
+    }
+    return $self->{listeners}->{$portstr};
+}
+1;
+
diff --git a/lib/NCIP/Configuration/Service.pm b/lib/NCIP/Configuration/Service.pm
new file mode 100644 (file)
index 0000000..cd6e830
--- /dev/null
@@ -0,0 +1,17 @@
+package NCIP::Configuration::Service;
+
+use Modern::Perl;
+
+sub new {
+    my ($class, $obj) = @_;
+    my $type = ref($class) || $class;
+
+    if (ref($obj) eq "HASH") {
+       # Just bless the object
+       return bless $obj, $type;
+    }
+
+    return bless {}, $type;
+}
+
+1;
diff --git a/lib/NCIP/User.pm b/lib/NCIP/User.pm
new file mode 100644 (file)
index 0000000..46e2d96
--- /dev/null
@@ -0,0 +1,30 @@
+package NCIP::User;
+
+use base qw(Class::Accessor);
+
+# User Object needs
+# Authentication Input
+# Block Or Trap
+# Date Of Birth
+# Name Information
+# Previous User Id(s)
+# User Address Information
+# User Language
+# User Privilege
+# User Id
+
+# Make accessors for the ones that makes sense
+NCIP::User->mk_accessors(qw(firstname surname address language privilege userid dateofbirth));
+
+sub authentication {
+}
+
+sub previous_userids {
+}
+
+sub status {
+   # Is the user blocked
+   # if so, why
+}
+
+1;
diff --git a/lib/NCIPResponder.pm b/lib/NCIPResponder.pm
new file mode 100644 (file)
index 0000000..21714e5
--- /dev/null
@@ -0,0 +1,43 @@
+package NCIPResponder;
+use Modern::Perl;
+use NCIP;
+
+use FileHandle;
+
+use Apache2::Const -compile => qw(OK :log :http :methods :cmd_how :override);
+use Apache2::RequestRec ();
+use Apache2::RequestIO ();
+use NCIPServer::NCIP;
+
+sub handler {
+    my $r = shift;
+
+    return Apache2::Const::HTTP_METHOD_NOT_ALLOWED unless $r->method_number eq Apache2::Const::M_POST;
+
+    my $NCIPConfigFile = $r->dir_config('NCIPConfigFile');
+
+    if (!defined($NCIPConfigFile)) {
+        die sprintf "error: There is no NCIPConfigFile defined\n";
+    } else {
+        if (! (-r $NCIPConfigFile)) {
+            die sprintf "error: NCIPConfigFile %s does not exist or is not readable\n", $NCIPConfigFile;
+        }
+    }
+
+    my $ncip = NCIP->new($NCIPConfigFile);
+
+    $r->content_type('text/html');
+    my $tmp_buf;
+    my $input_xml;
+
+    while ($r->read($tmp_buf, 1024)) {
+        $input_xml .= $tmp_buf;
+    }
+
+    my $response_xml = $ncip->process_request($input_xml);
+
+    $r->print($response_xml);
+    return Apache2::Const::OK;
+}
+
+1;
diff --git a/lib/NCIPServer.pm b/lib/NCIPServer.pm
new file mode 100644 (file)
index 0000000..52e14bd
--- /dev/null
@@ -0,0 +1,118 @@
+package NCIPServer;
+
+# Copyright 2013 Catalyst IT <chrisc@catalyst.net.nz>
+
+# This file is part of NCIPServer
+#
+# NCIPServer 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.
+#
+# NCIPServer 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 NCIPServer; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+use Sys::Syslog qw(syslog);
+use Modern::Perl;
+use NCIP::Configuration;
+use IO::Socket::INET;
+use Socket qw(:DEFAULT :crlf);
+use base qw(Net::Server::PreFork);
+
+=head1 NAME
+  
+    NCIP::Configuration
+
+=head1 SYNOPSIS
+
+    use NCIPServer;
+    my $server = NCIPServer->new({config_dir => $config_dir});
+
+=head1 FUNCTIONS
+
+=head2 run()
+
+  Apart from new, this is the only method you should ever call from outside this module
+=cut
+
+our $VERSION = '0.01';
+
+# This sets up the configuration
+
+my %transports = ( RAW => \&raw_transport, );
+
+sub configure_hook {
+    my ($self)        = @_;
+    my $server        = $self->{'server'};
+    my $config        = NCIP::Configuration->new( $server->{'config_dir'} );
+    my $server_params = $config->('NCIP.server-params');
+    while ( my ( $key, $val ) = each %$server_params ) {
+        $server->{$key} = $val;
+    }
+    my $listeners = $config->('NCIP.listeners');
+    foreach my $svc ( keys %$listeners ) {
+        $server->{'port'} = $listeners->{$svc}->{'port'};
+    }
+    $self->{'local_config'} = $config;
+}
+
+# Debug, remove before release
+
+sub post_configure_hook {
+    my $self = shift;
+    use Data::Dumper;
+    print Dumper $self;
+}
+
+# this handles the actual requests
+sub process_request {
+    my $self     = shift;
+    my $sockname = getsockname(STDIN);
+    my ( $port, $sockaddr ) = sockaddr_in($sockname);
+    $sockaddr = inet_ntoa($sockaddr);
+    my $proto = $self->{server}->{client}->NS_proto();
+    $self->{'service'} =
+      $self->{'local_config'}->find_service( $sockaddr, $port, $proto );
+    if ( !defined( $self->{service} ) ) {
+        syslog( "LOG_ERR",
+            "process_request: Unknown recognized server connection: %s:%s/%s",
+            $sockaddr, $port, $proto );
+        die "process_request: Bad server connection";
+    }
+    my $transport = $transports{ $self->{service}->{transport} };
+    if ( !defined($transport) ) {
+        syslog(
+            "LOG_WARNING",
+            "Unknown transport '%s', dropping",
+            $self->{'service'}->{transport}
+        );
+        return;
+    }
+    else {
+        &$transport($self);
+    }
+}
+
+sub raw_transport {
+    my $self = shift;
+    my ($input);
+    my $service = $self->{service};
+
+    # place holder code, just echo at the moment
+    while (1) {
+        local $SIG{ALRM} = sub { die "raw_transport Timed Out!\n"; };
+        $input = <STDIN>;
+        if ($input) {
+            print "You said $input";
+        }
+    }
+
+}
+
+1;
+__END__
diff --git a/t/NCIPServer.t b/t/NCIPServer.t
new file mode 100644 (file)
index 0000000..b0dae14
--- /dev/null
@@ -0,0 +1,16 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use lib 'lib';
+
+use Test::More tests => 2;
+BEGIN { use_ok('NCIPServer') };
+
+ok(my $server = NCIPServer->new({config_dir => 't/config_sample'}));
+
+# use Data::Dumper;
+# print Dumper $server;
+
+# uncomment this if you want to run the server in test mode
+# $server->run();
diff --git a/t/NCIP_Configuration.t b/t/NCIP_Configuration.t
new file mode 100644 (file)
index 0000000..99fda20
--- /dev/null
@@ -0,0 +1,36 @@
+#
+#===============================================================================
+#
+#         FILE: NCIP_Configuration.t
+#
+#  DESCRIPTION:
+#
+#        FILES: ---
+#         BUGS: ---
+#        NOTES: ---
+#       AUTHOR: Chris Cormack (rangi), chrisc@catalyst.net.nz
+# ORGANIZATION: Koha Development Team
+#      VERSION: 1.0
+#      CREATED: 28/08/13 10:35:44
+#     REVISION: ---
+#===============================================================================
+
+use strict;
+use warnings;
+use Sys::Syslog;
+use lib 'lib';
+
+use Test::More tests => 5;    # last test to print
+
+use_ok('NCIP::Configuration');
+
+ok( my $config = NCIP::Configuration->new('t/config_sample'),
+    'Creating a config object' );
+
+# because the file is called NCIP.xml we now have that namespace
+ok( my $server_params = $config->('NCIP.server-params'), 'Get server-params' );
+
+is( $server_params->{'min_servers'}, 1, 'Do we have a minimum of one server' );
+
+ok ($config->find_service('127.0.0.1','6001','tcp'),'Testing find_service');
+
diff --git a/t/NCIP_User.t b/t/NCIP_User.t
new file mode 100644 (file)
index 0000000..659af94
--- /dev/null
@@ -0,0 +1,14 @@
+#/usr/bin/perl
+
+use strict;
+use warnings;
+use lib 'lib';
+
+use Test::More tests => 4;                      # last test to print
+
+use_ok('NCIP::User');
+
+ok(my $user = NCIP::User->new(),'Create a new user object');
+ok($user->firstname('Chris'),'Set firstname');
+is($user->firstname(), 'Chris', "Test our getting");
+
diff --git a/t/config_sample/NCIP.xml b/t/config_sample/NCIP.xml
new file mode 100644 (file)
index 0000000..070580d
--- /dev/null
@@ -0,0 +1,36 @@
+<acsconfig xmlns="http://openncip.org/acs-config/1.0/">
+  <error-detect enabled="true" />
+
+  <server-params
+    min_servers='1'
+    min_spare_servers='0'
+    log_file='Sys::Syslog'
+    syslog_ident='ncip_server'
+    syslog_facility='local6'
+  />
+  
+  <listeners>
+    <service
+      port="127.0.0.1:6001/tcp"
+      transport="RAW"
+      protocol="NCIP/2.00"
+      timeout="60" />
+
+<!--    <service
+      port="8023/tcp"
+      transport="RAW"
+      protocol="NCIP/2.00"
+      timeout="60" />
+-->
+  </listeners>
+
+  <agencies>
+  </agencies>
+
+  <profile>
+  </profile>
+
+  <version>
+  </version>
+
+</acsconfig>