summaryrefslogtreecommitdiff
path: root/localikiwikicreatesite
blob: 95653d087f337018e48fc89a4e27c2604d0ae94e (plain)
  1. #!/bin/sh
  2. #
  3. # /usr/local/bin/localikiwikicreatesite
  4. # Copyright 2008 Jonas Smedegaard <dr@jones.dk>
  5. #
  6. # $Id: localikiwikicreatesite,v 1.13 2008-02-13 15:32:13 jonas Exp $
  7. #
  8. # Initialize ikiwiki site
  9. #
  10. # Origin: http://ikiwiki.info/setup/
  11. #
  12. set -e
  13. PRG=$(basename "$0")
  14. TEMP=$(getopt -s sh -o d:s:fh -l domain:,srcdomain:,force,help -n "$PRG" -- "$@")
  15. if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
  16. eval set -- "$TEMP"
  17. if [ -f /etc/local/ikiwiki.cfg ]; then
  18. . /etc/local/ikiwiki.cfg
  19. fi
  20. gitsrcuri="http://source.jones.dk"
  21. domain="${domain:-example.com}"
  22. srcdomain="$srcdomain"
  23. force="$force"
  24. showhelp() {
  25. cat <<EOF
  26. Usage: $PRG [opts...] PROJECT [HOST [SRCHOST]]
  27. Options:
  28. -d, --domain If HOST is a FQDN: Ignore the DOMAIN value.
  29. If HOST is a shortname: FQDN is HOST.DOMAIN.
  30. If HOST is omitted: FQDN is PROJECT.DOMAIN.
  31. (default: $domain)
  32. -s, --srcdomain If SRCHOST is a FQDN: Ignore the SRCDOMAIN value.
  33. If SRCHOST is a shortname: FQDN is HOST.SRCDOMAIN.
  34. If SRCHOST is omitted: FQDN is source.SRCDOMAIN.
  35. (default: ${srcdomain:-$domain without any leading www.})
  36. -f, --force Update without asking for confirmation
  37. -h, --help This help text
  38. Examples:
  39. $PRG -d example.com wiki
  40. $PRG mysite www.example.com source.example.org
  41. EOF
  42. }
  43. exit1() {
  44. echo >&2 "Error: $1"
  45. echo >&2 "Exiting..."
  46. exit 1
  47. }
  48. while true ; do
  49. case "$1" in
  50. -d|--domain) domain="$1"; shift 2;;
  51. -s|--srcdomain) srcdomain="$1"; shift 2;;
  52. -f|--force) force="1"; shift;;
  53. -h|--help) showhelp; exit 0;;
  54. --) shift; break;;
  55. *) exit1 "Internal error!";;
  56. esac
  57. done
  58. # Resolve FQDNs
  59. project="$1"
  60. [ -n "$project" ] || exit1 "ERROR: Project name must be supplied!"
  61. host="$2"
  62. [ -n "$host" ] || host="$project"
  63. echo "$host" | grep -q '\.' || host="$host.$domain"
  64. srchost="$3"
  65. [ -n "$srchost" ] || srchost="source"
  66. if echo "$srchost" | grep -qv '\.'; then
  67. [ -n "$srcdomain" ] || srcdomain=$(echo "$host" | sed 's/^www\.//')
  68. srchost="$srchost.$srcdomain"
  69. fi
  70. SRCDIR=~/private_webdata/$host/content
  71. CFGDIR=~/private_webdata/$host
  72. DESTDIR=~/public_websites/$host
  73. DESTSRCDIR=~/public_websites/$srchost
  74. ## Init public RCS repositories
  75. mkdir -p $DESTSRCDIR/${project}.git $DESTSRCDIR/${project}_content.git
  76. (cd $DESTSRCDIR/${project}_content.git
  77. git --bare init --shared
  78. )
  79. (cd $DESTSRCDIR/${project}.git
  80. git --bare init --shared
  81. )
  82. ## Create initial content
  83. mkdir -p $SRCDIR
  84. cat <<'EOF' >$SRCDIR/index.mdwn
  85. Welcome to your new wiki.
  86. All wikis are supposed to have a <a href="../sandbox/">SandBox</a>,
  87. so this one does too.
  88. ----
  89. This wiki is powered by [ikiwiki](http://ikiwiki.info).
  90. EOF
  91. #ikiwiki --verbose $SRCDIR $DESTDIR --url=http://"$host"
  92. ## Create initial backend
  93. mkdir -p $CFGDIR
  94. cp /usr/share/doc/ikiwiki/html/ikiwiki.setup $CFGDIR
  95. ## Init content RCS
  96. (cd $SRCDIR
  97. git init
  98. echo /.ikiwiki > .gitignore
  99. git add .
  100. git commit -m "initial commit"
  101. git remote add origin $DESTSRCDIR/${project}_content.git
  102. git config branch.master.remote origin
  103. git config branch.master.merge refs/heads/master
  104. git push --all
  105. chmod +x $DESTSRCDIR/${project}_content.git/hooks/post-update
  106. )
  107. ## Init backend RCS
  108. (cd $CFGDIR
  109. git init
  110. echo /content > .gitignore
  111. git add .
  112. git commit -m "initial commit"
  113. git remote add origin $DESTSRCDIR/$project.git
  114. git config branch.master.remote origin
  115. git config branch.master.merge refs/heads/master
  116. git push --all
  117. chmod +x $DESTSRCDIR/${project}.git/hooks/post-update
  118. )
  119. ## Adjust backend to actual paths, and enable Git post-update wrapper
  120. perl -pi -e '
  121. s,^(\s*)#?(srcdir\s*=>\s*")[^"]*("\,\s*),$1$2'$SRCDIR'$3,;
  122. s,^(\s*)#?(destdir\s*=>\s*")[^"]*("\,\s*),$1$2'$DESTDIR'$3,;
  123. s,^(\s*)#?(url\s*=>\s*")[^"]*("\,\s*),$1$2http://'$host'$3,;
  124. s,^(\s*)#?(cgiurl\s*=>\s*")([^"]*)("\,\s*),$1#$2$3$4,;
  125. s,^(\s*)#?(rcs\s*=>\s*")(git)("\,\s*),$1$2$3$4,;
  126. ' $CFGDIR/ikiwiki.setup
  127. perl -0 -pi -e '
  128. s,#{([\s#]*The git post-update wrapper[^}]*\s*)#(\s*wrapper =>\s*")[^"]*("\,\s*[^}]*)#(\s*wrappermode =>[^}]*)#},{$1$2'$DESTSRCDIR/${project}_content.git/hooks/post-update-$project'$3$4},;
  129. ' $CFGDIR/ikiwiki.setup
  130. perl -0 -pi -e 's,\n(exec\s[^\n]*),\nhooks/post-update-'"$project"'\n\n$1,' $DESTSRCDIR/${project}_content.git/hooks/post-update
  131. (cd $CFGDIR
  132. git add ikiwiki.setup
  133. git commit -m "Adjust ikiwiki.setup to use actual paths, and add+enable Git post-update hooks"
  134. )
  135. ## Add Makefile for further customization
  136. cat <<EOF >$CFGDIR/Makefile
  137. #underlays = basewiki smiley templates
  138. underlays = templates
  139. #locale = danish
  140. master = master
  141. #master = master-LOCALE
  142. all: \$(underlays)
  143. \$(underlays):
  144. mkdir \$@
  145. cd \$@ && git init
  146. cd \$@ && git remote add -f -t \$(master:LOCALE=\$(locale)) -m \$(master:LOCALE=\$(locale)) origin $gitsrcuri/${project}_\$@.git
  147. cd \$@ && git merge origin
  148. EOF
  149. (cd $CFGDIR
  150. git add Makefile
  151. git commit -m "Setup local paths"
  152. )
  153. ikiwiki --verbose $SRCDIR $DESTDIR --url=http://"$host" --setup $CFGDIR/ikiwiki.setup
  154. (cd $CFGDIR
  155. git push
  156. )