diff --git a/python-agent/etc/agent.conf b/python-agent/etc/agent.conf index a47832c6..9c1ffbf6 100644 --- a/python-agent/etc/agent.conf +++ b/python-agent/etc/agent.conf @@ -1,8 +1,8 @@ [DEFAULT] debug=True verbose=True - -storage=. +log_file = /var/log/murano-agent.log +storage=/var/murano/plans [rabbitmq] diff --git a/python-agent/init.d/murano-agent-deb b/python-agent/init.d/murano-agent-deb new file mode 100755 index 00000000..d1ec9a2b --- /dev/null +++ b/python-agent/init.d/murano-agent-deb @@ -0,0 +1,103 @@ +#!/bin/sh +# Copyright (c) 2013 Mirantis, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# Author: Igor Yozhikov +# +### BEGIN INIT INFO +# Provides: murano-agent +# Required-Start: $network $local_fs $remote_fs $syslog +# Required-Stop: $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Launches the murano linux agent +# Description: This startup script launches murano linux agent. +### END INIT INFO + + +PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin +DESC="murano-agent" +NAME=murano-agent +DAEMON=/usr/local/bin/muranoagent +PIDFILE=/var/run/$NAME.pid +SCRIPTNAME=/etc/init.d/$NAME +SYSTEM_USER=root +CONFIG_FILE=/etc/murano/agent.conf +DATADIR=/var/murano/plans + +# Exit if the package is not installed +[ -x $DAEMON ] || exit 5 + +# source function library +. /lib/lsb/init-functions + +if [ ! -d "$DATADIR" ]; then + mkdir -p ${DATADIR} + chown ${SYSTEM_USER} ${DATADIR} +fi + +do_start () { + start-stop-daemon --start --background --quiet --chuid $SYSTEM_USER:$SYSTEM_USER --make-pidfile --pidfile $PIDFILE --startas $DAEMON --test -- --config-file=$CONFIG_FILE > /dev/null || return 1 + start-stop-daemon --start --background --quiet --chuid $SYSTEM_USER:$SYSTEM_USER --make-pidfile --pidfile $PIDFILE --startas $DAEMON -- --config-file=$CONFIG_FILE || return 2 +} + +do_stop () { + start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE + RETVAL="$?" + rm -f $PIDFILE + return "$RETVAL" +} + +case "$1" in + start) + log_daemon_msg "Starting $DESC" "$NAME" + do_start + case "$?" in + 0|1) log_end_msg 0 ;; + 2) log_end_msg 1 ;; + esac + ;; + stop) + log_daemon_msg "Stopping $DESC" "$NAME" + do_stop + case "$?" in + 0|1) log_end_msg 0 ;; + 2) log_end_msg 1 ;; + esac + ;; + status) + status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? + ;; + restart|force-reload) + log_daemon_msg "Restarting $DESC" "$NAME" + do_stop + case "$?" in + 0|1) + do_start + case "$?" in + 0) log_end_msg 0 ;; + 1) log_end_msg 1 ;; # Old process is still running + *) log_end_msg 1 ;; # Failed to start + esac + ;; + *) + # Failed to stop + log_end_msg 1 + ;; + esac + ;; + *) + echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 + exit 3 + ;; +esac diff --git a/python-agent/init.d/murano-agent-el6 b/python-agent/init.d/murano-agent-el6 new file mode 100755 index 00000000..48f719c7 --- /dev/null +++ b/python-agent/init.d/murano-agent-el6 @@ -0,0 +1,103 @@ +#!/bin/sh +# Copyright (c) 2013 Mirantis, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# Author: Igor Yozhikov +# +### BEGIN INIT INFO +# Provides: murano-agent +# Required-Start: $network $local_fs $remote_fs $syslog +# Required-Stop: $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Launches the murano linux agent +# Description: This startup script launches murano linux agent. +### END INIT INFO +# chkconfig: 3 90 10 +# description: This startup script launches the murano linux agent. +# config: /etc/murano/agent.conf +# +PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin +DESC="murano-agent" +NAME=murano-agent +DAEMON=/usr/local/bin/muranoagent +PIDFILE=/var/run/$NAME.pid +SCRIPTNAME=/etc/init.d/$NAME +SYSTEM_USER=root +CONFIG_FILE=/etc/murano/agent.conf +DATADIR=/var/murano/plans +LOCKFILE=/var/lock/subsys/$NAME +# Exit if the package is not installed +[ -x $DAEMON ] || exit 5 + +# source function library +. /etc/init.d/functions + +RETVAL=0 + +if [ ! -d "$DATADIR" ]; then + mkdir -p $DATADIR + chown $SYSTEM_USER $DATADIR +fi + +start() { + echo -n "Starting $NAME: " + daemon --user $SYSTEM_USER "$DAEMON --config-file=$CONFIG_FILE &>/dev/null & echo \$! > $PIDFILE" + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && touch $LOCKFILE + return $RETVAL +} + +stop() { + echo -n "Stopping $NAME: " + #killproc $DAEMON -TERM + killproc -p $PIDFILE $DAEMON + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && rm -f $LOCKFILE + return $RETVAL +} + +restart() { + stop + start +} + +rh_status() { + # run checks to determine if the service is running or use generic status + status $DAEMON +} + + +case "$1" in + start) + start + ;; + + stop) + stop + ;; + + restart) + restart + ;; + + status) + rh_status + ;; + *) + echo $"Usage: $0 {start|stop|status|restart}" + exit 2 +esac +exit $? \ No newline at end of file diff --git a/python-agent/requirements.txt b/python-agent/requirements.txt index b983e320..dedd0651 100644 --- a/python-agent/requirements.txt +++ b/python-agent/requirements.txt @@ -4,3 +4,4 @@ bunch oslo.config>=1.2.0 http://tarballs.openstack.org/murano-common/murano-common-release-0.3.tar.gz#egg=murano-common-release-0.3 iso8601 +babel diff --git a/python-agent/setup-centos.sh b/python-agent/setup-centos.sh new file mode 100755 index 00000000..193b86f6 --- /dev/null +++ b/python-agent/setup-centos.sh @@ -0,0 +1,210 @@ +#!/bin/sh +# Copyright (c) 2013 Mirantis, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +# CentOS script +LOGLVL=1 +SERVICE_CONTENT_DIRECTORY=`cd $(dirname "$0") && pwd` +PREREQ_PKGS="git wget make gcc python-pip python-iso8601 python-six python-anyjson python-eventlet python-devel python-setuptools" +PIPAPPS="pip python-pip pip-python" +PIPCMD="" +SERVICE_SRV_NAME="murano-agent" +ETC_CFG_DIR="/etc/murano" + + + +# Functions +# Loger function +log() +{ + MSG=$1 + if [ $LOGLVL -gt 0 ]; then + echo "LOG:> $MSG" + fi +} + +# find pip +find_pip() +{ + for cmd in $PIPAPPS + do + _cmd=$(which $cmd 2>/dev/null) + if [ $? -eq 0 ];then + break + fi + done + if [ -z $_cmd ];then + echo "Can't find \"pip\" in system, please install it first, exiting!" + exit 1 + else + PIPCMD=$_cmd + fi +} + +# Check or install package +in_sys_pkg() +{ + PKG=$1 + rpm -q $PKG > /dev/null 2>&1 + if [ $? -eq 0 ]; then + log "Package \"$PKG\" already installed" + else + log "Installing \"$PKG\"..." + yum install $PKG --assumeyes > /dev/null 2>&1 + if [ $? -ne 0 ];then + log "installation fails, exiting!!!" + exit + fi + fi +} + +# install +inst() +{ +# Checking packages + for PKG in $PREREQ_PKGS + do + in_sys_pkg $PKG + done +# Find python pip + find_pip + MRN_CND_SPY=$SERVICE_CONTENT_DIRECTORY/setup.py + if [ -e $MRN_CND_SPY ]; then + chmod +x $MRN_CND_SPY + log "$MRN_CND_SPY output:_____________________________________________________________" +## Setup through pip + # Creating tarball + rm -rf $SERVICE_CONTENT_DIRECTORY/*.egg-info + cd $SERVICE_CONTENT_DIRECTORY && python $MRN_CND_SPY egg_info + if [ $? -ne 0 ];then + log "\"$MRN_CND_SPY\" egg info creation FAILS, exiting!!!" + exit 1 + fi + rm -rf $SERVICE_CONTENT_DIRECTORY/dist/* + cd $SERVICE_CONTENT_DIRECTORY && $MRN_CND_SPY sdist + if [ $? -ne 0 ];then + log "\"$MRN_CND_SPY\" tarball creation FAILS, exiting!!!" + exit 1 + fi + # Running tarball install + TRBL_FILE=$(basename `ls $SERVICE_CONTENT_DIRECTORY/dist/murano-agent*.tar.gz`) + $PIPCMD install $SERVICE_CONTENT_DIRECTORY/dist/$TRBL_FILE + if [ $? -ne 0 ];then + log "$PIPCMD install \"$TRBL_FILE\" FAILS, recreate terball with \"python setup.py sdist\" command, exiting!!!" + exit 1 + fi + # Creating etc directory for config files + if [ ! -d $ETC_CFG_DIR ];then + log "Creating $ETC_CFG_DIR direcory..." + mkdir -p $ETC_CFG_DIR + if [ $? -ne 0 ];then + log "Can't create $ETC_CFG_DIR, exiting!!!" + exit 1 + fi + fi + log "Making sample configuration file at \"$ETC_CFG_DIR\"" + cp -f "$SERVICE_CONTENT_DIRECTORY/etc/agent.conf" "$ETC_CFG_DIR/agent.conf" + else + log "$MRN_CND_SPY not found!" + fi +} + +# searching for service executable in path +get_service_exec_path() +{ + if [ -z "$SERVICE_EXEC_PATH" ]; then + SERVICE_EXEC_PATH=$(which muranoagent) + if [ $? -ne 0 ]; then + log "Can't find \"muranoagent ($SERVICE_SRV_NAME)\", please install the \"$SERVICE_SRV_NAME\" by running \"$(basename "$0") install\" or set variable SERVICE_EXEC_PATH=/path/to/daemon before running setup script, exiting!" + exit 1 + fi + else + if [ ! -x "$SERVICE_EXEC_PATH" ]; then + log "\"$SERVICE_EXEC_PATH\" in not executable, please install the muranoagent \"($SERVICE_SRV_NAME)\" or set variable SERVICE_EXEC_PATH=/path/to/daemon before running setup script, exiting!" + exit 1 + fi + fi +} + +# uninstall +uninst() +{ + # Uninstall trough pip + find_pip + # looking up for python package installed + PYPKG=$SERVICE_SRV_NAME + _pkg=$($PIPCMD freeze | grep $PYPKG) + if [ $? -eq 0 ]; then + log "Removing package \"$PYPKG\" with pip" + $PIPCMD uninstall $_pkg --yes + else + log "Python package \"$PYPKG\" not found" + fi +} + +# inject init +injectinit() +{ + log "Enabling $SERVICE_SRV_NAME in init.d..." + cp -f "$SERVICE_CONTENT_DIRECTORY/init.d/murano-agent-el6" "/etc/init.d/$SERVICE_SRV_NAME" + sed -i "s/DAEMON=.*/DAEMON=$(echo $SERVICE_EXEC_PATH | sed -e 's/\//\\\//g')/" /etc/init.d/$SERVICE_SRV_NAME + chmod 755 /etc/init.d/$SERVICE_SRV_NAME + chkconfig --add $SERVICE_SRV_NAME + chkconfig $SERVICE_SRV_NAME on +} + +purgeinit() +{ + log "Removing from init.d..." + chkconfig $SERVICE_SRV_NAME off + chkconfig --del $SERVICE_SRV_NAME + rm -f /etc/init.d/$SERVICE_SRV_NAME + #Fedora compat. + systemctl --system daemon-reload > /dev/null 2>&1 +} + +# Command line args' +COMMAND="$1" +case $COMMAND in + inject-init ) + get_service_exec_path + log "Injecting \"$SERVICE_SRV_NAME\" to init..." + injectinit + postinst + ;; + + install ) + inst + get_service_exec_path + injectinit + ;; + + purge-init ) + log "Purging \"$SERVICE_SRV_NAME\" from init..." + service $SERVICE_SRV_NAME stop + purgeinit + ;; + + uninstall ) + log "Uninstalling \"$SERVICE_SRV_NAME\" from system..." + service $SERVICE_SRV_NAME stop + purgeinit + uninst + ;; + + * ) + echo -e "Usage: $(basename "$0") command \nCommands:\n\tinstall - Install $SERVICE_SRV_NAME software\n\tuninstall - Uninstall $SERVICE_SRV_NAME software\n\tinject-init - Add $SERVICE_SRV_NAME to the system start-up\n\tpurge-init - Remove $SERVICE_SRV_NAME from the system start-up" + exit 1 + ;; +esac \ No newline at end of file diff --git a/python-agent/setup.py b/python-agent/setup.py old mode 100644 new mode 100755 diff --git a/python-agent/setup.sh b/python-agent/setup.sh new file mode 100755 index 00000000..6d0d9551 --- /dev/null +++ b/python-agent/setup.sh @@ -0,0 +1,206 @@ +#!/bin/sh +# Copyright (c) 2013 Mirantis, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +# Ubuntu script +LOGLVL=1 +SERVICE_CONTENT_DIRECTORY=`cd $(dirname "$0") && pwd` +PREREQ_PKGS="git wget make gcc python-pip python-iso8601 python-six python-anyjson python-eventlet python-dev python-setuptools" +PIPAPPS="pip python-pip pip-python" +PIPCMD="" +SERVICE_SRV_NAME="murano-agent" +ETC_CFG_DIR="/etc/murano" + + + +# Functions +# Loger function +log() +{ + MSG=$1 + if [ $LOGLVL -gt 0 ]; then + echo "LOG:> $MSG" + fi +} + +# find pip +find_pip() +{ + for cmd in $PIPAPPS + do + _cmd=$(which $cmd 2>/dev/null) + if [ $? -eq 0 ];then + break + fi + done + if [ -z $_cmd ];then + echo "Can't find \"pip\" in system, please install it first, exiting!" + exit 1 + else + PIPCMD=$_cmd + fi +} + +# Check or install package +in_sys_pkg() +{ + PKG=$1 + dpkg -s $PKG > /dev/null 2>&1 + if [ $? -eq 0 ]; then + log "Package \"$PKG\" already installed" + else + log "Installing \"$PKG\"..." + apt-get install $PKG --yes > /dev/null 2>&1 + if [ $? -ne 0 ];then + log "installation fails, exiting!!!" + exit + fi + fi +} + +# install +inst() +{ +# Checking packages + for PKG in $PREREQ_PKGS + do + in_sys_pkg $PKG + done +# Find python pip + find_pip + MRN_CND_SPY=$SERVICE_CONTENT_DIRECTORY/setup.py + if [ -e $MRN_CND_SPY ]; then + chmod +x $MRN_CND_SPY + log "$MRN_CND_SPY output:_____________________________________________________________" +## Setup through pip + # Creating tarball + rm -rf $SERVICE_CONTENT_DIRECTORY/*.egg-info + cd $SERVICE_CONTENT_DIRECTORY && python $MRN_CND_SPY egg_info + if [ $? -ne 0 ];then + log "\"$MRN_CND_SPY\" egg info creation FAILS, exiting!!!" + exit 1 + fi + rm -rf $SERVICE_CONTENT_DIRECTORY/dist/* + cd $SERVICE_CONTENT_DIRECTORY && $MRN_CND_SPY sdist + if [ $? -ne 0 ];then + log "\"$MRN_CND_SPY\" tarball creation FAILS, exiting!!!" + exit 1 + fi + # Running tarball install + TRBL_FILE=$(basename `ls $SERVICE_CONTENT_DIRECTORY/dist/murano-agent*.tar.gz`) + $PIPCMD install $SERVICE_CONTENT_DIRECTORY/dist/$TRBL_FILE + if [ $? -ne 0 ];then + log "$PIPCMD install \"$TRBL_FILE\" FAILS, recreate terball with \"python setup.py sdist\" command, exiting!!!" + exit 1 + fi + # Creating etc directory for config files + if [ ! -d $ETC_CFG_DIR ];then + log "Creating $ETC_CFG_DIR direcory..." + mkdir -p $ETC_CFG_DIR + if [ $? -ne 0 ];then + log "Can't create $ETC_CFG_DIR, exiting!!!" + exit 1 + fi + fi + log "Making sample configuration file at \"$ETC_CFG_DIR\"" + cp -f "$SERVICE_CONTENT_DIRECTORY/etc/agent.conf" "$ETC_CFG_DIR/agent.conf" + else + log "$MRN_CND_SPY not found!" + fi +} + +# searching for service executable in path +get_service_exec_path() +{ + if [ -z "$SERVICE_EXEC_PATH" ]; then + SERVICE_EXEC_PATH=$(which muranoagent) + if [ $? -ne 0 ]; then + log "Can't find \"muranoagent ($SERVICE_SRV_NAME)\", please install the \"$SERVICE_SRV_NAME\" by running \"$(basename "$0") install\" or set variable SERVICE_EXEC_PATH=/path/to/daemon before running setup script, exiting!" + exit 1 + fi + else + if [ ! -x "$SERVICE_EXEC_PATH" ]; then + log "\"$SERVICE_EXEC_PATH\" in not executable, please install the muranoagent \"($SERVICE_SRV_NAME)\" or set variable SERVICE_EXEC_PATH=/path/to/daemon before running setup script, exiting!" + exit 1 + fi + fi +} + +# uninstall +uninst() +{ + # Uninstall trough pip + find_pip + # looking up for python package installed + PYPKG=$SERVICE_SRV_NAME + _pkg=$($PIPCMD freeze | grep $PYPKG) + if [ $? -eq 0 ]; then + log "Removing package \"$PYPKG\" with pip" + $PIPCMD uninstall $_pkg --yes + else + log "Python package \"$PYPKG\" not found" + fi +} + +# inject init +injectinit() +{ + log "Enabling $SERVICE_SRV_NAME in init.d..." + cp -f "$SERVICE_CONTENT_DIRECTORY/init.d/murano-agent-deb" "/etc/init.d/$SERVICE_SRV_NAME" + sed -i "s/DAEMON=.*/DAEMON=$(echo $SERVICE_EXEC_PATH | sed -e 's/\//\\\//g')/" /etc/init.d/$SERVICE_SRV_NAME + chmod 755 /etc/init.d/$SERVICE_SRV_NAME + update-rc.d $SERVICE_SRV_NAME defaults +} + +purgeinit() +{ + log "Removing from init.d..." + update-rc.d -f $SERVICE_SRV_NAME remove + rm -f /etc/init.d/$SERVICE_SRV_NAME +} + +# Command line args' +COMMAND="$1" +case $COMMAND in + inject-init ) + get_service_exec_path + log "Injecting \"$SERVICE_SRV_NAME\" to init..." + injectinit + postinst + ;; + + install ) + inst + get_service_exec_path + injectinit + ;; + + purge-init ) + log "Purging \"$SERVICE_SRV_NAME\" from init..." + service $SERVICE_SRV_NAME stop + purgeinit + ;; + + uninstall ) + log "Uninstalling \"$SERVICE_SRV_NAME\" from system..." + service $SERVICE_SRV_NAME stop + purgeinit + uninst + ;; + + * ) + echo -e "Usage: $(basename "$0") command \nCommands:\n\tinstall - Install $SERVICE_SRV_NAME software\n\tuninstall - Uninstall $SERVICE_SRV_NAME software\n\tinject-init - Add $SERVICE_SRV_NAME to the system start-up\n\tpurge-init - Remove $SERVICE_SRV_NAME from the system start-up" + exit 1 + ;; +esac \ No newline at end of file