#!/bin/sh # global variables VERSION="2.4" DOWNLOAD_URL="http://owp.softunity.com.ru/download/ovz-web-panel-$VERSION.tgz" RUBYGEMS_URL="http://production.cf.rubygems.org/rubygems/rubygems-1.3.5.tgz" RUBY_SQLITE3_CMD="ruby -e \"require 'rubygems'\" -e \"require 'sqlite3'\"" LOG_FILE="/tmp/ovz-web-panel.log" INSTALL_DIR="/opt/ovz-web-panel/" FORCE=0 # force installation to the same directory PRESERVE_ARCHIVE=0 AUTOSOLVER=1 # automatic solving of dependencies DISTRIB_ID="" DEBUG=0 UPGRADE=0 UNINSTALL=0 ERR_FATAL=1 for PARAM in $@; do eval $PARAM done [ "x$DEBUG" = "x1" ] && set -xv log() { echo `date` $1 >> $LOG_FILE } puts() { echo $1 log "$1" } puts_separator() { puts "-----------------------------------" } puts_spacer() { puts } exec_cmd() { TITLE=$1 COMMAND=$2 puts "$TITLE $COMMAND" `$COMMAND` } fatal_error() { puts "Fatal error: $1" exit $ERR_FATAL } is_command_present() { puts "Checking presence of the command: $1" CMD=`whereis -b $1 | awk '{ print $2 }'` [ -n "$CMD" ] && return 0 || return 1 } detect_os() { puts "Detecting distrib ID..." is_command_present "lsb_release" if [ $? -eq 0 ]; then puts "LSB info: `lsb_release -a`" DISTRIB_ID=`lsb_release -si` return 0 fi [ -f /etc/redhat-release ] && DISTRIB_ID="RedHat" [ -f /etc/fedora-release ] && DISTRIB_ID="Fedora" [ -f /etc/debian_version ] && DISTRIB_ID="Debian" } resolve_deps() { puts "Resolving dependencies..." if [ "$DISTRIB_ID" = "Ubuntu" -o "$DISTRIB_ID" = "Debian" ]; then apt-get update apt-get -y install ruby1.8 rubygems libsqlite3-ruby libruby1.8 rake fi if [ "$DISTRIB_ID" = "RedHat" -o "$DISTRIB_ID" = "CentOS" ]; then yum -y install ruby is_command_present gem if [ $? -ne 0 ]; then yum -y install ruby-devel ruby-docs ruby-ri ruby-irb ruby-rdoc wget -nc -P /tmp/ $RUBYGEMS_URL ARCHIVE_NAME=`echo $RUBYGEMS_URL | sed 's/.\+\///g'` DIR_NAME=`echo $ARCHIVE_NAME | sed 's/.tgz//g'` tar -C /tmp/ -xzf /tmp/$ARCHIVE_NAME ruby /tmp/$DIR_NAME/setup.rb rm -f /tmp/$ARCHIVE_NAME rm -rf /tmp/$DIR_NAME fi gem list rake -i [ $? -ne 0 ] && gem install rake gem list rdoc -i [ $? -ne 0 ] && gem install rdoc sh -c "$RUBY_SQLITE3_CMD" > /dev/null 2>&1 if [ $? -ne 0 ]; then yum -y install sqlite-devel make gcc gem install sqlite3 fi fi if [ "$DISTRIB_ID" = "Fedora" ]; then yum -y install ruby rubygems ruby-sqlite3 rubygem-rake fi } check_environment() { puts "Checking environment..." [ "`whoami`" != "root" ] && fatal_error "Installer should be executed under root user." puts "System info: `uname -a`" detect_os [ "x$DISTRIB_ID" != "x" ] && puts "Detected distrib ID: $DISTRIB_ID" detect_openvz } check_dependencies() { [ "x$AUTOSOLVER" = "x1" ] && resolve_deps is_command_present ruby if [ $? -eq 0 ]; then RUBY_VERSION=`ruby -v | awk '{ print $2 }'` if [ "1.8" != "`echo $RUBY_VERSION | awk -F. '{ print $1"."$2 }'`" ]; then fatal_error "Panel requires Ruby 1.8 (Ruby 1.9 is not supported)." fi if [ `echo $RUBY_VERSION | awk -F. '{ print $3 }'` -lt 5 ]; then fatal_error "Panel requires Ruby 1.8.5 or higher." fi puts "Ruby version: $RUBY_VERSION" else fatal_error "Ruby 1.8 is not installed. Please install it first." fi is_command_present gem if [ $? -eq 0 ]; then puts "RubyGems version: `gem -v`" else fatal_error "RubyGems is not installed. Please install it first." fi puts "Checking Ruby SQLite3 support: $RUBY_SQLITE3_CMD" sh -c "$RUBY_SQLITE3_CMD" > /dev/null 2>&1 [ $? -ne 0 ] && fatal_error "Ruby SQLite3 support not found. Please install it first." puts_spacer } detect_openvz() { if [ -f /proc/vz/version ]; then ENVIRONMENT="HW-NODE" puts "OpenVZ hardware node detected." elif [ -d /proc/vz ]; then ENVIRONMENT="VPS" puts "OpenVZ virtual environment detected." else ENVIRONMENT="STANDALONE" puts "Standalone environment detected." fi } install_product() { puts "Installation..." [ -f $INSTALL_DIR/config/database.yml ] && UPGRADE=1 mkdir -p $INSTALL_DIR if [ -f "$DOWNLOAD_URL" ]; then ARCHIVE_NAME=$DOWNLOAD_URL puts "Local archive: $ARCHIVE_NAME" PRESERVE_ARCHIVE=1 else exec_cmd "Downloading:" "wget -nc -P $INSTALL_DIR $DOWNLOAD_URL" [ $? -ne 0 ] && fatal_error "Failed to download distribution." ARCHIVE_NAME="$INSTALL_DIR/"`echo $DOWNLOAD_URL | sed 's/.\+\///g'` fi EXCLUDE_LIST="" if [ "x$UPGRADE" = "x1" ]; then EXCLUDE_LIST="--exclude=*.log --exclude=config/database.yml --exclude=db/*.sqlite3" [ -f "$INSTALL_DIR/config/certs/server.crt" ] && EXCLUDE_LIST="$EXCLUDE_LIST --exclude=config/certs/*" [ -f "$INSTALL_DIR/utils/hw-daemon/certs/server.crt" ] && EXCLUDE_LIST="$EXCLUDE_LIST --exclude=hw-daemon/certs/*" fi exec_cmd "Unpacking:" "tar --strip 2 -C $INSTALL_DIR -xzf $ARCHIVE_NAME $EXCLUDE_LIST" if [ "x$PRESERVE_ARCHIVE" != "x1" ]; then exec_cmd "Removing downloaded archive:" "rm -f $ARCHIVE_NAME" fi if [ "x$UPGRADE" = "x1" ]; then puts "Removing deprecated files..." [ -f $INSTALL_DIR/app/controllers/admin_controller.rb ] && rm $INSTALL_DIR/app/controllers/admin_controller.rb puts "Upgrading database..." CURRENT_DIR=`pwd` cd $INSTALL_DIR rake db:migrate RAILS_ENV="production" cd $CURRENT_DIR [ $? -ne 0 ] && fatal_error "Failed to upgrade database to new version." puts "Syncing physical servers state..." ruby $INSTALL_DIR/script/runner -e production "HardwareServer.all.each { |server| server.sync }" puts "Reset remember_me tokens..." ruby $INSTALL_DIR/script/runner -e production "User.all.each{ |user| user.remember_token = ''; user.save }" fi [ ! -x $INSTALL_DIR/script/owp ] && chmod +x $INSTALL_DIR/script/owp if [ "$DISTRIB_ID" = "Ubuntu" -o "$DISTRIB_ID" = "Debian" -o "$DISTRIB_ID" = "RedHat" -o "$DISTRIB_ID" = "CentOS" -o "$DISTRIB_ID" = "Fedora" ]; then cp $INSTALL_DIR/script/owp /etc/init.d/owp chmod 755 /etc/init.d/owp if [ "$DISTRIB_ID" = "Ubuntu" -o "$DISTRIB_ID" = "Debian" ]; then update-rc.d -f owp remove update-rc.d owp defaults 30 else /sbin/chkconfig --add owp fi fi if [ -f $INSTALL_DIR/script/owp.cron -a -d /etc/cron.daily ]; then cp $INSTALL_DIR/script/owp.cron /etc/cron.daily/owp.cron chmod 755 /etc/cron.daily/owp.cron fi if [ -f $INSTALL_DIR/config/owp.conf.sample -a ! -f /etc/owp.conf ]; then cp $INSTALL_DIR/config/owp.conf.sample /etc/owp.conf sed -i "s|^INSTALL_DIR=.*|INSTALL_DIR=$INSTALL_DIR|g" /etc/owp.conf fi puts "Installation finished." puts "Product was installed into: $INSTALL_DIR" puts_spacer } stop_services() { puts "Stopping services..." $INSTALL_DIR/script/owp stop } start_services() { [ "x$UPGRADE" = "x1" ] && stop_services puts "Starting services..." if [ "x$UPGRADE" = "x0" ]; then if [ "$ENVIRONMENT" = "HW-NODE" ]; then HW_DAEMON_CONFIG="$INSTALL_DIR/utils/hw-daemon/hw-daemon.ini" if [ ! -f $HW_DAEMON_CONFIG ]; then echo "address = 127.0.0.1" >> $HW_DAEMON_CONFIG echo "port = 7767" >> $HW_DAEMON_CONFIG RAND_KEY=`head -c 200 /dev/urandom | md5sum | awk '{ print \$1 }'` echo "key = $RAND_KEY" >> $HW_DAEMON_CONFIG fi $INSTALL_DIR/script/owp start puts "Adding localhost to the list of controlled servers..." ruby $INSTALL_DIR/script/runner -e production "HardwareServer.new(:host => 'localhost', :auth_key => '$RAND_KEY').connect" [ $? -ne 0 ] && puts "Failed to add local server." else $INSTALL_DIR/script/owp start puts "Place hardware daemon on machine with OpenVZ." puts "To start hardware daemon run:" puts "sudo ruby $INSTALL_DIR/utils/hw-daemon/hw-daemon.rb start" fi else $INSTALL_DIR/script/owp start fi } print_access_info() { puts "Panel should be available at:" puts "http://`hostname -f`:3000" puts "Default credentials: admin/admin" } uninstall_product() { if [ ! -d "$INSTALL_DIR" -o "$INSTALL_DIR" = "" -o "$INSTALL_DIR" = "/" ]; then puts "Panel not found. Nothing to uninstall." return 1 fi stop_services rm -rf $INSTALL_DIR if [ "$DISTRIB_ID" = "Ubuntu" -o "$DISTRIB_ID" = "Debian" ]; then update-rc.d -f owp remove elif [ "$DISTRIB_ID" = "RedHat" -o "$DISTRIB_ID" = "CentOS" -o "$DISTRIB_ID" = "Fedora" ]; then /sbin/chkconfig --del owp fi [ -f /etc/owp.conf ] && rm /etc/owp.conf [ -f /etc/init.d/owp ] && rm /etc/init.d/owp [ -f /etc/cron.daily/owp.cron ] && rm /etc/cron.daily/owp.cron puts "Panel was uninstalled." } main() { puts_separator puts "OpenVZ Web Panel Installer." puts_separator check_environment if [ "x$UNINSTALL" = "x1" ]; then uninstall_product else check_dependencies install_product start_services print_access_info puts_separator fi } main