major update, working fully for mw 1.27
authorIan Kelling <ian@iankelling.org>
Wed, 22 Jun 2016 17:44:33 +0000 (10:44 -0700)
committerIan Kelling <ian@iankelling.org>
Wed, 22 Jun 2016 17:44:33 +0000 (10:44 -0700)
Mediawiki_Setup_Guide
mw-setup-script

index b410697bc76cfb83b43480228e918de4af9f7037..440beaffd1f50cd5372d2452456f61229eedb50b 100644 (file)
@@ -1,8 +1,5 @@
 == Introduction ==
 
 == Introduction ==
 
-'''Currently undergoing revisions to upgrade from mediawiki version 1.23 to 1.27.
-Should be done on 5/30/2016'''
-
 '''tldr''': Automated setup on gnu/linux after you set options in [[#Dependent Variables and Functions]], except email. Any code which is not ready to be run has bold text saying so immediately before it.
 
 ''' Goals / Why use this guide? '''
 '''tldr''': Automated setup on gnu/linux after you set options in [[#Dependent Variables and Functions]], except email. Any code which is not ready to be run has bold text saying so immediately before it.
 
 ''' Goals / Why use this guide? '''
@@ -21,15 +18,15 @@ Should be done on 5/30/2016'''
 
 * Self hosting, single Linux system with Bash shell
 * Root shell is assumed throughout
 
 * Self hosting, single Linux system with Bash shell
 * Root shell is assumed throughout
-* Code blocks are [https://en.wikipedia.org/wiki/Idempotent idempotent] unless stated otherwise
+* Code blocks are [https://en.wikipedia.org/wiki/Idempotent idempotent]
 
 '''Version Support'''
 
 Very minor adjustments needed for other distros. Help expand this list.
 
 '''Version Support'''
 
 Very minor adjustments needed for other distros. Help expand this list.
-* Mediawiki 1.23
-* Fedora 20 (tested)
-* Ubuntu 14.04 (tested)
-* Debian 7
+* Mediawiki 1.27
+* Debian 8 (tested)
+
+Pre 5/2016 revisions ran Mediawiki 1.23, tested on Fedora 20 and Ubuntu 14.04.
 
 == Production Server Prerequisites ==
 
 
 == Production Server Prerequisites ==
 
@@ -98,8 +95,8 @@ export mw_branch=REL1_27
 # customize these questions to something your contributors would know,
 # is not super common / scriptable, and doesn't have the answer in the question
 captchaArray() {
 # customize these questions to something your contributors would know,
 # is not super common / scriptable, and doesn't have the answer in the question
 captchaArray() {
-    if ! grep -Fx '$localSettingsQuestyQuestions = array (' $mwc
-    tee -a $mwc <<'EOF'
+    if ! grep -Fx '$localSettingsQuestyQuestions = array (' $mwc; then
+       tee -a $mwc <<'EOF'
 $localSettingsQuestyQuestions = array (
     "What is the name of the wiki software this site (and wikipedia) uses?" => "Mediawiki",
     "What does f in ofswiki.org stand for?" => "Free"
 $localSettingsQuestyQuestions = array (
     "What is the name of the wiki software this site (and wikipedia) uses?" => "Mediawiki",
     "What does f in ofswiki.org stand for?" => "Free"
@@ -124,47 +121,47 @@ export mw=/var/www/$mwdomain/html/w
 export mw_email="admin@$mwdomain"
 </source>
 
 export mw_email="admin@$mwdomain"
 </source>
 
-Here we define some small useful bash functions. This should be part of the same file.
+Here we define some small useful bash functions. This can be part of the same file.
 
 <source lang="bash">
 # for convenience, Mediawiki config file
 mwc="$mw/LocalSettings.php"
 
 
 <source lang="bash">
 # for convenience, Mediawiki config file
 mwc="$mw/LocalSettings.php"
 
-if isdeb; then
-    apache_user=www-data
-else
-    apache_user=apache
-fi
+# identify if this is a debian based distro
+isdeb() { command -v apt &>/dev/null; }
+# tee unique. append each stdin line if it does not exist in the file
+teeu () {
+    local MAPFILE
+    mapfile -t
+    for line in "${MAPFILE[@]}"; do
+        grep -xFq "$line" "$1" &>/dev/null || tee -a "$1" <<<"$line"
+    done
+}
 
 # get and reset an extension/skin repository, and enable it
 
 # get and reset an extension/skin repository, and enable it
-mw-ext () { mw-extra extension $@; }
-mw-skin() { mw-extra skin $@; }
+mw-ext () { mw-extra extensions $@; }
+mw-skin() { mw-extra skins $@; }
 
 mw-extra() {
 
 mw-extra() {
-    local type=${1}s # extension or skin
+    local type=$1 # extension or skin
     shift
     shift
-    local clone=true
-    if [[ $1 == -g ]]; then
-        clone=false
-        shift
-    fi
     local ext
     for ext in "$@"; do
     local ext
     for ext in "$@"; do
-        if $clone; then
-            local original_pwd="$PWD"
-            # it's ok that this fails if we already have it
-            url=https://git.wikimedia.org/git/mediawiki
-            target=$mw/$type/$ext
+        local original_pwd="$PWD"
+        # it's ok that this fails if we already have it
+        url=https://git.wikimedia.org/git/mediawiki
+        target=$mw/$type/$ext
+        if [[ ! -e $target/.git ]]; then
             git clone $url/$type/$ext.git $target
             git clone $url/$type/$ext.git $target
-            if ! cd $target; then
-                echo "mw-ext error: failed cd $mw/extensions/$ext";
-                exit 1
-            fi
-            git fetch
-            git checkout -qf origin/$mw_branch || git checkout -qf origin/master
-            git clean -xffd
-            cd "$original_pwd"
         fi
         fi
+        if ! cd $target; then
+            echo "mw-ext error: failed cd $mw/extensions/$ext";
+            exit 1
+        fi
+        git fetch
+        git checkout -qf origin/$mw_branch || git checkout -qf origin/master
+        git clean -xffd
+        cd "$original_pwd"
         case $type in
             extensions)
                 if [[ -e $target/extension.json ]]; then
         case $type in
             extensions)
                 if [[ -e $target/extension.json ]]; then
@@ -183,8 +180,8 @@ EOF
                 sed -i '/^wfLoadSkin/d' $mwc
                 sed -i '/^\$wgDefaultSkin/d' $mwc
                 teeu $mwc <<EOF
                 sed -i '/^wfLoadSkin/d' $mwc
                 sed -i '/^\$wgDefaultSkin/d' $mwc
                 teeu $mwc <<EOF
-$wgDefaultSkin = "${ext,,*}";
-wfLoadSkin( 'Vector' );
+\$wgDefaultSkin = "${ext,,*}";
+wfLoadSkin( '$ext' );
 EOF
                 ;;
         esac
 EOF
                 ;;
         esac
@@ -193,6 +190,13 @@ EOF
     # but still add a sleep to make sure everything works right
     sudo -u $apache_user php $mw/maintenance/update.php -q --quick; sleep 1
 }
     # but still add a sleep to make sure everything works right
     sudo -u $apache_user php $mw/maintenance/update.php -q --quick; sleep 1
 }
+
+if command -v apt &>/dev/null; then
+    apache_user=www-data
+else
+    apache_user=apache
+fi
+
 </source>
 
 == Install Mediawiki Dependencies ==
 </source>
 
 == Install Mediawiki Dependencies ==
@@ -203,15 +207,46 @@ The best way to get core dependencies is to install the mediawiki package itself
 
 [[mediawikiwiki:Manual:Installation_requirements|Manual:Installation_requirements]]: Overview of installation requirements.
 
 
 [[mediawikiwiki:Manual:Installation_requirements|Manual:Installation_requirements]]: Overview of installation requirements.
 
+Note, this guide needs a little adjustment before it will work with php7.0: make sure settings are still valid, update ini path.
+
 
 
 <source lang="bash">
 
 
 <source lang="bash">
+# From here on out, exit if a command fails.
+# This will prevent us from not noticing an important failure.
+# We recommend setting this for the entire installation session.
+# If you are running commands interactively, it might be best to
+# put it in your ~/.bashrc temporarily.
+set -eE -o pipefail
+trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
+source ~/mw_vars
+
 if isdeb; then
 if isdeb; then
+    # main reference:
+    # https://www.mediawiki.org/wiki/Manual:Running_MediaWiki_on_Ubuntu
     apt-get update
     apt-get update
-    # noninteractive to avoid mysql password prompt
-    DEBIAN_FRONTEND=noninteractive apt-get -y install mediawiki ImageMagick php5-mysqlnd php-apc
+    apt-get install -y ImageMagick
+    if apt-get install -s mediawiki &>/dev/null; then
+        # in debian wheezy time-frame distros, mediawiki was packaged.
+        apt-get -y install php-apc mediawiki
+    else
+        # https://www.mediawiki.org/wiki/Manual:Installation_requirements
+        if apt-get install -s php7.0 &>/dev/null; then
+            # note, 7.0 is untested by the editor here, since it's not
+            # available in debian 8. it's listed as supported
+            # in the mediawiki page.
+            # noninteractive to avoid mysql password prompt
+            DEBIAN_FRONTEND=noninteractive apt-get install -y apache2 mysql-server \
+                           php7.0 php7.0-mysql libapache2-mod-php7.0 php7.0-xml \
+                           php7.0-apcu
+        else
+            DEBIAN_FRONTEND=noninteractive apt-get install -y apache2 mysql-server \
+                           php5 php5-mysql libapache2-mod-php5 php5-apcu
+        fi
+    fi
     service apache2 restart
 else
     service apache2 restart
 else
+    # note
     # fedora deps are missing a database, so some is translated from debian packages
     yum -y install mediawiki ImageMagick php-mysqlnd php-pecl-apcu mariadb-server
 
     # fedora deps are missing a database, so some is translated from debian packages
     yum -y install mediawiki ImageMagick php-mysqlnd php-pecl-apcu mariadb-server
 
@@ -257,7 +292,9 @@ Here, we [[mediawikiwiki:Download_from_Git]], or reset our installation if it is
 mkdir -p $mw
 cd $mw
 # this will just fail if it already exists which is fine
 mkdir -p $mw
 cd $mw
 # this will just fail if it already exists which is fine
-git clone https://gerrit.wikimedia.org/r/p/mediawiki/core.git .
+if [[ ! -e .git ]]; then
+    git clone https://gerrit.wikimedia.org/r/p/mediawiki/core.git .
+fi
 # to see available branches: https://www.mediawiki.org/wiki/Version_lifecycle
 # and
 # git branch -r
 # to see available branches: https://www.mediawiki.org/wiki/Version_lifecycle
 # and
 # git branch -r
@@ -265,7 +302,9 @@ git checkout -f origin/$mw_branch
 git clean -ffxd
 # Get the php libraries wmf uses. Based on:
 # https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries
 git clean -ffxd
 # Get the php libraries wmf uses. Based on:
 # https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries
-git clone https://gerrit.wikimedia.org/r/p/mediawiki/vendor.git
+if [[ ! -e vendor/.git ]]; then
+    git clone  https://gerrit.wikimedia.org/r/p/mediawiki/vendor.git
+fi
 cd vendor
 git checkout -f origin/$mw_branch
 cd ..
 cd vendor
 git checkout -f origin/$mw_branch
 cd ..
@@ -273,7 +312,7 @@ cd ..
 # Drop any previous database which may have been installed while testing.
 # If upgrading, we should have a db backup which will get restored.
 # https://www.mediawiki.org/wiki/Manual:Upgrading
 # Drop any previous database which may have been installed while testing.
 # If upgrading, we should have a db backup which will get restored.
 # https://www.mediawiki.org/wiki/Manual:Upgrading
-mysql -u root -p$dbpass <<'EOF'
+mysql -u root -p$dbpass <<'EOF' ||:
 drop database my_wiki;
 exit
 EOF
 drop database my_wiki;
 exit
 EOF
@@ -323,6 +362,7 @@ fi
 # remove any existing directory
 rm -rf $mw/../analytics
 mv piwik $mw/../analytics
 # remove any existing directory
 rm -rf $mw/../analytics
 mv piwik $mw/../analytics
+cd $mw
 rm -rf $tmpdir
 
 </source>
 rm -rf $tmpdir
 
 </source>
@@ -356,48 +396,39 @@ a2ensite $mwdomain.conf
 </source>
 Then, copy the input to apache-site below and insert it into the apache config.
 
 </source>
 Then, copy the input to apache-site below and insert it into the apache config.
 
-Here, I use my scripts to setup apache. It's behind nginx because the same server hosts other sites which are not convenient to use the same apache instance.
+Here, we use some scripts automate setting up the Let 's Encrypt cert and
+the apache config.
+
 <source lang="bash">
 <source lang="bash">
+temp=$(mktemp -d)
+cd $temp
+git_site=https://iankelling.org/git
+git clone $git_site/acme-tiny-wrapper
 l=$mw/../../logs
 l=$mw/../../logs
-mkdir $l
+mkdir -p $l
 
 
-acme-tiny-wrapper $mwdomain
-dd of=/etc/apache2/ports.conf <<'EOF'
-Listen 8082
-EOF
+acme-tiny-wrapper/acme-tiny-wrapper $mwdomain
+
+git clone $git_site/basic-https-conf
 { cat <<EOF
 { cat <<EOF
-  ServerAdmin $mw_email
-  RewriteEngine On
-  # make the site's root url go to our main page
-  RewriteRule ^/?wiki(/.*)?\$ %{DOCUMENT_ROOT}/w/index.php [L]
-  # use short urls https://www.mediawiki.org/wiki/Manual:Short_URL
-  RewriteRule ^/*\$ %{DOCUMENT_ROOT}/w/index.php [L]
+ServerAdmin $mw_email
+RewriteEngine On
+# make the site's root url go to our main page
+RewriteRule ^/?wiki(/.*)?\$ %{DOCUMENT_ROOT}/w/index.php [L]
+# use short urls https://www.mediawiki.org/wiki/Manual:Short_URL
+RewriteRule ^/*\$ %{DOCUMENT_ROOT}/w/index.php [L]
 EOF
 EOF
-  find -L $(readlink -f $mw/..) -name .htaccess \
-      | while read line; do
-      echo -e "<Directory ${line%/.htaccess}>\n $(< $line)\n</Directory>";
-  done
-} | apache-site -i -p 127.0.0.1:8082 -- - $mwdomain
-nginx-site -p 8082 $mwdomain
-</source>
-
-
-Turn on the new configuration
-<source lang="bash">
-if isdeb; then
-    a2ensite $mwdomain.conf
-    # for short urls
-    a2enmod rewrite
-    # We restart rather than reload because of the module
-    service apache2 restart
-else
-    systemctl reload httpd.service
-fi
+find -L $(readlink -f $mw/..) -name .htaccess \
+    | while read line; do
+    echo -e "<Directory ${line%/.htaccess}>\n $(< $line)\n</Directory>";
+done
+} | basic-https-conf/apache-site -r ${mw%/*} - $mwdomain
 </source>
 
 Now mediawiki should load in your browser at $mwdomain .
 
 </source>
 
 Now mediawiki should load in your browser at $mwdomain .
 
-Allow proper search bots and internet archiver bots, via [[Mediawiki:Robots.txt]]
+Allow proper search bots and internet archiver bots, via [[Mediawiki:Robots.txt]],
+and install the default skin.
 
 <source lang="bash">
 dd of=$mw/../robots.txt <<'EOF'
 
 <source lang="bash">
 dd of=$mw/../robots.txt <<'EOF'
@@ -406,6 +437,7 @@ Disallow: /w/
         User-agent: ia_archiver
 Allow: /*&action=raw
 EOF
         User-agent: ia_archiver
 Allow: /*&action=raw
 EOF
+mw-skin Vector
 </source>
 
 '''Skippable Notes'''
 </source>
 
 '''Skippable Notes'''
@@ -426,7 +458,6 @@ teeu $mwc<<EOF
 \$wgRightsUrl = "$mw_RightsUrl";
 \$wgRightsText = "$mw_RightsText";
 \$wgRightsIcon = "$mw_RightsIcon";
 \$wgRightsUrl = "$mw_RightsUrl";
 \$wgRightsText = "$mw_RightsText";
 \$wgRightsIcon = "$mw_RightsIcon";
-wfLoadSkin( 'Vector' );
 EOF
 </source>
 Settings I recommend which are different than the defaults.
 EOF
 </source>
 Settings I recommend which are different than the defaults.
@@ -465,8 +496,7 @@ EOF
 # Increase from default of 2M to 100M.
 # This will at least allow high res pics etc.
 php_ini=$(isdeb && echo /etc/php5/apache2/php.ini || echo /etc/php.ini)
 # Increase from default of 2M to 100M.
 # This will at least allow high res pics etc.
 php_ini=$(isdeb && echo /etc/php5/apache2/php.ini || echo /etc/php.ini)
-sed -i 's/^\(upload_max_filesize\)\b.*/\1 = 100M/'
-sed -i 's/^\(post_max_size\)\b.*/\1 = 100M/'
+sed -i 's/^\(upload_max_filesize\|post_max_size\)\b.*/\1 = 100M/' $php_ini
 if isdeb; then
     service apache2 restart
 else
 if isdeb; then
     service apache2 restart
 else
@@ -485,14 +515,15 @@ Style settings. Omit to use a different style.
 <source lang="bash">
 teeu $mwc <<'EOF'
 $wgLogo = null;
 <source lang="bash">
 teeu $mwc <<'EOF'
 $wgLogo = null;
-$wgShowIPinHeader = false;
-$wgFooterIcons = null;
+#$wgFooterIcons = null;
 EOF
 # Make the toolbox go into the drop down.
 EOF
 # Make the toolbox go into the drop down.
-cd $mw
-git remote add ian git@gitorious.org:mediawiki-toolbox-patch/mediawiki-toolbox-patch.git
-git fetch ian
-git rebase ian/REL1_23-toolbox-in-dropdown
+cd $mw/skins/Vector
+if ! git remote show ian-kelling &>/dev/null; then
+    git remote add ian-kelling https://iankelling.org/git/Vector
+fi
+git fetch ian-kelling
+git checkout ian-kelling/REL1_27-toolbox-in-dropdown
 </source>
 
 == Install and Configure Mediawiki Extensions ==
 </source>
 
 == Install and Configure Mediawiki Extensions ==
@@ -502,54 +533,51 @@ When installing extensions on a wiki with important content, backup first as a p
 ''' Extensions with no configuration needed '''
 
 {| class="wikitable"
 ''' Extensions with no configuration needed '''
 
 {| class="wikitable"
-! Name
-! Description
-|-
-| [[mediawikiwiki:Extension:Cite|Extension:Cite]]
-| Have references in footnotes.
-|-
-| [[mediawikiwiki:Extension:CiteThisPage|Extension:CiteThisPage]]
-| Ability to generate citations to pages in a variety of styles.
-|-
-| [[mediawikiwiki:Extension:CSS|Extension:CSS]]
-| Allows CSS stylesheets to be included in specific articles
-|-
-| [[mediawikiwiki:Extension:DynamicPageList|Extension:DynamicPageList]]
-| Embed page lists from categories & combinations of categories
-|-
-| [[mediawikiwiki:Extension:Echo|Extension:Echo]]
-| Notification subsystem for usage by other extensions
-|-
-| [[mediawikiwiki:Extension:Gadgets|Extension:Gadgets]]
-| UI extension system for users
-|-
-| [[mediawikiwiki:Extension:ImageMap|Extension:ImageMap]]
-| Links for a region of an image
-|-
-| [[mediawikiwiki:Extension:Interwiki|Extension:Interwiki]]
-| Tool for nice links to other wikis
-|-
-| [[mediawikiwiki:Extension:News|Extension:News]]
-| Embed or rss recent changes
-|-
-| [[mediawikiwiki:Extension:Nuke|Extension:Nuke]]
-| Mass delete of pages, in the case of spam
-|-
-| [[mediawikiwiki:Extension:ParserFunctions|Extension:ParserFunctions]]
-| Useful for templates
-|-
-| [[mediawikiwiki:Extension:Poem|Extension:Poem]]
-| Useful for formatting things various ways
-|-
-| [[mediawikiwiki:Extension:SyntaxHighlight_GeSHi|Extension:SyntaxHighlight_GeSHi]]
-| Source code highlighting
-|-
-| [[mediawikiwiki:Extension:Variables|Extension:Variables]]
-| Define per-page variables
-|}
+ ! Name
+ ! Description
+    |-
+    | [[mediawikiwiki:Extension:Cite|Extension:Cite]]
+    | Have references in footnotes.
+    |-
+    | [[mediawikiwiki:Extension:CiteThisPage|Extension:CiteThisPage]]
+    | Ability to generate citations to pages in a variety of styles.
+    |-
+    | [[mediawikiwiki:Extension:CSS|Extension:CSS]]
+    | Allows CSS stylesheets to be included in specific articles
+    |-
+    | [[mediawikiwiki:Extension:Echo|Extension:Echo]]
+    | Notification subsystem for usage by other extensions
+    |-
+    | [[mediawikiwiki:Extension:Gadgets|Extension:Gadgets]]
+    | UI extension system for users
+    |-
+    | [[mediawikiwiki:Extension:ImageMap|Extension:ImageMap]]
+    | Links for a region of an image
+    |-
+    | [[mediawikiwiki:Extension:Interwiki|Extension:Interwiki]]
+    | Tool for nice links to other wikis
+    |-
+    | [[mediawikiwiki:Extension:News|Extension:News]]
+    | Embed or rss recent changes
+    |-
+    | [[mediawikiwiki:Extension:Nuke|Extension:Nuke]]
+    | Mass delete of pages, in the case of spam
+    |-
+    | [[mediawikiwiki:Extension:ParserFunctions|Extension:ParserFunctions]]
+    | Useful for templates
+    |-
+    | [[mediawikiwiki:Extension:Poem|Extension:Poem]]
+    | Useful for formatting things various ways
+    |-
+    | [[mediawikiwiki:Extension:SyntaxHighlight_GeSHi|Extension:SyntaxHighlight_GeSHi]]
+    | Source code highlighting
+    |-
+    | [[mediawikiwiki:Extension:Variables|Extension:Variables]]
+    | Define per-page variables
+    |}
 
 <source lang="bash">
 
 <source lang="bash">
-mw-ext Cite CiteThisPage CSS DynamicPageList Echo Gadgets ImageMap Interwiki News \
+mw-ext Cite CiteThisPage CSS Echo Gadgets ImageMap Interwiki News \
        Nuke ParserFunctions Poem SyntaxHighlight_GeSHi Variables
 </source>
 
        Nuke ParserFunctions Poem SyntaxHighlight_GeSHi Variables
 </source>
 
@@ -593,7 +621,12 @@ fi
 mw-ext Math
 # php5-curl according to Math readme
 if isdeb; then
 mw-ext Math
 # php5-curl according to Math readme
 if isdeb; then
-    apt-get -y install latex-cjk-all texlive-latex-extra texlive-latex-base ghostscript imagemagick ocaml php5-curl
+    curl_pkg=php7.0-curl
+    if ! apt-get -s install $curl_pkg &>/dev/null; then
+        curl_pkg=php5-curl
+    fi
+    apt-get -y install latex-cjk-all texlive-latex-extra texlive-latex-base \
+            ghostscript imagemagick ocaml $curl_pkg make
 else
     # todo, php5-curl equivalent on fedora
     yum -y install texlive-cjk ghostscript ImageMagick texlive ocaml
 else
     # todo, php5-curl equivalent on fedora
     yum -y install texlive-cjk ghostscript ImageMagick texlive ocaml
@@ -735,9 +768,11 @@ There are quite a few [[mediawikiwiki:Help:Namespaces|special pages]] which act
 
 <source lang="bash">
 # get repo
 
 <source lang="bash">
 # get repo
-mkdir ~/opt
-git clone --recursive https://gerrit.wikimedia.org/r/pywikibot/core.git ~/opt/pywikibot
-cd ~/opt/pywikibot
+if [[ ! -e ~/pywikibot/.git ]]; then
+    git clone --recursive \
+        https://gerrit.wikimedia.org/r/pywikibot/core.git ~/pywikibot
+fi
+cd ~/pywikibot
 #updating
 git pull --all
 git submodule update
 #updating
 git pull --all
 git submodule update
@@ -750,7 +785,7 @@ Relevent docs: [[mediawikiwiki:Manual:Pywikibot/Use_on_non-WMF_wikis|Manual:Pywi
 
 
 <source lang="bash">
 
 
 <source lang="bash">
-cd $HOME/opt/pywikibot
+cd $HOME/pywikibot
 dd of=user-config.py <<EOF
 mylang = 'en'
 usernames["$mwfamily"]['en'] = u'$wikiuser'
 dd of=user-config.py <<EOF
 mylang = 'en'
 usernames["$mwfamily"]['en'] = u'$wikiuser'
@@ -765,6 +800,12 @@ EOF
 
 # it won't overrwrite an existing file. Remove if if one exists
 rm -f  pywikibot/families/${mwfamily}_family.py
 
 # it won't overrwrite an existing file. Remove if if one exists
 rm -f  pywikibot/families/${mwfamily}_family.py
+if isdeb; then
+    apt-get install -y python-requests
+else
+    yum -y install python-requests
+fi
+
 python generate_family_file.py https://$mwdomain/wiki/Main_Page "$mwfamily"
 
 # Note, this needed only for ssl site
 python generate_family_file.py https://$mwdomain/wiki/Main_Page "$mwfamily"
 
 # Note, this needed only for ssl site
@@ -780,9 +821,9 @@ EOF
 This will take a full minute or so because the bot waits a few seconds between edits. Useful doc: [[mediawikiwiki:Pywikipediabot/Create_your_own_script]].
 
 <source lang="bash">
 This will take a full minute or so because the bot waits a few seconds between edits. Useful doc: [[mediawikiwiki:Pywikipediabot/Create_your_own_script]].
 
 <source lang="bash">
-pw="$HOME/opt/pywikibot"
+cd "$HOME/pywikibot"
 
 
-dd of=$pw/scripts/${mwfamily}_setup.py<<EOF
+dd of=scripts/${mwfamily}_setup.py<<EOF
 import pywikibot
 import time
 import sys
 import pywikibot
 import time
 import sys
@@ -858,7 +899,6 @@ div#mw-content-text {
 """)
 EOF
 
 """)
 EOF
 
-cd $pw
 python pwb.py ${mwfamily}_setup
 </source>
 
 python pwb.py ${mwfamily}_setup
 </source>
 
@@ -871,39 +911,41 @@ Family name, and all its duplicattions documented as supposed to be $wgSitename,
 
 == Automatic Backups ==
 
 
 == Automatic Backups ==
 
-Copy this to a file (the next block assumes ~/bin/remote_wiki_backup) on a different machine than the one hosting mediawiki. Also copy ~/mw_vars to the same machine. Setup passwordless sudo to the mediawiki host (specifically, name the host $mwdomain). This will make a versioned backup of the wiki to ~/backup/wiki_file_backup and ~/backup/wiki_db_backup.
+Here we will have a daily cronjob where a backup host sshs to the mediawiki host, makes a backup then copies it back. Copy ~/mw_vars to the backup host at /root/mw_vars. Setup passwordless ssh from the backup host to the mediawiki host. Then run this code on the backup host. This will make a versioned backup of the wiki to ~/backup.
 
 
-<source lang="bash">
+<source lang="bash" type="backup">
+backup_script=/etc/cron.daily/mediawiki_backup
+sudo dd of=$backup_script <<'EOFOUTER'
 #!/bin/bash
 #!/bin/bash
-source ~/mw_vars
-
 # if we get an error, keep going but return it at the end
 last_error=0
 trap 'last_error=$?' ERR
 # if we get an error, keep going but return it at the end
 last_error=0
 trap 'last_error=$?' ERR
-
+source ~/mw_vars
+logfile=/var/log/${mwdomain}_backup.log
+{
+echo "#### starting backup at $(date) ####"
 ssh root@$mwdomain <<ENDSSH
 ssh root@$mwdomain <<ENDSSH
+set -x
 tee -a $mwc<<'EOF'
 tee -a $mwc<<'EOF'
-$wgReadOnly = 'Dumping Database, Access will be restored shortly';
+\$wgReadOnly = 'Dumping Database, Access will be restored shortly';
 EOF
 EOF
-mysqldump -p$dbpass --default-character-set=binary my_wiki  > ~/wiki_backup/wikidump
-sed -i '$ d' $mwc # delete last line
+mkdir -p ~/wiki_backups
+mysqldump -p$dbpass --default-character-set=binary my_wiki  > ~/wiki_backups/wiki_db_backup
+sed -i '\$ d' $mwc # delete read only setting
 ENDSSH
 ENDSSH
-rdiff-backup root@$mwdomain::/root/wiki_db_backup ~/backup/wiki_db_backup
-rdiff-backup root@$mwdomain::$mw ~/backup/wiki_file_backup
-
+set -x
+rdiff-backup root@$mwdomain::/root/wiki_backups ~/backup/${mwdomain}_wiki_db_backup
+rdiff-backup root@$mwdomain::$mw ~/backup/${mwdomain}_wiki_file_backup
+set +x
+echo "=== ending backup at $(date) ===="
+}  &>>$logfile
+if [[ $last_error != 0 ]]; then
+    echo "backup for $mwdomain failed. See $logfile"
+fi
 exit $last_error
 exit $last_error
-</source>
-
-Run this script on the backup machine to setup daily backups at 4 am.
+EOFOUTER
 
 
-<source lang="bash">
-chmod +x $HOME/bin/remote_wiki_backup
-x="$(mktemp)"
-crontab -l > "$x"
-teeu "$x" <<'EOF'
-0 4 * * * x=$($HOME/bin/remote_wiki_backup 2>&1); [[ $? != 0 ]] && echo "$x"
-EOF
-crontab "$x"
+sudo chmod +x $backup_script
 </source>
 
 If you are like most people and don't use the old-school mail spool, setup the backup system to send mail externally. Some ways to do that are on this [http://unix.stackexchange.com/questions/36982/can-i-set-up-system-mail-to-use-an-external-smtp-server stackoverflow answer]. Then make local mail to your user get forwarded to an address you will read:
 </source>
 
 If you are like most people and don't use the old-school mail spool, setup the backup system to send mail externally. Some ways to do that are on this [http://unix.stackexchange.com/questions/36982/can-i-set-up-system-mail-to-use-an-external-smtp-server stackoverflow answer]. Then make local mail to your user get forwarded to an address you will read:
@@ -928,14 +970,19 @@ To test a backup restore:
 # Change REPLACE_ME in the code below (as in the backup section so you get the right variables),
 # Execute the code on the backup machine.
 
 # Change REPLACE_ME in the code below (as in the backup section so you get the right variables),
 # Execute the code on the backup machine.
 
-<source lang="bash">
+<source lang="bash" type="example">
+#!/bin/bash
 source ~/mw_vars
 HOSTNAME=REPLACE_ME source ~/mw_vars
 source ~/mw_vars
 HOSTNAME=REPLACE_ME source ~/mw_vars
-rdiff-backup -r now ~/backup/wiki_file_backup /tmp/wiki_file_restore
+rdiff-backup -r now ~/backup/${mwdomain}_wiki_file_backup /tmp/wiki_file_restore
 scp -r /tmp/wiki_file_restore/images root@$mwdomain:$mw/images
 scp -r /tmp/wiki_file_restore/images root@$mwdomain:$mw/images
-rdiff-backup -r now ~/backup/wiki_db_backup /tmp/wiki_db_restore
+rdiff-backup -r now ~/backup/${mwdomain}_wiki_db_backup /tmp/wiki_db_restore
 scp -r /tmp/wiki_db_restore root@$mwdomain:/tmp
 scp -r /tmp/wiki_db_restore root@$mwdomain:/tmp
-ssh root@$mwdomain "mysql -u root -p$dbpass my_wiki < /tmp/wiki_db_restore/wiki_db_dump"
+ssh root@$mwdomain <<EOF
+mysql -u root -p$dbpass my_wiki < /tmp/wiki_db_restore/wiki_db_dump
+php $mw/maintenance/update.php
+EOF
+
 </source>
 
 Then browse to your wiki and see if everything appears to work.
 </source>
 
 Then browse to your wiki and see if everything appears to work.
@@ -950,7 +997,7 @@ Major version upgrades should be done manually, and it is recommended to use a n
 
 Minor updates script:
 <source lang="bash">
 
 Minor updates script:
 <source lang="bash">
-s=$HOME/bin/mediawiki_update
+s=/etc/cron.daily/mediawiki_update
 dd of=$s<<'EOF'
 #!/bin/bash
 source ~/mw_vars
 dd of=$s<<'EOF'
 #!/bin/bash
 source ~/mw_vars
@@ -970,13 +1017,6 @@ done
 php $mw/maintenance/update.php -q
 EOF
 chmod +x $s
 php $mw/maintenance/update.php -q
 EOF
 chmod +x $s
-
-x="$(mktemp)"
-crontab -l > "$x"
-teeu "$x" <<EOF
-0 5 * * * $s
-EOF
-crontab "$x"
 </source>
 
 == Upgrading Major Versions ==
 </source>
 
 == Upgrading Major Versions ==
@@ -992,15 +1032,25 @@ My strategy is:
 
 == Setup Piwik ==
 
 
 == Setup Piwik ==
 
+Note,
 <source lang="bash">
 <source lang="bash">
-# docs suggests using separate database user, google lead me here for how
-# https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql
+# based on recommendation from install page
+if ! dpkg -s php5-gd &>/dev/null; then
+    apt-get install -y php5-gd
+    service apache2 restart
+fi
+
+# docs suggests using separate database user
 mysql -u root -p$dbpass <<EOF
 mysql -u root -p$dbpass <<EOF
-CREATE USER 'piwik'@'localhost' IDENTIFIED BY '$piwik_pass';
-GRANT ALL PRIVILEGES ON piwik . * TO 'piwik'@'localhost';
+GRANT ALL ON piwik.* TO 'piwik'@'localhost' IDENTIFIED BY '$piwik_pass';
 FLUSH PRIVILEGES;
 exit
 EOF
 FLUSH PRIVILEGES;
 exit
 EOF
+php_ini=$(isdeb && echo /etc/php5/apache2/php.ini || echo /etc/php.ini)
+# based on the install page. however, ths option is changing with php7.0
+opt=always_populate_raw_post_data
+sed -ri "/^ *$opt\b/d;/^ *\[PHP\]/a $opt = -1" $php_ini
+service apache2 restart
 </source>
 
 
 </source>
 
 
@@ -1008,7 +1058,7 @@ EOF
 
 Unfortunately, Piwik does not document how to do a fully automated install, and although it certainly seems possible, my first glance at the config file after doing manual steps showed a lot of noise, so we are sticking with the manual steps for now.
 
 
 Unfortunately, Piwik does not document how to do a fully automated install, and although it certainly seems possible, my first glance at the config file after doing manual steps showed a lot of noise, so we are sticking with the manual steps for now.
 
-In a browser, navigate to your_domain/analytics. Follow these steps [http://piwik.org/docs/installation/#the-5-minute-piwik-installation the-5-minute-piwik-installation], using the database password from the previous section.
+In a browser, navigate to your_domain/analytics. Follow these steps [http://piwik.org/docs/installation/#the-5-minute-piwik-installation the-5-minute-piwik-installation]. Use the user/db/pass from the previous section.
 
 
 We are going to use an extension to handle the javaScript tracking tag part.
 
 
 We are going to use an extension to handle the javaScript tracking tag part.
@@ -1020,7 +1070,7 @@ Under settings -> user settings, click the cookie to exclude your current browse
 
 <source lang="bash">
 git clone https://github.com/DaSchTour/piwik-mediawiki-extension.git $mw/extensions/Piwik
 
 <source lang="bash">
 git clone https://github.com/DaSchTour/piwik-mediawiki-extension.git $mw/extensions/Piwik
-mw-ext -g Piwik
+mw-ext Piwik
 teeu $mwc <<EOF
 \$wgPiwikURL = '$mwdomain/analytics/';
 \$wgPiwikIDSite = '1';
 teeu $mwc <<EOF
 \$wgPiwikURL = '$mwdomain/analytics/';
 \$wgPiwikIDSite = '1';
@@ -1032,34 +1082,21 @@ EOF
 
 You will need to adjust the previous $wgPiwikIDSite variable. The correct value can be found in the Piwik javaScript tracking tag code, in the line that looks like <code>_paq.push(['setSiteId', 2]);</code>
 
 
 You will need to adjust the previous $wgPiwikIDSite variable. The correct value can be found in the Piwik javaScript tracking tag code, in the line that looks like <code>_paq.push(['setSiteId', 2]);</code>
 
-'''Automatic Updates'''
+'''Updates'''
 
 
-Automatically update on tuesday, 3 am server time. This code will create an update script at ~/bin/piwik-remote-update. Based on [http://piwik.org/docs/update/ piwik.org/docs/update].
+Based on [http://piwik.org/docs/update/ piwik.org/docs/update]. Previously it's been seen to require manual steps, so it is not recommended to put in a cron script.
 
 
-<source lang="bash">
-s=~/bin/piwik-update
+<source lang="bash" type="example">
 mkdir -p ${s%/*}
 mkdir -p ${s%/*}
-dd of=$s <<EOF
-#!/bin/bash
 piwik_path=$mw/../analytics
 piwik_path=$mw/../analytics
-cd "\$(mktemp -d)"
+cd "$(mktemp -d)"
 wget -q http://builds.piwik.org/piwik.zip
 unzip -q piwik.zip
 rm -f piwik.zip
 wget -q http://builds.piwik.org/piwik.zip
 unzip -q piwik.zip
 rm -f piwik.zip
-cp \$piwik_path/config/config.ini.php piwik/config
-cp -rf piwik/* \$piwik_path
+cp $piwik_path/config/config.ini.php piwik/config
+cp -rf piwik/* $piwik_path
 # prevent making an email out of the standard success response
 # prevent making an email out of the standard success response
-x="\$( \$piwik_path/console core:update )"
-if [[ \$x != "Everything is already up to date." ]]; then
-echo "\$x"
-fi
-EOF
-chmod +x $s
-
-x="$(mktemp)"
-crontab -l > "$x"
-teeu "$x" <<< "0 3 * * tue $s"
-crontab "$x"
+$piwik_path/console core:update
 </source>
 
 
 </source>
 
 
@@ -1080,26 +1117,26 @@ Mediawiki.org has pages for ~5200 extensions. Mediawiki maintains ~700 extension
 Here are brief descriptions of extensions that are part of distributions and why they were rejected for this wiki.
 
 {| class="wikitable"
 Here are brief descriptions of extensions that are part of distributions and why they were rejected for this wiki.
 
 {| class="wikitable"
-|+
-| '''InputBox''' || Add html forms to pages. Can't imagine using it. Would install if I did.
-|+
-| '''Pdfhandler''' || Gallery of pages from a pdf file. Can't imagine using it. Would install if I did.
-|+
-| '''Footnote''' || deprecated in newer versions
-|+
-| '''NewUserNotif''' || Send me a notification when a user registers. Seems like an excessive notification.
-|+
-| '''NewestPages''' ||  A page creation history that doesn't expire like recent-changes. Meh
-|+
-| '''RSSReader''' || Embed an rss feed. Can't imagine using it. Would install if I did.
-|+
-| '''Openid''' || Poor UI. 2 pages & 2 links <login> <login with openid> which is confusing & ugly.
-|+
-| '''Validator''' || dependency of of semantic
-|+
-| '''Semantic''' || Seems like a lot of trouble around analyzing kinds of data which my wiki will not have.
-|+
-| '''wikicalendar''' || Make a calendar of events etc. Can't imagine using it. Would install if I did.
+   |+
+   | '''InputBox''' || Add html forms to pages. Can't imagine using it. Would install if I did.
+   |+
+   | '''Pdfhandler''' || Gallery of pages from a pdf file. Can't imagine using it. Would install if I did.
+   |+
+   | '''Footnote''' || deprecated in newer versions
+   |+
+   | '''NewUserNotif''' || Send me a notification when a user registers. Seems like an excessive notification.
+   |+
+   | '''NewestPages''' ||  A page creation history that doesn't expire like recent-changes. Meh
+   |+
+   | '''RSSReader''' || Embed an rss feed. Can't imagine using it. Would install if I did.
+   |+
+   | '''Openid''' || Poor UI. 2 pages & 2 links <login> <login with openid> which is confusing & ugly.
+   |+
+   | '''Validator''' || dependency of of semantic
+   |+
+   | '''Semantic''' || Seems like a lot of trouble around analyzing kinds of data which my wiki will not have.
+   |+
+   | '''wikicalendar''' || Make a calendar of events etc. Can't imagine using it. Would install if I did.
 |}
 
 == Misc Notes ==
 |}
 
 == Misc Notes ==
@@ -1144,7 +1181,5 @@ This means the code is compatible with gplv3.
 == todo list for this page ==
 
 * Evaluate any extensions bundled in 27 which I haven't checked out before.
 == todo list for this page ==
 
 * Evaluate any extensions bundled in 27 which I haven't checked out before.
-* Update style patch link.
 * Visual editor
 * Visual editor
-* Upgrade instructions
-* Consider changing default signature to not have talk link
+* Don't require registration for edits
index 151d9495643ede6662fa481adbf91a318abb101f..7aca959fb344d62421125abdb9cefd5b0a405647 100755 (executable)
@@ -5,41 +5,41 @@
 # for convenience, Mediawiki config file
 mwc="$mw/LocalSettings.php"
 
 # for convenience, Mediawiki config file
 mwc="$mw/LocalSettings.php"
 
-if isdeb; then
-    apache_user=www-data
-else
-    apache_user=apache
-fi
+# identify if this is a debian based distro
+isdeb() { command -v apt &>/dev/null; }
+# tee unique. append each stdin line if it does not exist in the file
+teeu () {
+    local MAPFILE
+    mapfile -t
+    for line in "${MAPFILE[@]}"; do
+        grep -xFq "$line" "$1" &>/dev/null || tee -a "$1" <<<"$line"
+    done
+}
 
 # get and reset an extension/skin repository, and enable it
 
 # get and reset an extension/skin repository, and enable it
-mw-ext () { mw-extra extension $@; }
-mw-skin() { mw-extra skin $@; }
+mw-ext () { mw-extra extensions $@; }
+mw-skin() { mw-extra skins $@; }
 
 mw-extra() {
 
 mw-extra() {
-    local type=${1}s # extension or skin
+    local type=$1 # extension or skin
     shift
     shift
-    local clone=true
-    if [[ $1 == -g ]]; then
-        clone=false
-        shift
-    fi
     local ext
     for ext in "$@"; do
     local ext
     for ext in "$@"; do
-        if $clone; then
-            local original_pwd="$PWD"
-            # it's ok that this fails if we already have it
-            url=https://git.wikimedia.org/git/mediawiki
-            target=$mw/$type/$ext
+        local original_pwd="$PWD"
+        # it's ok that this fails if we already have it
+        url=https://git.wikimedia.org/git/mediawiki
+        target=$mw/$type/$ext
+        if [[ ! -e $target/.git ]]; then
             git clone $url/$type/$ext.git $target
             git clone $url/$type/$ext.git $target
-            if ! cd $target; then
-                echo "mw-ext error: failed cd $mw/extensions/$ext";
-                exit 1
-            fi
-            git fetch
-            git checkout -qf origin/$mw_branch || git checkout -qf origin/master
-            git clean -xffd
-            cd "$original_pwd"
         fi
         fi
+        if ! cd $target; then
+            echo "mw-ext error: failed cd $mw/extensions/$ext";
+            exit 1
+        fi
+        git fetch
+        git checkout -qf origin/$mw_branch || git checkout -qf origin/master
+        git clean -xffd
+        cd "$original_pwd"
         case $type in
             extensions)
                 if [[ -e $target/extension.json ]]; then
         case $type in
             extensions)
                 if [[ -e $target/extension.json ]]; then
@@ -58,8 +58,8 @@ EOF
                 sed -i '/^wfLoadSkin/d' $mwc
                 sed -i '/^\$wgDefaultSkin/d' $mwc
                 teeu $mwc <<EOF
                 sed -i '/^wfLoadSkin/d' $mwc
                 sed -i '/^\$wgDefaultSkin/d' $mwc
                 teeu $mwc <<EOF
-$wgDefaultSkin = "${ext,,*}";
-wfLoadSkin( 'Vector' );
+\$wgDefaultSkin = "${ext,,*}";
+wfLoadSkin( '$ext' );
 EOF
                 ;;
         esac
 EOF
                 ;;
         esac
@@ -68,14 +68,50 @@ EOF
     # but still add a sleep to make sure everything works right
     sudo -u $apache_user php $mw/maintenance/update.php -q --quick; sleep 1
 }
     # but still add a sleep to make sure everything works right
     sudo -u $apache_user php $mw/maintenance/update.php -q --quick; sleep 1
 }
+
+if command -v apt &>/dev/null; then
+    apache_user=www-data
+else
+    apache_user=apache
+fi
+
 # </source>
 # <source lang="bash">
 # </source>
 # <source lang="bash">
+# From here on out, exit if a command fails.
+# This will prevent us from not noticing an important failure.
+# We recommend setting this for the entire installation session.
+# If you are running commands interactively, it might be best to
+# put it in your ~/.bashrc temporarily.
+set -eE -o pipefail
+trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
+source ~/mw_vars
+
 if isdeb; then
 if isdeb; then
+    # main reference:
+    # https://www.mediawiki.org/wiki/Manual:Running_MediaWiki_on_Ubuntu
     apt-get update
     apt-get update
-    # noninteractive to avoid mysql password prompt
-    DEBIAN_FRONTEND=noninteractive apt-get -y install mediawiki ImageMagick php5-mysqlnd php-apc
+    apt-get install -y ImageMagick
+    if apt-get install -s mediawiki &>/dev/null; then
+        # in debian wheezy time-frame distros, mediawiki was packaged.
+        apt-get -y install php-apc mediawiki
+    else
+        # https://www.mediawiki.org/wiki/Manual:Installation_requirements
+        if apt-get install -s php7.0 &>/dev/null; then
+            # note, 7.0 is untested by the editor here, since it's not
+            # available in debian 8. it's listed as supported
+            # in the mediawiki page.
+            # noninteractive to avoid mysql password prompt
+            DEBIAN_FRONTEND=noninteractive apt-get install -y apache2 mysql-server \
+                           php7.0 php7.0-mysql libapache2-mod-php7.0 php7.0-xml \
+                           php7.0-apcu
+        else
+            DEBIAN_FRONTEND=noninteractive apt-get install -y apache2 mysql-server \
+                           php5 php5-mysql libapache2-mod-php5 php5-apcu
+        fi
+    fi
     service apache2 restart
 else
     service apache2 restart
 else
+    # note
     # fedora deps are missing a database, so some is translated from debian packages
     yum -y install mediawiki ImageMagick php-mysqlnd php-pecl-apcu mariadb-server
 
     # fedora deps are missing a database, so some is translated from debian packages
     yum -y install mediawiki ImageMagick php-mysqlnd php-pecl-apcu mariadb-server
 
@@ -103,7 +139,9 @@ fi
 mkdir -p $mw
 cd $mw
 # this will just fail if it already exists which is fine
 mkdir -p $mw
 cd $mw
 # this will just fail if it already exists which is fine
-git clone https://gerrit.wikimedia.org/r/p/mediawiki/core.git .
+if [[ ! -e .git ]]; then
+    git clone https://gerrit.wikimedia.org/r/p/mediawiki/core.git .
+fi
 # to see available branches: https://www.mediawiki.org/wiki/Version_lifecycle
 # and
 # git branch -r
 # to see available branches: https://www.mediawiki.org/wiki/Version_lifecycle
 # and
 # git branch -r
@@ -111,7 +149,9 @@ git checkout -f origin/$mw_branch
 git clean -ffxd
 # Get the php libraries wmf uses. Based on:
 # https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries
 git clean -ffxd
 # Get the php libraries wmf uses. Based on:
 # https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries
-git clone https://gerrit.wikimedia.org/r/p/mediawiki/vendor.git
+if [[ ! -e vendor/.git ]]; then
+    git clone  https://gerrit.wikimedia.org/r/p/mediawiki/vendor.git
+fi
 cd vendor
 git checkout -f origin/$mw_branch
 cd ..
 cd vendor
 git checkout -f origin/$mw_branch
 cd ..
@@ -119,7 +159,7 @@ cd ..
 # Drop any previous database which may have been installed while testing.
 # If upgrading, we should have a db backup which will get restored.
 # https://www.mediawiki.org/wiki/Manual:Upgrading
 # Drop any previous database which may have been installed while testing.
 # If upgrading, we should have a db backup which will get restored.
 # https://www.mediawiki.org/wiki/Manual:Upgrading
-mysql -u root -p$dbpass <<'EOF'
+mysql -u root -p$dbpass <<'EOF' ||:
 drop database my_wiki;
 exit
 EOF
 drop database my_wiki;
 exit
 EOF
@@ -148,42 +188,34 @@ fi
 # remove any existing directory
 rm -rf $mw/../analytics
 mv piwik $mw/../analytics
 # remove any existing directory
 rm -rf $mw/../analytics
 mv piwik $mw/../analytics
+cd $mw
 rm -rf $tmpdir
 
 # </source>
 # <source lang="bash">
 rm -rf $tmpdir
 
 # </source>
 # <source lang="bash">
+temp=$(mktemp -d)
+cd $temp
+git_site=https://iankelling.org/git
+git clone $git_site/acme-tiny-wrapper
 l=$mw/../../logs
 l=$mw/../../logs
-mkdir $l
+mkdir -p $l
 
 
-acme-tiny-wrapper $mwdomain
-dd of=/etc/apache2/ports.conf <<'EOF'
-Listen 8082
-EOF
+acme-tiny-wrapper/acme-tiny-wrapper $mwdomain
+
+git clone $git_site/basic-https-conf
 { cat <<EOF
 { cat <<EOF
-  ServerAdmin $mw_email
-  RewriteEngine On
-  # make the site's root url go to our main page
-  RewriteRule ^/?wiki(/.*)?\$ %{DOCUMENT_ROOT}/w/index.php [L]
-  # use short urls https://www.mediawiki.org/wiki/Manual:Short_URL
-  RewriteRule ^/*\$ %{DOCUMENT_ROOT}/w/index.php [L]
-EOF
-  find -L $(readlink -f $mw/..) -name .htaccess \
-      | while read line; do
-      echo -e "<Directory ${line%/.htaccess}>\n $(< $line)\n</Directory>";
-  done
-} | apache-site -i -p 127.0.0.1:8082 -- - $mwdomain
-nginx-site -p 8082 $mwdomain
-# </source>
-# <source lang="bash">
-if isdeb; then
-    a2ensite $mwdomain.conf
-    # for short urls
-    a2enmod rewrite
-    # We restart rather than reload because of the module
-    service apache2 restart
-else
-    systemctl reload httpd.service
-fi
+ServerAdmin $mw_email
+RewriteEngine On
+# make the site's root url go to our main page
+RewriteRule ^/?wiki(/.*)?\$ %{DOCUMENT_ROOT}/w/index.php [L]
+# use short urls https://www.mediawiki.org/wiki/Manual:Short_URL
+RewriteRule ^/*\$ %{DOCUMENT_ROOT}/w/index.php [L]
+EOF
+find -L $(readlink -f $mw/..) -name .htaccess \
+    | while read line; do
+    echo -e "<Directory ${line%/.htaccess}>\n $(< $line)\n</Directory>";
+done
+} | basic-https-conf/apache-site -r ${mw%/*} - $mwdomain
 # </source>
 # <source lang="bash">
 dd of=$mw/../robots.txt <<'EOF'
 # </source>
 # <source lang="bash">
 dd of=$mw/../robots.txt <<'EOF'
@@ -192,6 +224,7 @@ Disallow: /w/
         User-agent: ia_archiver
 Allow: /*&action=raw
 EOF
         User-agent: ia_archiver
 Allow: /*&action=raw
 EOF
+mw-skin Vector
 # </source>
 # <source lang="bash">
 teeu $mwc<<EOF
 # </source>
 # <source lang="bash">
 teeu $mwc<<EOF
@@ -200,7 +233,6 @@ teeu $mwc<<EOF
 \$wgRightsUrl = "$mw_RightsUrl";
 \$wgRightsText = "$mw_RightsText";
 \$wgRightsIcon = "$mw_RightsIcon";
 \$wgRightsUrl = "$mw_RightsUrl";
 \$wgRightsText = "$mw_RightsText";
 \$wgRightsIcon = "$mw_RightsIcon";
-wfLoadSkin( 'Vector' );
 EOF
 # </source>
 # <source lang="bash">
 EOF
 # </source>
 # <source lang="bash">
@@ -236,8 +268,7 @@ EOF
 # Increase from default of 2M to 100M.
 # This will at least allow high res pics etc.
 php_ini=$(isdeb && echo /etc/php5/apache2/php.ini || echo /etc/php.ini)
 # Increase from default of 2M to 100M.
 # This will at least allow high res pics etc.
 php_ini=$(isdeb && echo /etc/php5/apache2/php.ini || echo /etc/php.ini)
-sed -i 's/^\(upload_max_filesize\)\b.*/\1 = 100M/'
-sed -i 's/^\(post_max_size\)\b.*/\1 = 100M/'
+sed -i 's/^\(upload_max_filesize\|post_max_size\)\b.*/\1 = 100M/' $php_ini
 if isdeb; then
     service apache2 restart
 else
 if isdeb; then
     service apache2 restart
 else
@@ -254,17 +285,18 @@ chmod -R g+w $mw/images
 # <source lang="bash">
 teeu $mwc <<'EOF'
 $wgLogo = null;
 # <source lang="bash">
 teeu $mwc <<'EOF'
 $wgLogo = null;
-$wgShowIPinHeader = false;
-$wgFooterIcons = null;
+#$wgFooterIcons = null;
 EOF
 # Make the toolbox go into the drop down.
 EOF
 # Make the toolbox go into the drop down.
-cd $mw
-git remote add ian git@gitorious.org:mediawiki-toolbox-patch/mediawiki-toolbox-patch.git
-git fetch ian
-git rebase ian/REL1_23-toolbox-in-dropdown
+cd $mw/skins/Vector
+if ! git remote show ian-kelling &>/dev/null; then
+    git remote add ian-kelling https://iankelling.org/git/Vector
+fi
+git fetch ian-kelling
+git checkout ian-kelling/REL1_27-toolbox-in-dropdown
 # </source>
 # <source lang="bash">
 # </source>
 # <source lang="bash">
-mw-ext Cite CiteThisPage CSS DynamicPageList Echo Gadgets ImageMap Interwiki News \
+mw-ext Cite CiteThisPage CSS Echo Gadgets ImageMap Interwiki News \
        Nuke ParserFunctions Poem SyntaxHighlight_GeSHi Variables
 # </source>
 # <source lang="bash">
        Nuke ParserFunctions Poem SyntaxHighlight_GeSHi Variables
 # </source>
 # <source lang="bash">
@@ -290,7 +322,12 @@ fi
 mw-ext Math
 # php5-curl according to Math readme
 if isdeb; then
 mw-ext Math
 # php5-curl according to Math readme
 if isdeb; then
-    apt-get -y install latex-cjk-all texlive-latex-extra texlive-latex-base ghostscript imagemagick ocaml php5-curl
+    curl_pkg=php7.0-curl
+    if ! apt-get -s install $curl_pkg &>/dev/null; then
+        curl_pkg=php5-curl
+    fi
+    apt-get -y install latex-cjk-all texlive-latex-extra texlive-latex-base \
+            ghostscript imagemagick ocaml $curl_pkg make
 else
     # todo, php5-curl equivalent on fedora
     yum -y install texlive-cjk ghostscript ImageMagick texlive ocaml
 else
     # todo, php5-curl equivalent on fedora
     yum -y install texlive-cjk ghostscript ImageMagick texlive ocaml
@@ -395,15 +432,17 @@ sed -i "/\\\$wgGroupPermissions\\['\\*'\\]\\['createaccount'\\] = false;/d" $mwc
 # </source>
 # <source lang="bash">
 # get repo
 # </source>
 # <source lang="bash">
 # get repo
-mkdir ~/opt
-git clone --recursive https://gerrit.wikimedia.org/r/pywikibot/core.git ~/opt/pywikibot
-cd ~/opt/pywikibot
+if [[ ! -e ~/pywikibot/.git ]]; then
+    git clone --recursive \
+        https://gerrit.wikimedia.org/r/pywikibot/core.git ~/pywikibot
+fi
+cd ~/pywikibot
 #updating
 git pull --all
 git submodule update
 # </source>
 # <source lang="bash">
 #updating
 git pull --all
 git submodule update
 # </source>
 # <source lang="bash">
-cd $HOME/opt/pywikibot
+cd $HOME/pywikibot
 dd of=user-config.py <<EOF
 mylang = 'en'
 usernames["$mwfamily"]['en'] = u'$wikiuser'
 dd of=user-config.py <<EOF
 mylang = 'en'
 usernames["$mwfamily"]['en'] = u'$wikiuser'
@@ -418,6 +457,12 @@ EOF
 
 # it won't overrwrite an existing file. Remove if if one exists
 rm -f  pywikibot/families/${mwfamily}_family.py
 
 # it won't overrwrite an existing file. Remove if if one exists
 rm -f  pywikibot/families/${mwfamily}_family.py
+if isdeb; then
+    apt-get install -y python-requests
+else
+    yum -y install python-requests
+fi
+
 python generate_family_file.py https://$mwdomain/wiki/Main_Page "$mwfamily"
 
 # Note, this needed only for ssl site
 python generate_family_file.py https://$mwdomain/wiki/Main_Page "$mwfamily"
 
 # Note, this needed only for ssl site
@@ -427,9 +472,9 @@ tee -a pywikibot/families/${mwfamily}_family.py<<'EOF'
 EOF
 # </source>
 # <source lang="bash">
 EOF
 # </source>
 # <source lang="bash">
-pw="$HOME/opt/pywikibot"
+cd "$HOME/pywikibot"
 
 
-dd of=$pw/scripts/${mwfamily}_setup.py<<EOF
+dd of=scripts/${mwfamily}_setup.py<<EOF
 import pywikibot
 import time
 import sys
 import pywikibot
 import time
 import sys
@@ -505,49 +550,10 @@ div#mw-content-text {
 """)
 EOF
 
 """)
 EOF
 
-cd $pw
 python pwb.py ${mwfamily}_setup
 # </source>
 # <source lang="bash">
 python pwb.py ${mwfamily}_setup
 # </source>
 # <source lang="bash">
-#!/bin/bash
-source ~/mw_vars
-
-# if we get an error, keep going but return it at the end
-last_error=0
-trap 'last_error=$?' ERR
-
-ssh root@$mwdomain <<ENDSSH
-tee -a $mwc<<'EOF'
-$wgReadOnly = 'Dumping Database, Access will be restored shortly';
-EOF
-mysqldump -p$dbpass --default-character-set=binary my_wiki  > ~/wiki_backup/wikidump
-sed -i '$ d' $mwc # delete last line
-ENDSSH
-rdiff-backup root@$mwdomain::/root/wiki_db_backup ~/backup/wiki_db_backup
-rdiff-backup root@$mwdomain::$mw ~/backup/wiki_file_backup
-
-exit $last_error
-# </source>
-# <source lang="bash">
-chmod +x $HOME/bin/remote_wiki_backup
-x="$(mktemp)"
-crontab -l > "$x"
-teeu "$x" <<'EOF'
-0 4 * * * x=$($HOME/bin/remote_wiki_backup 2>&1); [[ $? != 0 ]] && echo "$x"
-EOF
-crontab "$x"
-# </source>
-# <source lang="bash">
-source ~/mw_vars
-HOSTNAME=REPLACE_ME source ~/mw_vars
-rdiff-backup -r now ~/backup/wiki_file_backup /tmp/wiki_file_restore
-scp -r /tmp/wiki_file_restore/images root@$mwdomain:$mw/images
-rdiff-backup -r now ~/backup/wiki_db_backup /tmp/wiki_db_restore
-scp -r /tmp/wiki_db_restore root@$mwdomain:/tmp
-ssh root@$mwdomain "mysql -u root -p$dbpass my_wiki < /tmp/wiki_db_restore/wiki_db_dump"
-# </source>
-# <source lang="bash">
-s=$HOME/bin/mediawiki_update
+s=/etc/cron.daily/mediawiki_update
 dd of=$s<<'EOF'
 #!/bin/bash
 source ~/mw_vars
 dd of=$s<<'EOF'
 #!/bin/bash
 source ~/mw_vars
@@ -567,54 +573,31 @@ done
 php $mw/maintenance/update.php -q
 EOF
 chmod +x $s
 php $mw/maintenance/update.php -q
 EOF
 chmod +x $s
-
-x="$(mktemp)"
-crontab -l > "$x"
-teeu "$x" <<EOF
-0 5 * * * $s
-EOF
-crontab "$x"
 # </source>
 # <source lang="bash">
 # </source>
 # <source lang="bash">
-# docs suggests using separate database user, google lead me here for how
-# https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql
+# based on recommendation from install page
+if ! dpkg -s php5-gd &>/dev/null; then
+    apt-get install -y php5-gd
+    service apache2 restart
+fi
+
+# docs suggests using separate database user
 mysql -u root -p$dbpass <<EOF
 mysql -u root -p$dbpass <<EOF
-CREATE USER 'piwik'@'localhost' IDENTIFIED BY '$piwik_pass';
-GRANT ALL PRIVILEGES ON piwik . * TO 'piwik'@'localhost';
+GRANT ALL ON piwik.* TO 'piwik'@'localhost' IDENTIFIED BY '$piwik_pass';
 FLUSH PRIVILEGES;
 exit
 EOF
 FLUSH PRIVILEGES;
 exit
 EOF
+php_ini=$(isdeb && echo /etc/php5/apache2/php.ini || echo /etc/php.ini)
+# based on the install page. however, ths option is changing with php7.0
+opt=always_populate_raw_post_data
+sed -ri "/^ *$opt\b/d;/^ *\[PHP\]/a $opt = -1" $php_ini
+service apache2 restart
 # </source>
 # <source lang="bash">
 git clone https://github.com/DaSchTour/piwik-mediawiki-extension.git $mw/extensions/Piwik
 # </source>
 # <source lang="bash">
 git clone https://github.com/DaSchTour/piwik-mediawiki-extension.git $mw/extensions/Piwik
-mw-ext -g Piwik
+mw-ext Piwik
 teeu $mwc <<EOF
 \$wgPiwikURL = '$mwdomain/analytics/';
 \$wgPiwikIDSite = '1';
 EOF
 # </source>
 teeu $mwc <<EOF
 \$wgPiwikURL = '$mwdomain/analytics/';
 \$wgPiwikIDSite = '1';
 EOF
 # </source>
-# <source lang="bash">
-s=~/bin/piwik-update
-mkdir -p ${s%/*}
-dd of=$s <<EOF
-#!/bin/bash
-piwik_path=$mw/../analytics
-cd "\$(mktemp -d)"
-wget -q http://builds.piwik.org/piwik.zip
-unzip -q piwik.zip
-rm -f piwik.zip
-cp \$piwik_path/config/config.ini.php piwik/config
-cp -rf piwik/* \$piwik_path
-# prevent making an email out of the standard success response
-x="\$( \$piwik_path/console core:update )"
-if [[ \$x != "Everything is already up to date." ]]; then
-echo "\$x"
-fi
-EOF
-chmod +x $s
-
-x="$(mktemp)"
-crontab -l > "$x"
-teeu "$x" <<< "0 3 * * tue $s"
-crontab "$x"
-# </source>