#!/bin/bash # # Filename: /etc/init.d/target # # Bring up/down iscsi LIO target # ######################################################################### # # # Copyright (c) 2016 Wind River Systems, Inc. # # SPDX-License-Identifier: Apache-2.0 # DESC="target" STATUS_FILE="/var/run/lio-target.running" CINDER_CONF_DIR="/opt/cgcs/cinder" LIO_CONF_DIR="${CINDER_CONF_DIR}/iscsi-target" LIO_CONF_FILE="${LIO_CONF_DIR}/saveconfig.json" TGT_CONF_FILE="${CINDER_CONF_DIR}/data/tgt-initiators-15.12-upgrade.conf" BASE_TARGET_DIR="/etc/target" # Tools TARGETCLI="/usr/bin/targetcli" RTSTOOL="/usr/bin/cinder-rtstool" SM_QUERY="/usr/bin/sm-query" # This will log to /var/log/platform.log NAME=$(basename $0) function log () { logger -p local1.info "${NAME}: $1" } # Determine whether we are running on the active controller. # Return value: 0 - controller is active, 1 - not active. is_active_controller () { # service drbd-cgcs - should be active before iscsi one local SERVICE="drbd-cgcs" local ACTIVE=$(${SM_QUERY} service ${SERVICE} | \ grep enabled-active) if [ -z "${ACTIVE}" ] ; then return 1 else return 0 fi } # This is a function that migrates 15.12 TGT Target configuration # to the LIO Target configuration file. The function is called only # once on the first "swact" to the LIO controller after # Software Upgrade. migrate_tgt () { log "Migrating 15.12 TGT iSCSI Target to LIO" # TGT configuration directory TGT_CONF_DIR="/opt/cgcs/cinder/data/volumes" # Start the LIO target and enable it for configuration /usr/bin/targetctl restore if [ $? -ne 0 ] ; then log "ERROR: trying to start the LIO target" return 1 fi if [ ! -d ${TGT_CONF_DIR} ] ; then # User does not have attached volumes log "No volumes to migrate. Migration is done" return 0 fi if [ ! "$(ls -A ${TGT_CONF_DIR})" ] ; then # Cinder volumes configuration is empty log "No volumes to migrate. Migration is done" return 0 fi PORTAL_IP="" if [ -e /etc/hosts ] ; then PORTAL_IP=$(grep controller-cinder /etc/hosts | awk '{print $1}') fi # If no Portal IP is specified, use default IP address if [ -z "${PORTAL_IP}" ] ; then PORTAL_IP="0.0.0.0" fi for volume in `find ${TGT_CONF_DIR} -name "volume-*"` do TARGET_NAME=$(grep -n target ${volume} | awk '{ print $2}' | \ sed 's/>//') DEVICE=$(grep -n backing-store ${volume} | awk '{print $3}') USERID=$(grep -n incominguser ${volume} | awk '{print $3}') PASSWORD=$(grep -n incominguser ${volume} | awk '{print $4}') INITIATOR=$(grep -n ${TARGET_NAME} ${TGT_CONF_FILE} | \ awk '{ print $5 }') if [ ! "${TARGET_NAME}" -a "${DEVICE}" -a "${USERID}" -a \ "${PASSWORD}" -a "${INITIATOR}" ] ; then log "ERROR: volume ${TARGET_NAME} configuration is not complete" continue fi # Add the volume to the LIO configuration ${RTSTOOL} create ${DEVICE} ${TARGET_NAME} ${USERID} ${PASSWORD} \ False -a${PORTAL_IP} -p3260 2>/dev/null if [ $? -ne 0 ] ; then log "ERROR: Target creation failed for volume ${TARGET_NAME}" continue fi log "Created target ${TARGET_NAME}" ${RTSTOOL} add-initiator ${TARGET_NAME} ${USERID} ${PASSWORD} \ ${INITIATOR} 2>/dev/null if [ $? -ne 0 ] ; then log "ERROR: Add Initiator ${INITIATOR} failed for ${TARGET_NAME}" continue fi log "Added Initiator ${INITIATOR} for ${TARGET_NAME}" # Create a lun mapping from 1 to 0. Why? Well 15.12 used tgt which # uses lun 1 as the first volume, but lio uses lun 0. This mapping # allows iscsi references created in the old tgt realm to continue # to work. ${TARGETCLI} "/iscsi/${TARGET_NAME}/tpg1/acls/${INITIATOR} create 1 0" if [ $? -ne 0 ] ; then log "ERROR: lun 1 mapping failed: Initiator ${INITIATOR} Target ${TARGET_NAME}" else log "Added lun 1 mapping: Initiator ${INITIATOR} Target ${TARGET_NAME}" fi done # Save and verify the new LIO configuration ${RTSTOOL} save 2> /dev/null if [ $? -ne 0 ] ; then log "ERROR: Cannot save LIO Target configuration" return 1 fi ${RTSTOOL} verify 2> /dev/null if [ $? -ne 0 ] ; then log "ERROR: LIO Target verification failed" return 1 fi log "TGT to LIO migration is done" return 0 } start () { echo -n "Starting ${DESC}..." if ! is_active_controller ; then echo "failed. Controller is not active." exit 1 fi if [ ! -L ${BASE_TARGET_DIR} ] ; then rm -rf ${BASE_TARGET_DIR} ln -s ${LIO_CONF_DIR} ${BASE_TARGET_DIR} fi if [ ! -d ${LIO_CONF_DIR} ] ; then # Create LIO configuration directory mkdir -p ${LIO_CONF_DIR} && log "Created ${LIO_CONF_DIR}" # Create default LIO configuration file ${TARGETCLI} saveconfig ${LIO_CONF_FILE} fi if [ -e ${TGT_CONF_FILE} -a -s ${TGT_CONF_FILE} ] ; then migrate_tgt if [ $? -ne 0 ] ; then echo "tgt migration failed." exit 1 fi mv -f ${TGT_CONF_FILE} ${TGT_CONF_FILE}.bak else /usr/bin/targetctl restore if [ $? -ne 0 ] ; then echo "failed." exit 1 fi fi touch ${STATUS_FILE} echo "done." } stop () { echo -n "Stopping ${DESC}..." if [ ! -f ${STATUS_FILE} ] ; then echo "service has not been started" exit 0 fi /usr/bin/targetctl clear RET=$? if [ -f ${STATUS_FILE} ] ; then rm -f ${STATUS_FILE} fi if [ ${RET} -ne 0 ] ; then echo "failed." exit 1 fi echo -n } status() { if [ ! -f ${STATUS_FILE} ] ; then echo "${DESC} has not been started" exit 3 else echo "${DESC} had been started" fi } restart () { stop start } reload() { if [ ! -f ${STATUS_FILE} ] ; then echo "${DESC} has not been started" exit 1 fi /usr/bin/targetctl restore if [ $? -ne 0 ] ; then echo "failed." exit 1 fi } case "$1" in start) start ;; status) status ;; stop|forcedstop) stop ;; reload|force-reload) reload ;; restart|try-restart) restart ;; *) echo $"Usage: $0 {start|status|stop|forcedstop|restart|try-restart|reload|force-reload}" exit 1 ;; esac exit 0