#!/bin/sh WP_CONTENT_DIR=/var/lib/wordpress/wp-content WP_CONTENT_ORIG_DIR=/usr/share/wordpress/wp-content WP_CONTENT_SUBDIRS="themes plugins languages" set -e usage() { cat < [...] Actions: --sync-wp-content Update $WP_CONTENT_DIR based on files available in $WP_CONTENT_ORIG_DIR --purge-wp-content Purge $WP_CONTENT_DIR of symlinks pointing to $WP_CONTENT_ORIG_DIR END } purge_wp_content() { for subdir in $WP_CONTENT_SUBDIRS; do list=$(purge_wp_content_subdir "$subdir") print_if_needed "Removed from $WP_CONTENT_DIR/$subdir" "$list" done } print_if_needed() { local message="$1" local list="$2" if [ -n "$list" ]; then echo "$message: $list" fi } purge_wp_content_subdir() { local subdir=$1 for dir in $WP_CONTENT_DIR/$subdir/*; do if is_symlink_to_standard_directory "$dir"; then remove_symlink "$dir" fi done } is_symlink_to_standard_directory() { local symlink="$1" if [ ! -h "$symlink" ]; then return 1 fi target=$(readlink "$symlink") if [ "$target" = "${target##$WP_CONTENT_ORIG_DIR}" ]; then return 1 fi return 0 } remove_symlink() { local symlink="$1" echo -n "$(basename "$symlink") " rm -f "$symlink" } sync_wp_content() { for subdir in $WP_CONTENT_SUBDIRS; do ensure_wp_content_subdir_exists "$subdir" list=$(add_new_wp_content_files "$subdir") print_if_needed "Added to $WP_CONTENT_DIR/$subdir" "$list" list=$(drop_removed_wp_content_files "$subdir") print_if_needed "Removed from $WP_CONTENT_DIR/$subdir" "$list" done } ensure_wp_content_subdir_exists() { local subdir="$1" [ -e $WP_CONTENT_DIR ] || setup_wp_content mkdir -p "$WP_CONTENT_DIR/$subdir" } setup_wp_content() { mkdir -p $WP_CONTENT_DIR/blogs.dir $WP_CONTENT_DIR/uploads chown www-data:www-data $WP_CONTENT_DIR/blogs.dir $WP_CONTENT_DIR/uploads } add_new_wp_content_files() { local subdir="$1" for dir in $WP_CONTENT_ORIG_DIR/$subdir/*; do if [ ! -e "$dir" ]; then continue fi name="$(basename "$dir")" symlink_path="$WP_CONTENT_DIR/$subdir/$name" if [ -e "$symlink_path" ]; then continue fi echo -n "$name " ln -sf "$dir" "$symlink_path" done } drop_removed_wp_content_files() { local subdir="$1" for dir in $WP_CONTENT_DIR/$subdir/*; do if ! is_symlink_to_standard_directory "$dir"; then continue fi # Ensure the symlink is broken before removing it if [ -e "$dir" ]; then continue fi remove_symlink "$dir" done } TEMP=$(getopt -o sp -l sync-wp-content,purge-wp-content -- "$@") eval set -- "$TEMP" while true; do case "$1" in --sync-wp-content) action="$1" shift ;; --purge-wp-content) action="$1" shift ;; --) shift break ;; *) echo "$0: error: invalid option '$1'" >&2 usage exit 1 ;; esac done case "$action" in --sync-wp-content) sync_wp_content ;; --purge-wp-content) purge_wp_content ;; *) echo "$0: error: no action specified!" >&2 usage exit 1 ;; esac # Script documentation follows : <<=cut =encoding UTF-8 =head1 NAME wp-setup - wordpress setup for Debian =head1 SYNOPSIS B I =head1 DESCRIPTION This script's purpose is to make it easier to manage Wordpress installations on Debian systems. For now, it's mainly for the package's internal usage though. =head1 ACTIONS =over 4 =item B<--sync-wp-content> Update /var/lib/wordpress/wp-content/{plugins,themes}/ based on what's available in /usr/share/wordpress/wp-content/{plugins,themes}. This command is run by the package's postinst script every time that dpkg installs a package that modifies something in /usr/share/wordpress/wp-content/. =item B<--purge-wp-content> Remove all symlinks from /var/lib/wordpress/wp-content/{plugins,themes}/ that point to corresponding directories in /usr/share/wordpress/wp-content/{plugins,themes}. This command is run by the package's prerm script to ensure everything is properly removed. =back =head1 AUTHOR Raphaƫl Hertzog =cut