#!/bin/bash dbquery() { mysql -s -s -e "$*" trac } # 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 if [[ -n $(dbquery "SELECT id FROM project WHERE project_name = '${project_name}'") ]] then eerror "Project ${project_name} already exists." fi eask_str "a project description" project_desc=${REPLY} # svn_name may not be an empty string and must be >= 3 characters eask_str "a gforge svn repository name (LEAVE BLANK if this is a new project)" gforge_name=${REPLY} if [[ -n ${gforge_name} && ! -d /mnt/gforge/var/lib/gforge/svn/${gforge_name} ]] then eerror "Repository ${gforge_name} does not exists." fi # who requests the project ? while [[ -z ${user_name} ]] do eask_str "username of applicant" user_name=${REPLY} done user_email=$(dbquery "SELECT email FROM user WHERE login = '${user_name}'") if [[ -z ${user_email} ]] then eerror "Username ${user_name} does not exist." fi 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} if [[ -z ${gforge_name} ]] then 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} else eheading "using existing gforge repository" eexec svnadmin create ${svn_home} tmpfile=$(mktemp) svnadmin dump /mnt/gforge/var/lib/gforge/svn/${gforge_name} > ${tmpfile} svnadmin load ${svn_home} < ${tmpfile} rm -f ${tmpfile} fi eheading "creating subversion post-commit hook" cat < ${svn_home}/hooks/post-commit #!/bin/bash REPOS="\$1" REV="\$2" TRAC_ENV="/var/lib/trac/${project_name}/" /usr/bin/python /usr/local/bin/trac-post-commit-hook -p "\$TRAC_ENV" -r "\$REV" EOF eexec chmod +x ${svn_home}/hooks/post-commit 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} eexec sed -i -e "/^name =/a\\descr = ${project_desc}\\" ${trac_home}/conf/trac.ini 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 eexec trac-admin ${trac_home} permission add authenticated XML_RPC eexec trac-admin ${trac_home} wiki import WikiStart WikiStart.txt eexec trac-admin ${trac_home} wiki import GettingStarted GettingStarted.txt eexec chown apache:apache ${trac_home}/conf/trac.ini eexec chown -R apache:apache ${trac_home}/attachments 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 "adding initial project member to the database" if [[ ${project_closed} == y ]] then eexec dbquery "INSERT INTO project (project_name, private) VALUES ('${project_name}', 1)" else eexec dbquery "INSERT INTO project (project_name) VALUES ('${project_name}')" fi eexec dbquery "INSERT INTO member (user_id, project_id) VALUES (" \ "(SELECT id FROM user WHERE login = '${user_name}')," \ "(SELECT id FROM project WHERE project_name = '${project_name}'))" eexec wget --no-check-certificate -q -O/dev/null https://dev.spline.de/account/genusers eheading "requesting new mailinglist for the project" # register mailinglist (owner is user_email) for the new project eexec wget -q -O /dev/null --no-check-certificate --post-data "name=commit_${project_name}&email=${user_email}" \ https://lists.spline.inf.fu-berlin.de/cgi-bin/neueliste.pl eheading "sending confirmation email to applicant" sendmail -t <<-EOF From: dev@spline.de Subject: your new project has been approved To: ${user_email} Dear ${user_name}, your project (${project_name}) has been created and can be found at https://dev.spline.de/trac/${project_name} Yours, the dev.spline.de team EOF einfo "mail to ${user_email} has been sent" eheading "sending DONE email to dev@spline.de" sendmail -t <<-EOF From: dev@spline.de Subject: project ${project_name} for ${user_name} has been created To: dev@spline.de Dear dev@spline.de, the project ${project_name} for user ${user_name} has been created ! Yours, the dev.spline.de team EOF einfo "mail to dev@spline.de has been sent" echo einfo einfo "done! success! jipii! neeeat!" einfo "you can find the 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