Add pypimirror module.
New module to setup a Python Package Index mirror. Nginx is setup to serve as the mirror web server. The default setup is to mirror everything. Example of setting up a new mirror, restricting what we will mirror: node "mymirror.mydomain.org" { include openstack_cron class { "pypimirror": base_url => "http://mymirror.mydomain.org", package_matches = ["nose", "pep8", "simplejson"], } } To use it: pip install <package> -i http://mymirror.mydomain.org Change-Id: I36234b8242df0e9d1e7dca7e896005e9e46a9edf
This commit is contained in:
parent
06d4241646
commit
520065039c
9
modules/pypimirror/files/default
Normal file
9
modules/pypimirror/files/default
Normal file
@ -0,0 +1,9 @@
|
||||
server {
|
||||
listen 80;
|
||||
|
||||
index index.html index.htm;
|
||||
|
||||
location / {
|
||||
root /usr/local/pypimirror;
|
||||
}
|
||||
}
|
109
modules/pypimirror/manifests/init.pp
Normal file
109
modules/pypimirror/manifests/init.pp
Normal file
@ -0,0 +1,109 @@
|
||||
class pypimirror ( $base_url,
|
||||
$log_filename = "/var/log/pypimirror.log",
|
||||
$mirror_file_path = "/var/lib/pypimirror",
|
||||
$fetch_since_days = 1,
|
||||
$package_matches = ["*"],
|
||||
$external_links = true,
|
||||
$follow_external_index_pages = false )
|
||||
{
|
||||
|
||||
if $external_links == true {
|
||||
$external_links_real = 'True'
|
||||
}
|
||||
else {
|
||||
$external_links_real = 'False'
|
||||
}
|
||||
|
||||
if $follow_external_index_pages == true {
|
||||
$follow_external_index_pages_real = 'True'
|
||||
}
|
||||
else {
|
||||
$follow_external_index_pages_real = 'False'
|
||||
}
|
||||
|
||||
$packages = [ 'mercurial',
|
||||
'nginx',
|
||||
'python-pip' ]
|
||||
|
||||
package { $packages:
|
||||
ensure => present,
|
||||
}
|
||||
|
||||
# Build the mirror config file based on options provided.
|
||||
|
||||
file { 'pypimirror.cfg':
|
||||
path => '/etc/pypimirror.cfg',
|
||||
ensure => present,
|
||||
mode => 644,
|
||||
owner => 'root',
|
||||
group => 'root',
|
||||
content => template('pypimirror/config.erb'),
|
||||
}
|
||||
|
||||
# if we already have the repo the pull updates
|
||||
|
||||
exec { "update_z3c.pypimirror":
|
||||
command => "hg pull",
|
||||
cwd => "/usr/local/z3c.pypimirror",
|
||||
path => "/bin:/usr/bin",
|
||||
onlyif => "test -d /usr/local/z3c.pypimirror",
|
||||
before => Exec["get_z3c.pypimirror"],
|
||||
}
|
||||
|
||||
# otherwise get a new clone of it
|
||||
|
||||
exec { "get_z3c.pypimirror":
|
||||
command => "hg clone https://bitbucket.org/rsyring/z3c.pypimirror /usr/local/z3c.pypimirror",
|
||||
path => "/bin:/usr/bin",
|
||||
onlyif => "test ! -d /usr/local/z3c.pypimirror"
|
||||
}
|
||||
|
||||
exec { "install_z3c.pypimirror":
|
||||
command => "python setup.py install",
|
||||
cwd => "/usr/local/z3c.pypimirror",
|
||||
path => "/bin:/usr/bin",
|
||||
subscribe => [ Exec["get_z3c.pypimirror"], Exec["update_z3c.pypimirror"] ],
|
||||
}
|
||||
|
||||
exec { "initialize_mirror":
|
||||
command => "pypimirror --initial-fetch /etc/pypimirror.cfg",
|
||||
path => "/bin:/usr/bin:/usr/local/bin",
|
||||
onlyif => "test ! -d ${mirror_file_path}",
|
||||
require => [ Exec["get_z3c.pypimirror"], Exec["install_z3c.pypimirror"] ],
|
||||
}
|
||||
|
||||
# Add cron job to update the mirror
|
||||
|
||||
cron { "update_mirror":
|
||||
user => root,
|
||||
hour => 0,
|
||||
command => '/usr/local/bin/pypimirror --update-fetch /etc/pypimirror.cfg',
|
||||
require => Exec["install_z3c.pypimirror"],
|
||||
}
|
||||
|
||||
# Rotate the mirror log file
|
||||
|
||||
include logrotate
|
||||
logrotate::file {"pypimirror":
|
||||
log => $log_filename,
|
||||
options => ["compress", "delaycompress", "missingok", "rotate 7", "daily", "notifempty"],
|
||||
require => Cron["update_mirror"],
|
||||
}
|
||||
|
||||
# Setup the web server
|
||||
|
||||
service { "nginx":
|
||||
ensure => running,
|
||||
hasrestart => true
|
||||
}
|
||||
|
||||
file { "/etc/nginx/sites-available/default":
|
||||
ensure => present,
|
||||
source => "puppet:///modules/pypimirror/default",
|
||||
replace => true,
|
||||
owner => "root",
|
||||
group => "root",
|
||||
require => Package["nginx"],
|
||||
notify => Service["nginx"],
|
||||
}
|
||||
}
|
62
modules/pypimirror/templates/config.erb
Normal file
62
modules/pypimirror/templates/config.erb
Normal file
@ -0,0 +1,62 @@
|
||||
[DEFAULT]
|
||||
# the root folder of all mirrored packages.
|
||||
# if necessary it will be created for you
|
||||
mirror_file_path = <%= mirror_file_path %>
|
||||
|
||||
# where's your mirror on the net?
|
||||
base_url = <%= base_url %>
|
||||
|
||||
# lock file to avoid duplicate runs of the mirror script
|
||||
lock_file_name = /var/lock/pypi-poll-access.lock
|
||||
|
||||
# days to fetch in past on update
|
||||
fetch_since_days = <%= fetch_since_days %>
|
||||
|
||||
# Pattern for package files, only those matching will be mirrored
|
||||
filename_matches =
|
||||
*.zip
|
||||
*.tgz
|
||||
*.egg
|
||||
*.tar.gz
|
||||
*.tar.bz2
|
||||
|
||||
# Pattern for package names; only packages having matching names will
|
||||
# be mirrored
|
||||
package_matches =
|
||||
<% package_matches.each do |match| -%>
|
||||
<%= match %>
|
||||
<% end -%>
|
||||
|
||||
# remove packages not on pypi (or externals) anymore
|
||||
cleanup = True
|
||||
|
||||
# create index.html files
|
||||
create_indexes = True
|
||||
|
||||
# be more verbose
|
||||
verbose = True
|
||||
|
||||
# resolve download_url links on pypi which point to files and download
|
||||
# the files from there (if they match filename_matches).
|
||||
# The filename and filesize (from the download header) are used
|
||||
# to find out if the file is already on the mirror. Not all servers
|
||||
# support the content-length header, so be prepared to download
|
||||
# a lot of data on each mirror update.
|
||||
# This is highly experimental and shouldn't be used right now.
|
||||
#
|
||||
# NOTE: This option should only be set to True if package_matches is not
|
||||
# set to '*' - otherwise you will mirror a huge amount of data. BE CAREFUL
|
||||
# using this option!!!
|
||||
external_links = <%= external_links_real %>
|
||||
|
||||
# similar to 'external_links' but also follows an index page if no
|
||||
# download links are available on the referenced download_url page
|
||||
# of a given package.
|
||||
#
|
||||
# NOTE: This option should only be set to True if package_matches is not
|
||||
# set to '*' - otherwise you will mirror a huge amount of data. BE CAREFUL
|
||||
# using this option!!!
|
||||
follow_external_index_pages = <%= follow_external_index_pages_real %>
|
||||
|
||||
# logfile
|
||||
log_filename = <%= log_filename %>
|
Loading…
x
Reference in New Issue
Block a user