#!/bin/bash

#Copyright 2018-present Open Networking Foundation
#
#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.

### BEGIN INIT INFO
# Provides:          start_inband_oltservices.sh
# Required-Start:    $all
# Required-Stop:     $network $local_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Sets up inband management channel and starts device management and Openolt services
# Description:
#                    This script does the following things
#                    1) Extracts bal package and keep the files in appropriate paths.
#                    2) Starts svk_init which installs required drivers needed by the MAC devices
#                    3) Starts device management daemon which initializes all maple, qumran chip sets
#                       and brings up access terminal.
#                    4) Sets up inband management channel
#                    5) Creates inband vlan tagged interface which will be used to communicate to
#                       Openolt service from vOLTHA via NNI
#                    6) Sets up dhcp-client-identifier in "/etc/dhcp/dhclient.conf" for each inband
#                       tagged interface so that it can obtain IP address from DHCP server
#                    7) Sets up DHCP IP configuration in "/etc/network/interfaces" for inband tagged
#                       interface so that it can initiate DHCPREQUEST to DHCP server once network
#                       restart triggered.
#                    8) Starts openolt service which enables all PON and NNI interfaces and creates
#                       respective PON and NNI schedulers and Queues.
### END INIT INFO

#------------------------------------------------------------------------------
# GLOBAL VARIABLES
#------------------------------------------------------------------------------

# Root path where required bal directories are located
BRCM_OPT_DIR='/opt/bcm68620'
BRCM_DIR='/broadcom'

# olt service files
SVK_INIT_FILE="${BRCM_OPT_DIR}/svk_init.sh"

# vlan config file
VLAN_CONFIG_FILE="${BRCM_DIR}/vlan.config"
DHCLIENT_CONF="/etc/dhcp/dhclient.conf"

# olt serial number
SERIAL_NUMBER="/sys/devices/virtual/dmi/id/product_serial"

OLT_MODEL=$(cat /sys/devices/virtual/dmi/id/board_name)
NETWORK_INTERFACE="/etc/network/interfaces"
BAL_OPENOLT_DEB_16="/openolt_asfvolt16.deb"
BAL_OPENOLT_DEB_64="/openolt_asgvolt64.deb"

DEV_MGMT_DAEMON="dev_mgmt_daemon -d -pcie"
OPENOLT="openolt"
ASFVOLT16="asfvolt16"
ASGVOLT64="asgvolt64"
ASF16_MODEL="ASXvOLT16"

# vlan id for asfvolt16
ASFVOLT16_VLAN_ID_ETH2=

# vlan id for asgvolt64
ASGVOLT64_VLAN_ID_ETH1=

# File used to set/get argument to openolt service
OPENOLT_ARG_INPUT_FILE=/etc/default/openolt

# Wait time for BAL to get ready
WAIT_TIME_BAL_READY=20

#------------------------------------------------------------------------------
# Function Name: does_logger_exist
# Description:
#    This function check if logger exist and executable.
#
# Globals:
#    None
#
# Arguments:
#    None
#
# Returns:
#    returns 0 if exist and executable else 1
#------------------------------------------------------------------------------
does_logger_exist() {
    cmd=/usr/bin/logger
    if [ -x ${cmd} ]; then
        return 0
    else
        return 1
    fi
}

#------------------------------------------------------------------------------
# Function Name: info_message
# Description:
#    This function print the info message information to the console
#
# Globals:
#    None
#
# Arguments:
#    string message
#
# Returns:
#    None
#------------------------------------------------------------------------------
info_message() {
    echo "INFO: $1"
    logger -p user.info "$1"
}

#------------------------------------------------------------------------------
# Function Name: error_message
# Description:
#    This function print the error message information to the console
#
# Globals:
#    None
#
# Arguments:
#    string message
#
# Returns:
#    returns 1
#------------------------------------------------------------------------------
error_message() {
    echo "ERROR: $1"
    logger -p user.err "$1"
    return 1
}

#------------------------------------------------------------------------------
# Function Name: get_vlan_ids
# Description:
#    This function facilitates to fetch vlan id from vlan configuration file
#    located at /broadcom/vlan.config
#
# Globals:
#    VLAN_CONFIG_FILE, ASFVOLT16_VLAN_ID_ETH2, ASFVOLT16_VLAN_ID_ETH3,
#    ASGVOLT64_VLAN_ID_ETH1, ASGVOLT64_VLAN_ID_ETH2
#
# Arguments:
#    None
#
# Returns:
#    None
#------------------------------------------------------------------------------
get_vlan_ids() {
    # Read vlan.config file to fetch vlan id information
    if [ -f ${VLAN_CONFIG_FILE} ]; then
        ASFVOLT16_VLAN_ID_ETH2=$(awk '/asfvolt16_vlan_id_eth2/{print $0}' ${VLAN_CONFIG_FILE} | awk -F "=" '{print $2}')
        ASGVOLT64_VLAN_ID_ETH1=$(awk '/asgvolt64_vlan_id_eth1/{print $0}' ${VLAN_CONFIG_FILE} | awk -F "=" '{print $2}')
        if [ -z ${ASFVOLT16_VLAN_ID_ETH2} ] || [ -z ${ASGVOLT64_VLAN_ID_ETH1} ]; then
            error_message "ERROR: vlan ids not valid"
            exit 1
        fi
    else
        error_message "ERROR: ${VLAN_CONFIG_FILE} not found, using default value 4093"
    fi
}

#------------------------------------------------------------------------------
# Function Name: setup_nw_configuration
# Description:
#    This function read the "/broadcom/vlan.config" file to get VLAND IDs
#    for the interface eth1 and eth2 based on the OLT model  and update
#    these VLAN ID to /etc/network/interfaces file for dhcp request.
# Globals:
#    VLAN_CONFIG_FILE, ASFVOLT16_VLAN_ID_ETH2, ASGVOLT64_VLAN_ID_ETH1
#
# Arguments:
#    None
#
# Returns:
#    None
#------------------------------------------------------------------------------
setup_nw_configuration() {
    # Dynamic vlan entry in /etc/network/interfaces file
    # Should have only one entry in the file in case of multiple reboot
    if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
        set_dhcp_ip_configuration eth2 ${ASFVOLT16_VLAN_ID_ETH2}
    else
        set_dhcp_ip_configuration eth1 ${ASGVOLT64_VLAN_ID_ETH1}
    fi
    # Restart the networking services
    /etc/init.d/networking restart
}

#------------------------------------------------------------------------------
# Function Name: set_dhcp_ip_configuration
# Description:
#    This function facilitates setup_nw_configuration function and accepts interface
#    vlan id as an argumnet to modify network interfaces file
#
# Globals:
#    None
#
# Arguments:
#    None
#
# Returns:
#    None
#------------------------------------------------------------------------------
set_dhcp_ip_configuration() {
    interface=$1
    vlan_id=$2
    grep -q "iface ${interface}.${vlan_id}" $NETWORK_INTERFACE
    if [ $? -ne 0 ]; then
        echo "auto ${interface}.${vlan_id}" >>${NETWORK_INTERFACE}
        echo "iface ${interface}.${vlan_id} inet dhcp" >>${NETWORK_INTERFACE}
    fi
}

#------------------------------------------------------------------------------
# Function Name: start_dev_mgmt_service
# Description:
#    This function starts svk_init.sh script and device management service.
#    Device management service initializes all maple, qumran chip sets and
#    brings up access terminal.
#
# Globals:
#    SVK_INIT_FILE, BRCM_DIR, DEV_MGMT_DAEMON
#
# Arguments:
#    None
#
# Returns:
#    None
#------------------------------------------------------------------------------
start_dev_mgmt_service() {
    info_message "Starting device management service"
    chmod +x ${SVK_INIT_FILE}
    ${SVK_INIT_FILE}

    # starts the device_management deamon and openolt services
    service dev_mgmt_daemon start
    service dev_mgmt_daemon status
    if [ $? -eq 0 ]; then
        info_message "${DEV_MGMT_DAEMON} service is running"
        setup_inband_mgmt_channel
    else
        error_message "${DEV_MGMT_DAEMON} is not running"
        exit 1
    fi
}

#------------------------------------------------------------------------------
# Function Name: setup_inband_mgmt_channel
# Description:
#    This function sets up inband management channel.
#
# Globals:
#    BRCM_DIR, ASFVOLT16_VLAN_ID_ETH2, ASGVOLT64_VLAN_ID_ETH1
#
# Arguments:
#    None
#
# Returns:
#    None
#------------------------------------------------------------------------------
setup_inband_mgmt_channel() {
    local interface_type="inband"

    # Extracting vlan ids from file
    get_vlan_ids

    cd ${BRCM_DIR}
    if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
        # Waiting till interface eth2 get initialized & RUNNING state
        check_interface_is_up eth2 $interface_type

        # wait for BAL to get ready
        sleep WAIT_TIME_BAL_READY

        # enabling in-band communication through broadcom API on NIC interface id 14 for eth2 interface
        echo "/Api/Set object=inband_mgmt_channel id=0 nni_intf={intf_type=nni intf_id=0} nic_intf_id=14 \
        vlan_id=${ASFVOLT16_VLAN_ID_ETH2} action=none" | ./example_user_appl
        if [ $? -ne 0 ]; then
            error_message "Failed to enable in-band channel on NIC interface id 14 with vlan ${ASFVOLT16_VLAN_ID_ETH2}"
        fi
    else
        # Waiting till interface eth1 get initialized & RUNNING state
        check_interface_is_up eth1 $interface_type
        # wait for BAL to get ready
        sleep WAIT_TIME_BAL_READY
        # enabling in-band communication through broadcom API on NIC interface id 14 for eth1 interface
        echo "/Api/Set object=inband_mgmt_channel id=0 nni_intf={intf_type=nni intf_id=0} nic_intf_id=14 \
        vlan_id=${ASGVOLT64_VLAN_ID_ETH1} action=none" | ./example_user_appl
        if [ $? -ne 0 ]; then
            error_message "Failed to enable in-band channel on NIC interface id 14 with vlan ${ASGVOLT64_VLAN_ID_ETH1}"
        fi
    fi
}

#------------------------------------------------------------------------------
# Function Name: create_vlan_tagged_Iface
# Description:
#    This function create the VLAN interfaces and brings them UP.
#
# Globals:
#    ASFVOLT16_VLAN_ID_ETH2, ASGVOLT64_VLAN_ID_ETH1
#
# Arguments:
#    None
#
# Returns:
#    None
#------------------------------------------------------------------------------
create_vlan_tagged_Iface() {
    if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
        # Adding vlan to the interface eth2
        ip link add link eth2 name eth2.${ASFVOLT16_VLAN_ID_ETH2} type vlan id ${ASFVOLT16_VLAN_ID_ETH2}
        ifconfig eth2.${ASFVOLT16_VLAN_ID_ETH2} up
    else
        # Adding vlan to the interface eth1
        ip link add link eth1 name eth1.${ASGVOLT64_VLAN_ID_ETH1} type vlan id ${ASGVOLT64_VLAN_ID_ETH1}
        ifconfig eth1.${ASGVOLT64_VLAN_ID_ETH1} up
    fi
    info_message "Inband tagged interfaces created succesfully"
}

#------------------------------------------------------------------------------
# Function Name: setup_dhcpd_configuration
# Description:
#    This function updates /etc/dhcp/dhclient.conf file for dhcp
#    request for eth2.ASFVOLT16_VLAN_ID_ETH2, eth3.ASFVOLT16_VLAN_ID_ETH3,
#    eth1.ASGVOLT64_VLAN_ID_ETH1 and eth2.ASGVOLT64_VLAN_ID_ETH2 interfaces
#
# Globals:
#    ASFVOLT16_VLAN_ID_ETH2, ASFVOLT16_VLAN_ID_ETH3, ASGVOLT64_VLAN_ID_ETH1,
#    ASGVOLT64_VLAN_ID_ETH2,  DHCLIENT_CONF
#
# Arguments:
#    None
#
# Returns:
#    None
#------------------------------------------------------------------------------
setup_dhcpd_configuration() {
    if [ -f ${DHCLIENT_CONF} ]; then
        if [ -f ${SERIAL_NUMBER} ]; then
            serial_num=$(cat ${SERIAL_NUMBER})
            if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
                # dhcient.conf file should have only one entry for eth2.<ASFVOLT16_VLAN_ID_ETH2> interface
                set_dhclient_configuration eth2 ${ASFVOLT16_VLAN_ID_ETH2}
            else
                # dhcient.conf file should have only one entry for eth1.<ASGVOLT64_VLAN_ID_ETH1> interface
                set_dhclient_configuration eth1 ${ASGVOLT64_VLAN_ID_ETH1}
            fi
        else
            error_message "ERROR: serial number of olt not found"
        fi
    else
        error_message "ERROR: DHCP config file not found"
    fi
}

#------------------------------------------------------------------------------
# Function Name: set_dhclient_configuration
# Description:
#    This function updates dhclient conf file with in-band interfaces.
#
# Globals:
#    None
#
# Arguments:
#    None
#
# Returns:
#    None
#------------------------------------------------------------------------------
set_dhclient_configuration() {
    interface=$1
    vlan_id=$2
    grep -q "interface \"${interface}.${vlan_id}\"" $DHCLIENT_CONF
    if [ $? -ne 0 ]; then
        echo "interface \"${interface}.${vlan_id}\" {" >>$DHCLIENT_CONF
        echo "    send dhcp-client-identifier \"${serial_num}.${vlan_id}\";" >>$DHCLIENT_CONF
        echo "}" >>$DHCLIENT_CONF
    fi
}

#------------------------------------------------------------------------------
# Function Name: check_interface_is_up
# Description:
#    This function checks if provided inband interface is up and running
#
# Globals:
#    None
#
# Arguments:
#    None
#
# Returns:
#    None
#------------------------------------------------------------------------------
check_interface_is_up()
{
    interface=$1
    interface_type=$2
    count=0

    while true; do
        if [ $interface_type = "inband" ]; then
            ifconfig ${interface} | grep 'RUNNING' &>/dev/null
            if [ $? -eq 0 ]; then
                info_message "${interface} is up and running"
                break
            fi
        elif [ $interface_type = "inband-tagged" ]; then
            while true; do
                ifconfig ${interface} | grep 'RUNNING' &>/dev/null
                if [ $? -eq 0 ]; then
                    ip=$(ifconfig $interface | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1)
                    if [ ! -z "$ip" ]; then
                        info_message "${interface} is up and running with valid IP address"
                        return 0
                    else
                        info_message "Inband interface ${interface} is not up, continuously retrying for DHCP IP assignment"
                        info_message "Inband interface ${interface} is not up with valid IP hence not starting openolt service"
                        sleep 10
                        continue
                    fi
                fi
            done
        fi
    done
}

#------------------------------------------------------------------------------
# Function Name: stop_olt_services
# Description:
#    This function informs about inband interface error status and stops device management service.
#
# Globals:
#    None
#
# Arguments:
#    None
#
# Returns:
#    None
#------------------------------------------------------------------------------
stop_olt_services()
{
    error_message "Inband tagged interface $1 is not up with valid IP address"
    info_message "Not starting openolt service and stopping device menagement service"
    service dev_mgmt_daemon stop
    exit 1
}

#------------------------------------------------------------------------------
# Function Name: start_openolt_service
# Description:
#    This function checks whether inband interfaces are up with IP address, then
#    appends inband interface name to a file which later will be used by openolt
#    service as command line option then starts openolt service.
#    Openolt service enables all PON and NNI interfaces and creates respective PON
#    and NNI schedulers and Queues.
#
# Globals:
#    None
#
# Arguments:
#    None
#
# Returns:
#    None
#------------------------------------------------------------------------------
start_openolt_service()
{
    info_message "Starting openolt service"
    local interface_type="inband-tagged"

    if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
        check_interface_is_up eth2.${ASFVOLT16_VLAN_ID_ETH2} $interface_type
        if [ $? -ne 0 ]; then stop_olt_services eth2.${ASFVOLT16_VLAN_ID_ETH2}; fi
        openolt_grpc_interface=eth2.${ASFVOLT16_VLAN_ID_ETH2}
    else
        check_interface_is_up eth1.${ASGVOLT64_VLAN_ID_ETH1} $interface_type
        if [ $? -ne 0 ]; then stop_olt_services eth1.${ASGVOLT64_VLAN_ID_ETH1}; fi
        openolt_grpc_interface=eth1.${ASGVOLT64_VLAN_ID_ETH1}
    fi

    # Inband interface name appended to this file. Interface name will be
    # used as command line argument by openolt service while running the binary.
    if [ -f "$OPENOLT_ARG_INPUT_FILE" ]; then
        info_message "$OPENOLT_ARG_INPUT_FILE exist"
        echo "gRPC_interface=$openolt_grpc_interface" > $OPENOLT_ARG_INPUT_FILE
    else
        info_message "$OPENOLT_ARG_INPUT_FILE does not exist, creating it"
        touch $OPENOLT_ARG_INPUT_FILE
        echo "gRPC_interface=$openolt_grpc_interface" > $OPENOLT_ARG_INPUT_FILE
    fi

    service openolt start
    service openolt status
    if [ $? -eq 0 ]; then
        info_message "${OPENOLT} service is running"
    else
        error_message "${OPENOLT} is not running"
        exit 1
    fi
}

#------------------------------------------------------------------------------
# Function Name: start_olt_services
# Description:
#    This function triggers services to create vlan interfaces, to run BAL services
#    and to trigger DHCP requets on eth2.VLAN_ID_1 and eth3.VLAN_ID_2 interfaces.
#
# Globals:
#    None
#
# Arguments:
#    None
#
# Returns:
#    None
#------------------------------------------------------------------------------
start_olt_services() {
    start_dev_mgmt_service
    create_vlan_tagged_Iface
    setup_dhcpd_configuration
    setup_nw_configuration
    start_openolt_service
}

#------------------------------------------------------------------------------
# Function Name: copy_config_files
# Description:
#    This function copy config files to /broadcom directory
#
# Globals:
#     BRCM_DIR
#
# Arguments:
#    None
#
# Returns:
#    None
#------------------------------------------------------------------------------
copy_config_files() {
    info_message "copying config files to ${BRCM_DIR}"
    # if [ "${OLT_MODEL}" != ${ASF16_MODEL} ]; then
    #     [ -f /qax.soc ] && cp "/qax.soc" "${BRCM_DIR}/"
    # fi
    # [ -f /config.bcm ] && cp "/config.bcm" "${BRCM_DIR}/"
    [ -f /vlan.config ] && cp "/vlan.config" "${BRCM_DIR}/"
}

# Execution starts from here
does_logger_exist
if [ $? -eq 0 ]; then
    if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
        # check if debian package is already installed.
        dpkg -l | grep ${ASFVOLT16}
        if [ $? -ne 0 ]; then
            # installs openolt debian package for asfvolt16 model
            dpkg -i ${BAL_OPENOLT_DEB_16}
        fi
    else
        dpkg -l | grep ${ASGVOLT64}
        if [ $? -ne 0 ]; then
            # installs openolt debian package for asgvolt64 model
            dpkg -i ${BAL_OPENOLT_DEB_64}
        fi
    fi
    copy_config_files
    start_olt_services
else
    error_message "logger does not exist"
    exit 1
fi
