NAME
Apache2::FileManager - Apache2 mod_perl File Manager
SYNOPSIS
# Install in mod_perl enabled apache conf file
<Location /FileManager>
SetHandler perl-script
PerlHandler Apache2::FileManager
</Location>
(Then point your browser to http://www.yourwebsite.com/FileManager)
# Or call from your own mod_perl script
use Apache2::FileManager;
my $obj = Apache2::FileManager->new();
$obj->print();
# Or create your own custom MyFileManager subclass
package MyFileManager;
use strict;
use Apache2::FileManager;
our @ISA = ('Apache2::FileManager');
sub handler {
my $r = shift;
my $obj = __PACKAGE__->new();
$r->content_type('text/html');
$r->print ("
<HTML>
<HEAD>
<TITLE>".$r->hostname." File Manager</TITLE>
</HEAD>
");
$obj->print();
$r->print("</HTML>");
}
# .. overload the methods ..
DESCRIPTION
The Apache2::FileManager module is a simple HTML file manager. It provides file manipulations such as cut, copy, paste, delete, rename, extract archive, create directory, create file, edit file, and upload files.
Apache2::FileManager also has the ability to rsync the server htdocs tree to another server with the click of a button.
PREREQUISITES
The following (non-core) perl modules must be installed before installing Apache2::FileManager.
Apache/mod_perl => 2.0
Archive::Any => 0.03
CGI::Cookie => 1.20
File::NCopy => 0.32
File::Remove => 0.20
SPECIAL NOTES
Make sure the web server has read, write, and execute access access to the directory you want to manage files in. Typically you are going to want to run the following commands before you begin.
chown -R nobody /web/xyz/htdocs chmod -R 755 /web/xyz/htdocs
The extract functionality only works with *.tar.gz and *.zip files.
RSYNC FEATURE
To use the rync functionality you must have ssh, rsync, and the File::Rsync perl module installed on the development server. You also must have an sshd running on the production server.
Make sure you always fully qualify your server names so you don't have different values in your known hosts file.
For Example:
ssh my-machine - wrong
ssh my-machine.subnet.com - right
Note: If the ip address of the production_server changes you will need to create a new known_hosts file.
To get the rsync feature to work do the following:
#1 log onto the production server
#2 become root
#3 give web server user (typically nobody) a home area
I made mine /usr/local/apache/nobody
- production_server> mkdir /usr/local/apache/nobody
- edit passwd file and set new home area for nobody
- production_server> mkdir /usr/local/apache/nobody/.ssh
#4 log onto the development server
#5 become root
#6 give web server user (typically nobody) a home area
- dev_server> mkdir /usr/local/apache/nobody
- dev_server> chown -R nobody.nobody /usr/local/apache/nobody
- edit passwd file and set new home area for nobody
- dev_server> su - nobody
- dev_server> ssh-keygen -t dsa (don't use passphrase)
- dev_server> ssh production_server
(will fail but will make known_hosts file)
- log out from user nobody back to root user
- dev_server> cd /usr/local/apache/nobody/.ssh
- dev_server> scp id_dsa.pub production_server:/usr/local/apache/nobody/.ssh/authorized_keys
- dev_server> chown -R nobody.nobody /usr/local/apache/nobody
- dev_server> chmod -R 700 /usr/local/apache/nobody
#7 log back into the production server
#8 become root
#9 Do the following commands:
- production_server> chown -R nobody.nobody /usr/local/apache/nobody
- production_server> chmod -R 700 /usr/local/apache/nobody
You also need to specify the production server in the development server's web conf file. So your conf file should look like this:
<Location /FileManager>
SetHandler perl-script
PerlHandler Apache2::FileManager
PerlSetVar RSYNC_TO production_server:/web/xyz
</Location>
If your ssh path is not /usr/bin/ssh or /usr/local/bin/ssh, you also need to specify the path in the conf file or in the contructor with the directive SSH_PATH.
You can also specify RSYNC_TO in the constructor:
my $obj = Apache2::FileManager->new({
RSYNC_TO => "production_server:/web/xyz"
});
Also make sure /web/xyz and all files in the tree are readable, writeable, and executable by nobody on both the production server AND the development server.
USING DIFFERENT DOCUMENT ROOT
You can specify a different document root as long as the new document root falls inside of the orginal document root. For example if the document root of a web server is /web/project/htdocs, you could assign the document root to also be /web/project/htdocs/newroot. The directory `newroot` must exist.
# Specify different document root in apache conf file
<Location /FileManager>
SetHandler perl-script
PerlHandler Apache2::FileManager
PerlSetVar DOCUMENT_ROOT /web/project/htdocs/newroot
</Location>
# Or specify different document root in your own mod_perl script
use Apache2::FileManager;
my $obj = Apache2::FileManager->new({
DOCUMENT_ROOT => '/web/project/htdocs/newroot'
});
$obj->print();
SUBCLASSING Apache2::FileManager
# Create a new file with the following code:
package MyProject::MyFileManager;
use strict;
use Apache2::FileManager;
our @ISA = ('Apache2::FileManager');
#Add your own methods here
1;
The best way to subclass the filemanager would be to copy the methods you want to overload from the Apache2::FileManager file to your new subclass. Then change the methods to your liking.
BUGS
There is a bug in File::NCopy that occurs when trying to paste an empty directory. The directory is copied but reports back as 0 directories pasted. The author is in the process of fixing the problem.
AUTHOR
Apache::FileManager was written by Philip Collins <pmc@cpan.org>.
Apache2::FileManager was adapted for Apache2 by David Aguilar <davvid@cpan.org>.