noosfero-plugins 7.1 KB
#!/bin/sh

set -e

program_name=$(basename $0)

if [ -e /etc/default/noosfero ]; then
  . /etc/default/noosfero
fi

if [ -z "$NOOSFERO_DIR" ]; then
  this_script=$(readlink -f $0)
  NOOSFERO_DIR=$(dirname $this_script | xargs dirname)
fi

# data
available_plugins_dir="$NOOSFERO_DIR/plugins"
enabled_plugins_dir="$NOOSFERO_DIR/config/plugins"
base_plugins_dir="$NOOSFERO_DIR/baseplugins"
available_plugins=$(find -L "$available_plugins_dir" -maxdepth 1 -mindepth 1 -type d -not -name 'template' -printf '%f\n' | sort)
enabled_plugins=$(find -L "$enabled_plugins_dir" -maxdepth 1 -mindepth 1 -type d -printf '%f\n' | sort)
base_plugins=$(find -L "$base_plugins_dir" -maxdepth 1 -mindepth 1 -type d -printf '%f\n' | sort)

# operation defaults
quiet=false
needs_migrate=false
load_paths="$NOOSFERO_DIR/lib:$(echo $NOOSFERO_DIR/vendor/plugins/*/lib | tr ' ' :)"


_list() {
  for plugin in $available_plugins; do
    echo "$plugin"
  done
}

_status() {
  for plugin in $available_plugins; do
    if [ -h "$enabled_plugins_dir/$plugin" -o -h "$base_plugins_dir/$plugin" ]; then
      status="*"
    else
      status=" "
    fi
    echo "[$status] $plugin"
  done
}

_usage() {
  echo "$program_name: manages Noosfero plugins system-wide"
  echo
  echo "Usage:"
  echo "  $program_name [OPTIONS] list"
  echo "  $program_name [OPTIONS] status"
  echo "  $program_name [OPTIONS] enable PLUGIN [PLUGIN ...]"
  echo "  $program_name [OPTIONS] disable PLUGIN [PLUGIN ...]"
  echo "  $program_name [OPTIONS] enableall"
  echo "  $program_name [OPTIONS] disableall"
  echo "  $program_name [OPTIONS] new PLUGIN [PLUGIN ...]"
  echo
  echo "Options:"
  echo "  --quiet|-q"
  echo "    Run quietly"
  echo "  --version|-v"
  echo "    Prints version information and exits"
  echo
}

_say(){
  if [ "$quiet" = 'false' ]; then
    echo $@
  fi
}

run(){
  if [ -e "$1" ]; then
    ruby -I$load_paths -e "require '$1'"
    return $?
  fi
}

_install(){
  # export so that recursive enables for dependencies inherit this option too
  export NOOSFERO_BUNDLE_OPTS='install'
  _enable "$1"
}

_enable(){
  plugin="$1"

  if [ -d "$available_plugins_dir/$plugin" ]; then
    source="$available_plugins_dir/$plugin"
  else
    if [ ! -d "$plugin" ]; then
      echo "E: $plugin not found (needs to be an existing directory)"
      return
    fi

    # out-of-tree plugins
    source="$plugin"
    plugin=$(basename "$plugin")
  fi

  target="$enabled_plugins_dir/$plugin"
  base="$base_plugins_dir/$plugin"
  run "$source/before_enable.rb"
  if [ -h "$target" -o -h "$base" ]; then
    _say "$plugin already enabled"
  else
    if [ ! -d "$source" ]; then
      echo "E: $plugin plugin does not exist!"
      return
    fi
    installation_ok=true
    installation_file="$source/install.rb"
    if ! run $installation_file; then
      installation_ok=false
    else
      dependencies_ok=true
      dependencies_file="$source/dependencies.rb"
      if [ -e $source/Gemfile ]; then
        gemfile=$(mktemp --tmpdir=.)
        cat $NOOSFERO_DIR/Gemfile $source/Gemfile > $gemfile
        if [ -z "$NOOSFERO_BUNDLE_OPTS" ]; then NOOSFERO_BUNDLE_OPTS="--local"; fi
        if ! RUBYOPT='' BUNDLE_GEMFILE="$gemfile" bundle $NOOSFERO_BUNDLE_OPTS --quiet; then
          dependencies_ok=false
        else
          mv "$gemfile".lock Gemfile.lock
        fi
        rm -f $gemfile
      fi
      if ! run $dependencies_file; then
        dependencies_ok=false
      fi
    fi
    if [ "$installation_ok" = true ] && [ "$dependencies_ok" = true ]; then
      ln -s "$source" "$target"
      plugins_public_dir="$NOOSFERO_DIR/public/plugins"
      plugins_features_dir="$NOOSFERO_DIR/features/plugins"
      test -d "$target/public" && ln -s "$target/public" "$plugins_public_dir/$plugin"
      test -d "$NOOSFERO_DIR/features" && test -d "$target/features" && ln -s "$target/features" "$plugins_features_dir/$plugin"
      _say "$plugin enabled"
      run "$source/after_enable.rb"
      needs_migrate=true
    elif [ "$installation_ok" = false ]; then
      echo "W: failed to install $plugin; not enabling"
      echo
      exit 1
    elif [ "$dependencies_ok" = false ]; then
      echo "W: failed to load dependencies for $plugin; not enabling"
      echo
      exit 2
    fi
  fi
}

_disable(){
  plugin="$1"
  source="$available_plugins_dir/$plugin"
  target="$enabled_plugins_dir/$plugin"
  plugins_public_dir="$NOOSFERO_DIR/public/plugins"
  plugins_features_dir="$NOOSFERO_DIR/features/plugins"

  if [ -h "$base_plugins_dir/$plugin" ]; then
    _say "$plugin is a base plugin and cannot be disabled"
    return
  fi

  if [ -h "$target" ]; then
    rm "$target"
    test -h "$plugins_public_dir/$plugin" && rm "$plugins_public_dir/$plugin"
    test -h "$plugins_features_dir/$plugin" && rm "$plugins_features_dir/$plugin"
    _say "$plugin disabled"
    run "$source/after_disable.rb"
  else
    _say "$plugin already disabled"
  fi
}

_new(){
  plugin=$(echo "$1" | tr '[:upper:]' '[:lower:]')
  target="$available_plugins_dir/$plugin"
  if [ -d "$target" ]; then
    _say "There is already a plugin called $plugin"
    exit 1
  else
    template="$available_plugins_dir/template"
    mkdir "$target"

    plugin_name=$(echo "$plugin" | sed -e 's/^./\u&/; s/_\(.\)/\u\1/g')
    for source_file in $(find "$template" -type f -and '(' -not -name '*.po' -and -not -name '*.mo' ')'); do
      target_file=$(echo "$source_file" | sed -e "s/template/$plugin/g")
      mkdir -p $(dirname "$target_file")
      sed "s/TemplatePlugin/${plugin_name}Plugin/g" "$source_file" > "$target_file"
    done
    _enable "$plugin"
  fi
}

_enableall(){
  for plugin in $available_plugins; do
    _enable "$plugin"
  done
}

_disableall() {
  for plugin in $enabled_plugins; do
    _disable "$plugin"
  done
}

if [ $# -eq 0 ]; then
  _usage
  exit 0
fi

while [ ! -z "$1" ] && [ "${1##-}" != "$1" ]; do
  opt="$1"
  shift
  case "$opt" in
    -q|--quiet)
      quiet=true
      ;;
    -v|--version)
      ruby "-I$NOOSFERO_DIR/lib" -rnoosfero -e "puts \"$program_name version #{Noosfero::VERSION}\""
      exit 0
      ;;
    *)
      echo "Unknown option: $opt"
      _usage
      exit 1
      ;;
  esac
done

command="$1"
if [ -z "$command" ]; then
  _usage
  exit 1
fi
shift


case "$command" in
  enableall|disableall|enable|disable|new)
    if [ ! -w "$enabled_plugins_dir" ]; then
      echo "E: sorry, you don't have the required permissions to manage plugins"
      exit 2
    fi
    ;;
esac

case "$command" in
  list|status|usage|enableall|disableall)
    if [ ! -z "$1" ]; then
      _usage
      exit 1
    fi
    _$command
    ;;
  enable|install|disable|new)
    for plugin in $@; do
      _$command "$plugin"
    done
    ;;
  *)
    echo "Unknown command: $command"
    _usage
    exit 1
    ;;
esac

if [ "$needs_migrate" = 'true' ] && [ "$quiet" = 'false' ]; then
  cat <<-EOF

====================================================================
To finish the activation of the plugins you have just enabled, you
need to restart Noosfero.

If you installed Noosfero manually, run:

  $ ./script/production restart

If you installed Noosfero using Debian packages, run as root:

  # service noosfero restart

====================================================================
EOF
fi