RE: push_handlers
Makes sense, will look over the docs again. Thanks, Stathy Touloumis [EMAIL PROTECTED] wrote: For some reason the call to 'push_handlers' does not seem to register the 'handler' with mod_perl correctly when used in the code below. It seems that only a few initial requests will successfully be processed by this handler. It then just seems to be bypassed. It only works when the 'push_handler' code is commented out and a Perl*Handler directive is added to the apache conf file. Does anyone know why this is so? Here is a snippet of code which is read in at server startup through a 'require' directive. Apache-push_handlers( PerlPostReadRequestHandler= \handler ); sub handler { warn Hello World\n; } As far as I know, push_handlers only works the the current request -- that is, the handlers pushed with it are cleared at the end of the request. It would seem that doing this at startup sets up the handler which then gets used by the children and cleared after the first request they serve. This would give you the symptoms you're seeing (each child called once, and then it disappears). Try running httpd -X to see what happens. There's also probably something in the guide about it.
More Strange Behavior
Hello, I have currently added cutom apache directives using 'Apache::ModuleConfig,Apache::ExtUtils' and have come across some strange behavior when trying to use a custom mod_perl handler that worked fine before. I get this error : [Fri Jan 4 11:39:25 2002] [error] Uncaught exception from user code: Undefined subroutine MyModule::Server::Content::handler called. eval {...} called at /dev/null line 0 which is strange even after I modified the subroutine 'handler' within 'MyModule::Server::Content' to be as basic as : sub MyModule::Server::Content::handler { return Apache::Constants::OK; } The module which contains the custom directive callback routines is in MyModule::Server. When commenting out : #PerlFixupHandler MyModule::Server::Fixup #Files *.html # SetHandler perl-script # PerlHandler MyModule::Server::Content #/Files Pages are returned fine . . . Any help would be appreciated.
push_handlers, set_handlers
Apache 1.3.22 mod_perl 1.26 I have noticed some strange behavior when attempting to stack handlers below the 'ChildInit' phase. This code executes fine when placed in a server initialization script: Apache-push_handlers( PerlChildInitHandler= \My::Child::handler ); When using the code below in a server initialization script without any apache config directives the handler does not get called. Apache-push_handlers( PerlHandler= \My::handler ); When applying the following apache conf directive the handler seems to only get called occasionally (initialization of child process?). Files *.html SetHandler perl-script /Files Although, when using the 'push_handlers' method at another part of the request phase the handler gets called occasionally. Apache-push_handlers( PerlFixupHandler= \My::Other::handler ); When using the method below the handlers do not get called at all. Apache-httpd_conf(EOF); Files *.html PerlHandler My::handler SetHandler perl-script /Files EOF Apache-httpd_conf(EOF); PerlFixupHandler My::Other::handler EOF Of course when setting the directives into the apache conf all seems to work well. PerlFixupHandler My::Other Files *.html PerlHandler My SetHandler perl-script /Files Any ideas as to why this strange behavior? When trying to use the 'set_handlers' method it blows up stating the request object is not created. I cannot see the reason why the request object should be needed to set/push handlers which are used to 'handle' the request phases. Thanks,
Apache KeepAlive
Has anyone encountered issues when setting 'KeepAlive On' in there apache conf? After an initial request it seems that none of my handlers are called and the apache handlers take control. After a period of time the appropriate handlers seem to operate. If I reload quickly the same issue occurs. -Thanks
Apache KeepAlive
It seems to stop occurring if I set MaxRequestPerChild to One as well. Thanks,
RE: How to check the return status?
Perhaps something along the lines of : $r-push_handlers( PerlHandler = sub { my $r = shift; my $return = $handle-handler( $r ); if ( $return == Apache::Constants::OK ) { ?? } } ); -Original Message- From: Alexei V. Alexandrov [mailto:[EMAIL PROTECTED]] Sent: Monday, December 17, 2001 9:45 AM To: [EMAIL PROTECTED] Subject: How to check the return status? Hello everyone, I have a question that i can not resolve. The module dynamicaly loads other modules to handle specific urls like this: [snip] my $handle = 'My::Module'; eval { (my $h = $handle) =~ s!::!/!ig; require $h . .pm; }; if (!$@) { if ($handle-can( handler )) { $r-handler( perl-script ); $r-push_handlers( PerlHandler = \{${handle}::handler} ); ?? } } [snip] In this way the control is passed to another module. The module can return OK, SERVER_ERROR, etc... How can i check the return status so i can handle it (cache the output for example if the module returned OK) Thanks for any advice. --- Best regards, Alexei V. Alexandrov
RE: mod_perl vs. C for high performance Apache modules
http://www.perl.com/pub/a/2001/10/17/etoys.html Yea, mod_perl really sucks ; ) I have even worked on poorly architectured and coded sites which still performed fairly well. Recently I did a substantial project for a client in using mod_perl. That client is happy with the work, but an investor with their company is very angry because of what a horrible choice mod_perl is for high-load web applications compared with Apache modules and even CGI programs, written in C. If anyone on this list could forward any resources that do comparisons along these lines, or even analysis of mod_perl's handling of high-load web traffic, I would be very grateful.
RE: Auth Handlers
He he : ) I think this discussion is being miscommunicated (if that is a relevant word). I do not want authorization to be performed in the typical manner. Perhaps I want the information from a form submit or a cookie. I understand how the Apache authentication configuration works but I want to strictly use mod_perl to modify the authentication mechanisms without the standard Apache intervention. You mean you want to do authorization in a FixupHandler?? No, this is what I currently have to do to avoid Apache from sending the 'auth request' headers to the browser and still perform custom authentication via a form submit, cookie, etc. Thanks, : ) No problem, I guess I am unsure if this is the proper way to setup an Access, Authen, Authz handler. When I use this configuration my 'handler()' method does not get called and I get an error in the logs: [Mon Dec 10 13:13:03 2001] [crit] [client 192.168.0.1] configuration error: couldn't check user. No user file?: /index.html I think Apache is looking for the wrong file. Check the config for AuthUserFile. Did you use htpasswd to create it? I tried moving it down to be an Authz handler but the same error occurs. However, if I push this package as a FixupHandler it works fine and the 'handler()' method gets called. You mean you want to do authorization in a FixupHandler?? If you like I can let you have some scripts which will show you one way of checking for authorization without a second request for a username/password, assuming that at some stage in the browser session one was already supplied. Is that what you meant? 73, Ged.
RE: Auth Handlers
What I have down is moved out specific auth handler down the chain into the 'fixup' state but it would be much nicer (and ituitive) to place it in the appropriate position. On Tue, 2001-12-11 at 21:00, Stathy Touloumis wrote: Actually, I DON'T want the browser to prompt for a username/pass. I saw the examples in the eagle book and they all seem to use Authz, with Auth handlers using the example you showed. Perhaps I need to modify the headers so that the prompt does not occur? I have the exact same problem. I want my AuthenHandler to decide if the user is prompted for a password. Unfortunately the book tells me: By the time the handler is called, Apache will have done most of the work in negotiating the HTTP Basic authentication protocol. It will have alerted the browser that authentication is required to access the page, and the browser will have prompted the user to enter his name and password. Has anybody got an idea how to let a handler decide, if autthen. is required?
RE: Auth Handlers
Right, this is fairly obvious but we are trying to prevent apache from sending the 'login' headers if successful authorization does not occur. It seems to me that to do this the handler will need to be moved up or down the chain which can be unintuitive. Thanks, Has anybody got an idea how to let a handler decide, if autthen. is required? You can do this via an access handler. For example, we use the access handler to see if the user is coming in from a trusted ip address. If they are then they are authorized to use the site. Otherwise, the user must login. The module looks like package TrustedAuth; ... sub access_handler { my $r = shift; if ( ... ) { # Have a trusted host so don't ask user to login $r-set_handlers( PerlAuthenHandler = [ \OK ] ); } return OK; } sub authen_handler { # normal stuff here } 1; and my httpd.conf has PerlModule TrustedAuth Location /secure AuthName Secure AuthType basic Require valid-user PerlAccessHandler TrustedAuth::access_handler PerlAuthenHandler TrustedAuth::authen_handler /Location --- Andrew Gilmartin Senior Developer Ingenta [EMAIL PROTECTED] andrewgilmartin (aim) 401-743-3713 (cell)
Apache-push_handlers
Hi, I was wondering if anyone had experienced some funky behavior when 'pushing' a content handler (PerlHandler). The initial request makes the appropriate content handler call but upon subsequent requests the content handler routine does not get called. This is a snippet of code from a startup file that is loaded at system startup: my $environment = $ENV{'ENVIRONMENT'}; Apache-push_handlers( PerlHandler= sub { return Package::Base::$environment-handler( shift ); } ); Thanks,
RE: Auth Handlers
: ) No problem, I guess I am unsure if this is the proper way to setup an Access, Authen, Authz handler. When I use this configuration my 'handler()' method does not get called and I get an error in the logs: [Mon Dec 10 13:13:03 2001] [crit] [client 192.168.0.1] configuration error: couldn't check user. No user file?: /index.html I tried moving it down to be an Authz handler but the same error occurs. However, if I push this package as a FixupHandler it works fine and the 'handler()' method gets called. Thanks, -Original Message- From: Ged Haywood [mailto:[EMAIL PROTECTED]] Sent: Monday, December 10, 2001 7:16 PM To: Stathy Touloumis Cc: mod_perl List Subject: RE: Auth Handlers On Mon, 10 Dec 2001, Stathy Touloumis wrote: Directory /home/stathy/apache/html AuthName Login AuthType Base::Session::Handler require valid-user PerlAuthenHandler Base::Session::Handler /Directory Forgive me, it's late, and I'm afraid I've deleted the original question. But there isn't much here to go on... 73, Ged.
RE: Auth Handlers
Actually, I DON'T want the browser to prompt for a username/pass. I saw the examples in the eagle book and they all seem to use Authz, with Auth handlers using the example you showed. Perhaps I need to modify the headers so that the prompt does not occur? Thanks for the info, -Original Message- From: Rob Bloodgood [mailto:[EMAIL PROTECTED]] Sent: Tuesday, December 11, 2001 12:54 PM To: Stathy Touloumis Cc: mod_perl Subject: RE: Auth Handlers : ) No problem, I guess I am unsure if this is the proper way to setup an Access, Authen, Authz handler. When I use this configuration my 'handler()' method does not get called and I get an error in the logs: This is *not* the correct way to invoke it. Directory /home/stathy/apache/html AuthName Login # This is incorrect # AuthType Base::Session::Handler # *This* is what you need if you want the # browser to prompt for a username/pass AuthType Basic require valid-user PerlAuthenHandler Base::Session::Handler /Directory I just checked my answers from the Eagle (Writing Apache Modules with Perl and C), and that's the correct way. If I'm not mistaken, the chapter on Authentication is one of the sample chapters that's online at http://www.modperl.com. Have a look over there, it'll straighten you right out. :-) L8r, Rob #!/usr/bin/perl -w use Disclaimer qw/:standard/;
Auth Handlers
I seem to be unable to get my authentication/authorization handler to be called correctly. I have tried numerous directives and it seems to always get passed to the standard apache 'authentication' module. I receive this error : [Mon Dec 10 13:09:35 2001] [crit] [client 192.168.6.59] configuration error: couldn't check user. No user file?: /index.html OR the package handler does not get called at all. Thanks,
RE: Auth Handlers
Directory /home/stathy/apache/html AuthName Login AuthType Base::Session::Handler require valid-user PerlAuthenHandler Base::Session::Handler /Directory Send the config?
RE: Dynamic loading of development libraries
Or set MaxClients to 1 if you do not have too many developers and/or your development server doesn't suck ; ) There are 2 realistic solutions to your problem : 1. run a web server for each user ( a good solution in my opinion ) 2. wait for Doug to finish up mod_perl 2.0 I know the problem you have with development + mod_perl, and honestly, these are the only avaliable options.
RE: [OT] (apache question) Working around MaxClients?
You could defined a different port in your img tags. Then you can start thttpd to bind to that port. You shouldn't have a problem binding to ports higher that 1024(?) I think. Unless they have done something to prevent this which is doubtful. Example: img src="http://www.foo.com:/test/test.gif" Unfortunately it could mean changing lots of code on your site. Of course, you could use something like Apache::filter to alter your image tags on the way out. I don't think this would be a difficult issue though. The main thing is if you can bind to ports over 1024. I have a high traffic website (looks like 200 GB output per month, something around 10-20 hits per day) hosted on a commercial service. The service does not limit my bandwidth usage, but they limit the number of concurrent Apache process that I can have to 41. This causes the server to delay accepting new connections during peak times. My account is a "virtual server"; what this means is that I have access to the Apache httpd.conf files and can restart the Apache daemon, but do not have the priviledge to bind a program to port 80 (so I can't put thttpd on port 80). Stathy Touloumis Coder if ( eval{ $you = require Perl } ) { $you = '?3r1 H@c|3r' } Edventions 8800 Bronx Ave Skokie, IL 60077 www.edventions.com [EMAIL PROTECTED]
RE: Odd Caching Bug
So, if I understand correctly, the database handle is getting cached more than you think it should, that's right? I was unsure where the caching was occurring. I think MaxRequestsPerChild doesn't actually cut off a connection that is kept alive (with KeepAlive). Ctrl-N in a browser could validly reuse the same connection if it is still around (if you wait too long, a keep-alive connection will be closed). This would make sense. It would seem that 'KeepAlive' keeps the 'request' open until it times out. So even though you've set up MaxRequestsPerChild to 1, each Apache child process could be serving multiple requests over a single TCP/IP connection. The answer to "where the caching is occuring" would be in Apache::DBI, which opens a single DB connection per Apache child process. - stop using Apache::DBI. - have your scripts explicitly set the date format they want every time (do not rely on "whatever format is already there"). Actually these are both not options : ) We really are not allowing developers to modify global database variables. This is the first no-no. Because it is not a strict policy somebody obviously abused it : ) With both solutions, you'll be able to leave the keep-alive enabled and use a saner MaxRequestsPerChild (like the default setting). Having "MaxRequestsPerChild 1" is harsh on resources! Understandably the configuration is not optimized but it is only in a development environment to allow for simultaneous development of modules, components and visual elements. Our production environment varies significantly in it's configuration directives. Thanks for the information though. It clarified what I was originally thinking. Thanks,
[OT] RE: (apache question) Working around MaxClients?
Why don't you setup apache to do proxying? I have a high traffic website (looks like 200 GB output per month, something around 10-20 hits per day) hosted on a commercial service. The service does not limit my bandwidth usage, but they limit the number of concurrent Apache process that I can have to 41. This causes the server to delay accepting new connections during peak times. My account is a "virtual server"; what this means is that I have access to the Apache httpd.conf files and can restart the Apache daemon, but do not have the priviledge to bind a program to port 80 (so I can't put thttpd on port 80). I was thinking of serving the HTML files from Apache and the JPG files from thttpd (thttpd uses select() so it always only uses up one process, no matter how many connections it's handling) on port 8080, but there's one disadvantage: People who browse my site from behind certain firewalls can only see port 80. Does anyone know of a way to configure Apache so that it will pass port 80 traffic onto port 8080 somehow, without having access to modify the binary? It would have to do this without needing to spawn a child for every request though. Or is this impossible?
Odd Caching Bug
Hello, One of the developers I currently am working with has found an odd bug that can be replicated on several workstations. First my configuration : Apache 1.3.17 mod_perl 1.25 Mason (Ancient) Apache::DBI .88 Postgres 7 MaxRequestsPerChild 1 KeepAlive on We have two components that contain the following code. One of which changes a session variable (datestyle to 'ISO')on the postgres database. Theoretically the two components should return different results based on the specific datestyle settings ('ISO' and default). This only occurs when two browsers are opened independently that do not share the same session. When using ctrl-n on a windows client to open a new window it appears that they share session information and possibly the same tcp/ip connection(?). When reloading the components in the two windows eventually they both return the 'ISO' format date. After pausing for several minutes and reloading the component that DOES NOT explicitly set the 'ISO' format variable, it correctly returns the default date format. --COMPONENT 1-- %perl_init my $dbh = Edventions::Utilities-new-getDbHandle; ## Uses Apache::DBI to connect my $sql = q( select now() as today ); my $sth = $dbh-prepare( $sql ); $sth-execute; my $now = $sth-fetch-[0]; /%perl_init h1% $now % --COMPONENT 2-- %perl_init my $dbh = Utilities-new-getDatabaseHandle; ## Uses Apache::DBI to connect my $sql = q( set datestyle to 'ISO'; select now() as today ); my $sth = $dbh-prepare( $sql ); $sth-execute; my $now = $sth-fetch-[0]; /%perl_init h1% $now % Now when the apache directive KeepAlive is set to 'off' this problem does not occur. I am trying to figure out where the caching is occurring or if the database handle is not getting properly destroyed for each request. Any suggestions as to why this is occurring would be greatly appreciated. Thanks,
Odd Caching Bug
Hello, One of the developers I currently am working with has found an odd bug that can be replicated on several workstations. First my configuration : Apache 1.3.17 mod_perl 1.25 Mason (Ancient) Apache::DBI .88 Postgres 7 MaxRequestsPerChild 1 KeepAlive on We have two components that contain the following code. One of which changes a session variable (datestyle to 'ISO')on the postgres database. Theoretically the two components should return different results based on the specific datestyle settings ('ISO' and default). This only occurs when two browsers are opened independently that do not share the same session. When using ctrl-n on a windows client to open a new window it appears that they share session information and possibly the same tcp/ip connection(?). When reloading the components in the two windows eventually they both return the 'ISO' format date. After pausing for several minutes and reloading the component that DOES NOT explicitly set the 'ISO' format variable, it correctly returns the default date format. --COMPONENT 1-- %perl_init my $dbh = Edventions::Utilities-new-getDbHandle; ## Uses Apache::DBI to connect my $sql = q( select now() as today ); my $sth = $dbh-prepare( $sql ); $sth-execute; my $now = $sth-fetch-[0]; /%perl_init h1% $now % --COMPONENT 2-- %perl_init my $dbh = Utilities-new-getDatabaseHandle; ## Uses Apache::DBI to connect my $sql = q( set datestyle to 'ISO'; select now() as today ); my $sth = $dbh-prepare( $sql ); $sth-execute; my $now = $sth-fetch-[0]; /%perl_init h1% $now % Now when the apache directive KeepAlive is set to 'off' this problem does not occur. I am trying to figure out where the caching is occurring or if the database handle is not getting properly destroyed for each request. Any suggestions as to why this is occurring would be greatly appreciated. Thanks,
Setting 'Location' header
This code does not seem to work whether in a handler or when using a Mason component. I have tried several variations with different versions of mod_perl to no avail. Can anyone shed some light? my $head = $r-headers_out; $head-set( Location= '/index.html' ); $head-set( Target= '_top' ); $r-send_http_header; Thanks!
Accessing Global Configuration Directives
Is it possible to access a global configuration directive without using the request object? Thanks,
RE: server_root question...
If you want to use a perl function ( Apache::server_root_relative() ) then you have to use a Perl block. This might work : PerlSetEnv SERVER_ROOT \ Perl Apache::server_root_relative() /Perl But this seems so much easier : Perl $ENV{'SERVER_ROOT'} = Apache::server_root_relative() /Perl Maybe its too early or whatever. How would you go about setting $ENV{SERVER_ROOT} without using Perl. I was trying PerlSetEnv SERVER_ROOT Apache::server_root_relative() in perl.conf, but no go. Any ideas?
RE: [OT] Dynamically changing current package
Probably just never assumed to be used this way. Do not see to much documentation on using the Symbol table directly. Here is something strange as well. Try copying a package and then creating an object from it . . . Really funky Think I might post this to the p5p list - #!/usr/bin/perl -w # ## ASSIGN TEST TO TEST2 *{ 'Test2::' } = *{ 'Test::' }; ## LETS CREATE SOME OBJECTS my $obj = Test-new; print 'TEST PACKAGE OBJECT : ', ref($obj), "\n\n"; my $obj2 = Test2-new; print 'TEST2 PACKAGE OBJECT : ', ref($obj2), "\n\n"; ## FYI print '- ' x 10, 'TEST', ' -' x 10, "\n"; print map { "$_ - $Test::{$_}\n" } keys %Test:: ; print '- ' x 10, 'TEST2', ' -' x 10, "\n"; print map { "$_ - $Test2::{$_}\n" } keys %Test:: ; BEGIN { package Test; sub new { my $class =shift; print "SETTING OBJECT TO CLASS : $class\n"; bless my $obj = {}, $class; } } --- NewPackage will then contain all things in TestPackage Then you can redefined everything in TestPackage without affecting anything in NewPackage. Actually it will, if you were to delete NewPackage, TestPackage would not contain anything. Modifying 'thingys' in TestPackage would modify NewPackage. Actually I investigated this a little more and discovered some strange things... If you check out the results, copying the package at the package level cause scalars to be redefined and subroutines to created as references. Where as copying the the package at the glob level caused the the subroutines to be redefined and the scalars to be references... I wonder if this is a problem with perl? Robert Landrum --- results --- # perl n.pl 1 NewPackage::x was defined NewPackage::june was defined $NewPackage::x was set to 100 $Test::x now contains 100 Now Deleting Test package Test::x was deleted from the STASH Test::june was deleted from the STASH $NewPackage::x was set to 100 $Test::x now contains 100 Now Listing NewPackage NewPackage::x NewPackage::june Now Listing Test # perl n.pl NewPackage:: was defined as *{Test::} $NewPackage::x was set to 100 $Test::x now contains 1 Now Deleting Test package Test::x was deleted from the STASH Test::june was deleted from the STASH $NewPackage::x was set to 100 $Test::x now contains 1 Now Listing NewPackage Now Listing Test --- Contents of n.pl --- #!/usr/bin/perl package Test; our $x = 1; sub june { } package main; if($ARGV[0]) { for my $name (keys %{Test::}) { *{"NewPackage::".$name} = *{"Test::".$name}; print "NewPackage::".$name." was defined\n"; } print "\n"; } else { *{NewPackage::} = *{Test::}; print "NewPackage:: was defined as \*{Test::}\n"; print "\n"; } $NewPackage::x = 100; print "\$NewPackage::x was set to $NewPackage::x\n"; print "\$Test::x now contains $Test::x\n"; print "\n"; print "Now Deleting Test package\n"; for my $name (keys %{Test::}) { delete $Test::{$name}; print "Test::".$name." was deleted from the STASH\n"; } print "\n"; print "\$NewPackage::x was set to $NewPackage::x\n"; print "\$Test::x now contains $Test::x\n"; print "\n"; print "Now Listing NewPackage\n"; for my $name (keys %{NewPackage::}) { print "NewPackage::".$name."\n"; } print "\n"; print "Now Listing Test\n"; for my $name (keys %{Test::}) { print "Test::".$name."\n"; } print "\n";
RE: Development Environment
I actually was nearlly successful in accomplishing some sort of mechanism by which developer packages can be mapped to a virtual package which the real package points to (did this make sense?). Anyway, it needed to tap into the symbol table way too extensively and ran into several problems. I also thought about configuring the apache server differently on development so that child processes get recycled much faster than on production so as to allow for each request to use it's own memory. This can be resource intensive but again it would only be on development. Also, packages/modules will need to be called on a per request basis in development. I will let you know if it is feasible. Thanks, I agree. I've seen many people try to do shared memory/cached programming in one server and it just doesn't work very well in practice. It only takes one programmer a typo to take everyone else down until the bug is fixed. From Jakarta/Tomcat to IIS to Apache/mod_perl. Developers having their own workstation is the best for testing and active development. Of course, a staging server needs to be shared. But it's a lot cleaner once the developer has debugged their own code.
RE: suexec denies execution of scripts
Because suexec is build with a predefined path which allows only scripts underneath that path to run in. You need to find out what the 'docroot' is and be sure that your script is underneath this path. There are several other restrictions that need to be done to ensure that cgi's being run under suexec need to adhere to. http://www.apache.org/docs/suexec.html I respectfully request your help in order to get this working. My .cgi are not perl ones, but /bin/sh or whatever you want that works with suexec. I DO known this list is exclusive for mod_perl. But since i get no ideia where to go to seek for help. (as far as i known, there is no mailing list support for apache/suexec in www.apache.org). May some one (In the name of God) help with such, **PLEASE** ?
RE: [OT] Dynamically changing current package
NewPackage will then contain all things in TestPackage Then you can redefined everything in TestPackage without affecting anything in NewPackage. Actually it will, if you were to delete NewPackage, TestPackage would not contain anything. Modifying 'thingys' in TestPackage would modify NewPackage.
Symbol::delete_package
When using Symbol::delete_package to remove a package something odd happens. Other packages seem to disappear or functions are not available. Has anyone experienced this before? I am using this with Mason and after using Symbol::delete_package the Mason handler is no longer available. (Suse/Linux) Apache 1.3.12 Mod_perl/1.24 Thanks,
Development Environment
I was wondering if anyone has successfully setup a development environment to allow for multiple development copies of modules used within Mason components. Also, to have the appropriate changes to the modules shown within the development environment. Thanks, Stathy Touloumis Coder if ( eval{ $you = require Perl } ) { $you = '?3r1 H@c|3r' } Edventions 8800 Bronx Ave Skokie, IL 60077 www.edventions.com [EMAIL PROTECTED]