CPAN::Mini::Inject::Server - Inject into your CPAN mirror from over there


CPAN-Mini-Inject-Server documentation Contained in the CPAN-Mini-Inject-Server distribution.

Index


Code Index:

NAME

Top

CPAN::Mini::Inject::Server - Inject into your CPAN mirror from over there

VERSION

Top

Version 0.03

SYNOPSIS

Top

#under test server

use CGI::Application::Dispatch::Server; my $server = CGI::Application::Dispatch::Server->new( class => 'CPAN::Mini::Inject::Server::Dispatch', port => '9000' );

$server->run;

#under plain cgi

#!/usr/bin/perl use FindBin '$Bin'; use lib "$Bin/../../rel/path/to/my/perllib"; use CPAN::Mini::Inject::Server::Dispatch CPAN::Mini::Inject::Server::Dispatch->dispatch();

#Apache and mod perl

<location /app> SetHandler perl-script PerlHandler CPAN::Mini::Inject::Server::Dispatch </location>

DESCRIPTION

Top

This module is a simple Restish webservice that makes the basic functionality and interface of mcpani (of the CPAN::Mini::Inject package) available from accross a network allowing for remote management of a cpan mirror.

The original envisaged use for this module was for a continuous integration platform with distributed build nodes to be able to commit its build artifacts back to a common CPAN repository so that subsequent builds of other modules could use source the new version of the software.

FUNCTIONS

Top

add

Invokes the controller to add a new module to the CPAN::Mini server

update

Updates the cpan mirror

inject

Injects all added modules into the cpan mirror

AUTHOR

Top

Christopher Mckay, <potatohead at potatolan.com>

BUGS

Top

Please report any bugs or feature requests to bug-cpan-mini-inject-server at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=CPAN-Mini-Inject-Server. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

TO DO

Top

Need to add logging down to trace levels to this

SUPPORT

Top

You can find documentation for this module with the perldoc command.

    perldoc CPAN::Mini::Inject::Server




You can also look for information at:

* RT: CPAN's request tracker

http://rt.cpan.org/NoAuth/Bugs.html?Dist=CPAN-Mini-Inject-Server

* AnnoCPAN: Annotated CPAN documentation

http://annocpan.org/dist/CPAN-Mini-Inject-Server

* CPAN Ratings

http://cpanratings.perl.org/d/CPAN-Mini-Inject-Server

* Search CPAN

http://search.cpan.org/dist/CPAN-Mini-Inject-Server/

ACKNOWLEDGEMENTS

Top

COPYRIGHT & LICENSE

Top


CPAN-Mini-Inject-Server documentation Contained in the CPAN-Mini-Inject-Server distribution.
package CPAN::Mini::Inject::Server;
use base 'CGI::Application';

use strict;
use warnings;
use Carp;
use CGI::Application::Plugin::AutoRunmode;
use CPAN::Mini::Inject;

our $VERSION = '0.03';



######
#
# _mcpi
#
# Accessor for a mini cpan instance
#
###

sub _mcpi {
    my $self = shift;    

    if (not $self->{mcpi})
    {
        $self->{mcpi} = CPAN::Mini::Inject->new;
        $self->{mcpi}->loadcfg();
        $self->{mcpi}->parsecfg();
    }

    return $self->{mcpi};
} # end of method _mcpi


sub add :Runmode {
    my $self = shift;
    $self->header_add(-status => '501 Not Implemented');

    my $query = $self->query();

    my $module_name = $query->param('module');
    my $module_author = $query->param('authorid');
    my $module_version = $query->param('version');

    my $module_filename = $query->param('file');

    if (not $module_filename)
    {
        $self->header_add(-status => '400 No module archive supplied'); 
        return;
    }

    # check filename ends with tar.gz

    my $bytesread;
    my $tmp_fh;

    # -e tmp file here to check we don't bash on it can be racey, just forget
    # about it

    my $tmp_module_filename = $module_name;
    $tmp_module_filename =~ s/::/-/g;
    $tmp_module_filename = "/tmp/$tmp_module_filename-$module_version.tar.gz";

    if (not open ($tmp_fh, '>', $tmp_module_filename))
    {
        $self->header_add(-status => '500 Internal System Error');
        return;
    }

    while ($bytesread = read($module_filename, my $buffer, 1024))
    {
        print $tmp_fh $buffer;
    }

    close ($tmp_fh);


    my $mcpi = $self->_mcpi();
    $mcpi->add(
        module => $module_name,
        authorid => $module_author,
        version => $module_version,
        file => $tmp_module_filename,
    );

    unlink $tmp_module_filename;

    $mcpi->writelist();

    $self->header_add(-status => '202 Module added');
    return;
} # end of subroutine add


sub update :Runmode {
    my $self = shift;

    my $mcpi = $self->_mcpi();

    $mcpi->update_mirror();
    $mcpi->inject();

    $self->header_add(-status => '202 Mirror updated');
    return;
} # end of subroutine update


sub inject :Runmode {
    my $self = shift;

    my $mcpi = $self->_mcpi();

    $mcpi->inject();

    $self->header_add(-status => '202 Modules injected');
    return;
} # end of subroutine inject


1; # End of CPAN::Mini::Inject::Server