# Trema Sliceable Switch
# ----------------------

# Trema is a Full-Stack OpenFlow Framework in Ruby and C
# https://github.com/trema/trema
#
# Trema Sliceable Switch is an OpenFlow controller which provides
# virtual layer-2 network slices.
# https://github.com/trema/apps/wiki

# Trema Sliceable Switch (OpenFlow Controller)
TREMA_APPS_REPO=${TREMA_APPS_REPO:-https://github.com/trema/apps.git}
TREMA_APPS_BRANCH=${TREMA_APPS_BRANCH:-master}

# Save trace setting
MY_XTRACE=$(set +o | grep xtrace)
set +o xtrace

TREMA_DIR=${TREMA_DIR:-$DEST/trema}
TREMA_SS_DIR="$TREMA_DIR/apps/sliceable_switch"

TREMA_DATA_DIR=${TREMA_DATA_DIR:-$DATA_DIR/trema}
TREMA_SS_ETC_DIR=$TREMA_DATA_DIR/sliceable_switch/etc
TREMA_SS_DB_DIR=$TREMA_DATA_DIR/sliceable_switch/db
TREMA_SS_SCRIPT_DIR=$TREMA_DATA_DIR/sliceable_switch/script
TREMA_TMP_DIR=$TREMA_DATA_DIR/trema

TREMA_LOG_LEVEL=${TREMA_LOG_LEVEL:-info}

TREMA_SS_CONFIG=$TREMA_SS_ETC_DIR/sliceable.conf
TREMA_SS_APACHE_CONFIG=/etc/apache2/sites-available/sliceable_switch.conf

# configure_trema - Set config files, create data dirs, etc
function configure_trema {
    # prepare dir
    for d in $TREMA_SS_ETC_DIR $TREMA_SS_DB_DIR $TREMA_SS_SCRIPT_DIR; do
        sudo mkdir -p $d
        sudo chown -R `whoami` $d
    done
    sudo mkdir -p $TREMA_TMP_DIR
}

# init_trema - Initialize databases, etc.
function init_trema {
    local _pwd=$(pwd)

    # Initialize databases for Sliceable Switch
    cd $TREMA_SS_DIR
    rm -f filter.db slice.db
    ./create_tables.sh
    mv filter.db slice.db $TREMA_SS_DB_DIR
    # Make sure that apache cgi has write access to the databases
    sudo chown -R www-data.www-data $TREMA_SS_DB_DIR
    cd $_pwd

    # Setup HTTP Server for sliceable_switch
    cp $TREMA_SS_DIR/{Slice.pm,Filter.pm,config.cgi} $TREMA_SS_SCRIPT_DIR
    sed -i -e "s|/home/sliceable_switch/db|$TREMA_SS_DB_DIR|" \
        $TREMA_SS_SCRIPT_DIR/config.cgi

    sudo cp $TREMA_SS_DIR/apache/sliceable_switch $TREMA_SS_APACHE_CONFIG
    sudo sed -i -e "s|/home/sliceable_switch/script|$TREMA_SS_SCRIPT_DIR|" \
        $TREMA_SS_APACHE_CONFIG
    sudo a2enmod rewrite actions
    sudo a2ensite sliceable_switch.conf

    cp $TREMA_SS_DIR/sliceable_switch_null.conf $TREMA_SS_CONFIG
    sed -i -e "s|^\$apps_dir.*$|\$apps_dir = \"$TREMA_DIR/apps\"|" \
        -e "s|^\$db_dir.*$|\$db_dir = \"$TREMA_SS_DB_DIR\"|" \
        $TREMA_SS_CONFIG
}

function gem_install {
    [[ "$OFFLINE" = "True" ]] && return
    [ -n "$RUBYGEMS_CMD" ] || get_gem_command

    local pkg=$1
    $RUBYGEMS_CMD list | grep "^${pkg} " && return
    sudo $RUBYGEMS_CMD install $pkg
}

function get_gem_command {
    # Trema requires ruby 1.8, so gem1.8 is checked first
    RUBYGEMS_CMD=$(which gem1.8 || which gem)
    if [ -z "$RUBYGEMS_CMD" ]; then
        echo "Warning: ruby gems command not found."
    fi
}

function install_trema {
    # Trema
    gem_install trema
    # Sliceable Switch
    git_clone $TREMA_APPS_REPO $TREMA_DIR/apps $TREMA_APPS_BRANCH
    make -C $TREMA_DIR/apps/topology
    make -C $TREMA_DIR/apps/flow_manager
    make -C $TREMA_DIR/apps/sliceable_switch
}

function start_trema {
    # APACHE_NAME is defined in init_horizon (in lib/horizon)
    restart_service $APACHE_NAME

    sudo LOGGING_LEVEL=$TREMA_LOG_LEVEL TREMA_TMP=$TREMA_TMP_DIR \
        trema run -d -c $TREMA_SS_CONFIG
}

function stop_trema {
    sudo TREMA_TMP=$TREMA_TMP_DIR trema killall
}

function check_trema {
    :
}

# Restore xtrace
$MY_XTRACE