summaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xbin/addproject112
-rw-r--r--bin/config.sh9
-rwxr-xr-xbin/delproject99
-rw-r--r--bin/functions.sh202
4 files changed, 422 insertions, 0 deletions
diff --git a/bin/addproject b/bin/addproject
new file mode 100755
index 0000000..4a038dd
--- /dev/null
+++ b/bin/addproject
@@ -0,0 +1,112 @@
+#!/bin/bash
+
+# main function
+main() {
+ echo
+
+ # project_name may not be an empty string and must be >= 3 characters
+ while [[ ${#project_name} -lt 3 ]]
+ do
+ eask_str "a project name (min 3 chars)"
+ project_name=${REPLY}
+ done
+
+ # who requests the project ?
+ while [[ -z ${user_email} ]]
+ do
+ eask_str "email address (*.fu-berlin.de) of applicant"
+ user_email=${REPLY}
+ don (*.fu-berlin.de) of applicant"
+ user_email=${REPLY}
+ done
+
+ einfo
+ einfo "$(color yellow)public project:$(color) read access for everyone with a spline-dev account." \
+ "write access only for project members. this is the default."
+ einfo "$(color yellow)private project:$(color) read and write access only for project members."
+ einfo
+ eask_bool "Should the project be private?" n
+ project_closed=${REPLY}
+
+ svn_home=${SVN_ROOT}/${project_name}
+ trac_home=${TRAC_ROOT}/${project_name}
+ trac_db=trac_${project_name}
+
+ eheading "creating new subversion directory"
+ eexec svnadmin create ${svn_home}
+ tmpdir=$(mktemp -d)
+ eexec mkdir -p ${tmpdir}/{trunk,tags,branches}
+ eexec svn -q import -m "initial import for project ${project_name}" ${tmpdir} file://${svn_home}
+ eexec chown -R apache:apache ${svn_home}
+ eexec rm -rf ${tmpdir}
+
+ eheading "creating new trac project"
+ eexec mysqladmin create ${trac_db}
+ eexec trac-admin ${trac_home} initenv --inherit=${TRAC_INI} ${project_name} "mysql://${MYSQL_USER}:${MYSQL_PASS}@${MYSQL_HOST}/${trac_db}" svn ${svn_home}
+ if [[ ${project_closed} == y ]]
+ then
+ for perm in BROWSER_VIEW CHANGESET_VIEW FILE_VIEW LOG_VIEW MILESTONE_VIEW \
+ REPORT_SQL_VIEW REPORT_VIEW ROADMAP_VIEW SEARCH_VIEW TICKET_VIEW \
+ TIMELINE_VIEW WIKI_VIEW
+ do
+ eexec trac-admin ${trac_home} permission remove anonymous ${perm}
+ done
+ fi
+
+ for perm in TICKET_CREATE TICKET_MODIFY WIKI_CREATE WIKI_MODIFY
+ do
+ eexec trac-admin ${trac_home} permission remove authenticated ${perm}
+ done
+
+ eexec trac-admin ${trac_home} permission add authenticated TRAC_ADMIN
+
+ eheading "setting up apache2"
+ eexec sed -i -e "\$a\\# ${project_name} (added on $(date -R))\\" ${APACHE_PROJECT_CONF}
+ eexec sed -i -e "\$a\\Use TracProject ${project_name}\\" ${APACHE_PROJECT_CONF}
+
+ if [[ ${project_closed} == y ]]
+ then
+ eexec sed -i -e "\$a\\Use SVNProjectClosed ${project_name}\\" ${APACHE_PROJECT_CONF}
+ else
+ eexec sed -i -e "\$a\\Use SVNProject ${project_name}\\" ${APACHE_PROJECT_CONF}
+ fi
+
+ echo >> ${APACHE_PROJECT_CONF}
+ eexec /etc/init.d/apache2 reload
+
+ eheading "committing changes to our git-repository in /etc"
+ pushd /etc > /dev/null
+ eexec git add ${APACHE_PROJECT_CONF/\/etc\/}
+ eexec git commit -m "added new project ${project_name}"
+ popd > /dev/null
+
+ eheading "requesting new mailinglist for the project"
+ # register mailinglist (owner is user_email) for the new project
+ eexec wget --no-check-certificate --post-data "name=commit-${project_name}&email=${user_email}" \
+ https://lists.spline.inf.fu-berlin.de/cgi-bin/neueliste.pl
+
+ echo
+ einfo
+ einfo "done! success! jipii! neeeat!"
+ einfo "you can find your project at $(color yellow)https://dev.spline.de/trac/${project_name}$(color)"
+ einfo
+ echo
+}
+
+# go to script dir
+pushd $(dirname $0) > /dev/null
+
+# get global functions
+source "./functions.sh"
+
+# load configuration
+source "./config.sh"
+
+# exit on errors
+set -e
+
+# start main program
+main "$@"
+
+# leave script dir
+popd > /dev/null
diff --git a/bin/config.sh b/bin/config.sh
new file mode 100644
index 0000000..182f577
--- /dev/null
+++ b/bin/config.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+MYSQL_HOST=localhost
+MYSQL_USER=trac
+MYSQL_PASS=z8cdFshvR
+SVN_ROOT=/var/lib/svn
+TRAC_INI=/etc/trac/trac.ini
+TRAC_ROOT=/var/lib/trac
+APACHE_PROJECT_CONF=/etc/apache2/vhosts.d/dev_vhost.include
diff --git a/bin/delproject b/bin/delproject
new file mode 100755
index 0000000..4852276
--- /dev/null
+++ b/bin/delproject
@@ -0,0 +1,99 @@
+#!/bin/bash
+
+# main function
+main() {
+ echo
+
+ # project_name may not be an empty string and must be >= 3 characters
+ while [[ ${#project_name} -lt 3 ]]
+ do
+ eask_str "a project name (min 3 chars)"
+ project_name=${REPLY}
+ done
+
+ svn_home=${SVN_ROOT}/${project_name}
+ trac_home=${TRAC_ROOT}/${project_name}
+ trac_db=trac_${project_name}
+
+ eheading "deleting apache configuration"
+ eexec sed -i -e "/^# ${project_name} /,/^\$/d" ${APACHE_PROJECT_CONF}
+ eexec /etc/init.d/apache2 reload
+
+ eheading "committing changes to our git-repository in /etc"
+ pushd /etc >> /dev/null
+ eexec git add ${APACHE_PROJECT_CONF/\/etc\/}
+ eexec git commit -m "deleted project ${project_name}" || :
+ popd >> /dev/null
+
+
+ random_dir=$(echo $RANDOM |md5sum |awk '{print $1}')
+ backup_file=/var/www/localhost/htdocs/backup/${random_dir}/${project_name}-$(date +%Y%b%d).tar.bz2
+
+ eheading "creating backup in ${backup_file}"
+
+ tmpdir=$(mktemp -d)
+ eexec rsync -a ${svn_home}/ ${tmpdir}/svn/
+ eexec rsync -a ${trac_home}/ ${tmpdir}/trac/
+ eexec mysqldump ${trac_db} -r ${tmpdir}/trac.sql
+ eexec mkdir -p $(dirname ${backup_file})
+ eexec tar --exclude trac.ini -cjf ${backup_file} -C ${tmpdir} .
+ eexec rm -rf ${tmpdir}
+
+ # get all member email from the database 'mysql trac'
+ members=$(mysql -s -s -e \
+ "select u.email from user u join member m on m.user_id = u.id join project p on p.id = m.project_id where p.project_name = '${project_name}'" \
+ trac)
+
+ eheading "making the backup available for the project members"
+ einfo "sending backup link to "
+ for member in ${members}
+ do
+ einfo " ${member}"
+ sendmail -t <<-EOF
+ From: dev@spline.de
+ Subject: the project ${project_name} has been deleted
+ To: ${member}
+
+ hello ${member},
+
+ the project ${project_name} of which you have been a member has been
+ deleted. for the next week you can however download a backup of the
+ project using this link:
+
+ https://dev.spline.de/backup/${random_dir}/$(basename ${backup_file})
+
+ yours,
+ the dev.spline.de team
+ EOF
+ done
+
+ eheading "deleting project files"
+ eexec rm -rf ${svn_home}
+ eexec rm -rf ${trac_home}
+ eexec mysqladmin --force drop ${trac_db}
+ eexec mysql -e "DELETE FROM project WHERE project_name = '${project_name}'" trac
+
+ einfo
+ einfo "done! success! jipii! neeeat!"
+ einfo "you cannot find your project anywhere now"
+ einfo
+ echo
+}
+
+# go to script dir
+pushd $(dirname $0) > /dev/null
+
+# get global functions
+source "./functions.sh"
+
+# load configuration
+source "./config.sh"
+
+# exit on errors
+set -e
+
+# start main program
+main "$@"
+
+# leave script dir
+popd > /dev/null
diff --git a/bin/functions.sh b/bin/functions.sh
new file mode 100644
index 0000000..3dbbb7c
--- /dev/null
+++ b/bin/functions.sh
@@ -0,0 +1,202 @@
+# output handling
+coco() {
+ [[ -z "$1" ]] && echo -ne "\033[0m" || echo -ne "\033[${1}m"
+}
+
+# name all colors to get rid of hieroglyphics
+color() {
+ case $1 in
+ black) coco '0;30' ;;
+ dgray) coco '1;30' ;;
+ red) coco '0;31' ;;
+ lred) coco '1;31' ;;
+ green) coco '0;32' ;;
+ lgreen) coco '1;32' ;;
+ brown) coco '0;33' ;;
+ yellow) coco '1;33' ;;
+ blue) coco '0;34' ;;
+ lblue) coco '1;34' ;;
+ purple) coco '0;35' ;;
+ lpurple) coco '1;35' ;;
+ cyan) coco '0;36' ;;
+ lcyan) coco '1;36' ;;
+ lgray) coco '0;37' ;;
+ white) coco '1;37' ;;
+ *) coco '0' ;;
+ esac
+}
+
+_einfon() {
+ echo -ne " ${GOOD}*${NORMAL} $*"
+ return 0
+}
+
+_einfo() {
+ echo -e " ${GOOD}*${NORMAL} $*"
+ return 0
+}
+
+_ewarn() {
+ echo -e " ${WARN}*${NORMAL} $*"
+ return 0
+}
+
+_eerror() {
+ echo -e " ${BAD}*${NORMAL} $*"
+ return 0
+}
+
+_ewrap() {
+ local cmd="$1"
+ shift
+
+ local c="${ENDCOL}"
+ local p="$* "
+ local max=$((COLS - 11))
+
+ # Only use what we have space for
+ local d="${p%%\\n*}"
+ if [[ ${d} == "${p}" ]] ; then
+ d="${p:0:${max}}"
+ else
+ d="${d} "
+ fi
+
+ # Grab the last whole word
+ [[ ${#d} == "${max}" ]] && d="${d% *}"
+
+ # Print that
+ _${cmd} "${d}"
+
+ # Recurse on the rest
+ local r="$*"
+ d="${d} "
+ r="${r:${#d}}"
+ [[ -n ${r} ]] && ${cmd} "${r}"
+
+ return 0
+}
+
+einfo() {
+ _ewrap einfo "$*"
+}
+
+ewarn() {
+ _ewrap ewarn "$*"
+}
+
+eerror() {
+ _ewrap eerror "$*"
+ return 1
+}
+
+eheading() {
+ echo
+ echo -n "$(color green)>>> "
+ echo -n "$@"
+ echo " <<<$(color)"
+}
+
+# input handling
+eask_num() {
+ local -i reply=
+ _einfon
+ read -p "Please enter ${1:-Number} or press CTRL-C to abort> " reply
+ REPLY=${reply}
+}
+
+eask_str() {
+ local reply=
+ _einfon
+ read -p "Please enter ${1:-String} or press CTRL-C to abort> " reply
+ REPLY=${reply}
+}
+
+eask_bool() {
+ local reply= default=${2} str="[y/n]"
+
+ if [[ ${default} == y || ${default} == Y || ${default} == true ]]
+ then
+ str="[Y/n]"
+ elif [[ ${default} == n || ${default} == N || ${default} == false ]]
+ then
+ str="[y/N]"
+ fi
+
+ while [[ "${reply}" != y && "${reply}" != n ]]; do
+ _einfon
+ read -p "${1} ${str} " reply
+
+ if [[ -z ${reply} ]]
+ then
+ reply=${default}
+ break
+ fi
+ done
+
+ REPLY=${reply}
+}
+
+
+echoose() {
+ einfo ${1:-"Choose something from the following list"}
+ einfo
+ shift
+
+ local -a items=
+
+ while true; do
+ items=()
+
+ for i in "$@"; do
+ items=( "${items[@]}" "${i}" )
+ einfo "${#items[@]}) ${i}"
+ done
+
+ eask_num
+
+ if [[ ${REPLY} -le 0 || ${REPLY} -gt ${#items[@]} ]]; then
+ eerror "\nInvalid selection. Try again.\n " || :
+ else
+ break
+ fi
+ done
+
+ REPLY=${items[$(( ${REPLY} - 1 ))]}
+}
+
+# make-like exec wrapper
+eexec() {
+ einfo "$@"
+ "$@"
+}
+
+# alway use the right thing, even if EDITOR is not set
+editor() {
+ if [[ -z "${EDITOR}" || ! -x "${EDITOR}" ]]; then
+ if [[ -x /usr/bin/vim ]]; then
+ EDITOR=/usr/bin/vim
+ elif [[ -x /usr/bin/nano ]]; then
+ EDITOR=/usr/bin/nano
+ fi
+ fi
+
+ [[ -x ${EDITOR} ]] && ${EDITOR} "$@"
+}
+
+# Setup a secure $PATH. Just add system defaults.
+PATH="/bin:/sbin:/usr/bin:/usr/sbin"
+
+if [[ -z ${COLS} || -n ${COLUMNS} ]] ; then
+ COLS="${COLUMNS:-0}"
+ (( COLS == 0 )) && COLS=$(set -- `stty size 2>/dev/null` ; echo "$2")
+ (( COLS > 0 )) || (( COLS = 80 ))
+fi
+
+ENDCOL=$'\e[A\e['$(( COLS - 9 ))'C'
+GOOD=$'\e[32;01m'
+WARN=$'\e[33;01m'
+BAD=$'\e[31;01m'
+NORMAL=$'\e[0m'
+
+# vim: set ts=4 :