diff --git a/roles/bodhi2/backend/files/bodhi-masher.conf b/roles/bodhi2/backend/files/bodhi-masher.conf
new file mode 100644
index 0000000000..1f962ed504
--- /dev/null
+++ b/roles/bodhi2/backend/files/bodhi-masher.conf
@@ -0,0 +1,15 @@
+Alias /updates/static /usr/share/bodhi/static
+
+WSGISocketPrefix run/wsgi
+WSGIRestrictSignal Off
+
+WSGIDaemonProcess bodhi user=masher group=masher display-name=bodhi
+WSGIPythonOptimize 1
+
+WSGIScriptAlias /updates /usr/share/bodhi/bodhi.wsgi/updates
+
+
+ WSGIProcessGroup bodhi
+ Order deny,allow
+ Allow from all
+
diff --git a/roles/bodhi2/backend/files/el6-epel-testing.mash b/roles/bodhi2/backend/files/el6-epel-testing.mash
new file mode 100644
index 0000000000..cafc1568af
--- /dev/null
+++ b/roles/bodhi2/backend/files/el6-epel-testing.mash
@@ -0,0 +1,17 @@
+# mash config file
+
+[el6-epel-testing]
+rpm_path = %(arch)s/
+source_path = SRPMS/
+debuginfo_path = %(arch)s/debug
+debuginfo = True
+multilib = True
+multilib_method = devel
+tag = dist-6E-epel-testing
+inherit = False
+strict_keys = True
+keys = 0608b895
+use_repoview = True
+repoviewurl = http://download.fedoraproject.org/pub/epel/testing/6/%(arch)s/
+repoviewtitle = "Fedora EPEL Testing 6 - %(arch)s"
+arches = i386 x86_64 ppc64
diff --git a/roles/bodhi2/backend/files/el6-epel.mash b/roles/bodhi2/backend/files/el6-epel.mash
new file mode 100644
index 0000000000..72b209e36c
--- /dev/null
+++ b/roles/bodhi2/backend/files/el6-epel.mash
@@ -0,0 +1,17 @@
+# mash config file
+
+[el6-epel]
+rpm_path = %(arch)s/
+source_path = SRPMS/
+debuginfo_path = %(arch)s/debug
+debuginfo = True
+multilib = True
+multilib_method = devel
+tag = dist-6E-epel
+inherit = False
+strict_keys = True
+keys = 0608b895
+use_repoview = True
+repoviewurl = http://download.fedoraproject.org/pub/epel/6/%(arch)s/
+repoviewtitle = "Fedora EPEL 6 - %(arch)s"
+arches = i386 x86_64 ppc64
diff --git a/roles/bodhi2/backend/files/epel7-testing.mash b/roles/bodhi2/backend/files/epel7-testing.mash
new file mode 100644
index 0000000000..6d95a57fce
--- /dev/null
+++ b/roles/bodhi2/backend/files/epel7-testing.mash
@@ -0,0 +1,18 @@
+# mash config file
+
+[epel7-testing]
+rpm_path = %(arch)s/
+source_path = SRPMS/
+debuginfo_path = %(arch)s/debug
+debuginfo = True
+multilib = False
+tag = epel7-testing
+inherit = False
+strict_keys = True
+keys = 352C64E5
+use_repoview = True
+repoviewurl = http://download.fedoraproject.org/pub/epel/testing/7/%(arch)s/
+repoviewtitle = "Fedora EPEL Testing 7 - %(arch)s"
+arches = x86_64 ppc64
+hash_packages = True
+delta = False
diff --git a/roles/bodhi2/backend/files/epel7.mash b/roles/bodhi2/backend/files/epel7.mash
new file mode 100644
index 0000000000..8b5ff7097f
--- /dev/null
+++ b/roles/bodhi2/backend/files/epel7.mash
@@ -0,0 +1,18 @@
+# mash config file
+
+[epel7]
+rpm_path = %(arch)s/
+source_path = SRPMS/
+debuginfo_path = %(arch)s/debug
+debuginfo = True
+multilib = False
+tag = epel7
+inherit = False
+strict_keys = True
+keys = 352C64E5
+use_repoview = True
+repoviewurl = http://download.fedoraproject.org/pub/epel/7/%(arch)s/
+repoviewtitle = "Fedora EPEL 7 - %(arch)s"
+arches = x86_64 ppc64
+hash_packages = True
+delta = False
diff --git a/roles/bodhi2/backend/files/f20-updates-testing.mash b/roles/bodhi2/backend/files/f20-updates-testing.mash
new file mode 100644
index 0000000000..7d6b0f1911
--- /dev/null
+++ b/roles/bodhi2/backend/files/f20-updates-testing.mash
@@ -0,0 +1,21 @@
+# mash config file
+
+[f20-updates-testing]
+rpm_path = %(arch)s/
+source_path = SRPMS/
+debuginfo = True
+multilib = True
+multilib_method = devel
+tag = f20-updates-testing
+inherit = False
+strict_keys = True
+keys = 246110C1
+repoviewurl = http://download.fedoraproject.org/pub/fedora/linux/updates/testing/20/%(arch)s/
+repoviewtitle = "Fedora 20 Updates Testing - %(arch)s"
+arches = armhfp i386 x86_64
+delta = True
+#delta_dirs = /pub/fedora/linux/releases/20/Everything/%(arch)s/os/,/mnt/koji/mash/updates/f20-updates/%(arch)s/
+#parent_repos = http://download.fedoraproject.org/pub/fedora/linux/updates/20/%(arch)s, http://download.fedoraproject.org/pub/fedora/linux/releases/20/Everything/%(arch)s/os
+# point to branched till we release then use above
+delta_dirs = /pub/fedora/linux/development/20/%(arch)s/os/
+parent_repos = http://download.fedoraproject.org/pub/fedora/linux/development/20/%(arch)s/os/
diff --git a/roles/bodhi2/backend/files/f20-updates.mash b/roles/bodhi2/backend/files/f20-updates.mash
new file mode 100644
index 0000000000..894123947e
--- /dev/null
+++ b/roles/bodhi2/backend/files/f20-updates.mash
@@ -0,0 +1,20 @@
+[f20-updates]
+rpm_path = %(arch)s/
+source_path = SRPMS/
+debuginfo = True
+multilib = True
+multilib_method = devel
+tag = f20-updates
+inherit = False
+strict_keys = True
+keys = 246110C1
+repoviewurl = http://download.fedoraproject.org/pub/fedora/linux/updates/20/%(arch)s/
+repoviewtitle = "Fedora 20 Updates - %(arch)s"
+arches = armhfp i386 x86_64
+delta = True
+#generate deltas against branched
+delta_dirs = /pub/fedora/linux/development/20/%(arch)s/os/,/mnt/koji/mash/updates/f20-updates/%(arch)s/
+parent_repos = http://download.fedoraproject.org/pub/fedora/linux/development/20/%(arch)s/os
+# Bellow needs enabling at GA
+#delta_dirs = /pub/fedora/linux/releases/20/Everything/%(arch)s/os/,/mnt/koji/mash/updates/f20-updates/%(arch)s/
+#parent_repos = http://download.fedoraproject.org/pub/fedora/linux/releases/20/Everything/%(arch)s/os
diff --git a/roles/bodhi2/backend/files/f21-updates-testing.mash b/roles/bodhi2/backend/files/f21-updates-testing.mash
new file mode 100644
index 0000000000..42a3034ef8
--- /dev/null
+++ b/roles/bodhi2/backend/files/f21-updates-testing.mash
@@ -0,0 +1,22 @@
+# mash config file
+
+[f21-updates-testing]
+rpm_path = %(arch)s/
+source_path = SRPMS/
+debuginfo = True
+multilib = True
+multilib_method = devel
+tag = f21-updates-testing
+inherit = False
+strict_keys = True
+keys = 95A43F54
+repoviewurl = http://download.fedoraproject.org/pub/fedora/linux/updates/testing/21/%(arch)s/
+repoviewtitle = "Fedora 21 Updates Testing - %(arch)s"
+arches = armhfp i386 x86_64
+hash_packages = True
+delta = True
+delta_dirs = /pub/fedora/linux/releases/21/Everything/%(arch)s/os/,/mnt/koji/mash/updates/f21-updates/%(arch)s/
+parent_repos = http://download.fedoraproject.org/pub/fedora/linux/updates/21/%(arch)s, http://download.fedoraproject.org/pub/fedora/linux/releases/21/Everything/%(arch)s/os
+# point to branched till we release then use above
+#delta_dirs = /pub/fedora/linux/development/21/%(arch)s/os/
+#parent_repos = http://download.fedoraproject.org/pub/fedora/linux/development/21/%(arch)s/os/
diff --git a/roles/bodhi2/backend/files/f21-updates.mash b/roles/bodhi2/backend/files/f21-updates.mash
new file mode 100644
index 0000000000..9e5469cf43
--- /dev/null
+++ b/roles/bodhi2/backend/files/f21-updates.mash
@@ -0,0 +1,20 @@
+[f21-updates]
+rpm_path = %(arch)s/
+source_path = SRPMS/
+debuginfo = True
+multilib = True
+multilib_method = devel
+tag = f21-updates
+inherit = False
+strict_keys = True
+keys = 95A43F54
+repoviewurl = http://download.fedoraproject.org/pub/fedora/linux/updates/21/%(arch)s/
+repoviewtitle = "Fedora 21 Updates - %(arch)s"
+arches = armhfp i386 x86_64
+hash_packages = True
+delta = True
+#generate deltas against branched
+#delta_dirs = /pub/fedora/linux/development/21/%(arch)s/os/,/mnt/koji/mash/updates/f21-updates/%(arch)s/
+#parent_repos = http://download.fedoraproject.org/pub/fedora/linux/development/21/%(arch)s/os
+delta_dirs = /pub/fedora/linux/releases/21/Everything/%(arch)s/os/,/mnt/koji/mash/updates/f21-updates/%(arch)s/
+parent_repos = http://download.fedoraproject.org/pub/fedora/linux/releases/21/Everything/%(arch)s/os
diff --git a/roles/bodhi2/backend/files/f22-updates-testing.mash b/roles/bodhi2/backend/files/f22-updates-testing.mash
new file mode 100644
index 0000000000..edc30d7d74
--- /dev/null
+++ b/roles/bodhi2/backend/files/f22-updates-testing.mash
@@ -0,0 +1,22 @@
+# mash config file
+
+[f22-updates-testing]
+rpm_path = %(arch)s/
+source_path = SRPMS/
+debuginfo = True
+multilib = True
+multilib_method = devel
+tag = f22-updates-testing
+inherit = False
+strict_keys = True
+keys = 8E1431D5
+repoviewurl = http://download.fedoraproject.org/pub/fedora/linux/updates/testing/22/%(arch)s/
+repoviewtitle = "Fedora 22 Updates Testing - %(arch)s"
+arches = armhfp i386 x86_64
+hash_packages = True
+delta = True
+#delta_dirs = /pub/fedora/linux/releases/22/Everything/%(arch)s/os/,/mnt/koji/mash/updates/f22-updates/%(arch)s/
+#parent_repos = http://download.fedoraproject.org/pub/fedora/linux/updates/22/%(arch)s, http://download.fedoraproject.org/pub/fedora/linux/releases/22/Everything/%(arch)s/os
+# point to branched till we release then use above
+delta_dirs = /pub/fedora/linux/development/22/%(arch)s/os/
+parent_repos = http://download.fedoraproject.org/pub/fedora/linux/development/22/%(arch)s/os/
diff --git a/roles/bodhi2/backend/files/f22-updates.mash b/roles/bodhi2/backend/files/f22-updates.mash
new file mode 100644
index 0000000000..1261bb36b6
--- /dev/null
+++ b/roles/bodhi2/backend/files/f22-updates.mash
@@ -0,0 +1,20 @@
+[f22-updates]
+rpm_path = %(arch)s/
+source_path = SRPMS/
+debuginfo = True
+multilib = True
+multilib_method = devel
+tag = f22-updates
+inherit = False
+strict_keys = True
+keys = 8E1431D5
+repoviewurl = http://download.fedoraproject.org/pub/fedora/linux/updates/22/%(arch)s/
+repoviewtitle = "Fedora 22 Updates - %(arch)s"
+arches = armhfp i386 x86_64
+hash_packages = True
+delta = True
+#generate deltas against branched
+delta_dirs = /pub/fedora/linux/development/22/%(arch)s/os/,/mnt/koji/mash/updates/f22-updates/%(arch)s/
+parent_repos = http://download.fedoraproject.org/pub/fedora/linux/development/22/%(arch)s/os
+#delta_dirs = /pub/fedora/linux/releases/22/Everything/%(arch)s/os/,/mnt/koji/mash/updates/f22-updates/%(arch)s/
+#parent_repos = http://download.fedoraproject.org/pub/fedora/linux/releases/22/Everything/%(arch)s/os
diff --git a/roles/bodhi2/backend/files/fedora-epel-push b/roles/bodhi2/backend/files/fedora-epel-push
new file mode 100755
index 0000000000..169b2107a7
--- /dev/null
+++ b/roles/bodhi2/backend/files/fedora-epel-push
@@ -0,0 +1,111 @@
+#!/bin/sh
+
+SOURCE=/mnt/koji/mash/updates
+DEST=/pub/epel/
+
+OPTIONS="-rlptDvHh --stats --delay-updates $RSYNC_OPTS"
+
+for rel in 5 6; do
+
+ OUTPUT1=$(rsync $OPTIONS --exclude "repodata/*" --exclude "headers/*" \
+ $SOURCE/el$rel-epel/ $DEST/$rel/)
+ OUTPUT2=$(rsync $OPTIONS --delete --delete-delay \
+ $SOURCE/el$rel-epel/ $DEST/$rel/)
+
+ # Grep out some signals from the stats
+ bytes=$(echo "$OUTPUT1" | grep "Literal data" | awk ' { print $3 } ')
+ deleted=$(echo "$OUTPUT2" | grep "deleting " | wc -l)
+
+ # If anything changed, then publish a fedmsg message as bodhi.updates.sync
+ if [ "$bytes" != "0" -o "$deleted" != "0" ]; then
+ echo "{\"bytes\": \"$bytes\", \"deleted\": \"$deleted\", \"repo\": \"epel\", \"release\": \"$rel\"}" | fedmsg-logger \
+ --cert-prefix ftpsync \
+ --modname bodhi \
+ --topic updates.epel.sync \
+ --json-input &> /dev/null
+ fi
+
+ OUTPUT1=$(rsync $OPTIONS --exclude "repodata/*" --exclude "headers/*" \
+ $SOURCE/el$rel-epel-testing/ $DEST/testing/$rel/)
+ OUTPUT2=$(rsync $OPTIONS --delete --delete-delay \
+ $SOURCE/el$rel-epel-testing/ $DEST/testing/$rel/)
+
+ # Grep out some signals from the stats
+ bytes=$(echo "$OUTPUT1" | grep "Literal data" | awk ' { print $3 } ')
+ deleted=$(echo "$OUTPUT2" | grep "deleting " | wc -l)
+
+ # If anything changed, then publish a fedmsg message as bodhi.updates.sync
+ if [ "$bytes" != "0" -o "$deleted" != "0" ]; then
+ echo "{\"bytes\": \"$bytes\", \"deleted\": \"$deleted\", \"repo\": \"epel-testing\", \"release\": \"$rel\"}" | fedmsg-logger \
+ --cert-prefix ftpsync \
+ --modname bodhi \
+ --topic updates.epel.sync \
+ --json-input &> /dev/null
+ fi
+done
+
+for rel in 7; do
+
+ OUTPUT1=$(rsync $OPTIONS --exclude "repodata/*" \
+ $SOURCE/epel$rel/ $DEST/$rel/)
+ OUTPUT2=$(rsync $OPTIONS --delete --delete-delay \
+ $SOURCE/epel$rel/ $DEST/$rel/)
+
+ # Grep out some signals from the stats
+ bytes=$(echo "$OUTPUT1" | grep "Literal data" | awk ' { print $3 } ')
+ deleted=$(echo "$OUTPUT2" | grep "deleting " | wc -l)
+
+ # If anything changed, then publish a fedmsg message as bodhi.updates.sync
+ if [ "$bytes" != "0" -o "$deleted" != "0" ]; then
+ echo "{\"bytes\": \"$bytes\", \"deleted\": \"$deleted\", \"repo\": \"epel\", \"release\": \"$rel\"}" | fedmsg-logger \
+ --cert-prefix ftpsync \
+ --modname bodhi \
+ --topic updates.epel.sync \
+ --json-input &> /dev/null
+ fi
+
+ OUTPUT1=$(rsync $OPTIONS --exclude "repodata/*" \
+ $SOURCE/epel$rel-testing/ $DEST/testing/$rel/)
+ OUTPUT2=$(rsync $OPTIONS --delete --delete-delay \
+ $SOURCE/epel$rel-testing/ $DEST/testing/$rel/)
+
+ # Grep out some signals from the stats
+ bytes=$(echo "$OUTPUT1" | grep "Literal data" | awk ' { print $3 } ')
+ deleted=$(echo "$OUTPUT2" | grep "deleting " | wc -l)
+
+ # If anything changed, then publish a fedmsg message as bodhi.updates.sync
+ if [ "$bytes" != "0" -o "$deleted" != "0" ]; then
+ echo "{\"bytes\": \"$bytes\", \"deleted\": \"$deleted\", \"repo\": \"epel-testing\", \"release\": \"$rel\"}" | fedmsg-logger \
+ --cert-prefix ftpsync \
+ --modname bodhi \
+ --topic updates.epel.sync \
+ --json-input &> /dev/null
+ fi
+done
+
+for rel in 5 6 7; do
+ if [ ${rel} -eq 7 ]; then
+ TARGET_DIR=${DEST}/${rel}/x86_64/e
+ else
+ TARGET_DIR=${DEST}/${rel}/x86_64
+ fi
+
+ if [ -f ${TARGET_DIR}/epel-release*rpm ]; then
+ # We have a file to match. [This may sort wrong at -9 -> -10]
+ CANDIDATE=$( ls ${TARGET_DIR}/epel-release-*rpm | sort | tail -n 1)
+ TARGET=${DEST}/epel-release-latest-${rel}.noarch.rpm
+ # Does our symbolic link exist?
+ if [ -L ${TARGET} ]; then
+ # check to see if the link matches the candidate
+ TEST=$( readlink ${TARGET} )
+ if [ ${TEST} != ${CANDIDATE} ]; then
+ ln -sf $(echo ${CANDIDATE}|sed -e "s|$DEST|./|g" -e 's|//|/|g') ${TARGET}
+ fi
+ else
+ # first time for everything.
+ ln -sf $(echo ${CANDIDATE}|sed -e "s|$DEST|./|g" -e 's|//|/|g') ${TARGET}
+ fi
+ else
+ echo "No target file for epel-release ${rel} to link against."
+ fi
+done
diff --git a/roles/bodhi2/backend/files/fedora-updates-push b/roles/bodhi2/backend/files/fedora-updates-push
new file mode 100755
index 0000000000..1313337ac0
--- /dev/null
+++ b/roles/bodhi2/backend/files/fedora-updates-push
@@ -0,0 +1,72 @@
+#!/bin/sh
+
+SOURCE=/mnt/koji/mash/updates
+DEST=/pub/fedora/linux/updates/
+ATOMICSOURCE=/mnt/koji/mash/atomic/
+ATOMICDEST=/pub/fedora/linux/atomic/
+
+OPTIONS="-rlptDvHh --stats --delay-updates $RSYNC_OPTS"
+
+for rel in 20 21 22; do
+
+ OUTPUT1=$(rsync $OPTIONS --exclude "repodata/*" \
+ $SOURCE/f$rel-updates/ $DEST/$rel/ --link-dest $DEST/testing/$rel/)
+ OUTPUT2=$(rsync $OPTIONS --delete --delete-delay --exclude=Live --exclude=Images \
+ $SOURCE/f$rel-updates/ $DEST/$rel/)
+
+ # Grep out some signals from the stats
+ bytes=$(echo "$OUTPUT1" | grep "Literal data" | awk ' { print $3 } ')
+ deleted=$(echo "$OUTPUT2" | grep "deleting " | wc -l)
+
+ # If anything changed, then publish a fedmsg message as bodhi.updates.sync
+ if [ "$bytes" != "0" -o "$deleted" != "0" ]; then
+ echo "{\"bytes\": \"$bytes\", \"deleted\": \"$deleted\", \"repo\": \"updates\", \"release\": \"$rel\"}" | fedmsg-logger \
+ --cert-prefix ftpsync \
+ --modname bodhi \
+ --topic updates.fedora.sync \
+ --json-input &> /dev/null
+ fi
+
+done
+for rel in 20 21 22; do
+
+ OUTPUT1=$(rsync $OPTIONS --exclude "repodata/*" \
+ $SOURCE/f$rel-updates-testing/ $DEST/testing/$rel/)
+ OUTPUT2=$(rsync $OPTIONS --delete --delete-delay --exclude=Live --exclude=Images \
+ $SOURCE/f$rel-updates-testing/ $DEST/testing/$rel/)
+
+ # Grep out some signals from the stats
+ bytes=$(echo "$OUTPUT1" | grep "Literal data" | awk ' { print $3 } ')
+ deleted=$(echo "$OUTPUT2" | grep "deleting " | wc -l)
+
+ # If anything changed, then publish a fedmsg message as bodhi.updates.sync
+ if [ "$bytes" != "0" -o "$deleted" != "0" ]; then
+ echo "{\"bytes\": \"$bytes\", \"deleted\": \"$deleted\", \"repo\": \"updates-testing\", \"release\": \"$rel\"}" | fedmsg-logger \
+ --cert-prefix ftpsync \
+ --modname bodhi \
+ --topic updates.fedora.sync \
+ --json-input &> /dev/null
+ fi
+
+done
+for rel in 21 22; do
+
+ OUTPUT1=$(rsync $OPTIONS --ignore-existing \
+ $ATOMICSOURCE/$rel/objects/ $ATOMICDEST/$rel/objects/)
+ OUTPUT2=$(rsync $OPTIONS --delete --delete-delay --exclude=objects/ \
+ $ATOMICSOURCE/$rel/ $ATOMICDEST/$rel/)
+
+ # Grep out some signals from the stats
+ bytes=$(echo "$OUTPUT1" | grep "Literal data" | awk ' { print $3 } ')
+ deleted=$(echo "$OUTPUT2" | grep "deleting " | wc -l)
+
+ # If anything changed, then publish a fedmsg message as bodhi.updates.sync
+ if [ "$bytes" != "0" -o "$deleted" != "0" ]; then
+ echo "{\"bytes\": \"$bytes\", \"deleted\": \"$deleted\", \"repo\": \"atomic\", \"release\": \"$rel\"}" | fedmsg-logger \
+ --cert-prefix ftpsync \
+ --modname bodhi \
+ --topic updates.fedora.sync \
+ --json-input &> /dev/null
+ fi
+done
+
diff --git a/roles/bodhi2/backend/files/update-fullfilelist b/roles/bodhi2/backend/files/update-fullfilelist
new file mode 100755
index 0000000000..0302c6a5b6
--- /dev/null
+++ b/roles/bodhi2/backend/files/update-fullfilelist
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+# currently runs on releng2.fedora.phx.redhat.com
+
+MOD=$1
+[ -z "$MOD" ] && {
+ echo "usage: $0 "
+ exit 1
+}
+
+TMPFILE=$(mktemp -p /tmp/)
+pushd /pub/$MOD > /dev/null
+find * -print > $TMPFILE
+if diff $TMPFILE fullfilelist > /dev/null; then
+ rm -f $TMPFILE
+else
+ mv $TMPFILE fullfilelist
+fi
+chmod 0644 fullfilelist
+popd > /dev/null
diff --git a/roles/bodhi2/backend/meta/main.yml b/roles/bodhi2/backend/meta/main.yml
new file mode 100644
index 0000000000..9f7f541ae1
--- /dev/null
+++ b/roles/bodhi2/backend/meta/main.yml
@@ -0,0 +1,3 @@
+---
+dependencies:
+ - { role: bodhi/base }
diff --git a/roles/bodhi2/backend/tasks/main.yml b/roles/bodhi2/backend/tasks/main.yml
new file mode 100644
index 0000000000..4832971c43
--- /dev/null
+++ b/roles/bodhi2/backend/tasks/main.yml
@@ -0,0 +1,215 @@
+---
+# tasklist for setting up bodhi/masher (requires bodhi/base)
+# This is the base set of files needed for bodhi/masher
+
+- name: add ftpsync group
+ group: name=ftpsync gid=263 system=yes state=present
+
+- name: add ftpsync user
+ user: name=ftpsync uid=263 group=ftpsync createhome=yes system=yes state=present
+
+- name: add the ftpsync update-fullfilelist script
+ copy: src=update-fullfilelist dest=/usr/local/bin/update-fullfilelist owner=ftpsync group=ftpsync mode=555
+
+- name: add masher group
+ group: name=masher gid=751 system=yes state=present
+
+# masher user 751
+- name: add masher user as 751 - and group
+ user: name=masher uid=751 group=masher home=/home/masher groups=mock,ftpsync
+
+- name: install needed packages
+ yum: pkg={{ item }} state=present
+ with_items:
+ - python-fedora-turbogears
+ tags:
+ - packages
+
+- name: install bodhi-masher /etc/httpd/conf.d/bodhi.conf file
+ copy: >
+ src="bodhi-masher.conf"
+ dest="/etc/httpd/conf.d/bodhi.conf"
+ owner=root
+ group=root
+ mode=0644
+ notify:
+ - restart httpd
+ tags:
+ - config
+
+- name: change owner and group attributes of bodhi.pem file
+ file: >
+ path="/etc/pki/bodhi/bodhi.pem"
+ owner=masher
+ group=masher
+ when: inventory_hostname.startswith('bodhi-backend')
+ tags:
+ - config
+
+- name: change owner and group attributes of /var/log/bodhi directory
+ file: path=/var/log/bodhi owner=masher group=masher
+ when: inventory_hostname.startswith('bodhi-backend')
+ tags:
+ - config
+
+- name: setup /etc/bodhi/mash.conf file...
+ template: >
+ src=mash.conf
+ dest=/etc/bodhi/mash.conf
+ owner=masher
+ group=masher
+ mode=0640
+ tags:
+ - config
+
+- name: change type part of SELinux file context
+ file: >
+ dest=/var/tmp/bodhi/comps/
+ setype=httpd_sys_script_rw_t
+ state=directory
+ recurse=yes
+ tags:
+ - config
+
+- name: change owner attribute of /var/tmp/bodhi-bz.cookie file
+ file: >
+ path=/var/tmp/bodhi-bz.cookie
+ owner=masher
+ tags:
+ - config
+
+- name: install /etc/bodhi/*.mash files
+ copy: >
+ src="{{ item }}"
+ dest="/etc/bodhi/{{ item }}"
+ owner=masher
+ mode=0640
+ with_items:
+ - f20-updates.mash
+ - f20-updates-testing.mash
+ - f21-updates.mash
+ - f21-updates-testing.mash
+ - f22-updates.mash
+ - f22-updates-testing.mash
+ - el6-epel.mash
+ - el6-epel-testing.mash
+ - epel7.mash
+ - epel7-testing.mash
+ tags:
+ - config
+
+# tasks for setting up epelmasher
+
+- name: install needed packages
+ yum: pkg={{ item }} state=present
+ with_items:
+ - repoview
+ tags:
+ - packages
+
+- name: install bodhi-epel-masher /etc/bodhi/bodhi.cfg file
+ template: >
+ src="bodhi-epel-masher.cfg.j2"
+ dest="/etc/bodhi/bodhi.cfg"
+ owner=masher
+ group=masher
+ mode=0600
+ when: inventory_hostname.startswith('bodhi-backend02')
+ notify:
+ - restart httpd
+ tags:
+ - config
+
+# tasklist for setting up jobrunner
+
+- name: install bodhi-masher-jobrunner /etc/bodhi/bodhi.cfg file
+ template: >
+ src="bodhi-masher-jobrunner.cfg.j2"
+ dest="/etc/bodhi/bodhi.cfg"
+ owner=masher
+ group=masher
+ mode=0600
+ when: inventory_hostname.startswith('bodhi-backend01')
+ notify:
+ - restart httpd
+ tags:
+ - config
+
+#
+# cron job that syncs packages to koji
+#
+- name: put owner-sync-pkgdb in place
+ template: src=owner-sync-pkgdb.j2 dest=/usr/local/bin/owner-sync-pkgdb mode=0755
+ tags:
+ - config
+
+- name: sync packages from pkgdb2 to koji (el5)
+ cron: name="owner-sync-el5" minute="7,17,27,37,47,57" user="root"
+ job="/usr/local/bin/owner-sync-pkgdb dist-5E-epel"
+ cron_file=update-koji-owner-EL-5
+ when: inventory_hostname.startswith('bodhi-backend01') and env == "production"
+
+- name: sync packages from pkgdb2 to koji (el6)
+ cron: name="owner-sync-el5" minute="7,17,27,37,47,57" user="root"
+ job="/usr/local/bin/owner-sync-pkgdb dist-6E-epel"
+ cron_file=update-koji-owner-EL-6
+ when: inventory_hostname.startswith('bodhi-backend01') and env == "production"
+
+- name: sync packages from pkgdb2 to koji (epel7)
+ cron: name="owner-sync-el5" minute="7,17,27,37,47,57" user="root"
+ job="/usr/local/bin/owner-sync-pkgdb epel7"
+ cron_file=update-koji-owner-epel7
+ when: inventory_hostname.startswith('bodhi-backend01') and env == "production"
+
+- name: sync packages from pkgdb2 to koji (f20)
+ cron: name="owner-sync-el5" minute="7,17,27,37,47,57" user="root"
+ job="/usr/local/bin/owner-sync-pkgdb f20"
+ cron_file=update-koji-owner-f20
+ state=absent
+ when: inventory_hostname.startswith('bodhi-backend01')
+
+#
+# cron job that syncs updates to master mirror
+#
+
+- name: put fedora-updates-push in place
+ copy: src=fedora-updates-push dest=/usr/local/bin/fedora-updates-push mode=0755
+ tags:
+ - config
+ when: inventory_hostname.startswith('bodhi-backend01') and env == "production"
+
+- name: put fedora-epel-push in place
+ copy: src=fedora-epel-push dest=/usr/local/bin/fedora-epel-push mode=0755
+ tags:
+ - config
+ when: inventory_hostname.startswith('bodhi-backend02') and env == "production"
+
+- name: put update-fullfilelist in place
+ copy: src=update-fullfilelist dest=/usr/local/bin/update-fullfilelist mode=0755
+ tags:
+ - config
+ when: inventory_hostname.startswith('bodhi-backend01') and env == "production"
+
+- name: Updates sync cron job.
+ cron: name="updates-sync" minute="15,45" user="ftpsync"
+ job="/usr/local/bin/lock-wrapper fedora-updates-push '/usr/local/bin/fedora-updates-push && /usr/local/bin/update-fullfilelist fedora"
+ cron_file=updates-sync
+ when: inventory_hostname.startswith('bodhi-backend01') and env == "production"
+ tags:
+ - config
+
+- name: epel Updates sync cron job.
+ cron: name="epel-updates-sync" minute="15,45" user="ftpsync"
+ job="/usr/local/bin/lock-wrapper fedora-epel-push '/usr/local/bin/fedora-epel-push && /usr/local/bin/update-fullfilelist epel"
+ cron_file=updates-sync
+ when: inventory_hostname.startswith('bodhi-backend02') and env == "production"
+ tags:
+ - config
+
+- name: directory sizes update cron job.
+ cron: name="directory-sizes-update" minute="30" hour="19" user="ftpsync"
+ job="/usr/bin/find /srv/pub/alt/ /srv/pub/archive/ /srv/pub/fedora-secondary/ /srv/pub/fedora/ /srv/pub/epel/ -type d ! -path '/srv/pub/fedora/.snapshot*' ! -path '/srv/pub/epel/.snapshot*' ! -path '/srv/pub/alt/.snapshot*' ! -path '/srv/pub/archive/.snapshot*' ! -path '/srv/pub/fedora-secondary/.snapshot*' ! -path '/srv/pub/alt/stage*' ! -path '/srv/pub/alt/tmp' ! -path '/srv/pub/alt/screenshots/f21/source' | grep -v snapshot | /usr/bin/xargs -n 1 /usr/bin/du --exclude=.snapshot --exclude=stage -sh > /tmp/DIRECTORY_SIZES.txt 2> /dev/null; cp /tmp/DIRECTORY_SIZES.txt /srv/pub/"
+ cron_file=directory-sizes-update
+ when: inventory_hostname.startswith('bodhi-backend02') and env == "production"
+ tags:
+ - config
diff --git a/roles/bodhi2/backend/templates/bodhi-epel-masher.cfg.j2 b/roles/bodhi2/backend/templates/bodhi-epel-masher.cfg.j2
new file mode 100644
index 0000000000..0d99085655
--- /dev/null
+++ b/roles/bodhi2/backend/templates/bodhi-epel-masher.cfg.j2
@@ -0,0 +1,152 @@
+[global]
+
+##
+## Bodhi Production Masher Configuration
+##
+## $Id: bodhi-prod.cfg.erb,v 1.8 2008/05/21 23:38:07 lmacken Exp $
+##
+
+arches = 'i386 x86_64 ppc/ppc64'
+
+# EPEL specific configuration
+epel7_arches = 'x86_64 ppc64'
+epel7-testing_arches = 'x86_64 ppc64'
+el6-epel_arches = 'x86_64 i386 ppc64'
+el6-epel-testing_arches = 'x86_64 i386 ppc64'
+el5-epel_arches = 'x86_64 i386 ppc'
+el5-epel-testing_arches = 'x86_64 i386 ppc'
+
+# For pushing EPEL updates from the masher
+bodhi_url = 'http://localhost/updates'
+
+sqlobject.dburi="notrans_postgres://bodhi:{{ bodhiPassword }}@db-bodhi/bodhi"
+
+masher = None # we are the masher
+
+server.socket_port=8084
+server.environment="production"
+autoreload.on = False
+server.webpath="/updates"
+server.log_file = "server.log"
+server.log_to_screen = False
+server.thread_pool = 50
+server.socket_queue_size = 30
+
+# We probably want to have apache do this for us...
+#gzipFilter.on = True
+
+session_filter.on = False
+base_url_filter.on = True
+base_url_filter.use_x_forwarded_host = False
+base_url_filter.base_url = 'https://admin.fedoraproject.org'
+
+tg.strict_parameters = True
+tg.ignore_parameters = ["_csrf_token"]
+
+# Periodic jobs
+jobs = ''
+
+# Query the Fedora Package Database for the list of Critical Path Packages.
+critpath.type = 'pkgdb'
+
+# FAS2
+#sqlalchemy.dburi="sqlite:///"
+fas.url = 'https://admin.fedoraproject.org/accounts/'
+identity.provider='jsonfas2'
+identity.saprovider.model.visit="fedora.accounts.tgfas.VisitIdentity"
+visit.manager="jsonfas2"
+visit.saprovider.model="fedora.accounts.tgfas.Visit"
+visit.cookie.secure = True
+
+# Our identity that we use to fetch bugzilla details and such
+bodhi_password='<%= bodhiBugzillaPassword %>'
+bodhi_email = 'updates@fedoraproject.org'
+
+# TurboMail 3.0 settings
+mail.on = True
+mail.transport = 'smtp'
+mail.smtp.server = 'bastion'
+# The 'utf-8-qp' encoding causes problems with TurboMail 3.x
+# https://fedorahosted.org/bodhi/ticket/648
+mail.message.encoding = 'utf-8'
+
+notice_sender = 'updates@fedoraproject.org'
+security_team = 'security_respons-members@fedoraproject.org'
+release_team_address = 'bodhiadmin-members@fedoraproject.org'
+fedora_announce_list = 'package-announce@lists.fedoraproject.org'
+fedora_test_announce_list = 'test@lists.fedoraproject.org'
+fedora_epel_announce_list = 'epel-package-announce@lists.fedoraproject.org'
+fedora_epel_test_announce_list = 'epel-devel@lists.fedoraproject.org'
+
+build_dir = '/mnt/koji/packages'
+mashed_dir = '/mnt/koji/mash/updates/'
+mashed_stage_dir = '/mnt/koji/mash/updates/'
+mash_conf = '/etc/bodhi/mash.conf'
+
+comps_dir = '/var/tmp/bodhi/comps'
+
+base_address = 'https://admin.fedoraproject.org'
+#bz_server = 'https://bzprx.vip.phx.redhat.com/xmlrpc.cgi'
+bz_server = 'https://bugzilla.redhat.com/xmlrpc.cgi'
+bz_cookie = '/var/tmp/bodhi-bz.cookie'
+bz_products = 'Fedora,Fedora EPEL,oVirt'
+
+acl_system = 'pkgdb'
+pkgdb_url = 'https://admin.fedoraproject.org/pkgdb'
+
+buildsystem = 'koji'
+client_cert = '/etc/pki/bodhi/bodhi.pem'
+clientca_cert = '/etc/pki/bodhi/fedora-upload-ca.cert'
+serverca_cert = '/etc/pki/bodhi/fedora-server-ca.cert'
+
+masher_lock_id = 'FEDORA-EPEL'
+
+master_repomd = 'http://download01.phx2.fedoraproject.org/pub/fedora/linux/updates/%d/%s/repodata/repomd.xml'
+fedora_master_repomd = 'http://download01.phx2.fedoraproject.org/pub/fedora/linux/updates/%d/%s/repodata/repomd.xml'
+fedora_epel_master_repomd = 'http://download01.phx2.fedoraproject.org/pub/epel/%d/%s/repodata/repomd.xml'
+
+
+[logging]
+
+[[handlers]]
+
+[[[debug_out]]]
+class='TimedRotatingFileHandler'
+args="('/var/log/bodhi/server.log', 'D', 7)"
+level='DEBUG'
+formatter='full_content'
+
+[[[access_out]]]
+class='TimedRotatingFileHandler'
+level='INFO'
+args="('/var/log/bodhi/access.log', 'D', 7)"
+formatter='message_only'
+
+[[[error_out]]]
+class='TimedRotatingFileHandler'
+args="('/var/log/bodhi/server.log', 'D', 7)"
+level='ERROR'
+formatter='full_content'
+
+
+[[loggers]]
+[[[bodhi]]]
+level='DEBUG'
+qualname='bodhi'
+handlers=['debug_out']
+propagate=0
+
+[[[allinfo]]]
+level='INFO'
+handlers=['debug_out']
+propagate=0
+
+#[[[access]]]
+#level='INFO'
+#qualname='turbogears.access'
+#handlers=['debug_out']
+
+[[[turbomail]]]
+level='INFO'
+qualname='turbomail'
+handlers=['debug_out']
diff --git a/roles/bodhi2/backend/templates/bodhi-masher-jobrunner.cfg.j2 b/roles/bodhi2/backend/templates/bodhi-masher-jobrunner.cfg.j2
new file mode 100644
index 0000000000..a25e1d677e
--- /dev/null
+++ b/roles/bodhi2/backend/templates/bodhi-masher-jobrunner.cfg.j2
@@ -0,0 +1,159 @@
+[global]
+
+##
+## Bodhi Production Masher Configuration
+##
+## $Id: bodhi-prod.cfg.erb,v 1.8 2008/05/21 23:38:07 lmacken Exp $
+##
+
+# Release status
+# pre-beta enforces the 'Pre Beta' policy defined here:
+# https://fedoraproject.org/wiki/Updates_Policy
+f22.status = 'pre_beta'
+
+f22.post_beta.mandatory_days_in_testing = 7
+f22.post_beta.critpath.num_admin_approvals = 0
+f22.post_beta.critpath.min_karma = 2
+f22.post_beta.critpath.stable_after_days_without_negative_karma = 14
+
+f22.pre_beta.mandatory_days_in_testing = 3
+f22.pre_beta.critpath.num_admin_approvals = 0
+f22.pre_beta.critpath.min_karma = 1
+
+sqlobject.dburi="notrans_postgres://bodhi:{{ bodhiPassword }}@db-bodhi/bodhi"
+
+masher = None # we are the masher
+
+server.socket_port=8084
+server.environment="production"
+autoreload.on = False
+server.webpath="/updates"
+server.log_file = "server.log"
+server.log_to_screen = False
+server.thread_pool = 50
+server.socket_queue_size = 30
+
+# We probably want to have apache do this for us...
+#gzipFilter.on = True
+
+session_filter.on = False
+base_url_filter.on = True
+base_url_filter.use_x_forwarded_host = False
+base_url_filter.base_url = 'https://admin.fedoraproject.org'
+
+tg.strict_parameters = True
+tg.ignore_parameters = ["_csrf_token"]
+
+# Periodic jobs
+jobs = 'nagmail cache_release_data refresh_metrics approve_testing_updates expire_buildroot_overrides clean_pending_tags'
+
+# Query the Fedora Package Database for the list of Critical Path Packages.
+critpath.type = 'pkgdb'
+
+# FAS2
+#sqlalchemy.dburi="sqlite:///"
+fas.url = 'https://admin.fedoraproject.org/accounts/'
+identity.provider='jsonfas2'
+identity.saprovider.model.visit="fedora.accounts.tgfas.VisitIdentity"
+visit.manager="jsonfas2"
+visit.saprovider.model="fedora.accounts.tgfas.Visit"
+visit.cookie.secure = True
+
+# Our identity that we use to fetch bugzilla details and such
+bodhi_password='<%= bodhiBugzillaPassword %>'
+bodhi_email = 'updates@fedoraproject.org'
+
+# TurboMail 3.0 settings
+mail.on = True
+mail.transport = 'smtp'
+mail.smtp.server = 'bastion'
+# The 'utf-8-qp' encoding causes problems with TurboMail 3.x
+# https://fedorahosted.org/bodhi/ticket/648
+mail.message.encoding = 'utf-8'
+
+notice_sender = 'updates@fedoraproject.org'
+security_team = 'security_respons-members@fedoraproject.org'
+release_team_address = 'bodhiadmin-members@fedoraproject.org'
+fedora_announce_list = 'package-announce@lists.fedoraproject.org'
+fedora_test_announce_list = 'test@lists.fedoraproject.org'
+fedora_epel_announce_list = 'epel-package-announce@lists.fedoraproject.org'
+fedora_epel_test_announce_list = 'epel-devel@lists.fedoraproject.org'
+
+build_dir = '/mnt/koji/packages'
+mashed_dir = '/mnt/koji/mash/updates/'
+mashed_stage_dir = '/mnt/koji/mash/updates/'
+mash_conf = '/etc/bodhi/mash.conf'
+
+comps_dir = '/var/tmp/bodhi/comps'
+
+base_address = 'https://admin.fedoraproject.org'
+#bz_server = 'https://bzprx.vip.phx.redhat.com/xmlrpc.cgi'
+bz_server = 'https://bugzilla.redhat.com/xmlrpc.cgi'
+bz_cookie = '/var/tmp/bodhi-bz.cookie'
+bz_products = 'Fedora,Fedora EPEL,oVirt'
+
+acl_system = 'pkgdb'
+pkgdb_url = 'https://admin.fedoraproject.org/pkgdb'
+
+buildsystem = 'koji'
+client_cert = '/etc/pki/bodhi/bodhi.pem'
+clientca_cert = '/etc/pki/bodhi/fedora-upload-ca.cert'
+serverca_cert = '/etc/pki/bodhi/fedora-server-ca.cert'
+
+masher_lock_id = 'FEDORA'
+
+master_repomd = 'http://download01.phx2.fedoraproject.org/pub/fedora/linux/updates/%d/%s/repodata/repomd.xml'
+fedora_master_repomd = 'http://download01.phx2.fedoraproject.org/pub/fedora/linux/updates/%d/%s/repodata/repomd.xml'
+fedora_epel_master_repomd = 'http://download01.phx2.fedoraproject.org/pub/epel/%d/%s/repodata/repomd.xml'
+
+arches = 'i386 x86_64'
+
+[logging]
+
+[[handlers]]
+
+[[[debug_out]]]
+class='TimedRotatingFileHandler'
+args="('/var/log/bodhi/server.log', 'D', 7)"
+level='DEBUG'
+formatter='full_content'
+
+[[[access_out]]]
+class='TimedRotatingFileHandler'
+level='INFO'
+args="('/var/log/bodhi/access.log', 'D', 7)"
+formatter='message_only'
+
+[[[error_out]]]
+class='TimedRotatingFileHandler'
+args="('/var/log/bodhi/server.log', 'D', 7)"
+level='ERROR'
+formatter='full_content'
+
+
+[[loggers]]
+[[[bodhi]]]
+level='DEBUG'
+qualname='bodhi'
+handlers=['debug_out']
+propagate=0
+
+[[[allinfo]]]
+level='INFO'
+handlers=['debug_out']
+propagate=0
+
+#[[[access]]]
+#level='INFO'
+#qualname='turbogears.access'
+#handlers=['debug_out']
+
+[[[turbomail]]]
+level='INFO'
+qualname='turbomail'
+handlers=['debug_out']
+
+[[[urllib3]]]
+level='WARN'
+qualname='urllib3'
+handlers=['debug_out']
diff --git a/roles/bodhi2/backend/templates/bodhi-masher.cfg.j2 b/roles/bodhi2/backend/templates/bodhi-masher.cfg.j2
new file mode 100644
index 0000000000..5849dd62f8
--- /dev/null
+++ b/roles/bodhi2/backend/templates/bodhi-masher.cfg.j2
@@ -0,0 +1,142 @@
+[global]
+
+##
+## Bodhi Production Masher Configuration
+##
+## $Id: bodhi-prod.cfg.erb,v 1.8 2008/05/21 23:38:07 lmacken Exp $
+##
+
+sqlobject.dburi="notrans_postgres://bodhi:{{ bodhiPassword }}@db-bodhi/bodhi"
+
+masher = None # we are the masher
+
+server.socket_port=8084
+server.environment="production"
+autoreload.on = False
+server.webpath="/updates"
+server.log_file = "server.log"
+server.log_to_screen = False
+server.thread_pool = 50
+server.socket_queue_size = 30
+
+# We probably want to have apache do this for us...
+#gzipFilter.on = True
+
+session_filter.on = False
+base_url_filter.on = True
+base_url_filter.use_x_forwarded_host = False
+base_url_filter.base_url = 'https://admin.fedoraproject.org'
+
+tg.strict_parameters = True
+tg.ignore_parameters = ["_csrf_token"]
+
+# Periodic jobs
+jobs = ''
+
+# Query the Fedora Package Database for the list of Critical Path Packages.
+# This pkgdb feature is currently broken in staging.
+<% if environment == "production" %>
+critpath.type = 'pkgdb'
+<% end %>
+
+# FAS2
+#sqlalchemy.dburi="sqlite:///"
+fas.url = 'https://admin.fedoraproject.org/accounts/'
+identity.provider='jsonfas2'
+identity.saprovider.model.visit="fedora.accounts.tgfas.VisitIdentity"
+visit.manager="jsonfas2"
+visit.saprovider.model="fedora.accounts.tgfas.Visit"
+visit.cookie.secure = True
+
+# Our identity that we use to fetch bugzilla details and such
+bodhi_password='<%= bodhiBugzillaPassword %>'
+bodhi_email = 'updates@fedoraproject.org'
+
+mail.on = True
+mail.server = 'bastion'
+notice_sender = 'updates@fedoraproject.org'
+security_team = 'security_respons-members@fedoraproject.org'
+release_team_address = 'bodhiadmin-members@fedoraproject.org'
+fedora_announce_list = 'package-announce@lists.fedoraproject.org'
+fedora_test_announce_list = 'test@lists.fedoraproject.org'
+fedora_epel_announce_list = 'epel-package-announce@lists.fedoraproject.org'
+fedora_epel_test_announce_list = 'epel-devel@lists.fedoraproject.org'
+
+build_dir = '/mnt/koji/packages'
+mashed_dir = '/mnt/koji/mash/updates/'
+mashed_stage_dir = '/mnt/koji/mash/updates/'
+mash_conf = '/etc/bodhi/mash.conf'
+
+comps_dir = '/var/tmp/bodhi/comps'
+
+base_address = 'https://admin.fedoraproject.org'
+#bz_server = 'https://bzprx.vip.phx.redhat.com/xmlrpc.cgi'
+bz_server = 'https://bugzilla.redhat.com/xmlrpc.cgi'
+bz_cookie = '/var/tmp/bodhi-bz.cookie'
+bz_products = 'Fedora,Fedora EPEL,oVirt'
+
+acl_system = 'pkgdb'
+pkgdb_url = 'https://admin.fedoraproject.org/pkgdb'
+
+buildsystem = 'koji'
+client_cert = '/etc/pki/bodhi/bodhi.pem'
+clientca_cert = '/etc/pki/bodhi/fedora-upload-ca.cert'
+serverca_cert = '/etc/pki/bodhi/fedora-server-ca.cert'
+
+masher_lock_id = 'FEDORA'
+
+master_repomd = 'http://download01.phx2.fedoraproject.org/pub/fedora/linux/updates/%d/%s/repodata/repomd.xml'
+fedora_master_repomd = 'http://download01.phx2.fedoraproject.org/pub/fedora/linux/updates/%d/%s/repodata/repomd.xml'
+fedora_epel_master_repomd = 'http://download01.phx2.fedoraproject.org/pub/epel/%d/%s/repodata/repomd.xml'
+
+arches = 'armhfp i386 x86_64'
+
+[logging]
+
+[[handlers]]
+
+[[[debug_out]]]
+class='TimedRotatingFileHandler'
+args="('/var/log/bodhi/server.log', 'D', 7)"
+level='DEBUG'
+formatter='full_content'
+
+[[[access_out]]]
+class='TimedRotatingFileHandler'
+level='INFO'
+args="('/var/log/bodhi/access.log', 'D', 7)"
+formatter='message_only'
+
+[[[error_out]]]
+class='TimedRotatingFileHandler'
+args="('/var/log/bodhi/server.log', 'D', 7)"
+level='ERROR'
+formatter='full_content'
+
+
+[[loggers]]
+[[[bodhi]]]
+level='DEBUG'
+qualname='bodhi'
+handlers=['debug_out']
+propagate=0
+
+[[[allinfo]]]
+level='INFO'
+handlers=['debug_out']
+propagate=0
+
+#[[[access]]]
+#level='INFO'
+#qualname='turbogears.access'
+#handlers=['debug_out']
+
+[[[turbomail]]]
+level='INFO'
+qualname='turbomail'
+handlers=['debug_out']
+
+[[[urllib3]]]
+level='WARN'
+qualname='urllib3'
+handlers=['debug_out']
diff --git a/roles/bodhi2/backend/templates/bodhi-prod.cfg.erb b/roles/bodhi2/backend/templates/bodhi-prod.cfg.erb
new file mode 100644
index 0000000000..c166c65c6d
--- /dev/null
+++ b/roles/bodhi2/backend/templates/bodhi-prod.cfg.erb
@@ -0,0 +1,205 @@
+[global]
+
+##
+## Bodhi Production Configuration
+##
+## $Id: bodhi-prod.cfg.erb,v 1.8 2008/05/21 23:38:07 lmacken Exp $
+##
+
+# Release status
+# pre-beta enforces the 'Pre Beta' policy defined here:
+# https://fedoraproject.org/wiki/Updates_Policy
+f22.status = 'post_beta'
+
+f22.post_beta.mandatory_days_in_testing = 7
+f22.post_beta.critpath.num_admin_approvals = 0
+f22.post_beta.critpath.min_karma = 2
+f22.post_beta.critpath.stable_after_days_without_negative_karma = 14
+
+f22.pre_beta.mandatory_days_in_testing = 3
+f22.pre_beta.critpath.num_admin_approvals = 0
+f22.pre_beta.critpath.min_karma = 1
+
+# Bodhi Defaults:
+#
+# The number of admin approvals it takes to be able to push a critical path
+# # update to stable for a pending release.
+# critpath.num_admin_approvals = 0
+#
+# # The net karma required to submit a critial path update to a pending release)
+# critpath.min_karma = 2
+#
+# # Allow critpath to submit for stable after 2 weeks with no negative karma
+# critpath.stable_after_days_without_negative_karma = 14
+
+
+## A notice to flash on the front page
+#frontpage_notice = 'Bodhi is now enforcing the Package Update Acceptance Criteria across all Fedora releases.'
+
+## A notice to flash on the New Update page
+#newupdate_notice = 'Koji is currently down for a scheduled outage. Please see status.fedoraproject.org for more information'
+
+# Query the Fedora Package Database for the list of Critical Path Packages.
+<% if environment == "production" %>
+critpath.type = 'pkgdb'
+<% else %>
+<% end %>
+
+<% if environment == "production" %>
+deployment_type = "prod"
+<% end %>
+<% if environment == "staging" %>
+deployment_type = "stg"
+<% end %>
+<% if environment == "development" %>
+deployment_type = "dev"
+<% end %>
+
+# We no longer require proventester karma for critpath approval
+# https://fedorahosted.org/bodhi/ticket/653
+critpath.num_admin_approvals = 0
+
+#f17.pre_beta.critpath.num_admin_approvals = 0
+
+query_wiki_test_cases = True
+
+sqlobject.dburi="notrans_postgres://bodhi:<%= bodhiPassword %>@db-bodhi/bodhi"
+
+masher = 'http://releng04/updates'
+
+# For the build auto-complete widget
+tg_mochikit.packed = True
+
+server.socket_port=8084
+server.environment="production"
+autoreload.on = False
+server.webpath="/updates"
+server.log_file = "server.log"
+server.log_to_screen = False
+server.thread_pool = 50
+server.socket_queue_size = 30
+
+# We probably want to have apache do this for us...
+#gzipFilter.on = True
+
+session_filter.on = False
+base_url_filter.on = True
+base_url_filter.use_x_forwarded_host = False
+<% if environment == "staging" %>
+base_url_filter.base_url = 'https://admin.stg.fedoraproject.org'
+<% else %>
+base_url_filter.base_url = 'https://admin.fedoraproject.org'
+<% end %>
+
+tg.strict_parameters = True
+tg.ignore_parameters = ["_csrf_token"]
+
+# Periodic jobs
+jobs = 'cache_release_data'
+
+# FAS2
+#sqlalchemy.dburi="sqlite:///"
+fas.url = 'https://admin.fedoraproject.org/accounts/'
+identity.provider='jsonfas2'
+identity.saprovider.model.visit="fedora.accounts.tgfas.VisitIdentity"
+visit.manager="jsonfas2"
+visit.saprovider.model="fedora.accounts.tgfas.Visit"
+visit.cookie.secure = True
+visit.cookie.httponly = True
+
+# Our identity that we use to fetch bugzilla details and such
+bodhi_password='<%= bodhiBugzillaPassword %>'
+bodhi_email = 'updates@fedoraproject.org'
+security_team = 'security_respons-members@fedoraproject.org'
+release_team_address = 'bodhiadmin-members@fedoraproject.org'
+fedora_announce_list = 'package-announce@lists.fedoraproject.org'
+fedora_test_announce_list = 'test@lists.fedoraproject.org'
+mashed_dir = '/mnt/koji/mash/updates'
+# TurboMail 3.0 settings
+<% if environment == "staging" %>
+mail.on = False
+<% else %>
+mail.on = True
+<% end %>
+mail.transport = 'smtp'
+mail.smtp.server = 'bastion'
+# The 'utf-8-qp' encoding causes problems with TurboMail 3.x
+# https://fedorahosted.org/bodhi/ticket/648
+mail.message.encoding = 'utf-8'
+notice_sender = 'updates@fedoraproject.org'
+#bz_server = 'https://bzprx.vip.phx.redhat.com/xmlrpc.cgi'
+bz_server = 'https://bugzilla.redhat.com/xmlrpc.cgi'
+bz_cookie = '/var/tmp/bodhi-bz.cookie'
+bz_products = 'Fedora,Fedora EPEL,oVirt'
+
+build_dir = '/mnt/koji/packages'
+<% if environment == "staging" %>
+base_address = 'https://admin.stg.fedoraproject.org'
+<% else %>
+base_address = 'https://admin.fedoraproject.org'
+<% end %>
+
+acl_system = 'pkgdb'
+<% if environment == "staging" %>
+pkgdb_url = 'http://localhost/pkgdb'
+<% else %>
+pkgdb_url = 'https://admin.fedoraproject.org/pkgdb'
+<% end %>
+
+<% if environment == "staging" %>
+buildsystem = 'dev'
+<% else %>
+buildsystem = 'koji'
+<% end %>
+client_cert = '/etc/pki/bodhi/bodhi.pem'
+clientca_cert = '/etc/pki/bodhi/fedora-upload-ca.cert'
+serverca_cert = '/etc/pki/bodhi/fedora-server-ca.cert'
+
+[logging]
+
+[[handlers]]
+
+[[[debug_out]]]
+class='TimedRotatingFileHandler'
+args="('/var/log/bodhi/server.log', 'D', 7)"
+level='DEBUG'
+formatter='full_content'
+
+[[[access_out]]]
+class='TimedRotatingFileHandler'
+level='INFO'
+args="('/var/log/bodhi/access.log', 'D', 7)"
+formatter='message_only'
+
+[[[error_out]]]
+class='TimedRotatingFileHandler'
+args="('/var/log/bodhi/server.log', 'D', 7)"
+level='ERROR'
+formatter='full_content'
+
+[[loggers]]
+[[[bodhi]]]
+level='DEBUG'
+qualname='bodhi'
+handlers=['debug_out']
+propagate=0
+
+[[[allinfo]]]
+level='INFO'
+handlers=['debug_out']
+propagate=0
+
+#[[[access]]]
+#level='INFO'
+#qualname='turbogears.access'
+#handlers=['debug_out']
+
+[[[turbomail]]]
+level='INFO'
+qualname='turbomail'
+handlers=['debug_out']
+
+[[[urllib3]]]
+level='WARN'
+qualname='urllib3'
+handlers=['debug_out']
diff --git a/roles/bodhi2/backend/templates/mash.conf b/roles/bodhi2/backend/templates/mash.conf
new file mode 100644
index 0000000000..e68d26af94
--- /dev/null
+++ b/roles/bodhi2/backend/templates/mash.conf
@@ -0,0 +1,14 @@
+[defaults]
+{% if environment == 'staging' %}
+buildhost = http://koji.stg.fedoraproject.org/kojihub
+{% else %}
+buildhost = http://koji.fedoraproject.org/kojihub
+{% endif %}
+
+symlink = False
+configdir = /etc/bodhi/
+repodir = /mnt/koji
+fork = True
+use_sqlite = True
+strict_keys = True
+max_delta_rpm_size = 1500000000
diff --git a/roles/bodhi2/backend/templates/owner-sync-pkgdb.j2 b/roles/bodhi2/backend/templates/owner-sync-pkgdb.j2
new file mode 100755
index 0000000000..cb69b49c67
--- /dev/null
+++ b/roles/bodhi2/backend/templates/owner-sync-pkgdb.j2
@@ -0,0 +1,202 @@
+#!/usr/bin/python2
+
+# cronjobs are run on releng01.stg
+# Looks like:
+# /usr/local/bin/owner-sync-pkgdb f19
+# /usr/local/bin/owner-sync-pkgdb dist-5E-epel
+# /usr/local/bin/owner-sync-pkgdb dist-6E-epel
+# /usr/local/bin/owner-sync-pkgdb epel7
+
+import sys
+import os
+import ConfigParser
+from urlparse import urljoin
+
+import requests
+
+DEBUG=False
+VERIFY=True
+{% if env == 'staging' %}
+BASEURL = os.environ.get('PACKAGEDBURL') or 'https://admin.stg.fedoraproject.org/pkgdb/'
+{% else %}
+BASEURL = os.environ.get('PACKAGEDBURL') or 'https://admin.fedoraproject.org/pkgdb/'
+{% endif %}
+if not BASEURL.endswith('/'):
+ BASEURL = BASEURL + '/'
+
+# Why do we have this? Seems insecure....
+sys.path.append('.')
+
+try:
+ import koji
+except:
+ import brew as koji
+
+extraArchList = {'kernel': ('i586', 'i686', 'noarch'),
+ 'kernel-xen-2.6': ('i586', 'i686', 'noarch'),
+ 'glibc': ('i686',),
+ 'openssl': ('i686',),
+ 'em8300-kmod': ('i586', 'i686'),
+ 'sysprof-kmod': ('i586', 'i686'),
+ }
+
+def usage():
+ print "Usage: owner-sync "
+ print " : tag to synchronize owners for"
+ sys.exit(1)
+
+def get_options():
+ # shamelessly stolen from koji CLI
+ opts = {
+{% if env == 'staging' %}
+ 'server': 'http://koji.stg.fedoraproject.org/kojihub',
+ 'weburl': 'http://koji.stg.fedoraproject.org/koji',
+{% else %}
+ 'server': 'http://koji.fedoraproject.org/kojihub',
+ 'weburl': 'http://koji.fedoraproject.org/koji',
+{% endif %}
+ 'cert': '/etc/pki/pkgdb/pkgdb.pem',
+ 'ca': '/etc/pki/pkgdb/fedora-server-ca.cert',
+ 'serverca': '/etc/pki/pkgdb/fedora-server-ca.cert'
+ }
+ for configFile in ('/etc/koji.conf', os.path.expanduser('~/.koji/config')):
+ if os.access(configFile, os.F_OK):
+ f = open(configFile)
+ config = ConfigParser.ConfigParser()
+ config.readfp(f)
+ f.close()
+ if config.has_section('koji'):
+ for name, value in config.items('koji'):
+ if opts.has_key(name):
+ opts[name] = value
+ for entry in opts.keys():
+ if entry == 'server' or entry == 'weburl':
+ pass
+ opts[entry] = os.path.expanduser(opts[entry])
+ return opts
+
+if __name__ == '__main__':
+ try:
+ tag=sys.argv[1]
+ except:
+ print "ERROR: no tag specified!\n"
+ usage()
+
+ if tag.endswith('epel') or tag.startswith('epel'):
+ if tag.startswith('epel'):
+ version = tag.split('epel')[1]
+ else:
+ version = tag.split('-')[1][:-1]
+
+ data = requests.get(urljoin(BASEURL, 'api/collections'), verify=VERIFY).json()
+ branch_names = set()
+ for collection in (c for c in data['collections'] if c['status'] != 'EOL'):
+ ### TODO: check with pingou that this is now returning the same
+ # format as the collection names in api/vcs
+ # By moving the data from gitbranchname into branchname, I think
+ # that the data will now match
+ branch_names.add(collection['branchname'])
+
+ if tag.startswith('epel'):
+ # Ex: epel7 => epel7
+ reponame = tag
+ else:
+ # Ex: dist-6E-epel => el6
+ reponame = 'el%s' % version
+ if reponame not in branch_names:
+ print 'tag %s => repo %s: does not seem to be a non-EOL branch' % (tag, reponame)
+ sys.exit(1)
+
+ # EPEL needs a separate entry in koji for each epel version
+
+ data = requests.get(urljoin(BASEURL, 'api/vcs?format=json'), verify=VERIFY).json()
+ acls = data['packageAcls']
+ pkgs = {}
+ for pkg_name in acls:
+ try:
+ owners = acls[pkg_name][reponame]
+ except KeyError:
+ # Package is not branched for this release
+ continue
+ if len(owners['commit']['people']):
+ # Arbitrarily take the first committer listed as the owner in
+ # koji
+ pkgs[pkg_name] = owners['commit']['people'][0]
+ else:
+ pkgs[pkg_name] = 'orphan'
+ pkgList = pkgs.keys()
+ BuildEPEL = True
+ arches = ["primary"]
+ else:
+ # Fedora only needs one entry per package for all Fedora releases
+ # Use the owner from bugzilla for simplicity
+ data = requests.get(urljoin(BASEURL, 'api/bugzilla?format=json'), verify=VERIFY).json()
+ acls = data['bugzillaAcls']
+ pkgList = acls['Fedora'].keys()
+ pkgs = {}
+ for pkg in acls['Fedora']:
+ owner = acls['Fedora'][pkg]['owner']
+ owner = owner.replace('group::', '').replace('@', '')
+ pkgs[pkg] = owner
+
+ #pkgs = dict(((p, acls['Fedora'][p]['owner']) for p in acls['Fedora']))
+ BuildEPEL = False
+{% if env == 'staging' %}
+ arches = ["primary"]
+{% else %}
+ arches = ["primary", "arm", "ppc", "s390"]
+{% endif %}
+ pkgList.sort()
+
+ options = get_options()
+
+ for arch in arches:
+ if arch == "primary":
+{% if env == 'staging' %}
+ session = koji.ClientSession("http://koji.stg.fedoraproject.org/kojihub")
+{% else %}
+ session = koji.ClientSession("http://koji.fedoraproject.org/kojihub")
+{% endif %}
+ else:
+ session = koji.ClientSession("http://%s.koji.fedoraproject.org/kojihub" % arch)
+ try:
+ session.ssl_login(options['cert'], options['ca'], options['serverca'])
+ except:
+ print "Unable to sync to %s hub" % arch
+ continue
+ kojitag = session.getTag(tag)
+ if kojitag is None:
+ print "ERROR: tag %s does not exist!\n" % (tag)
+ usage()
+
+ kojipkgs = {}
+ kojiusers = [user['name'] for user in session.listUsers()]
+
+ for p in session.listPackages(tagID=tag, inherited = True):
+ kojipkgs[p['package_name']] = p
+
+ for pkg in pkgList:
+ owner = pkgs[pkg]
+ if DEBUG:
+ print '[DEBUG] Package: %s, Owner: %s' % (pkg, owner)
+
+ if not owner in kojiusers:
+ # add the user first
+ if DEBUG:
+ print "Adding user %s" % owner
+ else:
+ session.createUser(owner)
+ kojiusers.append(owner)
+ if not kojipkgs.has_key(pkg):
+ if DEBUG:
+ print "Adding package %s for %s with owner %s" % (pkg, tag, owner)
+ else:
+ extraArches = None
+ if pkg in extraArchList:
+ extraArches = extraArchList[pkg]
+ session.packageListAdd(tag, pkg, owner = owner, extra_arches=extraArches)
+ elif kojipkgs[pkg]['owner_name'] != owner:
+ if DEBUG:
+ print "Setting owner for %s in %s to %s" % (pkg, tag, owner)
+ else:
+ session.packageListSetOwner(tag, pkg, owner, force = True)
diff --git a/roles/bodhi2/base/tasks/main.yml b/roles/bodhi2/base/tasks/main.yml
new file mode 100644
index 0000000000..2fb12907fa
--- /dev/null
+++ b/roles/bodhi2/base/tasks/main.yml
@@ -0,0 +1,138 @@
+---
+# tasklist for setting up bodhi
+# This is the base set of files needed for bodhi
+
+- name: install needed packages
+ yum: pkg={{ item }} state=present
+ with_items:
+ - bodhi-server
+ tags:
+ - packages
+ - bodhi
+
+- name: setup /etc/bodhi/ directory
+ file: path=/etc/bodhi owner=root group=root mode=0755 state=directory
+ tags:
+ - config
+ - bodhi
+
+- name: setup basic /etc/bodhi/ contents
+ template: >
+ src="staging.ini.j2"
+ dest="/etc/bodhi/production.ini"
+ owner=bodhi
+ group=bodhi
+ mode=0600
+ when: inventory_hostname.startswith('bodhi0') and env == 'staging'
+ notify:
+ - restart httpd
+ tags:
+ - config
+ - bodhi
+
+- name: setup basic /etc/bodhi/ contents
+ template: >
+ src="production.ini.j2"
+ dest="/etc/bodhi/production.ini"
+ owner=bodhi
+ group=bodhi
+ mode=0600
+ when: inventory_hostname.startswith('bodhi0') and env == 'production'
+ notify:
+ - restart httpd
+ tags:
+ - config
+ - bodhi
+
+
+- name: setup basic /etc/httpd/conf.d/ bodhi contents
+ copy: >
+ src="bodhi-app.conf"
+ dest="/etc/httpd/conf.d/bodhi.conf"
+ owner=root
+ group=root
+ mode=0644
+ when: inventory_hostname.startswith('bodhi0')
+ notify:
+ - restart httpd
+ tags:
+ - config
+ - bodhi
+
+- name: setup /etc/pki/bodhi directory
+ file: path=/etc/pki/bodhi owner=root group=root mode=0755 state=directory
+ tags:
+ - config
+ - bodhi
+
+- name: install bodhi.pem file
+ copy: >
+ src="{{ puppet_private }}/bodhi_key_and_cert.pem"
+ dest="/etc/pki/bodhi/bodhi.pem"
+ owner=bodhi
+ group=bodhi
+ mode=0400
+ when: inventory_hostname.startswith('bodhi0')
+ tags:
+ - config
+ - bodhi
+
+- name: install bodhi certificates
+ copy: >
+ src="{{ puppet_private }}/fedora-ca.cert"
+ dest="/etc/pki/bodhi/{{ item }}"
+ owner=root
+ group=root
+ mode=0644
+ with_items:
+ - fedora-server-ca.cert
+ - fedora-upload-ca.cert
+ tags:
+ - config
+ - bodhi
+
+#- name: setup /var/log/bodhi directory
+# file: path=/var/log/bodhi owner=bodhi group=bodhi mode=0755 state=directory
+# when: inventory_hostname.startswith('bodhi0')
+# tags:
+# - config
+# - bodhi
+
+- name: check the selinux context of the bugzilla cookie
+ command: matchpathcon /var/tmp/bodhi-bz.cookie
+ register: cookiecontext
+ always_run: yes
+ changed_when: "1 != 1"
+ tags:
+ - config
+ - bodhi
+ - selinux
+
+- name: set the SELinux policy for the bugzilla cookie
+ command: semanage fcontext -a -t httpd_tmp_t "/var/tmp/bodhi-bz.cookie"
+ when: cookiecontext.stdout.find('httpd_tmp_t') == -1
+ tags:
+ - config
+ - bodhi
+ - selinux
+
+- name: enable httpd_tmp_exec SELinux boolean
+ seboolean: name=httpd_tmp_exec state=yes persistent=yes
+ tags:
+ - config
+ - bodhi
+ - selinux
+
+- name: enable httpd_can_network_connect_db SELinux boolean
+ seboolean: name=httpd_can_network_connect_db state=yes persistent=yes
+ tags:
+ - config
+ - bodhi
+ - selinux
+
+- name: enable httpd_can_network_connect SELinux boolean
+ seboolean: name=httpd_can_network_connect state=yes persistent=yes
+ tags:
+ - config
+ - bodhi
+ - selinux
diff --git a/roles/bodhi2/base/templates/production.ini.j2 b/roles/bodhi2/base/templates/production.ini.j2
new file mode 100644
index 0000000000..5711262a8c
--- /dev/null
+++ b/roles/bodhi2/base/templates/production.ini.j2
@@ -0,0 +1,442 @@
+[app:main]
+use = egg:bodhi
+
+##
+## Messages
+##
+
+# A notice to flash on the front page
+frontpage_notice =
+
+# A notice to flash on the New Update page
+newupdate_notice =
+
+testing_approval_msg = This update has reached %d days in testing and can be pushed to stable now if the maintainer wishes
+not_yet_tested_msg = This update has not yet met the minimum testing requirements defined in the Package Update Acceptance Criteria
+stablekarma_comment = This update has reached the stable karma threshold and will be pushed to the stable updates repository
+
+# Libravatar - If this is true libravatar will work as normal. Otherwise, all
+# libravatar links will be replaced with the string "libravatar.org" so that
+# the tests can still pass.
+libravatar_enabled = True
+# Set this to true if you want to do federated dns libravatar lookup
+libravatar_dns = False
+
+# Set this to True in order to send fedmsg messages.
+#fedmsg_enabled = True
+
+
+# Captcha - if 'captcha.secret' is not None, then it will be used for comments
+# captcha.secret must be 32 url-safe base64-encoded bytes
+# you can generate afresh with >>> cryptography.fernet.Fernet.generate_key()
+captcha.secret = CHANGEME
+# Dimensions
+captcha.image_width = 300
+captcha.image_height = 80
+# Any truetype font will do.
+# This font lives in pcaro-hermit-fonts package
+captcha.font_path = /usr/share/fonts/pcaro-hermit/Hermit-medium.otf
+captcha.font_size = 36
+# Colors
+captcha.font_color = #000000
+captcha.background_color = #ffffff
+# In pixels
+captcha.padding = 5
+# If a captcha sits around for this many seconds, it will stop working.
+captcha.ttl = 300
+
+#datagrepper_url = http://localhost:5000
+datagrepper_url = https://apps.fedoraproject.org/datagrepper
+badge_ids = binary-star|both-bull-and-self-transcended-tester-viii|catching-the-bull-tester-iv|corporate-drone|corporate-overlord|corporate-shill|discovery-of-the-footprints-tester-ii|in-search-of-the-bull-tester-i|is-this-thing-on-updates-testing-i|is-this-thing-on-updates-testing-ii|is-this-thing-on-updates-testing-iii|is-this-thing-on-updates-testing-iv|it-still-works!|like-a-rock-updates-stable-i|like-a-rock-updates-stable-ii|like-a-rock-updates-stable-iii|like-a-rock-updates-stable-iv|mic-check!-updates-testing-v|missed-the-train|override,-you-say|perceiving-the-bull-tester-iii|reaching-the-source-tester-ix|return-to-society-tester-x|riding-the-bull-home-tester-vi|stop-that-update!|take-this-and-call-me-in-the-morning|taming-the-bull-tester-v|tectonic!-updates-stable-v|the-bull-transcended-tester-vii|what-goes-around-comes-around-karma-i|what-goes-around-comes-around-karma-ii|what-goes-around-comes-around-karma-iii|what-goes-around-comes-around-karma-iv|white-hat|you-can-pry-it-from-my-cold,-dead-hands
+
+
+##
+## Wiki Test Cases
+##
+
+## Query the wiki for test cases
+query_wiki_test_cases = False
+wiki_url = https://fedoraproject.org/w/api.php
+test_case_base_url = https://fedoraproject.org/wiki/
+
+# Email domain to prepend usernames to
+default_email_domain = fedoraproject.org
+
+# domain for generated message IDs
+message_id_email_domain = admin.fedoraproject.org
+
+##
+## Mash settings
+##
+
+# If defined, the bodhi masher will ensure that messages are signed with the given cert
+#releng_fedmsg_certname = releng-releng04.phx2.fedoraproject.org
+
+# The masher is a bodhi instance that is responsible for composing the update
+# repositories, regenerating metrics, sending update notices, closing bugs,
+# and other costly operations. To set an external masher, set the masher to
+# the baseurl of the bodhi instance. If set to None, this bodhi instance
+# will act as a masher as well.
+#masher = None
+
+# Where to initially mash repositories
+mash_dir = %(here)s/masher/mash/
+
+# Where to symlink the latest repos by their tag name
+mash_stage_dir = %(here)s/masher/
+
+mash_conf = /etc/mash/mash.conf
+
+createrepo_cache_dir = /var/cache/createrepo
+
+## Our periodic jobs
+#jobs = clean_repo nagmail fix_bug_titles cache_release_data approve_testing_updates
+jobs = cache_release_data refresh_metrics approve_testing_updates
+
+## Comps configuration
+comps_dir = /usr/share/bodhi/
+comps_url = git://git.fedorahosted.org/comps.git
+
+##
+## Mirror settings
+##
+file_url = http://download.fedoraproject.org/pub/fedora/linux/updates
+master_repomd = http://download.fedora.redhat.com/pub/fedora/linux/updates/%d/i386/repodata/repomd.xml
+fedora_master_repomd = http://download.fedora.redhat.com/pub/fedora/linux/updates/%d/i386/repodata/repomd.xml
+fedora_epel_master_repomd = http://download.fedora.redhat.com/pub/epel/%d/i386/repodata/repomd.xml
+
+## The base url of this application
+base_address = https://admin.fedoraproject.org/updates/
+
+## Supported update types
+update_types = bugfix enhancement security newpackage
+
+## Supported architechures
+##
+## To handle arch name changes between releases, you
+## can also configure bodhi to support one arch *or*
+## another. For example, EPEL5 mashes produce 'ppc'
+## repos, where EPEL6 produces 'ppc64'. To handle this
+## scenario, you can specify something like:
+##
+## arches = ppc/ppc64
+##
+arches = i386 x86_64 armhfp
+
+##
+## Email setting
+##
+
+smtp_server = bastion
+
+# The updates system itself. This email address is used in fetching Bugzilla
+# information, as well as email notifications
+bodhi_email = updates@fedoraproject.org
+#bodhi_password =
+
+# The address that gets the requests
+release_team_address = bodhiadmin-members@fedoraproject.org
+
+# The address to notify when security updates are initially added to bodhi
+security_team = security_respons-members@fedoraproject.org
+
+# Public announcement lists
+fedora_announce_list = package-announce@lists.fedoraproject.org
+fedora_test_announce_list = test@lists.fedoraproject.org
+fedora_epel_announce_list = epel-package-announce@lists.fedoraproject.org
+fedora_epel_test_announce_list = epel-devel@lists.fedoraproject.org
+
+# Superuser groups
+admin_groups = proventesters security_respons bodhiadmin sysadmin-main
+
+# Users that we don't want to show up in the "leaderboard(s)"
+stats_blacklist = bodhi anonymous autoqa
+
+# A list of non-person users
+system_users = bodhi autoqa
+
+# The max length for an update title before we truncate it in the web ui
+max_update_length_for_ui = 70
+
+# The number of days used for calculating the 'top testers' metric
+top_testers_timeframe = 900
+
+# The email address of the proventesters
+proventesters_email = proventesters-members@fedoraproject.org
+
+# These are the default requirements that we apply to stacks, packages, and
+# updates. Users have free-reign to override them for each kind of entity. At
+# the end of the day, we only consider the requirements defined by single
+# updates themselves when gating in the backend masher process.
+site_requirements = depcheck upgradepath
+## Some day we'll have rpmgrill, and that will be cool. Ask tflink.
+#site_requirements = depcheck upgradepath rpmgrill
+
+# Where do we send update announcements to ?
+# These variables should be named per: Release.prefix_id.lower()_announce_list
+#fedora_announce_list =
+#fedora_test_announce_list =
+#fedora_epel_announce_list =
+#fedora_epel_test_announce_list =
+
+# Cache settings
+dogpile.cache.backend = dogpile.cache.dbm
+dogpile.cache.expiration_time = 100
+dogpile.cache.arguments.filename = /var/cache/bodhi-dogpile-cache.dbm
+
+# Exclude sending emails to these users
+exclude_mail = autoqa
+
+##
+## Buildsystem settings
+##
+
+# What buildsystem do we want to use? For development, we'll use a fake
+# buildsystem that always does what we tell it to do. For production, we'll
+# want to use 'koji'.
+buildsystem = dev
+
+# Koji's XML-RPC hub
+koji_hub = https://koji.stg.fedoraproject.org/kojihub
+
+# Root url of the Koji instance to point to. No trailing slash
+koji_url = http://koji.stg.fedoraproject.org
+
+# URL of where users should go to set up their notifications
+fmn_url = https://apps.fedoraproject.org/notifications/
+
+# URL of the resultsdb for integrating checks and stuff
+resultsdb_url = https://taskotron.fedoraproject.org/resultsdb/
+resultsdb_api_url = https://taskotron.fedoraproject.org/resultsdb_api/
+
+# Koji certs
+#client_cert =
+#clientca_cert =
+#serverca_cert =
+
+##
+## ACL system
+## Choices are 'pkgdb', which will send a JSON query to the pkgdb_url below,
+## or 'dummy', which will always return guest credentials (used for local
+## development).
+##
+acl_system = dummy
+
+##
+## Package DB
+##
+pkgdb_url = https://admin.fedoraproject.org/pkgdb
+
+# We used to get our package tags from pkgdb, but they come from tagger now.
+# https://github.com/fedora-infra/fedora-tagger/pull/74
+#pkgtags_url = https://apps.fedoraproject.org/tagger/api/v1/tag/sqlitebuildtags/
+
+##
+## Bug tracker settings
+##
+#bugtracker = bugzilla
+
+initial_bug_msg = %s has been submitted as an update to %s. %s
+stable_bug_msg = %s has been pushed to the %s repository. If problems still persist, please make note of it in this bug report.
+testing_bug_msg = \nIf you want to test the update, you can install it with \n su -c 'yum --enablerepo=updates-testing update %s'. You can provide feedback for this update here: %s
+
+##
+## Bugzilla settings.
+##
+
+# The username/password for our bugzilla account comes
+# from the bodhi_{email,password} fields.
+
+bz_server = https://bugzilla.redhat.com/xmlrpc.cgi
+#bz_cookie =
+
+# Bodhi will avoid touching bugs that are not against the following products
+bz_products = Fedora,Fedora EPEL
+
+buglink = https://bugzilla.redhat.com/show_bug.cgi?id=%s
+
+##
+## Packages that should suggest a reboot
+##
+reboot_pkgs = kernel kernel-smp kernel-xen-hypervisor kernel-PAE kernel-xen0 kernel-xenU kernel-xen kernel-xen-guest glibc hal dbus
+
+##
+## Critical Path Packages
+## https://fedoraproject.org/wiki/Critical_path_package
+##
+
+# Enable this to query the Fedora Package Database for the list of Critical
+# Path Packages. If disabled, it'll just use the hardcoded list below.
+#critpath.type = pkgdb
+
+# You can hardcode a list of critical path packages instead of using the PackageDB
+critpath_pkgs = kernel
+
+# The number of admin approvals it takes to be able to push a critical path
+# update to stable for a pending release.
+critpath.num_admin_approvals = 0
+
+# The net karma required to submit a critial path update to a pending release)
+critpath.min_karma = 2
+
+# Allow critpath to submit for stable after 2 weeks with no negative karma
+critpath.stable_after_days_without_negative_karma = 14
+
+# The minimum amount of time an update must spend in testing before
+# it can reach the stable repository
+fedora.mandatory_days_in_testing = 7
+fedora_epel.mandatory_days_in_testing = 14
+
+##
+## Release status
+##
+
+# Pre-beta enforces the Pre Beta policy defined here:
+# https://fedoraproject.org/wiki/Updates_Policy
+#f15.status = 'pre_beta'
+#f15.pre_beta.mandatory_days_in_testing = 3
+#f15.pre_beta.critpath.num_admin_approvals = 0
+#f15.pre_beta.critpath.min_karma = 1
+
+# For test cases.
+f7.status = post_beta
+f7.post_beta.mandatory_days_in_testing = 7
+f7.post_beta.critpath.num_admin_approvals = 0
+f7.post_beta.critpath.min_karma = 2
+
+# The number of days worth of updates/comments to display
+feeds.num_days_to_show = 7
+feeds.max_entries = 20
+
+##
+## Buildroot Override
+##
+
+# Number of days before expiring overrides
+buildroot_overrides.expire_after = 1
+
+##
+## Groups
+##
+
+# FAS Groups that we want to pay attention to
+# When a user logs in, bodhi will look for any of these groups and associate #
+# them with the user. They will then appear as the users effective principals in
+# the format "group:groupname" and can be used in Pyramid ACE's.
+important_groups = proventesters provenpackager releng security_respons packager bodhiadmin
+
+# Groups that can push updates for any package
+admin_packager_groups = provenpackager releng security_respons
+
+# User must be a member of this group to submit updates
+mandatory_packager_groups = packager
+
+##
+## updateinfo.xml configuraiton
+##
+updateinfo_rights = Copyright (C) 2015 Red Hat, Inc. and others.
+
+##
+## Authentication & Authorization
+##
+
+# pyramid.openid
+openid.success_callback = bodhi.security:remember_me
+openid.provider = https://id.fedoraproject.org/openid/
+openid_template = {username}.id.fedoraproject.org
+
+##
+## Pyramid settings
+##
+pyramid.reload_templates = true
+pyramid.debug_authorization = true
+pyramid.debug_notfound = true
+pyramid.debug_routematch = true
+pyramid.default_locale_name = en
+
+pyramid.includes =
+ pyramid_tm
+
+debugtoolbar.hosts = 127.0.0.1 ::1
+
+##
+## Database
+##
+# XXX - you should really change this to postgres
+sqlalchemy.url = sqlite:////var/cache/bodhi.db
+
+##
+## Templates
+##
+mako.directories = bodhi:templates
+
+##
+## Authentication & Sessions
+##
+
+# CHANGE THESE IN PRODUCTION!
+authtkt.secret = changethisinproduction!
+session.secret = ChangeThisSecret!!1
+authtkt.secure = false
+
+# pyramid_beaker
+session.type = file
+session.data_dir = %(here)s/data/sessions/data
+session.lock_dir = %(here)s/data/sessions/lock
+session.key = mykey
+session.cookie_on_exception = true
+cache.regions = default_term, second, short_term, long_term
+cache.type = memory
+cache.second.expire = 1
+cache.short_term.expire = 60
+cache.default_term.expire = 300
+cache.long_term.expire = 3600
+
+[server:main]
+use = egg:waitress#main
+host = 0.0.0.0
+port = 6543
+
+[pshell]
+m = bodhi.models
+db = bodhi.models.DBSession
+t = transaction
+
+# Begin logging configuration
+
+[loggers]
+keys = root, bodhi, sqlalchemy
+
+[handlers]
+keys = console
+
+[formatters]
+keys = generic
+
+[logger_root]
+level = INFO
+handlers = console
+
+[logger_bodhi]
+level = DEBUG
+handlers =
+qualname = bodhi
+
+[logger_sqlalchemy]
+level = INFO
+handlers =
+qualname = sqlalchemy.engine
+# "level = INFO" logs SQL queries.
+# "level = DEBUG" logs SQL queries and results.
+# "level = WARN" logs neither. (Recommended for production systems.)
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[formatter_generic]
+format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s
+
+# End logging configuration
diff --git a/roles/bodhi2/base/templates/staging.ini.j2 b/roles/bodhi2/base/templates/staging.ini.j2
new file mode 100644
index 0000000000..5bb27d279a
--- /dev/null
+++ b/roles/bodhi2/base/templates/staging.ini.j2
@@ -0,0 +1,442 @@
+[app:main]
+use = egg:bodhi
+
+##
+## Messages
+##
+
+# A notice to flash on the front page
+frontpage_notice =
+
+# A notice to flash on the New Update page
+newupdate_notice =
+
+testing_approval_msg = This update has reached %d days in testing and can be pushed to stable now if the maintainer wishes
+not_yet_tested_msg = This update has not yet met the minimum testing requirements defined in the Package Update Acceptance Criteria
+stablekarma_comment = This update has reached the stable karma threshold and will be pushed to the stable updates repository
+
+# Libravatar - If this is true libravatar will work as normal. Otherwise, all
+# libravatar links will be replaced with the string "libravatar.org" so that
+# the tests can still pass.
+libravatar_enabled = True
+# Set this to true if you want to do federated dns libravatar lookup
+libravatar_dns = False
+
+# Set this to True in order to send fedmsg messages.
+#fedmsg_enabled = True
+
+
+# Captcha - if 'captcha.secret' is not None, then it will be used for comments
+# captcha.secret must be 32 url-safe base64-encoded bytes
+# you can generate afresh with >>> cryptography.fernet.Fernet.generate_key()
+captcha.secret = CHANGEME
+# Dimensions
+captcha.image_width = 300
+captcha.image_height = 80
+# Any truetype font will do.
+# This font lives in pcaro-hermit-fonts package
+captcha.font_path = /usr/share/fonts/pcaro-hermit/Hermit-medium.otf
+captcha.font_size = 36
+# Colors
+captcha.font_color = #000000
+captcha.background_color = #ffffff
+# In pixels
+captcha.padding = 5
+# If a captcha sits around for this many seconds, it will stop working.
+captcha.ttl = 300
+
+#datagrepper_url = http://localhost:5000
+datagrepper_url = https://apps.stg.fedoraproject.org/datagrepper
+badge_ids = binary-star|both-bull-and-self-transcended-tester-viii|catching-the-bull-tester-iv|corporate-drone|corporate-overlord|corporate-shill|discovery-of-the-footprints-tester-ii|in-search-of-the-bull-tester-i|is-this-thing-on-updates-testing-i|is-this-thing-on-updates-testing-ii|is-this-thing-on-updates-testing-iii|is-this-thing-on-updates-testing-iv|it-still-works!|like-a-rock-updates-stable-i|like-a-rock-updates-stable-ii|like-a-rock-updates-stable-iii|like-a-rock-updates-stable-iv|mic-check!-updates-testing-v|missed-the-train|override,-you-say|perceiving-the-bull-tester-iii|reaching-the-source-tester-ix|return-to-society-tester-x|riding-the-bull-home-tester-vi|stop-that-update!|take-this-and-call-me-in-the-morning|taming-the-bull-tester-v|tectonic!-updates-stable-v|the-bull-transcended-tester-vii|what-goes-around-comes-around-karma-i|what-goes-around-comes-around-karma-ii|what-goes-around-comes-around-karma-iii|what-goes-around-comes-around-karma-iv|white-hat|you-can-pry-it-from-my-cold,-dead-hands
+
+
+##
+## Wiki Test Cases
+##
+
+## Query the wiki for test cases
+query_wiki_test_cases = False
+wiki_url = https://fedoraproject.org/w/api.php
+test_case_base_url = https://fedoraproject.org/wiki/
+
+# Email domain to prepend usernames to
+default_email_domain = fedoraproject.org
+
+# domain for generated message IDs
+message_id_email_domain = admin.stg.fedoraproject.org
+
+##
+## Mash settings
+##
+
+# If defined, the bodhi masher will ensure that messages are signed with the given cert
+#releng_fedmsg_certname = releng-releng04.phx2.fedoraproject.org
+
+# The masher is a bodhi instance that is responsible for composing the update
+# repositories, regenerating metrics, sending update notices, closing bugs,
+# and other costly operations. To set an external masher, set the masher to
+# the baseurl of the bodhi instance. If set to None, this bodhi instance
+# will act as a masher as well.
+#masher = None
+
+# Where to initially mash repositories
+mash_dir = %(here)s/masher/mash/
+
+# Where to symlink the latest repos by their tag name
+mash_stage_dir = %(here)s/masher/
+
+mash_conf = /etc/mash/mash.conf
+
+createrepo_cache_dir = /var/cache/createrepo
+
+## Our periodic jobs
+#jobs = clean_repo nagmail fix_bug_titles cache_release_data approve_testing_updates
+jobs = cache_release_data refresh_metrics approve_testing_updates
+
+## Comps configuration
+comps_dir = /usr/share/bodhi/
+comps_url = git://git.fedorahosted.org/comps.git
+
+##
+## Mirror settings
+##
+file_url = http://download.fedoraproject.org/pub/fedora/linux/updates
+master_repomd = http://download.fedora.redhat.com/pub/fedora/linux/updates/%d/i386/repodata/repomd.xml
+fedora_master_repomd = http://download.fedora.redhat.com/pub/fedora/linux/updates/%d/i386/repodata/repomd.xml
+fedora_epel_master_repomd = http://download.fedora.redhat.com/pub/epel/%d/i386/repodata/repomd.xml
+
+## The base url of this application
+base_address = https://admin.stg.fedoraproject.org/updates/
+
+## Supported update types
+update_types = bugfix enhancement security newpackage
+
+## Supported architechures
+##
+## To handle arch name changes between releases, you
+## can also configure bodhi to support one arch *or*
+## another. For example, EPEL5 mashes produce 'ppc'
+## repos, where EPEL6 produces 'ppc64'. To handle this
+## scenario, you can specify something like:
+##
+## arches = ppc/ppc64
+##
+arches = i386 x86_64 armhfp
+
+##
+## Email setting
+##
+
+smtp_server = bastion
+
+# The updates system itself. This email address is used in fetching Bugzilla
+# information, as well as email notifications
+bodhi_email = updates@fedoraproject.org
+#bodhi_password =
+
+# The address that gets the requests
+release_team_address = bodhiadmin-members@fedoraproject.org
+
+# The address to notify when security updates are initially added to bodhi
+security_team = security_respons-members@fedoraproject.org
+
+# Public announcement lists
+fedora_announce_list = package-announce@lists.fedoraproject.org
+fedora_test_announce_list = test@lists.fedoraproject.org
+fedora_epel_announce_list = epel-package-announce@lists.fedoraproject.org
+fedora_epel_test_announce_list = epel-devel@lists.fedoraproject.org
+
+# Superuser groups
+admin_groups = proventesters security_respons bodhiadmin sysadmin-main
+
+# Users that we don't want to show up in the "leaderboard(s)"
+stats_blacklist = bodhi anonymous autoqa
+
+# A list of non-person users
+system_users = bodhi autoqa
+
+# The max length for an update title before we truncate it in the web ui
+max_update_length_for_ui = 70
+
+# The number of days used for calculating the 'top testers' metric
+top_testers_timeframe = 900
+
+# The email address of the proventesters
+proventesters_email = proventesters-members@fedoraproject.org
+
+# These are the default requirements that we apply to stacks, packages, and
+# updates. Users have free-reign to override them for each kind of entity. At
+# the end of the day, we only consider the requirements defined by single
+# updates themselves when gating in the backend masher process.
+site_requirements = depcheck upgradepath
+## Some day we'll have rpmgrill, and that will be cool. Ask tflink.
+#site_requirements = depcheck upgradepath rpmgrill
+
+# Where do we send update announcements to ?
+# These variables should be named per: Release.prefix_id.lower()_announce_list
+#fedora_announce_list =
+#fedora_test_announce_list =
+#fedora_epel_announce_list =
+#fedora_epel_test_announce_list =
+
+# Cache settings
+dogpile.cache.backend = dogpile.cache.dbm
+dogpile.cache.expiration_time = 100
+dogpile.cache.arguments.filename = /var/cache/bodhi-dogpile-cache.dbm
+
+# Exclude sending emails to these users
+exclude_mail = autoqa
+
+##
+## Buildsystem settings
+##
+
+# What buildsystem do we want to use? For development, we'll use a fake
+# buildsystem that always does what we tell it to do. For production, we'll
+# want to use 'koji'.
+buildsystem = dev
+
+# Koji's XML-RPC hub
+koji_hub = https://koji.stg.fedoraproject.org/kojihub
+
+# Root url of the Koji instance to point to. No trailing slash
+koji_url = http://koji.stg.fedoraproject.org
+
+# URL of where users should go to set up their notifications
+fmn_url = https://apps.stg.fedoraproject.org/notifications/
+
+# URL of the resultsdb for integrating checks and stuff
+resultsdb_url = https://taskotron.stg.fedoraproject.org/resultsdb/
+resultsdb_api_url = https://taskotron.stg.fedoraproject.org/resultsdb_api/
+
+# Koji certs
+#client_cert =
+#clientca_cert =
+#serverca_cert =
+
+##
+## ACL system
+## Choices are 'pkgdb', which will send a JSON query to the pkgdb_url below,
+## or 'dummy', which will always return guest credentials (used for local
+## development).
+##
+acl_system = dummy
+
+##
+## Package DB
+##
+pkgdb_url = https://admin.stg.fedoraproject.org/pkgdb
+
+# We used to get our package tags from pkgdb, but they come from tagger now.
+# https://github.com/fedora-infra/fedora-tagger/pull/74
+#pkgtags_url = https://apps.fedoraproject.org/tagger/api/v1/tag/sqlitebuildtags/
+
+##
+## Bug tracker settings
+##
+#bugtracker = bugzilla
+
+initial_bug_msg = %s has been submitted as an update to %s. %s
+stable_bug_msg = %s has been pushed to the %s repository. If problems still persist, please make note of it in this bug report.
+testing_bug_msg = \nIf you want to test the update, you can install it with \n su -c 'yum --enablerepo=updates-testing update %s'. You can provide feedback for this update here: %s
+
+##
+## Bugzilla settings.
+##
+
+# The username/password for our bugzilla account comes
+# from the bodhi_{email,password} fields.
+
+bz_server = https://partner-bugzilla.redhat.com/xmlrpc.cgi
+#bz_cookie =
+
+# Bodhi will avoid touching bugs that are not against the following products
+bz_products = Fedora,Fedora EPEL
+
+buglink = https://partner-bugzilla.redhat.com/show_bug.cgi?id=%s
+
+##
+## Packages that should suggest a reboot
+##
+reboot_pkgs = kernel kernel-smp kernel-xen-hypervisor kernel-PAE kernel-xen0 kernel-xenU kernel-xen kernel-xen-guest glibc hal dbus
+
+##
+## Critical Path Packages
+## https://fedoraproject.org/wiki/Critical_path_package
+##
+
+# Enable this to query the Fedora Package Database for the list of Critical
+# Path Packages. If disabled, it'll just use the hardcoded list below.
+#critpath.type = pkgdb
+
+# You can hardcode a list of critical path packages instead of using the PackageDB
+critpath_pkgs = kernel
+
+# The number of admin approvals it takes to be able to push a critical path
+# update to stable for a pending release.
+critpath.num_admin_approvals = 0
+
+# The net karma required to submit a critial path update to a pending release)
+critpath.min_karma = 2
+
+# Allow critpath to submit for stable after 2 weeks with no negative karma
+critpath.stable_after_days_without_negative_karma = 14
+
+# The minimum amount of time an update must spend in testing before
+# it can reach the stable repository
+fedora.mandatory_days_in_testing = 7
+fedora_epel.mandatory_days_in_testing = 14
+
+##
+## Release status
+##
+
+# Pre-beta enforces the Pre Beta policy defined here:
+# https://fedoraproject.org/wiki/Updates_Policy
+#f15.status = 'pre_beta'
+#f15.pre_beta.mandatory_days_in_testing = 3
+#f15.pre_beta.critpath.num_admin_approvals = 0
+#f15.pre_beta.critpath.min_karma = 1
+
+# For test cases.
+f7.status = post_beta
+f7.post_beta.mandatory_days_in_testing = 7
+f7.post_beta.critpath.num_admin_approvals = 0
+f7.post_beta.critpath.min_karma = 2
+
+# The number of days worth of updates/comments to display
+feeds.num_days_to_show = 7
+feeds.max_entries = 20
+
+##
+## Buildroot Override
+##
+
+# Number of days before expiring overrides
+buildroot_overrides.expire_after = 1
+
+##
+## Groups
+##
+
+# FAS Groups that we want to pay attention to
+# When a user logs in, bodhi will look for any of these groups and associate #
+# them with the user. They will then appear as the users effective principals in
+# the format "group:groupname" and can be used in Pyramid ACE's.
+important_groups = proventesters provenpackager releng security_respons packager bodhiadmin
+
+# Groups that can push updates for any package
+admin_packager_groups = provenpackager releng security_respons
+
+# User must be a member of this group to submit updates
+mandatory_packager_groups = packager
+
+##
+## updateinfo.xml configuraiton
+##
+updateinfo_rights = Copyright (C) 2015 Red Hat, Inc. and others.
+
+##
+## Authentication & Authorization
+##
+
+# pyramid.openid
+openid.success_callback = bodhi.security:remember_me
+openid.provider = https://id.stg.fedoraproject.org/openid/
+openid_template = {username}.id.fedoraproject.org
+
+##
+## Pyramid settings
+##
+pyramid.reload_templates = true
+pyramid.debug_authorization = true
+pyramid.debug_notfound = true
+pyramid.debug_routematch = true
+pyramid.default_locale_name = en
+
+pyramid.includes =
+ pyramid_tm
+
+debugtoolbar.hosts = 127.0.0.1 ::1
+
+##
+## Database
+##
+# XXX - you should really change this to postgres
+sqlalchemy.url = sqlite:////var/cache/bodhi.db
+
+##
+## Templates
+##
+mako.directories = bodhi:templates
+
+##
+## Authentication & Sessions
+##
+
+# CHANGE THESE IN PRODUCTION!
+authtkt.secret = changethisinproduction!
+session.secret = ChangeThisSecret!!1
+authtkt.secure = false
+
+# pyramid_beaker
+session.type = file
+session.data_dir = %(here)s/data/sessions/data
+session.lock_dir = %(here)s/data/sessions/lock
+session.key = mykey
+session.cookie_on_exception = true
+cache.regions = default_term, second, short_term, long_term
+cache.type = memory
+cache.second.expire = 1
+cache.short_term.expire = 60
+cache.default_term.expire = 300
+cache.long_term.expire = 3600
+
+[server:main]
+use = egg:waitress#main
+host = 0.0.0.0
+port = 6543
+
+[pshell]
+m = bodhi.models
+db = bodhi.models.DBSession
+t = transaction
+
+# Begin logging configuration
+
+[loggers]
+keys = root, bodhi, sqlalchemy
+
+[handlers]
+keys = console
+
+[formatters]
+keys = generic
+
+[logger_root]
+level = INFO
+handlers = console
+
+[logger_bodhi]
+level = DEBUG
+handlers =
+qualname = bodhi
+
+[logger_sqlalchemy]
+level = INFO
+handlers =
+qualname = sqlalchemy.engine
+# "level = INFO" logs SQL queries.
+# "level = DEBUG" logs SQL queries and results.
+# "level = WARN" logs neither. (Recommended for production systems.)
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[formatter_generic]
+format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s
+
+# End logging configuration