Initial version of mirror module.
This commit is contained in:
parent
55694db8b3
commit
78b333cf6c
5 changed files with 402 additions and 0 deletions
103
mirror/files/sync-mirrors
Executable file
103
mirror/files/sync-mirrors
Executable file
|
@ -0,0 +1,103 @@
|
|||
#!/bin/bash
|
||||
|
||||
LOCKFILE=/var/run/sync-mirrors/lockfile
|
||||
LOGFILE=/var/log/sync-mirrors/sync-mirrors-`date +%Y%m%d%H%M%S`.log
|
||||
CONFDIR=/etc/sync-mirrors
|
||||
|
||||
usage() {
|
||||
echo "Usage: `basename $0` [-v] [mirror]" 1>&2
|
||||
echo " `basename $0` -l" 1>&2
|
||||
}
|
||||
|
||||
if [ -d ${CONFDIR} ]; then
|
||||
MIRRORLIST=`ls ${CONFDIR}/*.conf 2> /dev/null | while read f ; \
|
||||
do basename $f | sed -e 's/\.conf$//' ; done`
|
||||
if [ "${MIRRORLIST}" = "" ]; then
|
||||
echo "ERR: No configured mirrors found" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "ERR: Config directory [${CONFDIR}] missing" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
VERBOSE=0
|
||||
EXTRA_OPTS=""
|
||||
while getopts "vhl" c ; do
|
||||
case $c in
|
||||
v)
|
||||
VERBOSE=1
|
||||
EXTRA_OPTS="-v --progress"
|
||||
;;
|
||||
h)
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
l)
|
||||
echo "Available mirrors:"
|
||||
for name in ${MIRRORLIST} ; do
|
||||
echo " ${name}"
|
||||
done
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
shift `expr $OPTIND - 1`
|
||||
|
||||
if [ $# -gt 0 ]; then
|
||||
while true ; do
|
||||
if [ ! -f ${CONFDIR}/$1.conf ]; then
|
||||
echo "ERR: No mirror named [$1]" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
SYNC="${MIRRORS} $1"
|
||||
shift
|
||||
done
|
||||
else
|
||||
SYNC=${MIRRORLIST}
|
||||
fi
|
||||
|
||||
if [ `whoami` != mirror ]; then
|
||||
echo "ERR: Script needs to be run as mirror user" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
umask 022
|
||||
|
||||
if [ -f ${LOCKFILE} ]; then
|
||||
kill -0 `cat ${LOCKFILE}`
|
||||
if [ $? -ne 1 ]; then
|
||||
which stat > /dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
STARTED=" (`stat ${LOCKFILE} | sed -n 's/^Modify: \(.*\)/\1/p'`)"
|
||||
else
|
||||
STARTED=""
|
||||
fi
|
||||
echo "ERR: Lockfile exists${STARTED}, exiting" 1>&2
|
||||
exit 1
|
||||
else
|
||||
echo "WARN: Removing stale lock file..." 1>&2
|
||||
rm -f ${LOCKFILE}
|
||||
fi
|
||||
fi
|
||||
trap "rm -f ${LOCKFILE}" INT TERM EXIT
|
||||
echo $$ > ${LOCKFILE}
|
||||
|
||||
for mirror in ${SYNC} ; do
|
||||
SRC=""
|
||||
RSYNCOPTS=""
|
||||
. ${CONFDIR}/${mirror}.conf
|
||||
if [ "${SRC}" = "" ]; then
|
||||
echo "ERR: No SRC set for mirror ${mirror} ..." 1>&2
|
||||
exit 1
|
||||
fi
|
||||
[ ${VERBOSE} -eq 1 ] && echo "Starting ${mirror} sync ..."
|
||||
echo "`date '+%Y/%m/%d %H:%M:%S'` [$$] Starting ${mirror} sync ..." \
|
||||
>> ${LOGFILE}
|
||||
rsync -aH -4 ${EXTRA_OPTS} --numeric-ids --delete --delete-after \
|
||||
--delay-updates --no-motd ${RSYNCOPTS} --log-file=${LOGFILE} \
|
||||
${SRC} /srv/mirrors/${mirror}/
|
||||
done
|
||||
|
||||
rm -f ${LOCKFILE}
|
186
mirror/manifests/init.pp
Normal file
186
mirror/manifests/init.pp
Normal file
|
@ -0,0 +1,186 @@
|
|||
|
||||
# Install mirroring scripts
|
||||
#
|
||||
# === Parameters
|
||||
#
|
||||
# $datadir:
|
||||
# Directory for mirrored data. Defaults to /srv/mirrors
|
||||
#
|
||||
class mirror($datadir = "/srv/mirrors") {
|
||||
|
||||
include user::system
|
||||
realize(User["mirror"], Group["mirror"])
|
||||
|
||||
if $datadir != "/srv/mirrors" {
|
||||
file { "/srv/mirrors":
|
||||
ensure => link,
|
||||
target => $datadir,
|
||||
owner => "root",
|
||||
group => "root",
|
||||
seltype => "httpd_sys_content_t",
|
||||
before => File[$datadir],
|
||||
}
|
||||
selinux::manage_fcontext { "/srv/mirrors(/.*)?":
|
||||
type => "httpd_sys_content_t",
|
||||
before => File["/srv/mirrors"],
|
||||
}
|
||||
}
|
||||
file { $datadir:
|
||||
ensure => directory,
|
||||
mode => "0755",
|
||||
owner => "root",
|
||||
group => "root",
|
||||
seltype => "httpd_sys_content_t",
|
||||
}
|
||||
selinux::manage_fcontext { "${datadir}(/.*)?":
|
||||
type => "httpd_sys_content_t",
|
||||
before => File[$datadir],
|
||||
}
|
||||
|
||||
file { "/etc/sync-mirrors":
|
||||
ensure => directory,
|
||||
mode => "0755",
|
||||
owner => "root",
|
||||
group => "root",
|
||||
recurse => true,
|
||||
purge => true,
|
||||
}
|
||||
|
||||
file { [ "/var/run/sync-mirrors", "/var/log/sync-mirrors", ]:
|
||||
ensure => directory,
|
||||
mode => "0755",
|
||||
owner => "mirror",
|
||||
group => "mirror",
|
||||
before => Cron["sync-mirrors"],
|
||||
require => User["mirror"],
|
||||
}
|
||||
|
||||
file { "/usr/local/bin/sync-mirrors":
|
||||
ensure => present,
|
||||
source => "puppet:///modules/mirror/sync-mirrors",
|
||||
mode => "0755",
|
||||
owner => "root",
|
||||
group => "root",
|
||||
}
|
||||
cron { "sync-mirrors":
|
||||
command => "/usr/local/bin/sync-mirrors",
|
||||
user => "mirror",
|
||||
hour => [ 0, 6, 12, 18, ],
|
||||
minute => 0,
|
||||
require => [ File["/usr/local/bin/sync-mirrors"], User["mirror"], ],
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
# Create new mirror
|
||||
#
|
||||
# === Parameters:
|
||||
#
|
||||
# $name:
|
||||
# Mirror name
|
||||
#
|
||||
# $source:
|
||||
# Rsync path from where to sync mirror
|
||||
#
|
||||
# $rsync_options:
|
||||
# Extra options for rsync
|
||||
#
|
||||
# === Sample usage:
|
||||
#
|
||||
# mirrors::mirror { "centos":
|
||||
# source => "rsync://rsync.nic.funet.fi/ftp/pub/mirrors/centos.org/",
|
||||
# rsync_options => [
|
||||
# "--exclude=SRPMS",
|
||||
# "--exclude=debug",
|
||||
# "--exclude=isos",
|
||||
# ],
|
||||
# }
|
||||
#
|
||||
define mirror::mirror($source, $rsync_options=[]) {
|
||||
|
||||
require mirror
|
||||
|
||||
file { "/etc/sync-mirrors/${name}.conf":
|
||||
ensure => present,
|
||||
content => template("mirror/mirror.conf.erb"),
|
||||
mode => "0644",
|
||||
owner => "root",
|
||||
group => "root",
|
||||
require => File["/srv/mirrors/${name}"],
|
||||
}
|
||||
|
||||
file { "/srv/mirrors/${name}":
|
||||
ensure => directory,
|
||||
mode => "0755",
|
||||
owner => "mirror",
|
||||
group => "mirror",
|
||||
seltype => "httpd_sys_content_t",
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
# Run weekly hardlinking for mirrored data
|
||||
#
|
||||
class mirror::hardlink {
|
||||
|
||||
require mirror
|
||||
|
||||
package { "hardlink":
|
||||
ensure => installed,
|
||||
}
|
||||
cron { "hardlink-mirrors-weekly":
|
||||
command => "/usr/sbin/hardlink /srv/mirrors/",
|
||||
user => "mirror",
|
||||
hour => 4,
|
||||
minute => 0,
|
||||
weekday => 0,
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
# Install Fedora mirror reporting tool
|
||||
#
|
||||
# https://fedoraproject.org/wiki/Infrastructure/Mirroring
|
||||
#
|
||||
# === Parameters:
|
||||
#
|
||||
# $sitename:
|
||||
# Site name configured to mirrormanager
|
||||
#
|
||||
# $password:
|
||||
# Site password configured to mirrormanager
|
||||
#
|
||||
# $hostname:
|
||||
# Host name configured to mirrormanager
|
||||
#
|
||||
# $mirrors:
|
||||
# Components mirrored to this hosts
|
||||
#
|
||||
# === Sample usage:
|
||||
#
|
||||
# mirrors::reportmirror {
|
||||
# sitename => "foo.sh"
|
||||
# password => "secret",
|
||||
# hostname => "mirrors.foo.sh",
|
||||
# mirrors => [ "fedora", "epel", ],
|
||||
# }
|
||||
#
|
||||
class mirror::reportmirror($sitename, $password, $hostname, $mirrors=[]) {
|
||||
|
||||
package { "mirrormanager-client":
|
||||
ensure => installed,
|
||||
}
|
||||
|
||||
file { "/etc/mirrormanager-client/report_mirror.conf":
|
||||
ensure => present,
|
||||
content => template("mirror/report_mirror.conf.erb"),
|
||||
mode => "0640",
|
||||
owner => "root",
|
||||
group => "mirror",
|
||||
require => [ Package["mirrormanager-client"], Group["mirror"], ],
|
||||
}
|
||||
|
||||
}
|
2
mirror/templates/mirror.conf.erb
Normal file
2
mirror/templates/mirror.conf.erb
Normal file
|
@ -0,0 +1,2 @@
|
|||
SRC="<%= source %>"
|
||||
RSYNCOPTS="<%= rsync_options.join(' ') %>"
|
96
mirror/templates/report_mirror.conf.erb
Normal file
96
mirror/templates/report_mirror.conf.erb
Normal file
|
@ -0,0 +1,96 @@
|
|||
[global]
|
||||
# if enabled=0, no data is sent to the database
|
||||
enabled=1
|
||||
# server= is the URL to the MirrorManager XML-RPC interface
|
||||
server=https://admin.fedoraproject.org/mirrormanager/xmlrpc
|
||||
|
||||
|
||||
[site]
|
||||
# if enabled=0, no data about this site is sent to the database
|
||||
enabled=1
|
||||
# Name and Password fields need to match the Site name and password
|
||||
# fields you entered for your Site in the MirrorManager database at
|
||||
# https://admin.fedoraproject.org/mirrormanager
|
||||
name=<%= sitename %>
|
||||
password=<%= password %>
|
||||
|
||||
[host]
|
||||
# if enabled=0, no data about this host is sent to the database
|
||||
enabled=1
|
||||
# Name field need to match the Host name field you entered for your
|
||||
# Host in the MirrorManager database at
|
||||
# https://admin.fedoraproject.org/mirrormanager
|
||||
name=<%= hostname %>
|
||||
# if user_active=0, no data about this category is given to the public
|
||||
# This can be used to toggle between serving and not serving data,
|
||||
# such enabled during the nighttime (when you have more idle bandwidth
|
||||
# available) and disabled during the daytime.
|
||||
# By not specifying user_active, the database will not be updated.
|
||||
# user_active=1
|
||||
|
||||
[stats]
|
||||
# Stats are only sent when run with the -s option
|
||||
# and when this section is enabled.
|
||||
# This feature is not presently implemented
|
||||
enabled=0
|
||||
apache=/var/log/httpd/access_log
|
||||
vsftpd=/var/log/vsftpd.log
|
||||
# remember to enable log file and transfer logging in rsyncd.conf
|
||||
rsyncd=/var/log/rsyncd.log
|
||||
|
||||
|
||||
# Content Categories
|
||||
# These sections match the Categories for content tracked by MirrorManager.
|
||||
#
|
||||
# enabled=1 means information about this category will be sent to the database.
|
||||
# enabled=0, no data about this host is sent to the database. If the
|
||||
# database already has information for you for this Category, it will
|
||||
# remain unchanged. This can be used to update the database after you
|
||||
# have manually synced some infrequently-updated content, such as
|
||||
# historical releases.
|
||||
#
|
||||
# path= is the path on your local disk to the top-level directory for this Category
|
||||
|
||||
[Fedora Linux]
|
||||
<% if mirrors.include?('fedora') -%>
|
||||
enabled=1
|
||||
<% else -%>
|
||||
enabled=0
|
||||
<% end -%>
|
||||
path=/srv/mirrors/fedora
|
||||
|
||||
[Fedora EPEL]
|
||||
<% if mirrors.include?('epel') -%>
|
||||
enabled=1
|
||||
<% else -%>
|
||||
enabled=0
|
||||
<% end -%>
|
||||
path=/srv/mirrors/fedora-epel
|
||||
|
||||
# lesser used categories below
|
||||
|
||||
[Fedora Web]
|
||||
enabled=0
|
||||
path=/var/www/html/pub/fedora/web
|
||||
|
||||
[Fedora Secondary Arches]
|
||||
enabled=0
|
||||
path=/var/www/html/pub/fedora-secondary
|
||||
|
||||
[Fedora Other]
|
||||
enabled=0
|
||||
path=/var/www/html/pub/alt
|
||||
|
||||
# historical content
|
||||
|
||||
[Fedora Core]
|
||||
enabled=0
|
||||
path=/var/www/html/pub/fedora/linux/core
|
||||
|
||||
[Fedora Extras]
|
||||
enabled=0
|
||||
path=/var/www/html/pub/fedora/linux/extras
|
||||
|
||||
[Fedora Archive]
|
||||
enabled=0
|
||||
path=/var/www/html/pub/fedora-archive
|
|
@ -290,6 +290,21 @@ class user::system {
|
|||
require => Group["murmur"],
|
||||
}
|
||||
|
||||
# Mirrors
|
||||
@group { "mirror":
|
||||
ensure => present,
|
||||
gid => 820,
|
||||
}
|
||||
@user { "mirror":
|
||||
ensure => present,
|
||||
uid => 820,
|
||||
gid => 820,
|
||||
comment => "Service Mirror",
|
||||
home => "/var/empty",
|
||||
shell => "/sbin/nologin",
|
||||
require => Group["mirror"],
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue