<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Uncategorized &#8211; Furushima</title>
	<atom:link href="https://furushima.com.br/blog/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>https://furushima.com.br</link>
	<description>- Consultoria de Banco de Dados &#124; Furushima</description>
	<lastBuildDate>Mon, 03 Nov 2025 22:02:24 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://furushima.com.br/wp-content/uploads/2024/02/cropped-favicon-32x32.png</url>
	<title>Uncategorized &#8211; Furushima</title>
	<link>https://furushima.com.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>secondary_vnic_all_configure.sh</title>
		<link>https://furushima.com.br/blog/secondary_vnic_all_configure-sh/</link>
		
		<dc:creator><![CDATA[Carlos Furushima]]></dc:creator>
		<pubDate>Mon, 03 Nov 2025 21:25:56 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://furushima.com.br/?p=2917</guid>

					<description><![CDATA[Script oficial da Oracle Cloud que detecta e configura automaticamente todas as VNICs secundárias anexadas a uma VM Linux. Ideal para multihoming, separação de redes (app/backup), rotas dedicadas e cenários de alta disponibilidade. Faça o Download do script abaixo : https://raw.githubusercontent.com/oracle/terraform-examples/master/examples/oci/connect_vcns_using_multiple_vnics/scripts/secondary_vnic_all_configure.sh]]></description>
										<content:encoded><![CDATA[
<p>Script oficial da Oracle Cloud que <strong>detecta e configura automaticamente todas as VNICs secundárias</strong> anexadas a uma VM Linux.<br></p>



<ul class="wp-block-list">
<li><strong>Sobe as interfaces</strong> correspondentes às VNICs secundárias;</li>



<li><strong>Obtém o IP</strong> (via DHCP) ou aplica o IP estático já definido;</li>



<li><strong>Cria rotas e regras de policy routing</strong> por interface, isolando o tráfego por sub-rede;</li>



<li><strong>Persiste a configuração</strong> para sobreviver a reinicializações;</li>



<li>É <strong>idempotente</strong> (pode ser executado várias vezes) e dispensa reboot após anexar a VNIC.</li>
</ul>



<p>Ideal para <strong>multihoming</strong>, separação de redes (app/backup), rotas dedicadas e cenários de alta disponibilidade.</p>



<p></p>



<p>Faça o Download do script abaixo : </p>



<div class="wp-block-file aligncenter"><a id="wp-block-file--media-36d113fa-25db-4bd4-9ba6-1db1ffc5ed86" href="https://furushima.com.br/wp-content/uploads/2025/11/vnic.zip">vnic</a><a href="https://furushima.com.br/wp-content/uploads/2025/11/vnic.zip" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-36d113fa-25db-4bd4-9ba6-1db1ffc5ed86">Baixar</a></div>



<p></p>



<p class="has-text-align-center"><a href="https://raw.githubusercontent.com/oracle/terraform-examples/master/examples/oci/connect_vcns_using_multiple_vnics/scripts/secondary_vnic_all_configure.sh">https://raw.githubusercontent.com/oracle/terraform-examples/master/examples/oci/connect_vcns_using_multiple_vnics/scripts/secondary_vnic_all_configure.sh</a></p>



<p></p>



<p></p>



<p></p>



<div class="wp-block-kevinbatdorf-code-block-pro alignwide" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="#!/usr/bin/env bash

# Copyright (c) 2018, Oracle and/or its affiliates.
# The Universal Permissive License (UPL), Version 1.0
#
# Oracle OCI Virtual Cloud Networks IP configuration script
#
# 2017-10-24 initial release
# 2017-11-21 filter out VLANs if VM
# 2017-11-21 inhibit namespaces for ubuntu 16
# 2018-02-12 fix sshd typo in help
# 2018-02-20 update copyright notice
# 2018-03-21 fix to add src routing on primary VNIC when not using namespaces
# 2018-04-05 add note on multiple VCNs
# 2018-05-10 fix to delete config by deleting default route before deleting table, added -v option
# 2018-05-22 fix to ignore interfaces enslaved to a master device
# 2018-09-14 allow namespaces for Ubuntu 16 since problems with DHCP are fixed, and inhibit for all OL/Centos 6
# 2018-09-19 fix os name and version setting for centos 6 images
# 2018-09-19 fix ip addr parsing to remove MAC VLAN interfaces
# 2018-10-25 fix secondary private ip src routing
# 2018-10-31 fix misc routing setup, fix multiple ifaces on same subnet

declare -r THIS=$(basename &quot;$0&quot;)
declare -r MD_URL='http://169.254.169.254/opc/v1/vnics/'
declare -r NA='-'
declare -r RTS_FILE='/etc/iproute2/rt_tables'
declare -ir RT_ID_MIN=10 # in case lower ones are reserved
declare -ir RT_ID_MAX=255
declare -r RT_FORMAT_BM='ort${nic}vl${vltag}'
declare -r RT_FORMAT_VM='ort${nic}'
declare -r DEF_NS_FORMAT_BM='ons${nic}vl${vltag}'
declare -r DEF_NS_FORMAT_VM='ons${nic}'
declare -r MACVLAN_FORMAT='${iface}.${vltag}' # note awk script looks for this (max 15 chars)
declare -r VLAN_FORMAT='${iface}v${vltag}' # (max 15 chars)
declare -ir MTU=9000
declare -r ADD='ADD'
declare -r DELETE='DELETE'
declare -r YES='YES'
declare -r CURL=$(which curl)
declare -r IP=$(which ip)
declare -r SSHD=$(which sshd)
declare -r MODPROBE=$(which modprobe)
declare -r OS_RELEASE='/etc/os-release'
if [ -f &quot;$OS_RELEASE&quot; ]; then
    declare -r OS_ID=$(grep -ws ID $OS_RELEASE | cut -f 2 -d '=' | tr -d '&quot;' | tr '[:upper:]' '[:lower:]')
    declare -r OS_VERSION=$(grep -ws VERSION_ID $OS_RELEASE | cut -f 2 -d '=' | tr -d '&quot;')
else
    declare -r OS_RELEASE_alt='/etc/redhat-release'
    if [ -f &quot;$OS_RELEASE_alt&quot; ]; then
        declare -r OS_ID=$(cat $OS_RELEASE_alt|cut -f 1 -d ' ' | tr '[:upper:]' '[:lower:]')
        declare -r OS_VERSION=$(cat $OS_RELEASE_alt | cut -f 3 -d ' ')
    fi
fi
if [ -n &quot;$OS_VERSION&quot; ]; then
    declare -r OS_MAJ_VERSION=$(echo $OS_VERSION | cut -f 1 -d '.')
fi
declare -r SYS_CLASS_NET='/sys/class/net'
declare -A VIRTUAL_IFACES
declare IS_VM=''
declare -a MACS # all (unique) macs
declare -A MD_I_BY_MAC # index into arrays by MAC
declare -a MD_MACS
declare -a MD_ADDRS
declare -a MD_VLTAGS
declare -a MD_SCIDRS
declare -a MD_SPREFIXS
declare -a MD_SBITSS
declare -a MD_VIRTRTS
declare -a MD_VNICS
declare -a MD_NIC_IS # not set at all if vm
declare -a MD_CONFIGS # $ADD if vnic added
declare -A DUP_ADDRS # hash of addrs that appear more than once
declare -A DUP_SADDRS # hash of subnet addrs that appear more than once
# items use $NA to mean null
declare -A IP_I_BY_MAC # index into arrays by MAC
declare -a IP_MACS # runs of dups if sec addrs
declare -a IP_NSS
declare -a IP_IFACES
declare -a IP_ADDRS
declare -a IP_SADDRS
declare -a IP_SBITSS
declare -a IP_VIRTRTS
declare -a IP_STATES
declare -a IP_VLANS
declare -a IP_VLTAGS # vltag (0 if phys iface)
declare -a IP_SECADS # set to $YES if secondary addr
declare -a IP_SRCS # set to $YES if src hint
declare -a IP_NIC_IS # nic index of iface
declare -a IP_CONFIGS # $DELETE if vnic deleted
declare -a NIC_IP_IS # index of physical iface for nic index
declare -A NIC_I_BY_PHYS_IP_I # nic index for physical iface ip_i
# be sure to clear any IP_ arrays above in the read function
# options:
declare QUIET=''
declare DEBUG=''
declare START_SSHD=''
declare USE_NS=''
declare NS_FORMAT=''
declare -a SEC_ADDRS
declare -a SEC_VNICS

declare -r IFACE_AWK_SCRIPT='/tmp/oci_vcn_iface.awk'
cat &gt;$IFACE_AWK_SCRIPT &lt;&lt;'EOF'
function prtiface(mac, iface, addr, sbits, state, vlan, vltag, secad) {
    if (iface != &quot;&quot;) printf &quot;%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n&quot;, mac, iface, addr, sbits, state, vlan, vltag, secad
}
BEGIN { iface = &quot;&quot;; addr = &quot;-&quot; }
/^[0-9]/ {
    # if not the first and prev was not a mac vlan then print previous (note print at end too)
    if (addr == &quot;-&quot;) prtiface(mac, iface, addr, sbits, state, vlan, vltag, secad)
    addr = &quot;-&quot;
    sbits = &quot;-&quot;
    state = &quot;-&quot;
    macvlan = &quot;-&quot;
    vlan = &quot;-&quot;
    vltag = &quot;-&quot;
    secad = &quot;-&quot;
    if ($0 ~ /BROADCAST/ &amp;&amp; $0 !~ /UNKNOWN/ &amp;&amp; $0 !~ /NO-CARRIER/ &amp;&amp; $0 !~ /master /) {
        i = index($2, &quot;@&quot;)
        if (1 &lt; i) {
            j = index($2, &quot;.&quot;)
            if (j &lt; i) { # mac vlan (not used, no addrs)
                macvlan = substr($2, 1, i - 1)
                iface = substr($2, i + 1, length($2) - i - 1) # skip : at end
                addr = &quot;&quot; # skip the mac vlan iface
            } else { # vlan
                vlan = substr($2, 1, i - 1)
                # extract iface/vltag from macvlan
                iface = substr($2, i + 1, j - i - 1)
                vltag = substr($2, j + 1, length($2) - j - 1) # skip : at end
            }
        } else {
            i = index($2, &quot;:&quot;)
            if (i &lt;= 1) { print &quot;cannot find interface name&quot;; exit 1 }
            iface = substr($2, 1, i - 1)
        }
        if ($0 ~ /LOWER_UP/) state = &quot;UP&quot;
        else state = &quot;DOWN&quot;
    } else iface = &quot;&quot;
    next
}
/ link\/ether / { mac = tolower($2) }
/ inet [0-9]/ {
    i = index($2, &quot;/&quot;)
    if (i &lt;= 1) { print &quot;cannot find interface inet address&quot;; exit 1 }
    if (addr != &quot;-&quot;) secad = &quot;YES&quot;
    addr = substr($2, 0, i - 1)
    sbits = substr($2, i + 1, length($2) - i)
    prtiface(mac, iface, addr, sbits, state, vlan, vltag, secad)
}
END { if (addr == &quot;-&quot;) prtiface(mac, iface, addr, sbits, state, vlan, vltag, secad) }
EOF

oci_vcn_err() {
    echo &quot;Error: $1&quot; &gt;&amp;2
    exit 1
}

oci_vcn_warn() {
    echo &quot;Warning: $1&quot; &gt;&amp;2
}

oci_vcn_info() {
    [ -n &quot;$QUIET&quot; ] || echo &quot;Info: $1&quot; &gt;&amp;2
}

oci_vcn_debug() {
    [ -z &quot;$DEBUG&quot; ] || echo &quot;Debug: $1&quot; &gt;&amp;2
}

oci_vcn_virtual_ifaces_read() {
    VIRTUAL_IFACES=()
    local iface
    for iface in $(ls $SYS_CLASS_NET); do
        if ls -l $SYS_CLASS_NET/$iface | grep -wq virtual; then
            VIRTUAL_IFACES[$iface]='t'
        fi
    done
}

oci_vcn_md_read() {
    # sets all MD data arrays and their index I_BY_MAC
    local -r tmpfile=$(mktemp /tmp/oci_vcn_md.XXXXX)

    # MD notes:
    # vnic order: primary first, then time created (and therefore vltag/nic)
    # BM notes: (1) may be interleaved wrt nic index (i.e. all nic 0 not guaranteed before all nic 1)
    # (2) nicIndex was supported starting around 8/23/17, but will not appear on previously
    # launched instances unless refreshed by a vnic attach or detach after that date

    # parse: force json fields on separate lines
    # WARNING: assumes no string values with commas or double quotes
    # WARNING: assumes no sub-objects with identical field names
    [ -n &quot;$CURL&quot; ] || oci_vcn_err &quot;cannot find curl command&quot;
    $CURL -s $MD_URL | tr , '\n' &gt;&quot;$tmpfile&quot; || oci_vcn_err &quot;cannot read metadata&quot;
    MD_MACS=($(grep -w macAddr &quot;$tmpfile&quot; | cut -f 4 -d '&quot;')) || exit $? # string
    local -i i
    for i in $(seq 0 $((${#MD_MACS[@]} - 1))); do
        MD_MACS[$i]=&quot;${MD_MACS[$i],,}&quot;
    done
    MD_ADDRS=($(grep -w privateIp &quot;$tmpfile&quot; | cut -f 4 -d '&quot;')) # string
    MD_VLTAGS=($(grep -w vlanTag &quot;$tmpfile&quot; | cut -f 2 -d ':' | tr -d ' ')) # integer
    MD_VIRTRTS=($(grep -w virtualRouterIp &quot;$tmpfile&quot; | cut -f 4 -d '&quot;')) # string
    local s
    for s in $(grep -w subnetCidrBlock &quot;$tmpfile&quot; | cut -f 4 -d '&quot;'); do # string
        MD_SCIDRS+=(${s})
        MD_SPREFIXS+=(${s%/*})
        MD_SBITSS+=(${s#*/})
    done
    MD_VNICS=($(grep -w vnicId &quot;$tmpfile&quot; | cut -f 4 -d '&quot;'))
    MD_NIC_IS=($(grep -w nicIndex &quot;$tmpfile&quot; | cut -f 2 -d ':' | tr -d ' '))

    # do some validity checks on md data
    [ ${#MD_MACS[@]} -eq ${#MD_ADDRS[@]} ] || oci_vcn_err &quot;invalid metadata: MAC or IP addresses are missing&quot;
    [ ${#MD_MACS[@]} -eq ${#MD_VLTAGS[@]} ] || oci_vcn_err &quot;invalid metadata: MAC or VLAN tags are missing&quot;
    [ ${#MD_MACS[@]} -eq ${#MD_VIRTRTS[@]} ] || oci_vcn_err &quot;invalid metadata: MAC or virtual router addresses are missing&quot;
    [ ${#MD_MACS[@]} -eq ${#MD_SPREFIXS[@]} ] || oci_vcn_err &quot;invalid metadata: MAC or subnets are missing&quot;
    [ ${#MD_MACS[@]} -eq ${#MD_VNICS[@]} ] || oci_vcn_err &quot;invalid metadata: MAC or VNIC ids are missing&quot;
    for i in $(seq 0 $((${#MD_MACS[@]} - 1))); do
        [[ ${MD_ADDRS[$i]} =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] || oci_vcn_err &quot;invalid metadata: address IP format incorrect: ${MD_ADDRS[$i]}&quot;
        [[ ${MD_VLTAGS[$i]} =~ ^[0-9]+$ ]] || oci_vcn_err &quot;invalid metadata: VLAN tag incorrect: ${MD_VLTAGS[$i]}&quot;
        [[ ${MD_VIRTRTS[$i]} =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] || oci_vcn_err &quot;invalid metadata: virtual router address format incorrect: ${MD_VIRTRTS[$i]}&quot;
        [[ ${MD_SPREFIXS[$i]} =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] || oci_vcn_err &quot;invalid metadata: subnet prefix format incorrect: ${MD_SPREFIXS[$i]}&quot;
    done

    # set vm flag based on existence of nic index (see override in oci_vcn_ip_read)
    # get the virtual interfaces if VM
    if [ ${#MD_NIC_IS[@]} -eq 0 ]; then
        IS_VM='t'
        oci_vcn_virtual_ifaces_read
    fi

    # create reverse lookup
    for i in &quot;${!MD_MACS[@]}&quot;; do
        MD_I_BY_MAC[${MD_MACS[$i]}]=$i
    done
    rm &quot;$tmpfile&quot;

    # find the duplicate addrs, if any
    local -A addrs=()
    local addr
    for addr in &quot;${MD_ADDRS[@]}&quot;; do
        if [ -n &quot;${addrs[$addr]}&quot; ]; then DUP_ADDRS[$addr]='t'; fi
        addrs[$addr]='t'
    done

    # find the duplicate subnet addrs, if any
    local -A saddrs=()
    for addr in &quot;${MD_SPREFIXS[@]}&quot;; do
        if [ -n &quot;${saddrs[$addr]}&quot; ]; then DUP_SADDRS[addr]='t'; fi
        saddrs[addr]='t'
    done
}

oci_vcn_ip_route_table_name() {
    local -ir nic=$1 # format looks for &quot;${nic}&quot;, note this is really $nic_i
    local -ir vltag=$2
    local format=&quot;$RT_FORMAT_VM&quot;

    [ -n &quot;$IS_VM&quot; ] || format=&quot;$RT_FORMAT_BM&quot;
    eval echo &quot;$format&quot;
}

oci_vcn_ip_route_table_name_ip_i() {
    # use only when ip already setup
    local -ir ip_i=$1
    local -ir nic_i=${IP_NIC_IS[$ip_i]}
    local -ir vltag=${IP_VLTAGS[$ip_i]}

    oci_vcn_ip_route_table_name $nic_i $vltag
}

oci_vcn_ip_route_table_exists() {
    local -r rt_name=$1
    if grep -qsw $rt_name $RTS_FILE; then
        echo &quot;$rt_name&quot;
    fi
}

oci_vcn_ip_route_table_find_unused_id() {
    # read all the current route table id/name pairs
    # mapfile will create array with each line an element
    local lines
    mapfile -t lines &lt; &lt;(cat $RTS_FILE | grep -E '^[0-9]' | tr '\t' ' ' | tr -s ' ' ' ') || oci_vcn_err &quot;cannot read route tables file $RTS_FILE&quot;
    local line
    local -A rt_by_id
    for line in &quot;${lines[@]}&quot;; do
        local -a pair=($line)
        local id=${pair[0]}
        local name=${pair[1]}
        rt_by_id[$id]=$name
    done

    # find first id not used
    local -i unused=-1
    local -i i
    for i in $(seq $RT_ID_MIN $RT_ID_MAX); do
        if [ -z &quot;${rt_by_id[$i]}&quot; ]; then
            unused=$i
            break
        fi
    done
    [ $unused -ne -1 ] ||  oci_vcn_err &quot;cannot find unused id in route tables file $RTS_FILE&quot;
    echo $unused
}

oci_vcn_ip_route_table_create() {
    local -ir nic_i=$1
    local -ir vltag=$2
    local -r skip_if_exists=$3
    local -r rt_name=$(oci_vcn_ip_route_table_name $nic_i $vltag)

    # Check if the route table exists
    local rt_exists
    rt_exists=$(oci_vcn_ip_route_table_exists $rt_name) || exit $?
    if [ -n &quot;$rt_exists&quot; ]; then # already exists
        if [ -n &quot;$skip_if_exists&quot; ]; then
            oci_vcn_debug &quot;create route table $rt_name already exists, skipping&quot;
            return
        fi
        oci_vcn_warn &quot;route table $rt_name already exists, reusing&quot;
    else # create
        local -i rt_id
        rt_id=$(oci_vcn_ip_route_table_find_unused_id) || exit $?
        oci_vcn_debug &quot;create route table $rt_name ($rt_id)&quot;
        echo &quot;$rt_id    $rt_name&quot; &gt;&gt; $RTS_FILE
    fi
    echo &quot;$rt_name&quot;
}

oci_vcn_ip_route_table_del() {
    local -r rt_name=$1
    local -r tmpfile=$(mktemp /tmp/oci_vcn_rt_tables.XXXXX)

    if ! grep -qsw $rt_name $RTS_FILE; then
        oci_vcn_debug &quot;rt $rt_name not in $RTS_FILE&quot;
        return
    fi
    oci_vcn_debug &quot;rt $rt_name delete&quot;
    cp -p $RTS_FILE &quot;$tmpfile&quot; # in case grep fails
    grep -vw $rt_name $RTS_FILE &gt; &quot;$tmpfile&quot;
    mv &quot;$tmpfile&quot; $RTS_FILE
    echo 't'
}

oci_vcn_ip_routing_add() {
    local -ir md_i=$1
    local -ir nic_i=$2
    local -r iface=$3
    local -r ns=$4
    local -r skip_if_exists=$5
    local -ir vltag=&quot;${MD_VLTAGS[$md_i]}&quot;
    local -r addr=&quot;${MD_ADDRS[$md_i]}&quot;
    local -r sprefix=&quot;${MD_SPREFIXS[$md_i]}&quot;
    local -r virtrt=&quot;${MD_VIRTRTS[$md_i]}&quot;
    local -r scidr=&quot;${MD_SCIDRS[$md_i]}&quot;

    # set a default route to the gateway/virtual router
    if [ -n &quot;$ns&quot; ]; then
        local -r nscmd=&quot;netns exec $ns $IP&quot;
        # using a namespace: iface is assumed only one in namespace, so just set a
        # default route to the gateway in the main route table
        oci_vcn_debug &quot;default route add&quot;
        $IP $nscmd route add default via $virtrt || oci_vcn_err &quot;cannot add namespace $ns default gateway $virtrt&quot;
        oci_vcn_info &quot;added namespace $ns default route to gateway $virtrt&quot;
    else
        # the default route (in main route table) already defined through primary vnic.
        # this adds a rule to lookup a route table for any packets sourced from addr
        # and then the route table has the default route for that addr.
        # this allows packets from protocol services that reply with src addr
        # set to route back out through the iface (prevents asymmetric routing).

        # check for dup addrs and subnet addrs
        if [ -n &quot;${DUP_ADDRS[$addr]}&quot; ]; then
            oci_vcn_warn &quot;IP address $addr is a duplicate, skipping creating source route rule&quot;
            return
        fi
        [ -z &quot;${DUP_SADDRS[$sprefix]}&quot; ] || oci_vcn_warn &quot;duplicate subnet prefix $sprefix&quot;

        # create route table and add a default route via the gateway, and subnet route
        local rt_name
        rt_name=$(oci_vcn_ip_route_table_create $nic_i $vltag $skip_if_exists) || exit $?
        [ -n &quot;$rt_name&quot; ] || return
        oci_vcn_debug &quot;route table add rules&quot;
        $IP route add default via $virtrt dev $iface table $rt_name || oci_vcn_err &quot;cannot add default route via $virtrt on $iface to table $rt_name&quot;
        $IP route add $scidr dev $iface table $rt_name || oci_vcn_err &quot;cannot add subnet $scidr route on $iface to table $rt_name&quot;

        # create source-based rule to use table
        oci_vcn_debug &quot;src rule add&quot;
        $IP rule add from $addr lookup $rt_name || oci_vcn_err &quot;cannot add rule from $addr use table $rt_name&quot;
        oci_vcn_info &quot;added rule for routing from $addr lookup $rt_name with default via $virtrt&quot;
    fi
}

oci_vcn_ip_routing_del() {
    local -ir ip_i=$1
    local -r ns=&quot;${IP_NSS[$ip_i]#$NA}&quot;
    local -r iface=&quot;${IP_IFACES[$ip_i]}&quot;

    # for namespaces the subnet and default routes will be auto deleted with the namespace
    if [ -z &quot;$ns&quot; ]; then
        # delete rule
        local -r rt_name=$(oci_vcn_ip_route_table_name_ip_i $ip_i)
        local had_rule=''
        if $IP rule | grep -qsw $rt_name; then # rule(s) exists
            # note that there may be secondary private ips rules using the same table
            oci_vcn_debug &quot;rules to table $rt_name delete&quot;
            while $IP rule del lookup $rt_name 2&gt;/dev/null; do true; done
            had_rule='t'
        fi

        # delete route table
        local had_table
        had_table=$(oci_vcn_ip_route_table_del $rt_name) || exit $?
        ([ -z &quot;$had_rule&quot; ] &amp;&amp; [ -z &quot;$had_table&quot; ]) || oci_vcn_info &quot;removed routing on interface $iface&quot;
    fi
}

oci_vcn_ip_routing_sec_addr_add() {
    local -ir iface_ip_i=$1
    local -r addr=$2
    local -r ns=&quot;${IP_NSS[$iface_ip_i]#$NA}&quot;

    # need to add source rule so reuse the routing table from the primary private ip
    # not needed if in namespace
    # not needed if on pri iface (uses main route table for dest and default route)
    if [ -z &quot;$ns&quot; ] &amp;&amp; [ $iface_ip_i -ne 0 ]; then
        # create source-based rule to use iface's routing table
        local -r rt_name=$(oci_vcn_ip_route_table_name_ip_i $iface_ip_i)
        oci_vcn_debug &quot;sec addr src rule add&quot;
        $IP rule add from $addr lookup $rt_name || oci_vcn_err &quot;cannot add rule from secondary $addr use table $rt_name&quot;
        oci_vcn_info &quot;added rule for routing from secondary IP address $addr lookup $rt_name&quot;
    fi
}

oci_vcn_ip_routing_sec_addr_del() {
    local -ir ip_i=$1
    local -r addr=$2
    local -r ns=&quot;${IP_NSS[$ip_i]#$NA}&quot;

    # deconfig the routing (see comments in add)
    if [ -z &quot;$ns&quot; ] &amp;&amp; [ $ip_i -ne 0 ]; then
        $IP rule del from $addr 2&gt;/dev/null # ok if already deleted
        oci_vcn_info &quot;deleted rule for routing from secondary IP address $addr&quot;
    fi
}

oci_vcn_ip_routes_read() {
    #ip r list 192.168.1.0/24
    local -ir ip_i=$1
    local -r ns=&quot;${IP_NSS[$ip_i]#$NA}&quot;
    local -r iface=&quot;${IP_IFACES[$ip_i]}&quot;
    local nscmd=''
    local virtrt=&quot;$NA&quot;

    if [ -n &quot;$ns&quot; ]; then
        nscmd=&quot;netns exec $ns $IP&quot;
    else
        # no namespace: check for route table
        local -r rt_name=$(oci_vcn_ip_route_table_name_ip_i $ip_i)
        local rt_exists
        rt_exists=$(oci_vcn_ip_route_table_exists $rt_name) || exit $?
        if [ -n &quot;$rt_exists&quot; ]; then # exists
            # check for rule
            if $IP rule | grep -qsw $rt_name; then # rule exists that uses route table
                # look for default route in table, note table may exist but be empty
                # &quot;default via 10.0.0.1 dev ens3&quot;
                local -a def_entry
                def_entry=($($IP route show table $rt_name | grep -sw ^default))
                if [ -n &quot;${def_entry[2]}&quot; ]; then
                    virtrt=&quot;${def_entry[2]}&quot;
                    oci_vcn_debug &quot;default route: $virtrt&quot;
                else # emtpy table: delete rule and table
                    virtrt=&quot;$NA&quot;
                    oci_vcn_ip_routing_del $ip_i
                fi
            else # clean up route table since no rule uses it
                $(oci_vcn_ip_route_table_del $rt_name)
            fi
        fi
    fi

    # read the routes
    local sprefix=&quot;$NA&quot;
    local sbits=&quot;$NA&quot;
    local src=&quot;$NA&quot;
    # mapfile will create array with each line an element
    mapfile -t routes &lt; &lt;($IP $nscmd route | grep -w $iface) || oci_vcn_err &quot;cannot read IP routes for interface $iface&quot;
    local line
    for line in &quot;${routes[@]}&quot;; do
        local -a route=($line)
        if [ &quot;${route[0]}&quot; = 'default' ]; then
            # &quot;default via 10.0.0.1 dev ens3&quot;
            virtrt=&quot;${route[2]}&quot;
            oci_vcn_debug &quot;default route via: $virtrt&quot;
        elif [ &quot;${route[0]#169.}&quot; = &quot;${route[0]}&quot; ]; then # not cavium route
            # &quot;10.0.0.0/24 dev ens3 proto kernel scope link src 10.0.0.2&quot;
            local -i i
            for i in $(seq 0 $((${#route[@]} - 1))); do
                local x=&quot;${route[$i]}&quot;
                if [ $i -eq 0 ]; then
                    sprefix=${x%/*}
                    sbits=${x#*/}
                    if [ &quot;$sprefix&quot; = &quot;$sbits&quot; ]; then # not valid line
                        sprefix=&quot;$NA&quot;
                        sbits=&quot;$NA&quot;
                        break
                    else
                        oci_vcn_debug &quot;subnet route: $sprefix/$sbits&quot;
                    fi
                elif [ &quot;$x&quot; = 'src' ]; then src=&quot;$YES&quot;
                fi
            done
        fi
    done
    IP_VIRTRTS[$ip_i]=&quot;$virtrt&quot;
    IP_SADDRS[$ip_i]=&quot;$sprefix&quot;
    IP_SBITSS[$ip_i]=&quot;$sbits&quot;
    IP_SRCS[$ip_i]=&quot;$src&quot;
}

oci_vcn_macvlan_name() {
    local -r iface=$1
    local -r vltag=$2
    eval echo &quot;$MACVLAN_FORMAT&quot;
}

oci_vcn_vlan_name() {
    local -r iface=$1
    local -r vltag=$2
    eval echo &quot;$VLAN_FORMAT&quot;
}

oci_vcn_ip_ns_name() {
    local -ir nic=$1 # format looks for &quot;${nic}&quot;
    local -ir vltag=$2

    if [ -n &quot;$USE_NS&quot; ] &amp;&amp; [ -z &quot;$NS_FORMAT&quot; ]; then
        if [ -n &quot;$IS_VM&quot; ]; then NS_FORMAT=&quot;$DEF_NS_FORMAT_VM&quot;
        else NS_FORMAT=&quot;$DEF_NS_FORMAT_BM&quot;; fi
    fi
    eval echo &quot;$NS_FORMAT&quot;
}

oci_vcn_ip_ns_svcs_stop() {
    local -r ns=$1
    local pids
    pids=$($IP netns pids $ns) || oci_vcn_err &quot;cannot get ids for processes in namespace $ns&quot;
    if [ -n &quot;$pids&quot; ]; then
        kill -TERM $pids || oci_vcn_err &quot;cannot terminate namespace $ns processes: $pids&quot;
        oci_vcn_info &quot;terminated namespace $ns processes: $pids&quot;
    fi
}

oci_vcn_ip_ns_svcs_start() {
    local -r ns=$1
    if [ -n &quot;$START_SSHD&quot; ]; then # start SSH daemon
        $IP netns exec $ns $SSHD || oci_vcn_err &quot;cannot start ssh daemon&quot;
        oci_vcn_info &quot;started namespace $ns ssh daemon&quot;
    fi
}

oci_vcn_ip_ns_del() {
    local -r ns=$1
    # note also deletes vlans and routes
    $IP netns del $ns || oci_vcn_err &quot;cannot delete namespace $ns&quot;
    oci_vcn_info &quot;deleted namespace $ns&quot;
}

oci_vcn_ip_ns_create() {
    local -ir nic_i=$1
    local -ir vltag=$2

    [ -n &quot;$MODPROBE&quot; ] || oci_vcn_err &quot;cannot find modprobe command&quot;
    $MODPROBE 8021q || oci_vcn_err &quot;failed to load 8021q module&quot;
    local ns
    ns=$(oci_vcn_ip_ns_name $nic_i $vltag) || exit $?
    $IP netns add $ns || oci_vcn_err &quot;cannot create namespace $ns&quot;
    oci_vcn_info &quot;created namespace $ns&quot;
    echo &quot;$ns&quot;
}

oci_vcn_ip_addr_add_iface() {
    local -ir md_i=$1
    local -ir ip_i=$2 # index of physical iface/nic
    local -r ns=$3
    local iface=&quot;${IP_IFACES[$ip_i]}&quot;
    local -r physns=&quot;${IP_NSS[$ip_i]#$NA}&quot;
    local -r mac=&quot;${MD_MACS[$md_i]}&quot;
    local -ir vltag=&quot;${MD_VLTAGS[$md_i]}&quot;
    local -r addr=&quot;${MD_ADDRS[$md_i]}&quot;
    local -r sbits=&quot;${MD_SBITSS[$md_i]}&quot;
    local vlan=''

    # must be adding to physical iface/nic
    [ -z &quot;${IP_VLANS[$ip_i]#$NA}&quot; ] || oci_vcn_err &quot;cannot add IP address $addr to virtual interface ${IP_VLANS[$ip_i]}&quot;

    # create virtual interface if needed (bm cases)
    local macvlan=''
    if [ -z &quot;$IS_VM&quot; ] &amp;&amp; [ $vltag -ne 0 ]; then
        # bm vnics need a virtual iface except for vltag=0
        # if physical iface/nic is in a namespace we must go there to create
        local physnscmd=''
        if [ -n &quot;$physns&quot; ]; then
            physnscmd=&quot;netns exec $physns $IP&quot;
        fi

        # create a mac vlan from physical iface/nic
        oci_vcn_debug &quot;macvlan link add $macvlan&quot;
        macvlan=$(oci_vcn_macvlan_name $iface $vltag) || exit $?
        $IP $physnscmd link add link $iface name $macvlan address $mac type macvlan \
            || oci_vcn_err &quot;cannot create MAC VLAN interface $macvlan for MAC address $mac&quot;

        # if physical iface/nic is in a namespace pull out the created mac vlan
        if [ -n &quot;$physns&quot; ]; then
            $IP $physnscmd link set $macvlan netns 1
        fi

        # create an ip vlan on top of the mac vlan
        oci_vcn_debug &quot;vlan link add&quot;
        vlan=$(oci_vcn_vlan_name $iface $vltag) || exit $?
        $IP link add link $macvlan name $vlan type vlan id $vltag \
            || oci_vcn_err &quot;cannot create VLAN $vlan on MAC VLAN $macvlan&quot;
    fi

    # use namespace, if option
    local nscmd=''
    local -r dev=&quot;${vlan:-$iface}&quot;
    if [ -n &quot;$ns&quot; ]; then
        nscmd=&quot;netns exec $ns $IP&quot;
        # move the iface(s) to the target namespace
        if [ -n &quot;$macvlan&quot; ]; then
            oci_vcn_debug &quot;macvlan link move $ns&quot;
            $IP link set dev $macvlan netns $ns || oci_vcn_err &quot;cannot move MAC VLAN $macvlan into namespace $ns&quot;
        fi
        oci_vcn_debug &quot;$dev link move $ns&quot;
        $IP link set dev $dev netns $ns || oci_vcn_err &quot;cannot move interface $dev into namespace $ns&quot;
    fi

    # add IP address to iface:
    # the netmask is specified to create a route in the main route table
    # if this iface is on the same subnet as another iface then the route will not have an effect
    # (until the other iface is removed)
    oci_vcn_debug &quot;addr $addr/$sbits add on $dev ns '$ns'&quot;
    $IP $nscmd addr add $addr/$sbits dev $dev || oci_vcn_err &quot;cannot add IP address $addr/$sbits on interface $dev&quot;

    if [ -n &quot;$macvlan&quot; ]; then # set vlans up
        oci_vcn_debug &quot;vlans set up&quot;
        $IP $nscmd link set dev $macvlan mtu $MTU up || oci_vcn_err &quot;cannot set MAC VLAN $macvlan up&quot;
        $IP $nscmd link set dev $vlan mtu $MTU up || oci_vcn_err &quot;cannot set VLAN $vlan up&quot;
    else
        oci_vcn_debug &quot;$iface set up&quot;
        $IP $nscmd link set dev $iface mtu $MTU up || oci_vcn_err &quot;cannot set interface $iface MTU&quot;
    fi

    oci_vcn_info &quot;added IP address $addr on interface $dev with MTU $MTU&quot;
    echo &quot;$dev&quot;
}

oci_vcn_ip_addr_del_iface() {
    local -ir ip_i=$1
    local -r iface=&quot;${IP_IFACES[$ip_i]}&quot;
    local -r ns=&quot;${IP_NSS[$ip_i]#$NA}&quot;
    local -r vlan=&quot;${IP_VLANS[$ip_i]#$NA}&quot;
    local -r secad=&quot;${IP_SECADS[$ip_i]#$NA}&quot;
    local nscmd=''

    if [ -n &quot;$ns&quot; ]; then
        nscmd=&quot;netns exec $ns $IP&quot;
    fi
    if [ &quot;$secad&quot; != &quot;$YES&quot; ] &amp;&amp; [ -n &quot;$vlan&quot; ]; then
        # delete vlan and macvlan, removes the addrs (pri and sec) as well
        oci_vcn_debug &quot;$ns link delete&quot;
        local -ir vltag=&quot;${IP_VLTAGS[$ip_i]}&quot;
        local macvlan
        macvlan=$(oci_vcn_macvlan_name $iface $vltag) || exit $?
        $IP $nscmd link del link $vlan dev $macvlan || oci_vcn_err &quot;cannot remove VLAN $vlan&quot;
        oci_vcn_info &quot;removed VLAN $vlan&quot;
    else
        # delete addr from phys iface
        # deleting namespace will move phys iface back to main
        # note that we may be deleting sec addr from a vlan here
        local -r addr=&quot;${IP_ADDRS[$ip_i]#$NA}&quot;
        local -r dev=&quot;${vlan:-$iface}&quot;
        local bits=&quot;${IP_SBITSS[$ip_i]#$NA}&quot;

        [ &quot;$secad&quot; != &quot;$YES&quot; ] || bits=32
        oci_vcn_debug &quot;addr $addr del ns '$ns' dev $dev&quot;
        $IP $nscmd addr del $addr/$bits dev $dev || oci_vcn_err &quot;cannot remove IP address $addr/$bits from interface $dev&quot;
        oci_vcn_info &quot;removed IP address $addr from interface $dev&quot;
    fi
}

oci_vcn_ip_addr_add() {
    local -ir md_i=$1
    local -r mac=&quot;${MD_MACS[$md_i]}&quot;
    local -r addr=&quot;${MD_ADDRS[$md_i]}&quot;
    local ns=''
    local iface=''
    local -i nic_i
    local -i vltag

    # note that when adding an addr to a physical iface ip_i will be the index of the
    # addr, but when creating a vlan for addr ip_i will not be the vlan iface but its phys one
    local -i ip_i

    if [ -z &quot;$IS_VM&quot; ]; then
        # bm vnics' physical ifaces are identified by nic index
        nic_i=${MD_NIC_IS[$md_i]}
        [ $nic_i -lt ${#NIC_IP_IS[@]} ] || oci_vcn_err &quot;cannot find interface for NIC $nic_i&quot;
        ip_i=${NIC_IP_IS[$nic_i]}
        iface=&quot;${IP_IFACES[$ip_i]}&quot;
        vltag=${MD_VLTAGS[$md_i]}
    else
        # vm vnics' physical ifaces are identified by matching mac
        local found=''
        ip_i=0
        local ip_mac
        for ip_mac in &quot;${IP_MACS[@]}&quot;; do
            if [ &quot;$ip_mac&quot; = &quot;$mac&quot; ]; then
                found='t'
                break
            fi
            ip_i+=1
        done
        [ -n &quot;$found&quot; ] || oci_vcn_err &quot;cannot find interface matching VNIC MAC $mac&quot;
        iface=&quot;${IP_IFACES[$ip_i]}&quot;
        nic_i=${IP_NIC_IS[$ip_i]}
        vltag=0
    fi

    # check that there is no current addr on iface
    if [ -n &quot;$IS_VM&quot; ] || [ &quot;${MD_VLTAGS[$md_i]}&quot; = &quot;0&quot; ]; then # putting addr directly on iface
        local -r ip_addr=&quot;${IP_ADDRS[$ip_i]#$NA}&quot;
        [ -z &quot;$ip_addr&quot; ] || oci_vcn_err &quot;IP address $ip_addr already added on interface $iface&quot;
    fi

    # make sure physical iface/nic is up
    if [ &quot;${IP_STATES[$ip_i]}&quot; != &quot;UP&quot; ]; then
        $IP link set dev $iface up || oci_vcn_err &quot;cannot set interface $iface up&quot;
    fi

    # create namespace if requested
    local ns=''
    if [ -n &quot;$USE_NS&quot; ]; then
        ns=$(oci_vcn_ip_ns_create $nic_i $vltag) || exit $?
        # if working on a physical iface we need to set its namespace so that any
        # vlan created subsequently will know how to find it
        [ $vltag -ne 0 ] || IP_NSS[$ip_i]=&quot;$ns&quot;
    fi

    # add addr to iface (possibly creating vlan)
    local dev
    dev=$(oci_vcn_ip_addr_add_iface $md_i $ip_i $ns) || exit $?

    # setup routes
    oci_vcn_ip_routing_add $md_i $nic_i $dev $ns

    # if namespace then wait for changes and start services
    if [ -n &quot;$ns&quot; ]; then
        sleep 1 # namespace changes seem to take time
        oci_vcn_ip_ns_svcs_start $ns
    fi
}

oci_vcn_ip_sec_addr_add() {
    local -ir iface_ip_i=$1
    local -r addr=$2
    local -r iface=&quot;${IP_IFACES[$iface_ip_i]}&quot;
    local -r vlan=&quot;${IP_VLANS[$iface_ip_i]#$NA}&quot;
    local -r dev=&quot;${vlan:-$iface}&quot;
    local -r ns=&quot;${IP_NSS[$iface_ip_i]#$NA}&quot;
    local nscmd=''
    local nsinfo=''

    # config routing
    oci_vcn_ip_routing_sec_addr_add $iface_ip_i $addr

    # config the addr on the iface
    if [ -n &quot;$ns&quot; ]; then
        nscmd=&quot;netns exec $ns $IP&quot;
        nsinfo=&quot; in namespace $ns&quot;
    fi
    oci_vcn_info &quot;adding secondary IP address $addr to interface (or VLAN) $dev$nsinfo&quot;
    $IP $nscmd addr add $addr/32 dev $dev || oci_vcn_err &quot;cannot add secondary IP address $addr on interface $dev$nsinfo&quot;
}

oci_vcn_ip_sec_addr_del() {
    local -ir ip_i=$1
    local -r deconfig_all=$2
    local -r addr=${IP_ADDRS[$ip_i]}
    local -r iface=${IP_IFACES[$ip_i]}
    local -r vlan=&quot;${IP_VLANS[$ip_i]#$NA}&quot;
    local -r dev=&quot;${vlan:-$iface}&quot;
    local -r ns=&quot;${IP_NSS[$ip_i]#$NA}&quot;
    local nscmd=''
    local nsinfo=''

    [ &quot;${IP_SECADS[$ip_i]}&quot; = &quot;$YES&quot; ] || oci_vcn_err &quot;not a secondary IP address: $addr&quot;

    # remove the addr on the iface (see comments in add)
    # no need if deconfig all and on a vlan or in namespace
    if [ -z &quot;$deconfig_all&quot; ] || ([ -z &quot;$vlan&quot; ] &amp;&amp; [ -z &quot;$ns&quot; ]); then
        if [ -z &quot;$deconfig_all&quot; ] &amp;&amp; [ -n &quot;$ns&quot; ]; then
            nscmd=&quot;netns exec $ns $IP&quot;
            nsinfo=&quot; in namespace $ns&quot;
        fi

        oci_vcn_info &quot;removing secondary IP address $addr from interface (or VLAN) $dev$nsinfo&quot;
        $IP $nscmd addr del $addr/32 dev $dev || oci_vcn_err &quot;cannot remove IP address $addr on interface $dev&quot;
    fi

    # remove the routing (see comments in add)
    oci_vcn_ip_routing_sec_addr_del $ip_i $addr
}

oci_vcn_sec_addr_is_provisioned() {
    local -r find_addr=$1
    local -r find_vnic=$2
    local -i i
    local found=''

    for i in $(seq 0 $((${#SEC_ADDRS[@]} - 1))); do
        local addr=${SEC_ADDRS[$i]}
        local vnic=${SEC_VNICS[$i]}
        if [ &quot;$find_addr&quot; = &quot;$addr&quot; ] &amp;&amp; [ &quot;$find_vnic&quot; = &quot;$vnic&quot; ]; then
            found='t'
            break
        fi
    done
    echo &quot;$found&quot;
}

oci_vcn_ip_addr_del() {
    local -ir ip_i=$1
    local -r ns=&quot;${IP_NSS[$ip_i]#$NA}&quot;
    local -r secad=&quot;${IP_SECADS[$ip_i]#$NA}&quot;

    [ $ip_i -ne 0 ] || oci_vcn_err &quot;cannot remove primary VNIC&quot;

    if [ &quot;$secad&quot; != &quot;$YES&quot; ]; then
        if [ -n &quot;$ns&quot; ]; then
            # stop services in namespace
            oci_vcn_ip_ns_svcs_stop $ns
        fi

        # remove routing
        oci_vcn_ip_routing_del $ip_i
    fi

    # remove addr
    oci_vcn_ip_addr_del_iface $ip_i

    if [ &quot;$secad&quot; != &quot;$YES&quot; ] &amp;&amp; [ -n &quot;$ns&quot; ]; then
        # delete namespace
        oci_vcn_ip_ns_del $ns
        sleep 1 # namespace changes seem to take time
    fi
}

oci_vcn_ip_ifaces_read() {
    local -r ns=&quot;$1&quot;
    local nscmd=''
    local -a iface_datas

    if [ -n &quot;$ns&quot; ]; then # change ip command to use namespace
        nscmd=&quot;netns exec $ns $IP&quot;
    fi

    # read the interfaces in namespace (if any)
    # mapfile will create array with each line an element
    mapfile -t iface_datas &lt; &lt;($IP $nscmd addr show | awk -f $IFACE_AWK_SCRIPT) || oci_vcn_err &quot;cannot read IP addresses&quot;
    if [ ${#iface_datas[@]} -eq 0 ]; then
        # if reading physical ifaces, must be at least 1
        [ -n &quot;$ns&quot; ] || oci_vcn_err &quot;cannot locate interfaces&quot;
        # empty namespace: probably result of a VM VNIC delete
        # note empty namespaces do not survive reboot
        $IP netns del $ns || oci_vcn_err &quot;cannot delete empty namespace $ns&quot;
        oci_vcn_warn &quot;deleted empty namespace $ns&quot;
    else
        local -r nsna=&quot;${ns:-$NA}&quot;
        local -i ip_i=${#IP_MACS[@]} # continue from previous ns (if any)
        local line
        for line in &quot;${iface_datas[@]}&quot;; do
            # line items are in order printed by awk script print
            # note that $NA is used to mean null (i.e. not set)
            oci_vcn_debug &quot;iface line: $line&quot;
            local -a iface_data=($line)
            local iface=&quot;${iface_data[1]}&quot;
            # filter out virtual interfaces if VM (assume created by user for other purpose)
            if [ -z &quot;$IS_VM&quot; ] || [ -z &quot;${VIRTUAL_IFACES[$iface]}&quot; ]; then
                local mac=&quot;${iface_data[0]}&quot;
                IP_MACS+=(&quot;$mac&quot;)
                IP_NSS+=(&quot;$nsna&quot;)
                IP_IFACES+=(&quot;$iface&quot;)
                IP_ADDRS+=(&quot;${iface_data[2]}&quot;)
                IP_SBITSS+=(&quot;${iface_data[3]}&quot;)
                IP_STATES+=(&quot;${iface_data[4]}&quot;)
                IP_VLANS+=(&quot;${iface_data[5]}&quot;)
                IP_VLTAGS+=(&quot;${iface_data[6]}&quot;)
                local secad=&quot;${iface_data[7]}&quot;
                IP_SECADS+=(&quot;$secad&quot;)
                [ &quot;$secad&quot; = &quot;$YES&quot; ] || IP_I_BY_MAC[&quot;$mac&quot;]=$ip_i # primary addrs only
                ip_i+=1
            fi
        done
    fi
}

oci_vcn_ip_read() {
    IP_I_BY_MAC=()
    IP_MACS=()
    IP_NSS=()
    IP_IFACES=()
    IP_ADDRS=()
    IP_SADDRS=()
    IP_SBITSS=()
    IP_VIRTRTS=()
    IP_STATES=()
    IP_VLANS=()
    IP_VLTAGS=()
    IP_SECADS=()
    IP_SRCS=()
    IP_NIC_IS=()
    NIC_IP_IS=()
    NIC_I_BY_PHYS_IP_I=()

    # read the non-namespace ifaces and any addrs on them
    oci_vcn_ip_ifaces_read
    # read ifaces in all the namespaces (if any), note some os's don't support netns
    mapfile -t nss &lt; &lt;($IP netns 2&gt;/dev/null)
    local ns
    for ns in &quot;${nss[@]}&quot;; do
        oci_vcn_ip_ifaces_read $ns
    done

    # set vltag 0 (for phys ifaces) and read os routes for all ifaces
    local -i ip_i
    for ip_i in $(seq 0 $((${#IP_MACS[@]} - 1))); do
        # any iface w/o vltag has tag 0
        [ -n &quot;${IP_VLTAGS[$ip_i]#$NA}&quot; ] || IP_VLTAGS[$ip_i]=0
        oci_vcn_ip_routes_read $ip_i
    done

    # find the &quot;physical&quot; iface indices: vltag 0 and not secondary addr
    # note vm ifaces are considered physical
    # these may not be in nic index order due to inclusion in namespaces (see next)
    local -r tmpfile=$(mktemp /tmp/oci_vcn_ifaces.XXXXX)
    local -A ip_i_by_phys_iface
    for ip_i in $(seq 0 $((${#IP_MACS[@]} - 1))); do
        if [ ${IP_VLTAGS[$ip_i]} -eq 0 ] &amp;&amp; [ &quot;${IP_SECADS[$ip_i]}&quot; != &quot;$YES&quot; ]; then
            # physical iface/nic
            local iface=${IP_IFACES[$ip_i]}
            ip_i_by_phys_iface[$iface]=$ip_i
            echo &quot;$iface&quot; &gt;&gt; &quot;$tmpfile&quot;
        fi
        NIC_I_BY_PHYS_IP_I[$ip_i]=-1
    done

    # sort physical ifaces by first number (either at end or in middle) in iface name
    # this will provide the nic index
    local -i nic_i=0
    local iface
    for iface in $(cat &quot;$tmpfile&quot; | awk -- '{ match($1, /[0-9]+/); print substr($1, RSTART, RLENGTH), $1 }' | sort -n | cut -f 2 -d ' '); do
        local ip_i=${ip_i_by_phys_iface[$iface]}
        NIC_IP_IS+=($ip_i)
        NIC_I_BY_PHYS_IP_I[$ip_i]=$nic_i
        nic_i+=1
    done
    rm &quot;$tmpfile&quot;

    # for each iface (phys or vlan) get nic index
    for ip_i in $(seq 0 $((${#IP_MACS[@]} - 1))); do
        local iface=${IP_IFACES[$ip_i]}
        local -i phys_ip_i=${ip_i_by_phys_iface[$iface]}
        IP_NIC_IS[$ip_i]=${NIC_I_BY_PHYS_IP_I[$phys_ip_i]}
    done

    # fix up missing nic index for bms (see also oci_vcn_md_read): bms will be missing nic index metadata
    # if they were created before and have not had a vnic attached or detached since 8/23/17.
    # if there is a secondary vnic created and configured (before 8/23/17) we can tell it is a bm
    # because there will either be configured vlans or more vnics than physical ifaces.
    # note that gen 2 shapes are post 8/23/17 and, hence, will have nic indices already set.
    # a missing nic index for an old bm will not matter if there are no vnics to configure.
    if [ ${#MD_NIC_IS[@]} -eq 0 ] &amp;&amp; [ ${#NIC_IP_IS[@]} -eq 1 ] &amp;&amp; \
        ([ ${#IP_MACS[@]} -gt 1 ] || [ ${#MD_MACS[@]} -gt 1 ]); then # configured or new secondaries
        local -i md_i
        for md_i in $(seq 0 $((${#MD_MACS[@]} - 1))); do
            MD_NIC_IS+=(0)
        done
        oci_vcn_info &quot;legacy BM instance detected&quot;
        IS_VM=''
    fi
}

oci_vcn_read() {
    # assumes md info is already read
    # reads ip configs and creates single array of all macs
    # (fixes vm interfaces if random mac)
    [ -n &quot;$IP&quot; ] || oci_vcn_err &quot;cannot find ip command&quot;
    local warn_ifaces=''
    local -i attempt
    for attempt in 1 2; do
        # initialize md/ip shared arrays
        MACS=(&quot;${MD_MACS[@]}&quot;)
        # read all of ip config info and see if it matches md info
        oci_vcn_ip_read
        MD_CONFIGS=()
        local -i md_i=0
        local mac
        for mac in &quot;${MD_MACS[@]}&quot;; do
            MD_CONFIGS[$md_i]=&quot;$NA&quot;
            local -i ip_i=${IP_I_BY_MAC[$mac]:--1}
            if [ $ip_i -lt 0 ]; then
                # if there is no corresponding iface mac: add
                # note ifaces with random macs will be detected below and this will be retried
                MD_CONFIGS[$md_i]=&quot;$ADD&quot;
            else
                local addr=&quot;${IP_ADDRS[$ip_i]#$NA}&quot;
                if [ -z &quot;$addr&quot; ]; then
                    # matching mac iface does not have address: add
                    # make sure it is not a (corrupted) vlan that had been configured previously
                    [ ${IP_VLTAGS[$ip_i]} -eq 0 ] || oci_vcn_err &quot;VLAN (with MAC $mac) configured but missing IP address (must manually fix)&quot;
                    MD_CONFIGS[$md_i]=&quot;$ADD&quot;
                fi
            fi
            md_i+=1
        done
        local -i ip_i=0
        IP_CONFIGS=()
        local retry=''
        warn_ifaces=''
        local -A new_macs=() # for deduping secondary addr macs
        for mac in &quot;${IP_MACS[@]}&quot;; do
            IP_CONFIGS[$ip_i]=&quot;$NA&quot;
            local addr=&quot;${IP_ADDRS[$ip_i]#$NA}&quot;
            # note that the primary vnic will be matched up (permanently)
            local -i md_i=${MD_I_BY_MAC[$mac]:--1}
            if [ $md_i -lt 0 ]; then
                # no metadata mac corresponding to ip mac
                local iface=&quot;${IP_IFACES[$ip_i]}&quot;
                if [ -n &quot;$addr&quot; ]; then
                    # addr is configured: should be deleted
                    # bm case (in vm case ifaces are auto-deleted when vnic is detached)
                    IP_CONFIGS[$ip_i]=&quot;$DELETE&quot;
                elif [ -z &quot;$IS_VM&quot; ]; then
                    # bm iface mac w/o addr and w/o md mac:
                    # skip if phys iface, else addr deleted w/o deleting vlan?
                    if [ ${IP_VLTAGS[$ip_i]} -ne 0 ]; then
                        IP_CONFIGS[$ip_i]=&quot;$DELETE&quot;
                        warn_ifaces=&quot;$warn_ifaces $iface&quot;
                    fi
                else
                    # vm iface mac w/o addr and w/o md mac: assume random mac
                    ([ $attempt -eq 1 ] &amp;&amp; [ &quot;${IP_STATES[$ip_i]}&quot; = 'DOWN' ]) || oci_vcn_err &quot;interface $iface with MAC $mac does not have corresponding metadata&quot;
                    # assume vm case 1st since less likely addr was deleted
                    # attempt mac fix by turning iface up, then retry
                    # this is probably an Intel driver problem
                    # could look at /sys/class/net/&lt;iface&gt;/addr_assign_type
                    $IP link set dev $iface up || oci_vcn_err &quot;cannot set interface $iface up&quot;
                    retry='t'
                fi
                if [ -z &quot;${new_macs[$mac]}&quot; ]; then
                    new_macs[$mac]='t'
                    MACS+=(&quot;$mac&quot;) # accumulate all unique macs
                fi
                # TODO else validate for consistency?: addr, vltag, subnet, virtrt
            elif [ &quot;${IP_SECADS[$ip_i]}&quot; = &quot;$YES&quot; ]; then
                local is_prov=$(oci_vcn_sec_addr_is_provisioned $addr &quot;${MD_VNICS[$md_i]}&quot;)
                if [ -z &quot;$is_prov&quot; ]; then
                    IP_CONFIGS[$ip_i]=&quot;$DELETE&quot;
                fi
            fi
            ip_i+=1
        done
        [ -n &quot;$retry&quot; ] || break
    done

    if [ -n &quot;$warn_ifaces&quot; ]; then
        oci_vcn_warn &quot;no VNIC (or MAC does not match) and no address, interfaces will be marked for delete:$warn_ifaces&quot;
    fi
}

oci_vcn_config_or_deconfig_sec_addrs() {
    local -r do_config=&quot;$1&quot; # config if not empty, else deconfig
    local found=''
    # vnics must be configured, whether config or deconfig secondary addrs
    local -i i
    for i in $(seq 0 $((${#SEC_ADDRS[@]} - 1))); do
        local addr=${SEC_ADDRS[$i]}
        local vnic=${SEC_VNICS[$i]}
        # find vnic's mac
        local mac=''
        local -i md_i
        for md_i in $(seq 0 $((${#MD_MACS[@]} - 1))); do
            if [ &quot;$vnic&quot; = &quot;${MD_VNICS[$md_i]}&quot; ]; then
                mac=&quot;${MD_MACS[$md_i]}&quot;
                break
            fi
        done
        [ -n &quot;$mac&quot; ] || oci_vcn_err &quot;cannot find VNIC for secondary IP address $addr on $vnic&quot;
        # find mac in ip config
        local -i iface_ip_i=-1
        local already_config=''
        local -i ip_i
        for ip_i in $(seq 0 $((${#IP_MACS[@]} - 1))); do
            if [ &quot;$mac&quot; = &quot;${IP_MACS[$ip_i]}&quot; ]; then # put on this iface if not already configured
                [ $iface_ip_i -ge 0 ] || iface_ip_i=$ip_i # 1st is interface (secondary addrs come after)
                if [ &quot;$addr&quot; = &quot;${IP_ADDRS[$ip_i]}&quot; ]; then # already configured
                    already_config='t'
                    break
                fi
            fi
        done
        [ $iface_ip_i -ge 0 ] || oci_vcn_err &quot;cannot find interface for secondary IP address $addr on $vnic&quot;
        if [ -n &quot;$do_config&quot; ] &amp;&amp; [ -z &quot;$already_config&quot; ]; then # configure
            oci_vcn_ip_sec_addr_add $iface_ip_i $addr
            found='t'
        elif [ -z &quot;$do_config&quot; ] &amp;&amp; [ -n &quot;$already_config&quot; ]; then # deconfigure
            # note this path is only if deconfiguring just the secondaries
            oci_vcn_ip_sec_addr_del $ip_i
            found='t'
        fi
    done
    echo &quot;$found&quot;
}

oci_vcn_config() {
    local found=''
    local mac
    local -A configed

    # fix up config: md will indicate adds, ip deletes
    local -i md_i
    for md_i in $(seq 0 $((${#MD_CONFIGS[@]} - 1))); do
        local config=&quot;${MD_CONFIGS[$md_i]#$NA}&quot;
        if [ &quot;$config&quot; = &quot;$ADD&quot; ]; then
            oci_vcn_info &quot;adding IP config for VNIC MAC ${MD_MACS[$md_i]} with id ${MD_VNICS[$md_i]}&quot;
            oci_vcn_ip_addr_add $md_i
            found='t'
        fi
    done
    local del_vmac=''
    local -i ip_i
    for ip_i in $(seq 0 $((${#IP_CONFIGS[@]} - 1))); do
        local config=&quot;${IP_CONFIGS[$ip_i]#$NA}&quot;
        if [ &quot;$config&quot; = &quot;$DELETE&quot; ]; then
            # del all pri addrs and sec addrs (unless its vlan is being deleted)
            local mac=&quot;${IP_MACS[$ip_i]}&quot;
            local secad=&quot;${IP_SECADS[$ip_i]#$NA}&quot;
            if [ &quot;$secad&quot; != &quot;$YES&quot; ] || [ &quot;$del_vmac&quot; != &quot;$mac&quot; ]; then
                local addr=&quot;${IP_ADDRS[$ip_i]}&quot;
                oci_vcn_info &quot;removing IP config of address $addr from MAC $mac&quot;
                oci_vcn_ip_addr_del $ip_i
                found='t'
                # keep track of last deleted vlan
                [ &quot;${IP_VLTAGS[$ip_i]}&quot; -eq 0 ] || del_vmac=$mac
            fi
        fi
    done

    # config secondary addrs, if any
    local sec_addrs_found=''
    if [ ${#SEC_ADDRS[@]} -gt 0 ]; then
        # reread config if there were changes so that secondaries are put in the correct place
        if [ -n &quot;$found&quot; ]; then
            sleep 2 # wait for newly created ifaces to settle
            oci_vcn_read
        fi
        sec_addrs_found=$(oci_vcn_config_or_deconfig_sec_addrs 't') || exit $?
    fi

    [ -n &quot;$found&quot; ] || [ -n &quot;$sec_addrs_found&quot; ] || oci_vcn_info &quot;no changes, IP configuration is up-to-date&quot;
}

oci_vcn_deconfig_all() {
    local -i ip_i=0
    local found=''
    local mac
    for mac in &quot;${IP_MACS[@]}&quot;; do
        local addr=&quot;${IP_ADDRS[$ip_i]#$NA}&quot;
        if [ -n &quot;$addr&quot; ]; then # ip is configured
            # note that primaries are encountered first
            if [ &quot;${IP_SECADS[$ip_i]}&quot; != &quot;$YES&quot; ]; then # primary addr
                if [ $ip_i -gt 0 ]; then # skip pri vnic, pri addr
                    local -i md_i=${MD_I_BY_MAC[$mac]:--1}
                    local missing=&quot; missing&quot;
                    local vnicmsg=''
                    if [ $md_i -ge 0 ]; then vnicmsg=&quot; with id ${MD_VNICS[$md_i]}&quot;; missing=&quot;&quot;; fi
                    oci_vcn_info &quot;removing IP config of address $addr for$missing VNIC MAC $mac$vnicmsg&quot;
                    oci_vcn_ip_addr_del $ip_i
                    found='t'
                fi
            else # secondary addr
                oci_vcn_ip_sec_addr_del $ip_i 't'
                found='t'
            fi
        fi
        ip_i+=1
    done
    if [ -z &quot;$found&quot; ]; then
        oci_vcn_info &quot;no changes, no IP configuration to delete&quot;
    fi
}

oci_vcn_show() {
    local -r fmt=&quot;%-6s %-15s %-15s %-5s %-15s %-10s %-3s %-10s %-5s %-11s %-5s %-17s %s\n&quot;
    printf &quot;$fmt&quot; CONFIG ADDR SPREFIX SBITS VIRTRT NS IND IFACE VLTAG VLAN STATE MAC VNIC
    local mac
    for mac in &quot;${MACS[@]}&quot;; do # all known macs
        local config=&quot;$NA&quot;
        local addr=&quot;$NA&quot;
        local nic_i=&quot;$NA&quot;
        local vltag=&quot;$NA&quot;
        local sprefix=&quot;$NA&quot;
        local sbits=&quot;$NA&quot;
        local virtrt=&quot;$NA&quot;
        local ns=&quot;$NA&quot;
        local iface=&quot;$NA&quot;
        local vlan=&quot;$NA&quot;
        local state=&quot;$NA&quot;
        local vnic=&quot;$NA&quot;
        local -i md_i=${MD_I_BY_MAC[$mac]:--1}
        if [ $md_i -ge 0 ]; then # in md: ADD, or no change depending on ip info
            config=&quot;${MD_CONFIGS[$md_i]}&quot;
            nic_i=&quot;${MD_NIC_IS[$md_i]:-$NA}&quot;
            addr=&quot;${MD_ADDRS[$md_i]}&quot;
            [ -n &quot;$IS_VM&quot; ] || vltag=&quot;${MD_VLTAGS[$md_i]}&quot; # not used in vms
            sprefix=&quot;${MD_SPREFIXS[$md_i]}&quot;
            sbits=&quot;${MD_SBITSS[$md_i]}&quot;
            virtrt=&quot;${MD_VIRTRTS[$md_i]}&quot;
            vnic=&quot;${MD_VNICS[$md_i]}&quot;
        fi
        # find the ip info on this mac, note that there could be none, one,
        # or multiple addrs if secondaries addrs exist (they will come after primary)
        local -i ip_i=${IP_I_BY_MAC[$mac]:--1} # index of primary addr, if any
        if [ $ip_i -ge 0 ]; then
            local -i pri_ip_i=$ip_i
            local secad=''
            while true; do
                secad=&quot;${IP_SECADS[$ip_i]#$NA}&quot;
                [ $pri_ip_i -eq $ip_i ] || [ -n &quot;$secad&quot; ] || break
                vlan=&quot;${IP_VLANS[$ip_i]:-$NA}&quot;
                iface=&quot;${IP_IFACES[$ip_i]}&quot;
                ns=&quot;${IP_NSS[$ip_i]}&quot;
                state=&quot;${IP_STATES[$ip_i]}&quot;
                local cfg=&quot;${IP_CONFIGS[$ip_i]#$NA}&quot;
                [ -z &quot;$cfg&quot; ] || config=&quot;$cfg&quot;
                if [ $md_i -lt 0 ]; then # not in md, fill with ip info
                    addr=&quot;${IP_ADDRS[$ip_i]}&quot;
                    sbits=&quot;${IP_SBITSS[$ip_i]}&quot;
                    virtrt=&quot;${IP_VIRTRTS[$ip_i]}&quot;
                    [ -n &quot;$IS_VM&quot; ] || vltag=&quot;${IP_VLTAGS[$ip_i]}&quot;
                elif [ -n &quot;$secad&quot; ]; then
                    addr=&quot;${IP_ADDRS[$ip_i]}&quot;
                fi
                local -i nic_phys=${NIC_I_BY_PHYS_IP_I[$ip_i]}
                [ -n &quot;$secad&quot; ] || [ $nic_phys -lt 0 ] || nic_i=$nic_phys # don't show if sec addr
                if [ -z &quot;$secad&quot; ]; then
                    printf &quot;$fmt&quot; &quot;$config&quot; &quot;$addr&quot; &quot;$sprefix&quot; &quot;$sbits&quot; &quot;$virtrt&quot; &quot;$ns&quot; &quot;$nic_i&quot; &quot;$iface&quot; &quot;$vltag&quot; &quot;$vlan&quot; &quot;$state&quot; &quot;$mac&quot; &quot;$vnic&quot;
                else
                    printf &quot;$fmt&quot; &quot;$config&quot; &quot;$addr&quot; &quot;$NA&quot; &quot;$NA&quot; &quot;$NA&quot; &quot;$NA&quot; &quot;$NA&quot; &quot;$NA&quot; &quot;$NA&quot; &quot;$NA&quot; &quot;$NA&quot; &quot;$NA&quot; &quot;$NA&quot;
                fi
                ip_i+=1
            done
        else
            printf &quot;$fmt&quot; &quot;$config&quot; &quot;$addr&quot; &quot;$sprefix&quot; &quot;$sbits&quot; &quot;$virtrt&quot; &quot;$ns&quot; &quot;$nic_i&quot; &quot;$iface&quot; &quot;$vltag&quot; &quot;$vlan&quot; &quot;$state&quot; &quot;$mac&quot; &quot;$vnic&quot;
        fi
    done
}

oci_vcn_help() {
    cat &lt;&lt;EOF
NAME
    $THIS -- display and configure Oracle OCI Virtual Cloud Networks on instance

SYNOPSIS
    $THIS [-s] [-e &lt;IP address&gt; &lt;VNIC OCID&gt;]
    $THIS -c [-q] [-s] [-n [&lt;format&gt;] [-r]] [-e &lt;IP address&gt; &lt;VNIC OCID&gt; [-e ...]]
    $THIS -d [-q] [-s] [-e &lt;IP address&gt; &lt;VNIC OCID&gt;]

DESCRIPTION
    This shows the current OCI Virtual interface Cards provisioned in the cloud
    and configured on this instance. When a secondary VNIC is provisioned in OCI it must
    be explicitly configured on the instance using this script or similar commands.

    The first version of this command displays the currently provisioned VNICs and the
    current IP configuration for this instance. VNICs that are not yet configured are
    marked with '$ADD' and IP configurations that no longer have an associated VNIC
    are marked with '$DELETE'.

    The second version, with -c, configures VNICs that do not have an IP configuration
    and deletes the IP configurations of VNICs that are not currently provisioned.
    This puts the instance IP configuration in sync with current OCI provisioning.
    If one or more optional -e options are present the secondary IP addresses are
    configured on the same interfaces as the corresponding VNIC.

    The configuring interfaces can optionally be placed inside separate network
    namespaces. This is necessary when VNICs are in subnets (different VCNs) with
    overlapping address blocks and the network applications are not bound directly
    to interfaces. Network namespaces require applications to be launched in them
    explicitly (via 'ip netns exec &lt;ns&gt;') in order to establish association with
    the interface. When namespaces are not used, policy-based routing is configured
    to provide a default route to the secondary VNIC\'s virtual router (default
    gateway) when the VNIC\'s address is the source address.

    Bare Metal secondary VNICs are configured using VLANs (where there is no
    corresponding physical interface). These will look like 2 addition interfaces
    when showing IP links, with names like '$MACVLAN_FORMAT' for the MAC VLAN
    and '$VLAN_FORMAT' for the IP VLAN.

    The third version, -d, deletes all IP configuration for provisioned secondary VNICs
    as long as there is no -e option. If one or more optional -e options are present
    only the given secondary IP addresses are deconfigured and the remaining configuration
    is left as is.

    This script is made to be run periodically to pick up changes in VNIC provisioning
    (whether adding or deleting). Note that these IP configuration changes are not
    persistent, the script must, at a minimum, be run on each startup.

    -c          Add IP configuration for VNICs that are not configured and delete
                for VNICs that are no longer provisioned.
    -d          Deconfigure all VNICs (except the primary). If a -e option is also
                present only the secondary IP address(es) are deconfigured.
    -e &lt;IP address&gt; &lt;VNIC OCID&gt;
                Secondary private IP address to configure or deconfigure.
    -h          Print help.
    -n [&lt;format&gt;]
                When configuring, place interfaces in namespace identified by the given
                format. Format can include \$nic and \$vltag variables. The name
                defaults to '$DEF_NS_FORMAT_BM' for BMs and '$DEF_NS_FORMAT_VM' for VMs.
                When configuring multiple VNICs ensure the namespaces are unique.
    -q          Suppress information messages.
    -r          Start sshd in namespace (if -n is present)
    -s          Show information on all provisioning and interface configuration.
                This is the default action if no options are given.
                Columns:
                    CONFIG  '$ADD' indicates missing IP config, '$DELETE' missing VNIC
                    ADDR    IP address
                    SPREFIX subnet CIDR prefix
                    SBITS   subnet mask bits
                    VIRTRT  virutal router IP address
                    NS      namespace (if any)
                    IND     interface index (if BM)
                    IFACE   interface (underlying physical if VLAN is also set)
                    VLTAG   VLAN tag (if BM)
                    VLAN    IP virtual LAN (if any)
                    STATE   state of interface
                    MAC     MAC address
                    VNIC    VNIC object identifier
    -v          Verbose information messages.

EXAMPLES
    $THIS
        Show all provisioned VNICs and configured IP addresses.
    $THIS -c
        Set configuration without a namespace.
    $THIS -c -n ''
        Set configuration using a namespace with the default format.
    $THIS -c -n 'myns\$vltag'
        Set configuration using a namespace with format 'myns\$vltag'.

SEE ALSO:
    OCI networking overview including route tables and security lists:
        https://docs.us-phoenix-1.oraclecloud.com/Content/Network/Concepts/overview.htm
    Note: secondary VNIC in different VCN not handled, requires manually adding default route:
        ip route add &lt;VCN2 CIDR&gt; via &lt;VCN2 sec VNIC subnet virt router ip&gt; dev &lt;VCN2 sec VNIC ifname&gt;
EOF
}

# TODO secondary private IPs in metadata

declare show=''
declare config=''
declare deconfig=''
declare os_ver=&quot;$OS_ID-$OS_VERSION&quot;
declare os_maj_ver=&quot;$OS_ID-$OS_MAJ_VERSION&quot;
while [ $# -ge 1 ]; do
    declare opt=&quot;$1&quot;
    shift
    case $opt in
        -c) config='t';;
        -d) deconfig='t';;
        -e) if [ $# -lt 2 ]; then oci_vcn_err &quot;secondary private IP address option requires &lt;IP address&gt; &lt;VNIC OCID&gt;&quot;; fi
            SEC_ADDRS+=($1); shift
            SEC_VNICS+=($1); shift
            ;;
        -n) if [ &quot;$os_maj_ver&quot; = &quot;ol-6&quot; ] || [ &quot;$os_maj_ver&quot; = &quot;centos-6&quot; ]; then
                oci_vcn_err &quot;namespaces not supported on this os version ($os_ver)&quot;
            fi
            if [ $# -ge 1 ] &amp;&amp; ! [[ &quot;$1&quot; =~ ^\- ]]; then
                [ -z &quot;$1&quot; ] || NS_FORMAT=&quot;$1&quot;
                shift
            fi
            USE_NS='t';;
        -r) START_SSHD='t'
            [ -n &quot;$SSHD&quot; ] || oci_vcn_err &quot;missing sshd command&quot;;;
        -s) show='t';;
        -h) oci_vcn_help; exit 0;;
        -q) if [ -n &quot;$DEBUG&quot; ]; then oci_vcn_err &quot;cannot specify quiet with verbose&quot;; fi
            QUIET='t';;
        -v) if [ -n &quot;$QUIET&quot; ]; then oci_vcn_err &quot;cannot specify verbose with quiet&quot;; fi
            DEBUG='t';;
        -*) oci_vcn_err &quot;unknown option $opt&quot;;;
    esac
done

[ -z &quot;$START_SSHD&quot; ] || [ -n &quot;$USE_NS&quot; ] || oci_vcn_err &quot;cannot start sshd if namespace is not created&quot;

[ $EUID -eq 0 ] || oci_vcn_err &quot;must be run as root&quot;

# read all metadata and ip config
oci_vcn_md_read
oci_vcn_read

# process options
if [ -n &quot;$config&quot; ]; then
    [ -z &quot;$deconfig&quot; ] || oci_vcn_err &quot;conflicting options&quot;
    oci_vcn_config
    [ -z &quot;$show&quot; ] || oci_vcn_read # reread if show
elif [ -n &quot;$deconfig&quot; ]; then
    if [ ${#SEC_ADDRS[@]} -gt 0 ]; then # just deconfig addrs
        oci_vcn_config_or_deconfig_sec_addrs
    else # deconfig all
        oci_vcn_deconfig_all
    fi
    [ -z &quot;$show&quot; ] || oci_vcn_read # reread if show
else
    show='t'
fi
[ -z &quot;$show&quot; ] || oci_vcn_show
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">#!/usr/bin/env bash</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Copyright (c) 2018, Oracle and/or its affiliates.</span></span>
<span class="line"><span style="color: #6A9955"># The Universal Permissive License (UPL), Version 1.0</span></span>
<span class="line"><span style="color: #6A9955">#</span></span>
<span class="line"><span style="color: #6A9955"># Oracle OCI Virtual Cloud Networks IP configuration script</span></span>
<span class="line"><span style="color: #6A9955">#</span></span>
<span class="line"><span style="color: #6A9955"># 2017-10-24 initial release</span></span>
<span class="line"><span style="color: #6A9955"># 2017-11-21 filter out VLANs if VM</span></span>
<span class="line"><span style="color: #6A9955"># 2017-11-21 inhibit namespaces for ubuntu 16</span></span>
<span class="line"><span style="color: #6A9955"># 2018-02-12 fix sshd typo in help</span></span>
<span class="line"><span style="color: #6A9955"># 2018-02-20 update copyright notice</span></span>
<span class="line"><span style="color: #6A9955"># 2018-03-21 fix to add src routing on primary VNIC when not using namespaces</span></span>
<span class="line"><span style="color: #6A9955"># 2018-04-05 add note on multiple VCNs</span></span>
<span class="line"><span style="color: #6A9955"># 2018-05-10 fix to delete config by deleting default route before deleting table, added -v option</span></span>
<span class="line"><span style="color: #6A9955"># 2018-05-22 fix to ignore interfaces enslaved to a master device</span></span>
<span class="line"><span style="color: #6A9955"># 2018-09-14 allow namespaces for Ubuntu 16 since problems with DHCP are fixed, and inhibit for all OL/Centos 6</span></span>
<span class="line"><span style="color: #6A9955"># 2018-09-19 fix os name and version setting for centos 6 images</span></span>
<span class="line"><span style="color: #6A9955"># 2018-09-19 fix ip addr parsing to remove MAC VLAN interfaces</span></span>
<span class="line"><span style="color: #6A9955"># 2018-10-25 fix secondary private ip src routing</span></span>
<span class="line"><span style="color: #6A9955"># 2018-10-31 fix misc routing setup, fix multiple ifaces on same subnet</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">THIS=$(</span><span style="color: #DCDCAA">basename</span><span style="color: #CE9178"> &quot;</span><span style="color: #9CDCFE">$0</span><span style="color: #CE9178">&quot;)</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MD_URL=&#39;http://169.254.169.254/opc/v1/vnics/&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">NA=&#39;-&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">RTS_FILE=&#39;/etc/iproute2/rt_tables&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">RT_ID_MIN=</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># in case lower ones are reserved</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">RT_ID_MAX=</span><span style="color: #B5CEA8">255</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">RT_FORMAT_BM=&#39;ort${nic}vl${vltag}&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">RT_FORMAT_VM=&#39;ort${nic}&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">DEF_NS_FORMAT_BM=&#39;ons${nic}vl${vltag}&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">DEF_NS_FORMAT_VM=&#39;ons${nic}&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MACVLAN_FORMAT=&#39;${iface}.${vltag}&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># note awk script looks for this (max 15 chars)</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">VLAN_FORMAT=&#39;${iface}v${vltag}&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># (max 15 chars)</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MTU=</span><span style="color: #B5CEA8">9000</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ADD=&#39;ADD&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">DELETE=&#39;DELETE&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">YES=&#39;YES&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">CURL=$(</span><span style="color: #DCDCAA">which</span><span style="color: #CE9178"> curl)</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IP=$(</span><span style="color: #DCDCAA">which</span><span style="color: #CE9178"> ip)</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">SSHD=$(</span><span style="color: #DCDCAA">which</span><span style="color: #CE9178"> sshd)</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MODPROBE=$(</span><span style="color: #DCDCAA">which</span><span style="color: #CE9178"> modprobe)</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">OS_RELEASE=&#39;/etc/os-release&#39;</span></span>
<span class="line"><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -f </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$OS_RELEASE</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">OS_ID=$(</span><span style="color: #DCDCAA">grep</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-ws</span><span style="color: #CE9178"> ID </span><span style="color: #9CDCFE">$OS_RELEASE</span><span style="color: #CE9178"> </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">cut</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-f</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">2</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-d</span><span style="color: #CE9178"> &#39;=&#39; </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">tr</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-d</span><span style="color: #CE9178"> &#39;&quot;&#39; </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">tr</span><span style="color: #CE9178"> &#39;[:upper:]&#39; &#39;[:lower:]&#39;)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">OS_VERSION=$(</span><span style="color: #DCDCAA">grep</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-ws</span><span style="color: #CE9178"> VERSION_ID </span><span style="color: #9CDCFE">$OS_RELEASE</span><span style="color: #CE9178"> </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">cut</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-f</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">2</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-d</span><span style="color: #CE9178"> &#39;=&#39; </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">tr</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-d</span><span style="color: #CE9178"> &#39;&quot;&#39;)</span></span>
<span class="line"><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">OS_RELEASE_alt=&#39;/etc/redhat-release&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -f </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$OS_RELEASE_alt</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">OS_ID=$(</span><span style="color: #DCDCAA">cat</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$OS_RELEASE_alt</span><span style="color: #D4D4D4">|</span><span style="color: #DCDCAA">cut</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-f</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">1</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-d</span><span style="color: #CE9178"> &#39; &#39; </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">tr</span><span style="color: #CE9178"> &#39;[:upper:]&#39; &#39;[:lower:]&#39;)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">OS_VERSION=$(</span><span style="color: #DCDCAA">cat</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$OS_RELEASE_alt</span><span style="color: #CE9178"> </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">cut</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-f</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">3</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-d</span><span style="color: #CE9178"> &#39; &#39;)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$OS_VERSION</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">OS_MAJ_VERSION=$(</span><span style="color: #DCDCAA">echo</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$OS_VERSION</span><span style="color: #CE9178"> </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">cut</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-f</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">1</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-d</span><span style="color: #CE9178"> &#39;.&#39;)</span></span>
<span class="line"><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">SYS_CLASS_NET=&#39;/sys/class/net&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-A</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">VIRTUAL_IFACES</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">IS_VM</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MACS</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># all (unique) macs</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-A</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MD_I_BY_MAC</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># index into arrays by MAC</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MD_MACS</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MD_ADDRS</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MD_VLTAGS</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MD_SCIDRS</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MD_SPREFIXS</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MD_SBITSS</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MD_VIRTRTS</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MD_VNICS</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MD_NIC_IS</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># not set at all if vm</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MD_CONFIGS</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># $ADD if vnic added</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-A</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">DUP_ADDRS</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># hash of addrs that appear more than once</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-A</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">DUP_SADDRS</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># hash of subnet addrs that appear more than once</span></span>
<span class="line"><span style="color: #6A9955"># items use $NA to mean null</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-A</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IP_I_BY_MAC</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># index into arrays by MAC</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IP_MACS</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># runs of dups if sec addrs</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IP_NSS</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IP_IFACES</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IP_ADDRS</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IP_SADDRS</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IP_SBITSS</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IP_VIRTRTS</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IP_STATES</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IP_VLANS</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IP_VLTAGS</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># vltag (0 if phys iface)</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IP_SECADS</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># set to $YES if secondary addr</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IP_SRCS</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># set to $YES if src hint</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IP_NIC_IS</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># nic index of iface</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IP_CONFIGS</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># $DELETE if vnic deleted</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">NIC_IP_IS</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># index of physical iface for nic index</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-A</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">NIC_I_BY_PHYS_IP_I</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># nic index for physical iface ip_i</span></span>
<span class="line"><span style="color: #6A9955"># be sure to clear any IP_ arrays above in the read function</span></span>
<span class="line"><span style="color: #6A9955"># options:</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">QUIET</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">DEBUG</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">START_SSHD</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">USE_NS</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">NS_FORMAT</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">SEC_ADDRS</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">SEC_VNICS</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IFACE_AWK_SCRIPT=&#39;/tmp/oci_vcn_iface.awk&#39;</span></span>
<span class="line"><span style="color: #DCDCAA">cat</span><span style="color: #D4D4D4"> &gt;</span><span style="color: #9CDCFE">$IFACE_AWK_SCRIPT</span><span style="color: #D4D4D4"> &lt;&lt;&#39;</span><span style="color: #D4D4D4">EOF</span><span style="color: #D4D4D4">&#39;</span></span>
<span class="line"><span style="color: #CE9178">function prtiface(mac, iface, addr, sbits, state, vlan, vltag, secad) {</span></span>
<span class="line"><span style="color: #CE9178">    if (iface != &quot;&quot;) printf &quot;%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n&quot;, mac, iface, addr, sbits, state, vlan, vltag, secad</span></span>
<span class="line"><span style="color: #CE9178">}</span></span>
<span class="line"><span style="color: #CE9178">BEGIN { iface = &quot;&quot;; addr = &quot;-&quot; }</span></span>
<span class="line"><span style="color: #CE9178">/^[0-9]/ {</span></span>
<span class="line"><span style="color: #CE9178">    # if not the first and prev was not a mac vlan then print previous (note print at end too)</span></span>
<span class="line"><span style="color: #CE9178">    if (addr == &quot;-&quot;) prtiface(mac, iface, addr, sbits, state, vlan, vltag, secad)</span></span>
<span class="line"><span style="color: #CE9178">    addr = &quot;-&quot;</span></span>
<span class="line"><span style="color: #CE9178">    sbits = &quot;-&quot;</span></span>
<span class="line"><span style="color: #CE9178">    state = &quot;-&quot;</span></span>
<span class="line"><span style="color: #CE9178">    macvlan = &quot;-&quot;</span></span>
<span class="line"><span style="color: #CE9178">    vlan = &quot;-&quot;</span></span>
<span class="line"><span style="color: #CE9178">    vltag = &quot;-&quot;</span></span>
<span class="line"><span style="color: #CE9178">    secad = &quot;-&quot;</span></span>
<span class="line"><span style="color: #CE9178">    if ($0 ~ /BROADCAST/ &amp;&amp; $0 !~ /UNKNOWN/ &amp;&amp; $0 !~ /NO-CARRIER/ &amp;&amp; $0 !~ /master /) {</span></span>
<span class="line"><span style="color: #CE9178">        i = index($2, &quot;@&quot;)</span></span>
<span class="line"><span style="color: #CE9178">        if (1 &lt; i) {</span></span>
<span class="line"><span style="color: #CE9178">            j = index($2, &quot;.&quot;)</span></span>
<span class="line"><span style="color: #CE9178">            if (j &lt; i) { # mac vlan (not used, no addrs)</span></span>
<span class="line"><span style="color: #CE9178">                macvlan = substr($2, 1, i - 1)</span></span>
<span class="line"><span style="color: #CE9178">                iface = substr($2, i + 1, length($2) - i - 1) # skip : at end</span></span>
<span class="line"><span style="color: #CE9178">                addr = &quot;&quot; # skip the mac vlan iface</span></span>
<span class="line"><span style="color: #CE9178">            } else { # vlan</span></span>
<span class="line"><span style="color: #CE9178">                vlan = substr($2, 1, i - 1)</span></span>
<span class="line"><span style="color: #CE9178">                # extract iface/vltag from macvlan</span></span>
<span class="line"><span style="color: #CE9178">                iface = substr($2, i + 1, j - i - 1)</span></span>
<span class="line"><span style="color: #CE9178">                vltag = substr($2, j + 1, length($2) - j - 1) # skip : at end</span></span>
<span class="line"><span style="color: #CE9178">            }</span></span>
<span class="line"><span style="color: #CE9178">        } else {</span></span>
<span class="line"><span style="color: #CE9178">            i = index($2, &quot;:&quot;)</span></span>
<span class="line"><span style="color: #CE9178">            if (i &lt;= 1) { print &quot;cannot find interface name&quot;; exit 1 }</span></span>
<span class="line"><span style="color: #CE9178">            iface = substr($2, 1, i - 1)</span></span>
<span class="line"><span style="color: #CE9178">        }</span></span>
<span class="line"><span style="color: #CE9178">        if ($0 ~ /LOWER_UP/) state = &quot;UP&quot;</span></span>
<span class="line"><span style="color: #CE9178">        else state = &quot;DOWN&quot;</span></span>
<span class="line"><span style="color: #CE9178">    } else iface = &quot;&quot;</span></span>
<span class="line"><span style="color: #CE9178">    next</span></span>
<span class="line"><span style="color: #CE9178">}</span></span>
<span class="line"><span style="color: #CE9178">/ link\/ether / { mac = tolower($2) }</span></span>
<span class="line"><span style="color: #CE9178">/ inet [0-9]/ {</span></span>
<span class="line"><span style="color: #CE9178">    i = index($2, &quot;/&quot;)</span></span>
<span class="line"><span style="color: #CE9178">    if (i &lt;= 1) { print &quot;cannot find interface inet address&quot;; exit 1 }</span></span>
<span class="line"><span style="color: #CE9178">    if (addr != &quot;-&quot;) secad = &quot;YES&quot;</span></span>
<span class="line"><span style="color: #CE9178">    addr = substr($2, 0, i - 1)</span></span>
<span class="line"><span style="color: #CE9178">    sbits = substr($2, i + 1, length($2) - i)</span></span>
<span class="line"><span style="color: #CE9178">    prtiface(mac, iface, addr, sbits, state, vlan, vltag, secad)</span></span>
<span class="line"><span style="color: #CE9178">}</span></span>
<span class="line"><span style="color: #CE9178">END { if (addr == &quot;-&quot;) prtiface(mac, iface, addr, sbits, state, vlan, vltag, secad) }</span></span>
<span class="line"><span style="color: #D4D4D4">EOF</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;Error: </span><span style="color: #9CDCFE">$1</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> &gt;&amp;2</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">exit</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_warn</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;Warning: </span><span style="color: #9CDCFE">$1</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> &gt;&amp;2</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$QUIET</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;Info: </span><span style="color: #9CDCFE">$1</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> &gt;&amp;2</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$DEBUG</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;Debug: </span><span style="color: #9CDCFE">$1</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> &gt;&amp;2</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_virtual_ifaces_read</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">VIRTUAL_IFACES</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">iface</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">iface</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">ls</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$SYS_CLASS_NET</span><span style="color: #CE9178">)</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">ls</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-l</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$SYS_CLASS_NET</span><span style="color: #CE9178">/</span><span style="color: #9CDCFE">$iface</span><span style="color: #D4D4D4"> | </span><span style="color: #DCDCAA">grep</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-wq</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">virtual</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">VIRTUAL_IFACES</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$iface</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_md_read</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># sets all MD data arrays and their index I_BY_MAC</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">tmpfile=$(</span><span style="color: #DCDCAA">mktemp</span><span style="color: #CE9178"> /tmp/oci_vcn_md.XXXXX)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># MD notes:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># vnic order: primary first, then time created (and therefore vltag/nic)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># BM notes: (1) may be interleaved wrt nic index (i.e. all nic 0 not guaranteed before all nic 1)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># (2) nicIndex was supported starting around 8/23/17, but will not appear on previously</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># launched instances unless refreshed by a vnic attach or detach after that date</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># parse: force json fields on separate lines</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># WARNING: assumes no string values with commas or double quotes</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># WARNING: assumes no sub-objects with identical field names</span></span>
<span class="line"><span style="color: #D4D4D4">    [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$CURL</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot find curl command&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$CURL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-s</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$MD_URL</span><span style="color: #D4D4D4"> | </span><span style="color: #DCDCAA">tr</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;\n&#39;</span><span style="color: #D4D4D4"> &gt;</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$tmpfile</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot read metadata&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #D4D4D4">=(</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">grep</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-w</span><span style="color: #CE9178"> macAddr &quot;</span><span style="color: #9CDCFE">$tmpfile</span><span style="color: #CE9178">&quot; </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">cut</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-f</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">4</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-d</span><span style="color: #CE9178"> &#39;&quot;&#39;)</span><span style="color: #D4D4D4">) || </span><span style="color: #DCDCAA">exit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">$?</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># string</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">i</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">seq</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">0</span><span style="color: #CE9178"> $((${</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #CE9178">[@]} </span><span style="color: #D4D4D4">-</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">1</span><span style="color: #CE9178">)))</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #CE9178">[$i],,}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">MD_ADDRS</span><span style="color: #D4D4D4">=(</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">grep</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-w</span><span style="color: #CE9178"> privateIp &quot;</span><span style="color: #9CDCFE">$tmpfile</span><span style="color: #CE9178">&quot; </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">cut</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-f</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">4</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-d</span><span style="color: #CE9178"> &#39;&quot;&#39;)</span><span style="color: #D4D4D4">) </span><span style="color: #6A9955"># string</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">MD_VLTAGS</span><span style="color: #D4D4D4">=(</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">grep</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-w</span><span style="color: #CE9178"> vlanTag &quot;</span><span style="color: #9CDCFE">$tmpfile</span><span style="color: #CE9178">&quot; </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">cut</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-f</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">2</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-d</span><span style="color: #CE9178"> &#39;:&#39; </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">tr</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-d</span><span style="color: #CE9178"> &#39; &#39;)</span><span style="color: #D4D4D4">) </span><span style="color: #6A9955"># integer</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">MD_VIRTRTS</span><span style="color: #D4D4D4">=(</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">grep</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-w</span><span style="color: #CE9178"> virtualRouterIp &quot;</span><span style="color: #9CDCFE">$tmpfile</span><span style="color: #CE9178">&quot; </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">cut</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-f</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">4</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-d</span><span style="color: #CE9178"> &#39;&quot;&#39;)</span><span style="color: #D4D4D4">) </span><span style="color: #6A9955"># string</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">s</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">s</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">grep</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-w</span><span style="color: #CE9178"> subnetCidrBlock &quot;</span><span style="color: #9CDCFE">$tmpfile</span><span style="color: #CE9178">&quot; </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">cut</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-f</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">4</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-d</span><span style="color: #CE9178"> &#39;&quot;&#39;)</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># string</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">MD_SCIDRS</span><span style="color: #D4D4D4">+=(${</span><span style="color: #9CDCFE">s</span><span style="color: #D4D4D4">})</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">MD_SPREFIXS</span><span style="color: #D4D4D4">+=(${</span><span style="color: #9CDCFE">s</span><span style="color: #D4D4D4">%/*})</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">MD_SBITSS</span><span style="color: #D4D4D4">+=(${</span><span style="color: #9CDCFE">s</span><span style="color: #D4D4D4">#*/})</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">MD_VNICS</span><span style="color: #D4D4D4">=(</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">grep</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-w</span><span style="color: #CE9178"> vnicId &quot;</span><span style="color: #9CDCFE">$tmpfile</span><span style="color: #CE9178">&quot; </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">cut</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-f</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">4</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-d</span><span style="color: #CE9178"> &#39;&quot;&#39;)</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">MD_NIC_IS</span><span style="color: #D4D4D4">=(</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">grep</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-w</span><span style="color: #CE9178"> nicIndex &quot;</span><span style="color: #9CDCFE">$tmpfile</span><span style="color: #CE9178">&quot; </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">cut</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-f</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">2</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-d</span><span style="color: #CE9178"> &#39;:&#39; </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">tr</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-d</span><span style="color: #CE9178"> &#39; &#39;)</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># do some validity checks on md data</span></span>
<span class="line"><span style="color: #D4D4D4">    [ ${#</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #D4D4D4">[@]} -eq ${#</span><span style="color: #9CDCFE">MD_ADDRS</span><span style="color: #D4D4D4">[@]} ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;invalid metadata: MAC or IP addresses are missing&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    [ ${#</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #D4D4D4">[@]} -eq ${#</span><span style="color: #9CDCFE">MD_VLTAGS</span><span style="color: #D4D4D4">[@]} ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;invalid metadata: MAC or VLAN tags are missing&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    [ ${#</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #D4D4D4">[@]} -eq ${#</span><span style="color: #9CDCFE">MD_VIRTRTS</span><span style="color: #D4D4D4">[@]} ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;invalid metadata: MAC or virtual router addresses are missing&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    [ ${#</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #D4D4D4">[@]} -eq ${#</span><span style="color: #9CDCFE">MD_SPREFIXS</span><span style="color: #D4D4D4">[@]} ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;invalid metadata: MAC or subnets are missing&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    [ ${#</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #D4D4D4">[@]} -eq ${#</span><span style="color: #9CDCFE">MD_VNICS</span><span style="color: #D4D4D4">[@]} ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;invalid metadata: MAC or VNIC ids are missing&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">seq</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">0</span><span style="color: #CE9178"> $((${</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #CE9178">[@]} </span><span style="color: #D4D4D4">-</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">1</span><span style="color: #CE9178">)))</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        [[ ${</span><span style="color: #9CDCFE">MD_ADDRS</span><span style="color: #D4D4D4">[$i]} </span><span style="color: #D4D4D4">=~</span><span style="color: #D4D4D4"> ^[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">-9]+</span><span style="color: #D7BA7D">\.</span><span style="color: #D4D4D4">[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">-9]+</span><span style="color: #D7BA7D">\.</span><span style="color: #D4D4D4">[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">-9]+</span><span style="color: #D7BA7D">\.</span><span style="color: #D4D4D4">[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">-9]+$ ]] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;invalid metadata: address IP format incorrect: ${</span><span style="color: #9CDCFE">MD_ADDRS</span><span style="color: #CE9178">[$i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        [[ ${</span><span style="color: #9CDCFE">MD_VLTAGS</span><span style="color: #D4D4D4">[$i]} </span><span style="color: #D4D4D4">=~</span><span style="color: #D4D4D4"> ^[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">-9]+$ ]] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;invalid metadata: VLAN tag incorrect: ${</span><span style="color: #9CDCFE">MD_VLTAGS</span><span style="color: #CE9178">[$i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        [[ ${</span><span style="color: #9CDCFE">MD_VIRTRTS</span><span style="color: #D4D4D4">[$i]} </span><span style="color: #D4D4D4">=~</span><span style="color: #D4D4D4"> ^[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">-9]+</span><span style="color: #D7BA7D">\.</span><span style="color: #D4D4D4">[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">-9]+</span><span style="color: #D7BA7D">\.</span><span style="color: #D4D4D4">[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">-9]+</span><span style="color: #D7BA7D">\.</span><span style="color: #D4D4D4">[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">-9]+$ ]] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;invalid metadata: virtual router address format incorrect: ${</span><span style="color: #9CDCFE">MD_VIRTRTS</span><span style="color: #CE9178">[$i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        [[ ${</span><span style="color: #9CDCFE">MD_SPREFIXS</span><span style="color: #D4D4D4">[$i]} </span><span style="color: #D4D4D4">=~</span><span style="color: #D4D4D4"> ^[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">-9]+</span><span style="color: #D7BA7D">\.</span><span style="color: #D4D4D4">[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">-9]+</span><span style="color: #D7BA7D">\.</span><span style="color: #D4D4D4">[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">-9]+</span><span style="color: #D7BA7D">\.</span><span style="color: #D4D4D4">[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">-9]+$ ]] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;invalid metadata: subnet prefix format incorrect: ${</span><span style="color: #9CDCFE">MD_SPREFIXS</span><span style="color: #CE9178">[$i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># set vm flag based on existence of nic index (see override in oci_vcn_ip_read)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># get the virtual interfaces if VM</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ ${#</span><span style="color: #9CDCFE">MD_NIC_IS</span><span style="color: #D4D4D4">[@]} -eq </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">IS_VM</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_virtual_ifaces_read</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># create reverse lookup</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;${</span><span style="color: #D4D4D4">!</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #CE9178">[@]}&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">MD_I_BY_MAC[$</span><span style="color: #D4D4D4">{MD_MACS[</span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4">]}</span><span style="color: #DCDCAA">]</span><span style="color: #D4D4D4">=</span><span style="color: #9CDCFE">$i</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">rm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$tmpfile</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># find the duplicate addrs, if any</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-A</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">addrs=</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">addr</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">addr</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MD_ADDRS</span><span style="color: #CE9178">[@]}&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">addrs</span><span style="color: #CE9178">[$addr]}&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">DUP_ADDRS</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$addr</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&#39;t&#39;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">addrs</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$addr</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># find the duplicate subnet addrs, if any</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-A</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">saddrs=</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">addr</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MD_SPREFIXS</span><span style="color: #CE9178">[@]}&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">saddrs</span><span style="color: #CE9178">[$addr]}&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">DUP_SADDRS</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">addr</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&#39;t&#39;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">saddrs</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">addr</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_route_table_name</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nic=</span><span style="color: #9CDCFE">$1</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># format looks for &quot;${nic}&quot;, note this is really $nic_i</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vltag=</span><span style="color: #9CDCFE">$2</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">format</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$RT_FORMAT_VM</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$IS_VM</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #9CDCFE">format</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$RT_FORMAT_BM</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">eval</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$format</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_route_table_name_ip_i</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># use only when ip already setup</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nic_i=</span><span style="color: #D4D4D4">${</span><span style="color: #9CDCFE">IP_NIC_IS</span><span style="color: #D4D4D4">[$ip_i]}</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vltag=</span><span style="color: #D4D4D4">${</span><span style="color: #9CDCFE">IP_VLTAGS</span><span style="color: #D4D4D4">[$ip_i]}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">oci_vcn_ip_route_table_name</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$nic_i</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$vltag</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_route_table_exists</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rt_name=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">grep</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-qsw</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$RTS_FILE</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_route_table_find_unused_id</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># read all the current route table id/name pairs</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># mapfile will create array with each line an element</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">lines</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">mapfile</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-t</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">lines</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #CE9178">&lt;(</span><span style="color: #DCDCAA">cat</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$RTS_FILE</span><span style="color: #CE9178"> </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">grep</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-E</span><span style="color: #CE9178"> &#39;^[0-9]&#39; </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">tr</span><span style="color: #CE9178"> &#39;\t&#39; &#39; &#39; </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">tr</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-s</span><span style="color: #CE9178"> &#39; &#39; &#39; &#39;)</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot read route tables file </span><span style="color: #9CDCFE">$RTS_FILE</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">line</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-A</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rt_by_id</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">line</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">lines</span><span style="color: #CE9178">[@]}&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">pair=</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$line</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=${</span><span style="color: #9CDCFE">pair</span><span style="color: #D4D4D4">[0]}</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">=${</span><span style="color: #9CDCFE">pair</span><span style="color: #D4D4D4">[1]}</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">rt_by_id</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$id</span><span style="color: #D4D4D4">]=</span><span style="color: #9CDCFE">$name</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># find first id not used</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">unused=</span><span style="color: #B5CEA8">-1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">i</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">seq</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$RT_ID_MIN</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$RT_ID_MAX</span><span style="color: #CE9178">)</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -z </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">rt_by_id</span><span style="color: #CE9178">[$i]}&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">unused</span><span style="color: #D4D4D4">=</span><span style="color: #9CDCFE">$i</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">break</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">    [ </span><span style="color: #9CDCFE">$unused</span><span style="color: #D4D4D4"> -ne </span><span style="color: #B5CEA8">-1</span><span style="color: #D4D4D4"> ] ||  </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot find unused id in route tables file </span><span style="color: #9CDCFE">$RTS_FILE</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$unused</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_route_table_create</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nic_i=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vltag=</span><span style="color: #9CDCFE">$2</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">skip_if_exists=</span><span style="color: #9CDCFE">$3</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rt_name=$(</span><span style="color: #DCDCAA">oci_vcn_ip_route_table_name</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$nic_i</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$vltag</span><span style="color: #CE9178">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># Check if the route table exists</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rt_exists</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">rt_exists</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">oci_vcn_ip_route_table_exists</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178">)</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">exit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">$?</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$rt_exists</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># already exists</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$skip_if_exists</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;create route table </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178"> already exists, skipping&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_warn</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;route table </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178"> already exists, reusing&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># create</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rt_id</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">rt_id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">oci_vcn_ip_route_table_find_unused_id</span><span style="color: #CE9178">)</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">exit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">$?</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;create route table </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178"> (</span><span style="color: #9CDCFE">$rt_id</span><span style="color: #CE9178">)&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$rt_id</span><span style="color: #CE9178">    </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> &gt;&gt; </span><span style="color: #9CDCFE">$RTS_FILE</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_route_table_del</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rt_name=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">tmpfile=$(</span><span style="color: #DCDCAA">mktemp</span><span style="color: #CE9178"> /tmp/oci_vcn_rt_tables.XXXXX)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> ! </span><span style="color: #DCDCAA">grep</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-qsw</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$RTS_FILE</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;rt </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178"> not in </span><span style="color: #9CDCFE">$RTS_FILE</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;rt </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178"> delete&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">cp</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-p</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$RTS_FILE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$tmpfile</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># in case grep fails</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">grep</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-vw</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$RTS_FILE</span><span style="color: #D4D4D4"> &gt; </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$tmpfile</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">mv</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$tmpfile</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$RTS_FILE</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_routing_add</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">md_i=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nic_i=</span><span style="color: #9CDCFE">$2</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">iface=</span><span style="color: #9CDCFE">$3</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ns=</span><span style="color: #9CDCFE">$4</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">skip_if_exists=</span><span style="color: #9CDCFE">$5</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vltag=&quot;${</span><span style="color: #9CDCFE">MD_VLTAGS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">addr=&quot;${</span><span style="color: #9CDCFE">MD_ADDRS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">sprefix=&quot;${</span><span style="color: #9CDCFE">MD_SPREFIXS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">virtrt=&quot;${</span><span style="color: #9CDCFE">MD_VIRTRTS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">scidr=&quot;${</span><span style="color: #9CDCFE">MD_SCIDRS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># set a default route to the gateway/virtual router</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nscmd=&quot;netns exec </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$IP</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># using a namespace: iface is assumed only one in namespace, so just set a</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># default route to the gateway in the main route table</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;default route add&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$nscmd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">route</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">add</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">default</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">via</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$virtrt</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot add namespace </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178"> default gateway </span><span style="color: #9CDCFE">$virtrt</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;added namespace </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178"> default route to gateway </span><span style="color: #9CDCFE">$virtrt</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># the default route (in main route table) already defined through primary vnic.</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># this adds a rule to lookup a route table for any packets sourced from addr</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># and then the route table has the default route for that addr.</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># this allows packets from protocol services that reply with src addr</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># set to route back out through the iface (prevents asymmetric routing).</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># check for dup addrs and subnet addrs</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">DUP_ADDRS</span><span style="color: #CE9178">[$addr]}&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">oci_vcn_warn</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;IP address </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> is a duplicate, skipping creating source route rule&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">        [ -z </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">DUP_SADDRS</span><span style="color: #CE9178">[$sprefix]}&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_warn</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;duplicate subnet prefix </span><span style="color: #9CDCFE">$sprefix</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># create route table and add a default route via the gateway, and subnet route</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rt_name</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">rt_name</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">oci_vcn_ip_route_table_create</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$nic_i</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$vltag</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$skip_if_exists</span><span style="color: #CE9178">)</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">exit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">$?</span></span>
<span class="line"><span style="color: #D4D4D4">        [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #C586C0">return</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;route table add rules&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">route</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">add</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">default</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">via</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$virtrt</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$iface</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">table</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot add default route via </span><span style="color: #9CDCFE">$virtrt</span><span style="color: #CE9178"> on </span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178"> to table </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">route</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">add</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$scidr</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$iface</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">table</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot add subnet </span><span style="color: #9CDCFE">$scidr</span><span style="color: #CE9178"> route on </span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178"> to table </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># create source-based rule to use table</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;src rule add&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rule</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">add</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">from</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$addr</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">lookup</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot add rule from </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> use table </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;added rule for routing from </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> lookup </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178"> with default via </span><span style="color: #9CDCFE">$virtrt</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_routing_del</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ns=&quot;${</span><span style="color: #9CDCFE">IP_NSS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">iface=&quot;${</span><span style="color: #9CDCFE">IP_IFACES</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># for namespaces the subnet and default routes will be auto deleted with the namespace</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># delete rule</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rt_name=$(</span><span style="color: #DCDCAA">oci_vcn_ip_route_table_name_ip_i</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$ip_i</span><span style="color: #CE9178">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">had_rule</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> rule | </span><span style="color: #DCDCAA">grep</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-qsw</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># rule(s) exists</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># note that there may be secondary private ips rules using the same table</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;rules to table </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178"> delete&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">while</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> rule del lookup </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #D4D4D4"> 2&gt;/dev/null; </span><span style="color: #C586C0">do</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">true</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">had_rule</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># delete route table</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">had_table</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">had_table</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">oci_vcn_ip_route_table_del</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178">)</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">exit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">$?</span></span>
<span class="line"><span style="color: #D4D4D4">        ([ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$had_rule</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] &amp;&amp; [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$had_table</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]) || </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;removed routing on interface </span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_routing_sec_addr_add</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">iface_ip_i=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">addr=</span><span style="color: #9CDCFE">$2</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ns=&quot;${</span><span style="color: #9CDCFE">IP_NSS</span><span style="color: #CE9178">[$iface_ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># need to add source rule so reuse the routing table from the primary private ip</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># not needed if in namespace</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># not needed if on pri iface (uses main route table for dest and default route)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] &amp;&amp; [ </span><span style="color: #9CDCFE">$iface_ip_i</span><span style="color: #D4D4D4"> -ne </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># create source-based rule to use iface&#39;s routing table</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rt_name=$(</span><span style="color: #DCDCAA">oci_vcn_ip_route_table_name_ip_i</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$iface_ip_i</span><span style="color: #CE9178">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;sec addr src rule add&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rule</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">add</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">from</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$addr</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">lookup</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot add rule from secondary </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> use table </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;added rule for routing from secondary IP address </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> lookup </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_routing_sec_addr_del</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">addr=</span><span style="color: #9CDCFE">$2</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ns=&quot;${</span><span style="color: #9CDCFE">IP_NSS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># deconfig the routing (see comments in add)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] &amp;&amp; [ </span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4"> -ne </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rule</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">del</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">from</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$addr</span><span style="color: #D4D4D4"> 2&gt;</span><span style="color: #CE9178">/dev/null</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># ok if already deleted</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;deleted rule for routing from secondary IP address </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_routes_read</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">#ip r list 192.168.1.0/24</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ns=&quot;${</span><span style="color: #9CDCFE">IP_NSS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">iface=&quot;${</span><span style="color: #9CDCFE">IP_IFACES</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">nscmd</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">virtrt</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">nscmd</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;netns exec </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$IP</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># no namespace: check for route table</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rt_name=$(</span><span style="color: #DCDCAA">oci_vcn_ip_route_table_name_ip_i</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$ip_i</span><span style="color: #CE9178">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rt_exists</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">rt_exists</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">oci_vcn_ip_route_table_exists</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178">)</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">exit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">$?</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$rt_exists</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># exists</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># check for rule</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> rule | </span><span style="color: #DCDCAA">grep</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-qsw</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># rule exists that uses route table</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955"># look for default route in table, note table may exist but be empty</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955"># &quot;default via 10.0.0.1 dev ens3&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">def_entry</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">def_entry</span><span style="color: #D4D4D4">=(</span><span style="color: #CE9178">$(</span><span style="color: #9CDCFE">$IP</span><span style="color: #CE9178"> route show table </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #CE9178"> </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">grep</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-sw</span><span style="color: #CE9178"> ^default)</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">def_entry</span><span style="color: #CE9178">[2]}&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">virtrt</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">def_entry</span><span style="color: #CE9178">[2]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;default route: </span><span style="color: #9CDCFE">$virtrt</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># emtpy table: delete rule and table</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">virtrt</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #DCDCAA">oci_vcn_ip_routing_del</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ip_i</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># clean up route table since no rule uses it</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #DCDCAA">$(oci_vcn_ip_route_table_del</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$rt_name</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># read the routes</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sprefix</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sbits</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">src</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># mapfile will create array with each line an element</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">mapfile</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-t</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">routes</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #CE9178">&lt;(</span><span style="color: #9CDCFE">$IP</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$nscmd</span><span style="color: #CE9178"> route </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">grep</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-w</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178">)</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot read IP routes for interface </span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">line</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">line</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">routes</span><span style="color: #CE9178">[@]}&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">route=</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$line</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">route</span><span style="color: #CE9178">[0]}&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;default&#39;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># &quot;default via 10.0.0.1 dev ens3&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">virtrt</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">route</span><span style="color: #CE9178">[2]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;default route via: </span><span style="color: #9CDCFE">$virtrt</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">elif</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">route</span><span style="color: #CE9178">[0]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">169</span><span style="color: #CE9178">.}&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">route</span><span style="color: #CE9178">[0]}&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># not cavium route</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># &quot;10.0.0.0/24 dev ens3 proto kernel scope link src 10.0.0.2&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">i</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">seq</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">0</span><span style="color: #CE9178"> $((${</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">route</span><span style="color: #CE9178">[@]} </span><span style="color: #D4D4D4">-</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">1</span><span style="color: #CE9178">)))</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">route</span><span style="color: #CE9178">[$i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #9CDCFE">$i</span><span style="color: #D4D4D4"> -eq </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">sprefix</span><span style="color: #D4D4D4">=${</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">%/*}</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">sbits</span><span style="color: #D4D4D4">=${</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">#*/}</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$sprefix</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$sbits</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># not valid line</span></span>
<span class="line"><span style="color: #D4D4D4">                        </span><span style="color: #9CDCFE">sprefix</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                        </span><span style="color: #9CDCFE">sbits</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                        </span><span style="color: #C586C0">break</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">                        </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;subnet route: </span><span style="color: #9CDCFE">$sprefix</span><span style="color: #CE9178">/</span><span style="color: #9CDCFE">$sbits</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">elif</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$x</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;src&#39;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">src</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$YES</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_VIRTRTS</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$virtrt</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_SADDRS</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$sprefix</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_SBITSS</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$sbits</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_SRCS</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$src</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_macvlan_name</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">iface=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vltag=</span><span style="color: #9CDCFE">$2</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">eval</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$MACVLAN_FORMAT</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_vlan_name</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">iface=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vltag=</span><span style="color: #9CDCFE">$2</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">eval</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$VLAN_FORMAT</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_ns_name</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nic=</span><span style="color: #9CDCFE">$1</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># format looks for &quot;${nic}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vltag=</span><span style="color: #9CDCFE">$2</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$USE_NS</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] &amp;&amp; [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NS_FORMAT</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$IS_VM</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">NS_FORMAT</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$DEF_NS_FORMAT_VM</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">NS_FORMAT</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$DEF_NS_FORMAT_BM</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">eval</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NS_FORMAT</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_ns_svcs_stop</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ns=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">pids</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">pids</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">$(</span><span style="color: #9CDCFE">$IP</span><span style="color: #CE9178"> netns pids </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">)</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot get ids for processes in namespace </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$pids</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">kill</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-TERM</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$pids</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot terminate namespace </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178"> processes: </span><span style="color: #9CDCFE">$pids</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;terminated namespace </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178"> processes: </span><span style="color: #9CDCFE">$pids</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_ns_svcs_start</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ns=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$START_SSHD</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># start SSH daemon</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">netns</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">exec</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ns</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$SSHD</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot start ssh daemon&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;started namespace </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178"> ssh daemon&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_ns_del</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ns=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># note also deletes vlans and routes</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">netns</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">del</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ns</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot delete namespace </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;deleted namespace </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_ns_create</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nic_i=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vltag=</span><span style="color: #9CDCFE">$2</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$MODPROBE</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot find modprobe command&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$MODPROBE</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">8021</span><span style="color: #CE9178">q</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;failed to load 8021q module&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ns</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">ns</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">oci_vcn_ip_ns_name</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$nic_i</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$vltag</span><span style="color: #CE9178">)</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">exit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">$?</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">netns</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">add</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ns</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot create namespace </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;created namespace </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_addr_add_iface</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">md_i=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i=</span><span style="color: #9CDCFE">$2</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># index of physical iface/nic</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ns=</span><span style="color: #9CDCFE">$3</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">iface</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_IFACES</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">physns=&quot;${</span><span style="color: #9CDCFE">IP_NSS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">mac=&quot;${</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vltag=&quot;${</span><span style="color: #9CDCFE">MD_VLTAGS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">addr=&quot;${</span><span style="color: #9CDCFE">MD_ADDRS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">sbits=&quot;${</span><span style="color: #9CDCFE">MD_SBITSS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">vlan</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># must be adding to physical iface/nic</span></span>
<span class="line"><span style="color: #D4D4D4">    [ -z </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_VLANS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot add IP address </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> to virtual interface ${</span><span style="color: #9CDCFE">IP_VLANS</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># create virtual interface if needed (bm cases)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">macvlan</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$IS_VM</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] &amp;&amp; [ </span><span style="color: #9CDCFE">$vltag</span><span style="color: #D4D4D4"> -ne </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># bm vnics need a virtual iface except for vltag=0</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># if physical iface/nic is in a namespace we must go there to create</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">physnscmd</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$physns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">physnscmd</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;netns exec </span><span style="color: #9CDCFE">$physns</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$IP</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># create a mac vlan from physical iface/nic</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;macvlan link add </span><span style="color: #9CDCFE">$macvlan</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">macvlan</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">oci_vcn_macvlan_name</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$vltag</span><span style="color: #CE9178">)</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">exit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">$?</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$physnscmd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">link</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">add</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">link</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$iface</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">name</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$macvlan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">address</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$mac</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">type</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">macvlan</span><span style="color: #D4D4D4"> </span><span style="color: #D7BA7D">\</span></span>
<span class="line"><span style="color: #D4D4D4">            || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot create MAC VLAN interface </span><span style="color: #9CDCFE">$macvlan</span><span style="color: #CE9178"> for MAC address </span><span style="color: #9CDCFE">$mac</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># if physical iface/nic is in a namespace pull out the created mac vlan</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$physns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$physnscmd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">link</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">set</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$macvlan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">netns</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># create an ip vlan on top of the mac vlan</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;vlan link add&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">vlan</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">oci_vcn_vlan_name</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$vltag</span><span style="color: #CE9178">)</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">exit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">$?</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">link</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">add</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">link</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$macvlan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">name</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$vlan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">type</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vlan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">id</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$vltag</span><span style="color: #D4D4D4"> </span><span style="color: #D7BA7D">\</span></span>
<span class="line"><span style="color: #D4D4D4">            || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot create VLAN </span><span style="color: #9CDCFE">$vlan</span><span style="color: #CE9178"> on MAC VLAN </span><span style="color: #9CDCFE">$macvlan</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># use namespace, if option</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">nscmd</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev=&quot;${</span><span style="color: #9CDCFE">vlan</span><span style="color: #D4D4D4">:-</span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">nscmd</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;netns exec </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$IP</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># move the iface(s) to the target namespace</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$macvlan</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;macvlan link move </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">link</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">set</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$macvlan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">netns</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ns</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot move MAC VLAN </span><span style="color: #9CDCFE">$macvlan</span><span style="color: #CE9178"> into namespace </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$dev</span><span style="color: #CE9178"> link move </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">link</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">set</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$dev</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">netns</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ns</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot move interface </span><span style="color: #9CDCFE">$dev</span><span style="color: #CE9178"> into namespace </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># add IP address to iface:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># the netmask is specified to create a route in the main route table</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># if this iface is on the same subnet as another iface then the route will not have an effect</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># (until the other iface is removed)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;addr </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178">/</span><span style="color: #9CDCFE">$sbits</span><span style="color: #CE9178"> add on </span><span style="color: #9CDCFE">$dev</span><span style="color: #CE9178"> ns &#39;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&#39;&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$nscmd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">addr</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">add</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178">/</span><span style="color: #9CDCFE">$sbits</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$dev</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot add IP address </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178">/</span><span style="color: #9CDCFE">$sbits</span><span style="color: #CE9178"> on interface </span><span style="color: #9CDCFE">$dev</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$macvlan</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># set vlans up</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;vlans set up&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$nscmd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">link</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">set</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$macvlan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">mtu</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$MTU</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">up</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot set MAC VLAN </span><span style="color: #9CDCFE">$macvlan</span><span style="color: #CE9178"> up&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$nscmd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">link</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">set</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$vlan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">mtu</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$MTU</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">up</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot set VLAN </span><span style="color: #9CDCFE">$vlan</span><span style="color: #CE9178"> up&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178"> set up&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$nscmd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">link</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">set</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$iface</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">mtu</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$MTU</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">up</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot set interface </span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178"> MTU&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;added IP address </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> on interface </span><span style="color: #9CDCFE">$dev</span><span style="color: #CE9178"> with MTU </span><span style="color: #9CDCFE">$MTU</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$dev</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_addr_del_iface</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">iface=&quot;${</span><span style="color: #9CDCFE">IP_IFACES</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ns=&quot;${</span><span style="color: #9CDCFE">IP_NSS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vlan=&quot;${</span><span style="color: #9CDCFE">IP_VLANS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">secad=&quot;${</span><span style="color: #9CDCFE">IP_SECADS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">nscmd</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">nscmd</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;netns exec </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$IP</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$secad</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> != </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$YES</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] &amp;&amp; [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$vlan</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># delete vlan and macvlan, removes the addrs (pri and sec) as well</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178"> link delete&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vltag=&quot;${</span><span style="color: #9CDCFE">IP_VLTAGS</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">macvlan</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">macvlan</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">oci_vcn_macvlan_name</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$vltag</span><span style="color: #CE9178">)</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">exit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">$?</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$nscmd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">link</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">del</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">link</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$vlan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$macvlan</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot remove VLAN </span><span style="color: #9CDCFE">$vlan</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;removed VLAN </span><span style="color: #9CDCFE">$vlan</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># delete addr from phys iface</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># deleting namespace will move phys iface back to main</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># note that we may be deleting sec addr from a vlan here</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">addr=&quot;${</span><span style="color: #9CDCFE">IP_ADDRS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev=&quot;${</span><span style="color: #9CDCFE">vlan</span><span style="color: #D4D4D4">:-</span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">bits</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_SBITSS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$secad</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> != </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$YES</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #9CDCFE">bits</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">32</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;addr </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> del ns &#39;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&#39; dev </span><span style="color: #9CDCFE">$dev</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$nscmd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">addr</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">del</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178">/</span><span style="color: #9CDCFE">$bits</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$dev</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot remove IP address </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178">/</span><span style="color: #9CDCFE">$bits</span><span style="color: #CE9178"> from interface </span><span style="color: #9CDCFE">$dev</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;removed IP address </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> from interface </span><span style="color: #9CDCFE">$dev</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_addr_add</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">md_i=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">mac=&quot;${</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">addr=&quot;${</span><span style="color: #9CDCFE">MD_ADDRS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ns</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">iface</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nic_i</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vltag</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># note that when adding an addr to a physical iface ip_i will be the index of the</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># addr, but when creating a vlan for addr ip_i will not be the vlan iface but its phys one</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$IS_VM</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># bm vnics&#39; physical ifaces are identified by nic index</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">nic_i</span><span style="color: #D4D4D4">=${</span><span style="color: #9CDCFE">MD_NIC_IS</span><span style="color: #D4D4D4">[$md_i]}</span></span>
<span class="line"><span style="color: #D4D4D4">        [ </span><span style="color: #9CDCFE">$nic_i</span><span style="color: #D4D4D4"> -lt ${#</span><span style="color: #9CDCFE">NIC_IP_IS</span><span style="color: #D4D4D4">[@]} ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot find interface for NIC </span><span style="color: #9CDCFE">$nic_i</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">ip_i</span><span style="color: #D4D4D4">=${</span><span style="color: #9CDCFE">NIC_IP_IS</span><span style="color: #D4D4D4">[$nic_i]}</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">iface</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_IFACES</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">vltag</span><span style="color: #D4D4D4">=${</span><span style="color: #9CDCFE">MD_VLTAGS</span><span style="color: #D4D4D4">[$md_i]}</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># vm vnics&#39; physical ifaces are identified by matching mac</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">found</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">ip_i</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_mac</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ip_mac</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_MACS</span><span style="color: #CE9178">[@]}&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ip_mac</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$mac</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">found</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">break</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">ip_i</span><span style="color: #D4D4D4">+=</span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">        [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$found</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot find interface matching VNIC MAC </span><span style="color: #9CDCFE">$mac</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">iface</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_IFACES</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">nic_i</span><span style="color: #D4D4D4">=${</span><span style="color: #9CDCFE">IP_NIC_IS</span><span style="color: #D4D4D4">[$ip_i]}</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">vltag</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># check that there is no current addr on iface</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$IS_VM</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || [ </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MD_VLTAGS</span><span style="color: #CE9178">[$md_i]}&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;0&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># putting addr directly on iface</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_addr=&quot;${</span><span style="color: #9CDCFE">IP_ADDRS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ip_addr</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;IP address </span><span style="color: #9CDCFE">$ip_addr</span><span style="color: #CE9178"> already added on interface </span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># make sure physical iface/nic is up</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_STATES</span><span style="color: #CE9178">[$ip_i]}&quot;</span><span style="color: #D4D4D4"> != </span><span style="color: #CE9178">&quot;UP&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">link</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">set</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$iface</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">up</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot set interface </span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178"> up&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># create namespace if requested</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ns</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$USE_NS</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">ns</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">oci_vcn_ip_ns_create</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$nic_i</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$vltag</span><span style="color: #CE9178">)</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">exit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">$?</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># if working on a physical iface we need to set its namespace so that any</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># vlan created subsequently will know how to find it</span></span>
<span class="line"><span style="color: #D4D4D4">        [ </span><span style="color: #9CDCFE">$vltag</span><span style="color: #D4D4D4"> -ne </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ] || </span><span style="color: #9CDCFE">IP_NSS</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># add addr to iface (possibly creating vlan)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">dev</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">oci_vcn_ip_addr_add_iface</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$md_i</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$ip_i</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">)</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">exit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">$?</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># setup routes</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">oci_vcn_ip_routing_add</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$md_i</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$nic_i</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$dev</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ns</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># if namespace then wait for changes and start services</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">sleep</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># namespace changes seem to take time</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_ip_ns_svcs_start</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ns</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_sec_addr_add</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">iface_ip_i=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">addr=</span><span style="color: #9CDCFE">$2</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">iface=&quot;${</span><span style="color: #9CDCFE">IP_IFACES</span><span style="color: #CE9178">[$iface_ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vlan=&quot;${</span><span style="color: #9CDCFE">IP_VLANS</span><span style="color: #CE9178">[$iface_ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev=&quot;${</span><span style="color: #9CDCFE">vlan</span><span style="color: #D4D4D4">:-</span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ns=&quot;${</span><span style="color: #9CDCFE">IP_NSS</span><span style="color: #CE9178">[$iface_ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">nscmd</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">nsinfo</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># config routing</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">oci_vcn_ip_routing_sec_addr_add</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$iface_ip_i</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$addr</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># config the addr on the iface</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">nscmd</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;netns exec </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$IP</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">nsinfo</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot; in namespace </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;adding secondary IP address </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> to interface (or VLAN) </span><span style="color: #9CDCFE">$dev$nsinfo</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$nscmd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">addr</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">add</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178">/32</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$dev</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot add secondary IP address </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> on interface </span><span style="color: #9CDCFE">$dev$nsinfo</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_sec_addr_del</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">deconfig_all=</span><span style="color: #9CDCFE">$2</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">addr=</span><span style="color: #D4D4D4">${</span><span style="color: #9CDCFE">IP_ADDRS</span><span style="color: #D4D4D4">[$ip_i]}</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">iface=</span><span style="color: #D4D4D4">${</span><span style="color: #9CDCFE">IP_IFACES</span><span style="color: #D4D4D4">[$ip_i]}</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vlan=&quot;${</span><span style="color: #9CDCFE">IP_VLANS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev=&quot;${</span><span style="color: #9CDCFE">vlan</span><span style="color: #D4D4D4">:-</span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ns=&quot;${</span><span style="color: #9CDCFE">IP_NSS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">nscmd</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">nsinfo</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    [ </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_SECADS</span><span style="color: #CE9178">[$ip_i]}&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$YES</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;not a secondary IP address: </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># remove the addr on the iface (see comments in add)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># no need if deconfig all and on a vlan or in namespace</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$deconfig_all</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || ([ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$vlan</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] &amp;&amp; [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]); </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$deconfig_all</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] &amp;&amp; [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">nscmd</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;netns exec </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$IP</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">nsinfo</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot; in namespace </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;removing secondary IP address </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> from interface (or VLAN) </span><span style="color: #9CDCFE">$dev$nsinfo</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$nscmd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">addr</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">del</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178">/32</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$dev</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot remove IP address </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> on interface </span><span style="color: #9CDCFE">$dev</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># remove the routing (see comments in add)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">oci_vcn_ip_routing_sec_addr_del</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$addr</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_sec_addr_is_provisioned</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">find_addr=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">find_vnic=</span><span style="color: #9CDCFE">$2</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">i</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">found</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">seq</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">0</span><span style="color: #CE9178"> $((${</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">SEC_ADDRS</span><span style="color: #CE9178">[@]} </span><span style="color: #D4D4D4">-</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">1</span><span style="color: #CE9178">)))</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">addr</span><span style="color: #D4D4D4">=${</span><span style="color: #9CDCFE">SEC_ADDRS</span><span style="color: #D4D4D4">[$i]}</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">vnic</span><span style="color: #D4D4D4">=${</span><span style="color: #9CDCFE">SEC_VNICS</span><span style="color: #D4D4D4">[$i]}</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$find_addr</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] &amp;&amp; [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$find_vnic</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$vnic</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">found</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">break</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$found</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_addr_del</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-ir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i=</span><span style="color: #9CDCFE">$1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ns=&quot;${</span><span style="color: #9CDCFE">IP_NSS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">secad=&quot;${</span><span style="color: #9CDCFE">IP_SECADS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    [ </span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4"> -ne </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot remove primary VNIC&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$secad</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> != </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$YES</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># stop services in namespace</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">oci_vcn_ip_ns_svcs_stop</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ns</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># remove routing</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_ip_routing_del</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ip_i</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># remove addr</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">oci_vcn_ip_addr_del_iface</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ip_i</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$secad</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> != </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$YES</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] &amp;&amp; [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># delete namespace</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_ip_ns_del</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ns</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">sleep</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># namespace changes seem to take time</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_ifaces_read</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ns=&quot;</span><span style="color: #9CDCFE">$1</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">nscmd</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">iface_datas</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># change ip command to use namespace</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">nscmd</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;netns exec </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$IP</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># read the interfaces in namespace (if any)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># mapfile will create array with each line an element</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">mapfile</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-t</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">iface_datas</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #CE9178">&lt;(</span><span style="color: #9CDCFE">$IP</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$nscmd</span><span style="color: #CE9178"> addr show </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">awk</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-f</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$IFACE_AWK_SCRIPT</span><span style="color: #CE9178">)</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot read IP addresses&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ ${#</span><span style="color: #9CDCFE">iface_datas</span><span style="color: #D4D4D4">[@]} -eq </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># if reading physical ifaces, must be at least 1</span></span>
<span class="line"><span style="color: #D4D4D4">        [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot locate interfaces&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># empty namespace: probably result of a VM VNIC delete</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># note empty namespaces do not survive reboot</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">netns</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">del</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ns</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot delete empty namespace </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_warn</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;deleted empty namespace </span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nsna=&quot;${</span><span style="color: #9CDCFE">ns</span><span style="color: #D4D4D4">:-</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i=</span><span style="color: #D4D4D4">${#</span><span style="color: #9CDCFE">IP_MACS</span><span style="color: #D4D4D4">[@]} </span><span style="color: #6A9955"># continue from previous ns (if any)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">line</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">line</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">iface_datas</span><span style="color: #CE9178">[@]}&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># line items are in order printed by awk script print</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># note that $NA is used to mean null (i.e. not set)</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">oci_vcn_debug</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;iface line: </span><span style="color: #9CDCFE">$line</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">iface_data=</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$line</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">iface</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">iface_data</span><span style="color: #CE9178">[1]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># filter out virtual interfaces if VM (assume created by user for other purpose)</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$IS_VM</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || [ -z </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">VIRTUAL_IFACES</span><span style="color: #CE9178">[$iface]}&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">mac</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">iface_data</span><span style="color: #CE9178">[0]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">IP_MACS</span><span style="color: #D4D4D4">+=(</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$mac</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">IP_NSS</span><span style="color: #D4D4D4">+=(</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$nsna</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">IP_IFACES</span><span style="color: #D4D4D4">+=(</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">IP_ADDRS</span><span style="color: #D4D4D4">+=(</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">iface_data</span><span style="color: #CE9178">[2]}&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">IP_SBITSS</span><span style="color: #D4D4D4">+=(</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">iface_data</span><span style="color: #CE9178">[3]}&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">IP_STATES</span><span style="color: #D4D4D4">+=(</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">iface_data</span><span style="color: #CE9178">[4]}&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">IP_VLANS</span><span style="color: #D4D4D4">+=(</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">iface_data</span><span style="color: #CE9178">[5]}&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">IP_VLTAGS</span><span style="color: #D4D4D4">+=(</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">iface_data</span><span style="color: #CE9178">[6]}&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">secad</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">iface_data</span><span style="color: #CE9178">[7]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">IP_SECADS</span><span style="color: #D4D4D4">+=(</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$secad</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$secad</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$YES</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">IP_I_BY_MAC[</span><span style="color: #DCDCAA">&quot;</span><span style="color: #9CDCFE">$mac</span><span style="color: #DCDCAA">&quot;</span><span style="color: #DCDCAA">]</span><span style="color: #D4D4D4">=</span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># primary addrs only</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">ip_i</span><span style="color: #D4D4D4">+=</span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_ip_read</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_I_BY_MAC</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_MACS</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_NSS</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_IFACES</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_ADDRS</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_SADDRS</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_SBITSS</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_VIRTRTS</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_STATES</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_VLANS</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_VLTAGS</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_SECADS</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_SRCS</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">IP_NIC_IS</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">NIC_IP_IS</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">NIC_I_BY_PHYS_IP_I</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># read the non-namespace ifaces and any addrs on them</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">oci_vcn_ip_ifaces_read</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># read ifaces in all the namespaces (if any), note some os&#39;s don&#39;t support netns</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">mapfile</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-t</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nss</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #CE9178">&lt;(</span><span style="color: #9CDCFE">$IP</span><span style="color: #CE9178"> netns </span><span style="color: #D4D4D4">2&gt;</span><span style="color: #CE9178">/dev/null)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ns</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ns</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">nss</span><span style="color: #CE9178">[@]}&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_ip_ifaces_read</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ns</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># set vltag 0 (for phys ifaces) and read os routes for all ifaces</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ip_i</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">seq</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">0</span><span style="color: #CE9178"> $((${</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">IP_MACS</span><span style="color: #CE9178">[@]} </span><span style="color: #D4D4D4">-</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">1</span><span style="color: #CE9178">)))</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># any iface w/o vltag has tag 0</span></span>
<span class="line"><span style="color: #D4D4D4">        [ -n </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_VLTAGS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #9CDCFE">IP_VLTAGS</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4">]=</span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_ip_routes_read</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ip_i</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># find the &quot;physical&quot; iface indices: vltag 0 and not secondary addr</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># note vm ifaces are considered physical</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># these may not be in nic index order due to inclusion in namespaces (see next)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">tmpfile=$(</span><span style="color: #DCDCAA">mktemp</span><span style="color: #CE9178"> /tmp/oci_vcn_ifaces.XXXXX)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-A</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i_by_phys_iface</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ip_i</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">seq</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">0</span><span style="color: #CE9178"> $((${</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">IP_MACS</span><span style="color: #CE9178">[@]} </span><span style="color: #D4D4D4">-</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">1</span><span style="color: #CE9178">)))</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ ${</span><span style="color: #9CDCFE">IP_VLTAGS</span><span style="color: #D4D4D4">[$ip_i]} -eq </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ] &amp;&amp; [ </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_SECADS</span><span style="color: #CE9178">[$ip_i]}&quot;</span><span style="color: #D4D4D4"> != </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$YES</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># physical iface/nic</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">iface</span><span style="color: #D4D4D4">=${</span><span style="color: #9CDCFE">IP_IFACES</span><span style="color: #D4D4D4">[$ip_i]}</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">ip_i_by_phys_iface</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$iface</span><span style="color: #D4D4D4">]=</span><span style="color: #9CDCFE">$ip_i</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> &gt;&gt; </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$tmpfile</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">NIC_I_BY_PHYS_IP_I</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4">]=</span><span style="color: #B5CEA8">-1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># sort physical ifaces by first number (either at end or in middle) in iface name</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># this will provide the nic index</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nic_i=</span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">iface</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">iface</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">cat</span><span style="color: #CE9178"> &quot;</span><span style="color: #9CDCFE">$tmpfile</span><span style="color: #CE9178">&quot; </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">awk</span><span style="color: #CE9178"> </span><span style="color: #569CD6">--</span><span style="color: #CE9178"> &#39;{ match($1, /[0-9]+/); print substr($1, RSTART, RLENGTH), $1 }&#39; </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">sort</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-n</span><span style="color: #CE9178"> </span><span style="color: #D4D4D4">|</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">cut</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-f</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">2</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-d</span><span style="color: #CE9178"> &#39; &#39;)</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ip_i</span><span style="color: #D4D4D4">=${</span><span style="color: #9CDCFE">ip_i_by_phys_iface</span><span style="color: #D4D4D4">[$iface]}</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">NIC_IP_IS</span><span style="color: #D4D4D4">+=(</span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">NIC_I_BY_PHYS_IP_I</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4">]=</span><span style="color: #9CDCFE">$nic_i</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">nic_i</span><span style="color: #D4D4D4">+=</span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">rm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$tmpfile</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># for each iface (phys or vlan) get nic index</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ip_i</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">seq</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">0</span><span style="color: #CE9178"> $((${</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">IP_MACS</span><span style="color: #CE9178">[@]} </span><span style="color: #D4D4D4">-</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">1</span><span style="color: #CE9178">)))</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">iface</span><span style="color: #D4D4D4">=${</span><span style="color: #9CDCFE">IP_IFACES</span><span style="color: #D4D4D4">[$ip_i]}</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">phys_ip_i=</span><span style="color: #D4D4D4">${</span><span style="color: #9CDCFE">ip_i_by_phys_iface</span><span style="color: #D4D4D4">[$iface]}</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">IP_NIC_IS</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4">]=${</span><span style="color: #9CDCFE">NIC_I_BY_PHYS_IP_I</span><span style="color: #D4D4D4">[$phys_ip_i]}</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># fix up missing nic index for bms (see also oci_vcn_md_read): bms will be missing nic index metadata</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># if they were created before and have not had a vnic attached or detached since 8/23/17.</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># if there is a secondary vnic created and configured (before 8/23/17) we can tell it is a bm</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># because there will either be configured vlans or more vnics than physical ifaces.</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># note that gen 2 shapes are post 8/23/17 and, hence, will have nic indices already set.</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># a missing nic index for an old bm will not matter if there are no vnics to configure.</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ ${#</span><span style="color: #9CDCFE">MD_NIC_IS</span><span style="color: #D4D4D4">[@]} -eq </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ] &amp;&amp; [ ${#</span><span style="color: #9CDCFE">NIC_IP_IS</span><span style="color: #D4D4D4">[@]} -eq </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> ] &amp;&amp; </span><span style="color: #D7BA7D">\</span></span>
<span class="line"><span style="color: #D4D4D4">        ([ ${#</span><span style="color: #9CDCFE">IP_MACS</span><span style="color: #D4D4D4">[@]} -gt </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> ] || [ ${#</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #D4D4D4">[@]} -gt </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> ]); </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># configured or new secondaries</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">md_i</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">md_i</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">seq</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">0</span><span style="color: #CE9178"> $((${</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #CE9178">[@]} </span><span style="color: #D4D4D4">-</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">1</span><span style="color: #CE9178">)))</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">MD_NIC_IS</span><span style="color: #D4D4D4">+=(</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;legacy BM instance detected&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">IS_VM</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_read</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># assumes md info is already read</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># reads ip configs and creates single array of all macs</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># (fixes vm interfaces if random mac)</span></span>
<span class="line"><span style="color: #D4D4D4">    [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$IP</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot find ip command&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">warn_ifaces</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">attempt</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">attempt</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> 1 2; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># initialize md/ip shared arrays</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">MACS</span><span style="color: #D4D4D4">=(</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #CE9178">[@]}&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># read all of ip config info and see if it matches md info</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_ip_read</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">MD_CONFIGS</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">md_i=</span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">mac</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">mac</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #CE9178">[@]}&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">MD_CONFIGS</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$md_i</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i=</span><span style="color: #D4D4D4">${</span><span style="color: #9CDCFE">IP_I_BY_MAC</span><span style="color: #D4D4D4">[$mac]:-</span><span style="color: #9CDCFE">-1</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4"> -lt </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955"># if there is no corresponding iface mac: add</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955"># note ifaces with random macs will be detected below and this will be retried</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">MD_CONFIGS</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$md_i</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ADD</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">addr</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_ADDRS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #6A9955"># matching mac iface does not have address: add</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #6A9955"># make sure it is not a (corrupted) vlan that had been configured previously</span></span>
<span class="line"><span style="color: #D4D4D4">                    [ ${</span><span style="color: #9CDCFE">IP_VLTAGS</span><span style="color: #D4D4D4">[$ip_i]} -eq </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;VLAN (with MAC </span><span style="color: #9CDCFE">$mac</span><span style="color: #CE9178">) configured but missing IP address (must manually fix)&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">MD_CONFIGS</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$md_i</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ADD</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">md_i</span><span style="color: #D4D4D4">+=</span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i=</span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">IP_CONFIGS</span><span style="color: #D4D4D4">=()</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">retry</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">warn_ifaces</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-A</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">new_macs=</span><span style="color: #D4D4D4">() # for deduping secondary addr macs</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">mac</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_MACS</span><span style="color: #CE9178">[@]}&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">IP_CONFIGS</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">addr</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_ADDRS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># note that the primary vnic will be matched up (permanently)</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">md_i=</span><span style="color: #D4D4D4">${</span><span style="color: #9CDCFE">MD_I_BY_MAC</span><span style="color: #D4D4D4">[$mac]:-</span><span style="color: #9CDCFE">-1</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #9CDCFE">$md_i</span><span style="color: #D4D4D4"> -lt </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955"># no metadata mac corresponding to ip mac</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">iface</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_IFACES</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #6A9955"># addr is configured: should be deleted</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #6A9955"># bm case (in vm case ifaces are auto-deleted when vnic is detached)</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">IP_CONFIGS</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$DELETE</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">elif</span><span style="color: #D4D4D4"> [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$IS_VM</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #6A9955"># bm iface mac w/o addr and w/o md mac:</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #6A9955"># skip if phys iface, else addr deleted w/o deleting vlan?</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ ${</span><span style="color: #9CDCFE">IP_VLTAGS</span><span style="color: #D4D4D4">[$ip_i]} -ne </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                        </span><span style="color: #9CDCFE">IP_CONFIGS</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$DELETE</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                        </span><span style="color: #9CDCFE">warn_ifaces</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$warn_ifaces</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #6A9955"># vm iface mac w/o addr and w/o md mac: assume random mac</span></span>
<span class="line"><span style="color: #D4D4D4">                    ([ </span><span style="color: #9CDCFE">$attempt</span><span style="color: #D4D4D4"> -eq </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> ] &amp;&amp; [ </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_STATES</span><span style="color: #CE9178">[$ip_i]}&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;DOWN&#39;</span><span style="color: #D4D4D4"> ]) || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;interface </span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178"> with MAC </span><span style="color: #9CDCFE">$mac</span><span style="color: #CE9178"> does not have corresponding metadata&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #6A9955"># assume vm case 1st since less likely addr was deleted</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #6A9955"># attempt mac fix by turning iface up, then retry</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #6A9955"># this is probably an Intel driver problem</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #6A9955"># could look at /sys/class/net/&lt;iface&gt;/addr_assign_type</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">$IP</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">link</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">set</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dev</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$iface</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">up</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot set interface </span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178"> up&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">retry</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -z </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">new_macs</span><span style="color: #CE9178">[$mac]}&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">new_macs</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$mac</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">MACS</span><span style="color: #D4D4D4">+=(</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$mac</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">) </span><span style="color: #6A9955"># accumulate all unique macs</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955"># TODO else validate for consistency?: addr, vltag, subnet, virtrt</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">elif</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_SECADS</span><span style="color: #CE9178">[$ip_i]}&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$YES</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">is_prov</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">oci_vcn_sec_addr_is_provisioned</span><span style="color: #CE9178"> </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> &quot;${</span><span style="color: #9CDCFE">MD_VNICS</span><span style="color: #CE9178">[$md_i]}&quot;)</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$is_prov</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">IP_CONFIGS</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4">]=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$DELETE</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">ip_i</span><span style="color: #D4D4D4">+=</span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">        [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$retry</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #C586C0">break</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$warn_ifaces</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_warn</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;no VNIC (or MAC does not match) and no address, interfaces will be marked for delete:</span><span style="color: #9CDCFE">$warn_ifaces</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_config_or_deconfig_sec_addrs</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">do_config=&quot;</span><span style="color: #9CDCFE">$1</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># config if not empty, else deconfig</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">found</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># vnics must be configured, whether config or deconfig secondary addrs</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">i</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">seq</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">0</span><span style="color: #CE9178"> $((${</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">SEC_ADDRS</span><span style="color: #CE9178">[@]} </span><span style="color: #D4D4D4">-</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">1</span><span style="color: #CE9178">)))</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">addr</span><span style="color: #D4D4D4">=${</span><span style="color: #9CDCFE">SEC_ADDRS</span><span style="color: #D4D4D4">[$i]}</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">vnic</span><span style="color: #D4D4D4">=${</span><span style="color: #9CDCFE">SEC_VNICS</span><span style="color: #D4D4D4">[$i]}</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># find vnic&#39;s mac</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">mac</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">md_i</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">md_i</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">seq</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">0</span><span style="color: #CE9178"> $((${</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #CE9178">[@]} </span><span style="color: #D4D4D4">-</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">1</span><span style="color: #CE9178">)))</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$vnic</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MD_VNICS</span><span style="color: #CE9178">[$md_i]}&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">mac</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">break</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">        [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$mac</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot find VNIC for secondary IP address </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> on </span><span style="color: #9CDCFE">$vnic</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># find mac in ip config</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">iface_ip_i=</span><span style="color: #B5CEA8">-1</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">already_config</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ip_i</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">seq</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">0</span><span style="color: #CE9178"> $((${</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">IP_MACS</span><span style="color: #CE9178">[@]} </span><span style="color: #D4D4D4">-</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">1</span><span style="color: #CE9178">)))</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$mac</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_MACS</span><span style="color: #CE9178">[$ip_i]}&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># put on this iface if not already configured</span></span>
<span class="line"><span style="color: #D4D4D4">                [ </span><span style="color: #9CDCFE">$iface_ip_i</span><span style="color: #D4D4D4"> -ge </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ] || </span><span style="color: #9CDCFE">iface_ip_i</span><span style="color: #D4D4D4">=</span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># 1st is interface (secondary addrs come after)</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_ADDRS</span><span style="color: #CE9178">[$ip_i]}&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># already configured</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">already_config</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">break</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">        [ </span><span style="color: #9CDCFE">$iface_ip_i</span><span style="color: #D4D4D4"> -ge </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot find interface for secondary IP address </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> on </span><span style="color: #9CDCFE">$vnic</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$do_config</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] &amp;&amp; [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$already_config</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># configure</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">oci_vcn_ip_sec_addr_add</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$iface_ip_i</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$addr</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">found</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">elif</span><span style="color: #D4D4D4"> [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$do_config</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] &amp;&amp; [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$already_config</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># deconfigure</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># note this path is only if deconfiguring just the secondaries</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">oci_vcn_ip_sec_addr_del</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ip_i</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">found</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$found</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_config</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">found</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">mac</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-A</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">configed</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># fix up config: md will indicate adds, ip deletes</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">md_i</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">md_i</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">seq</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">0</span><span style="color: #CE9178"> $((${</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">MD_CONFIGS</span><span style="color: #CE9178">[@]} </span><span style="color: #D4D4D4">-</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">1</span><span style="color: #CE9178">)))</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MD_CONFIGS</span><span style="color: #CE9178">[$md_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$config</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ADD</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;adding IP config for VNIC MAC ${</span><span style="color: #9CDCFE">MD_MACS</span><span style="color: #CE9178">[$md_i]} with id ${</span><span style="color: #9CDCFE">MD_VNICS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">oci_vcn_ip_addr_add</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$md_i</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">found</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">del_vmac</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ip_i</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">seq</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">0</span><span style="color: #CE9178"> $((${</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">IP_CONFIGS</span><span style="color: #CE9178">[@]} </span><span style="color: #D4D4D4">-</span><span style="color: #CE9178"> </span><span style="color: #B5CEA8">1</span><span style="color: #CE9178">)))</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_CONFIGS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$config</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$DELETE</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># del all pri addrs and sec addrs (unless its vlan is being deleted)</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">mac</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_MACS</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">secad</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_SECADS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$secad</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> != </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$YES</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$del_vmac</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> != </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$mac</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">addr</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_ADDRS</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;removing IP config of address </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> from MAC </span><span style="color: #9CDCFE">$mac</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #DCDCAA">oci_vcn_ip_addr_del</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ip_i</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">found</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955"># keep track of last deleted vlan</span></span>
<span class="line"><span style="color: #D4D4D4">                [ </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_VLTAGS</span><span style="color: #CE9178">[$ip_i]}&quot;</span><span style="color: #D4D4D4"> -eq </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ] || </span><span style="color: #9CDCFE">del_vmac</span><span style="color: #D4D4D4">=</span><span style="color: #9CDCFE">$mac</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># config secondary addrs, if any</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sec_addrs_found</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ ${#</span><span style="color: #9CDCFE">SEC_ADDRS</span><span style="color: #D4D4D4">[@]} -gt </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># reread config if there were changes so that secondaries are put in the correct place</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$found</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">sleep</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># wait for newly created ifaces to settle</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">oci_vcn_read</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">sec_addrs_found</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">$(</span><span style="color: #DCDCAA">oci_vcn_config_or_deconfig_sec_addrs</span><span style="color: #CE9178"> &#39;t&#39;)</span><span style="color: #D4D4D4"> || </span><span style="color: #DCDCAA">exit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">$?</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$found</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$sec_addrs_found</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;no changes, IP configuration is up-to-date&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_deconfig_all</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i=</span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">found</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">mac</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">mac</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_MACS</span><span style="color: #CE9178">[@]}&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">addr</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_ADDRS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># ip is configured</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># note that primaries are encountered first</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_SECADS</span><span style="color: #CE9178">[$ip_i]}&quot;</span><span style="color: #D4D4D4"> != </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$YES</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># primary addr</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4"> -gt </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># skip pri vnic, pri addr</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">md_i=</span><span style="color: #D4D4D4">${</span><span style="color: #9CDCFE">MD_I_BY_MAC</span><span style="color: #D4D4D4">[$mac]:-</span><span style="color: #9CDCFE">-1</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">missing</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot; missing&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">vnicmsg</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #9CDCFE">$md_i</span><span style="color: #D4D4D4"> -ge </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">vnicmsg</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot; with id ${</span><span style="color: #9CDCFE">MD_VNICS</span><span style="color: #CE9178">[$md_i]}&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">missing</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;removing IP config of address </span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178"> for</span><span style="color: #9CDCFE">$missing</span><span style="color: #CE9178"> VNIC MAC </span><span style="color: #9CDCFE">$mac$vnicmsg</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #DCDCAA">oci_vcn_ip_addr_del</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ip_i</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">found</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># secondary addr</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #DCDCAA">oci_vcn_ip_sec_addr_del</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">found</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">ip_i</span><span style="color: #D4D4D4">+=</span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$found</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_info</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;no changes, no IP configuration to delete&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_show</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">fmt=&quot;%-6s %-15s %-15s %-5s %-15s %-10s %-3s %-10s %-5s %-11s %-5s %-17s %s\n&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">printf</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$fmt</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">CONFIG</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ADDR</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">SPREFIX</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">SBITS</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">VIRTRT</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">NS</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IND</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IFACE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">VLTAG</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">VLAN</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">STATE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MAC</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">VNIC</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">mac</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">mac</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MACS</span><span style="color: #CE9178">[@]}&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># all known macs</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">addr</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">nic_i</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">vltag</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sprefix</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sbits</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">virtrt</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ns</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">iface</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">vlan</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">state</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">vnic</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">md_i=</span><span style="color: #D4D4D4">${</span><span style="color: #9CDCFE">MD_I_BY_MAC</span><span style="color: #D4D4D4">[$mac]:-</span><span style="color: #9CDCFE">-1</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #9CDCFE">$md_i</span><span style="color: #D4D4D4"> -ge </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># in md: ADD, or no change depending on ip info</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MD_CONFIGS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">nic_i</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MD_NIC_IS</span><span style="color: #CE9178">[$md_i]</span><span style="color: #D4D4D4">:-</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">addr</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MD_ADDRS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$IS_VM</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #9CDCFE">vltag</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MD_VLTAGS</span><span style="color: #CE9178">[$md_i]}&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># not used in vms</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">sprefix</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MD_SPREFIXS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">sbits</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MD_SBITSS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">virtrt</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MD_VIRTRTS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">vnic</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">MD_VNICS</span><span style="color: #CE9178">[$md_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># find the ip info on this mac, note that there could be none, one,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># or multiple addrs if secondaries addrs exist (they will come after primary)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ip_i=</span><span style="color: #D4D4D4">${</span><span style="color: #9CDCFE">IP_I_BY_MAC</span><span style="color: #D4D4D4">[$mac]:-</span><span style="color: #9CDCFE">-1</span><span style="color: #D4D4D4">} </span><span style="color: #6A9955"># index of primary addr, if any</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4"> -ge </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">pri_ip_i=</span><span style="color: #9CDCFE">$ip_i</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">secad</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">while</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">true</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">secad</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_SECADS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                [ </span><span style="color: #9CDCFE">$pri_ip_i</span><span style="color: #D4D4D4"> -eq </span><span style="color: #9CDCFE">$ip_i</span><span style="color: #D4D4D4"> ] || [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$secad</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #C586C0">break</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">vlan</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_VLANS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">:-</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">iface</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_IFACES</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">ns</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_NSS</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">state</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_STATES</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">cfg</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_CONFIGS</span><span style="color: #CE9178">[$ip_i]</span><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$cfg</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$cfg</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #9CDCFE">$md_i</span><span style="color: #D4D4D4"> -lt </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># not in md, fill with ip info</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">addr</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_ADDRS</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">sbits</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_SBITSS</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">virtrt</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_VIRTRTS</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                    [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$IS_VM</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #9CDCFE">vltag</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_VLTAGS</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">elif</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$secad</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">addr</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;${</span><span style="color: #9CDCFE">IP_ADDRS</span><span style="color: #CE9178">[$ip_i]}&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">local</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nic_phys=</span><span style="color: #D4D4D4">${</span><span style="color: #9CDCFE">NIC_I_BY_PHYS_IP_I</span><span style="color: #D4D4D4">[$ip_i]}</span></span>
<span class="line"><span style="color: #D4D4D4">                [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$secad</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || [ </span><span style="color: #9CDCFE">$nic_phys</span><span style="color: #D4D4D4"> -lt </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ] || </span><span style="color: #9CDCFE">nic_i</span><span style="color: #D4D4D4">=</span><span style="color: #9CDCFE">$nic_phys</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># don&#39;t show if sec addr</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$secad</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #DCDCAA">printf</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$fmt</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$config</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$sprefix</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$sbits</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$virtrt</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$nic_i</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$vltag</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$vlan</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$state</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$mac</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$vnic</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #DCDCAA">printf</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$fmt</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$config</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$NA</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">ip_i</span><span style="color: #D4D4D4">+=</span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">printf</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$fmt</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$config</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$addr</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$sprefix</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$sbits</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$virtrt</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$ns</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$nic_i</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$iface</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$vltag</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$vlan</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$state</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$mac</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$vnic</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">done</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_help</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">cat</span><span style="color: #D4D4D4"> &lt;&lt;</span><span style="color: #D4D4D4">EOF</span></span>
<span class="line"><span style="color: #CE9178">NAME</span></span>
<span class="line"><span style="color: #CE9178">    </span><span style="color: #9CDCFE">$THIS</span><span style="color: #CE9178"> -- display and configure Oracle OCI Virtual Cloud Networks on instance</span></span>
<span class="line"></span>
<span class="line"><span style="color: #CE9178">SYNOPSIS</span></span>
<span class="line"><span style="color: #CE9178">    </span><span style="color: #9CDCFE">$THIS</span><span style="color: #CE9178"> [-s] [-e &lt;IP address&gt; &lt;VNIC OCID&gt;]</span></span>
<span class="line"><span style="color: #CE9178">    </span><span style="color: #9CDCFE">$THIS</span><span style="color: #CE9178"> -c [-q] [-s] [-n [&lt;format&gt;] [-r]] [-e &lt;IP address&gt; &lt;VNIC OCID&gt; [-e ...]]</span></span>
<span class="line"><span style="color: #CE9178">    </span><span style="color: #9CDCFE">$THIS</span><span style="color: #CE9178"> -d [-q] [-s] [-e &lt;IP address&gt; &lt;VNIC OCID&gt;]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #CE9178">DESCRIPTION</span></span>
<span class="line"><span style="color: #CE9178">    This shows the current OCI Virtual interface Cards provisioned in the cloud</span></span>
<span class="line"><span style="color: #CE9178">    and configured on this instance. When a secondary VNIC is provisioned in OCI it must</span></span>
<span class="line"><span style="color: #CE9178">    be explicitly configured on the instance using this script or similar commands.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #CE9178">    The first version of this command displays the currently provisioned VNICs and the</span></span>
<span class="line"><span style="color: #CE9178">    current IP configuration for this instance. VNICs that are not yet configured are</span></span>
<span class="line"><span style="color: #CE9178">    marked with &#39;</span><span style="color: #9CDCFE">$ADD</span><span style="color: #CE9178">&#39; and IP configurations that no longer have an associated VNIC</span></span>
<span class="line"><span style="color: #CE9178">    are marked with &#39;</span><span style="color: #9CDCFE">$DELETE</span><span style="color: #CE9178">&#39;.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #CE9178">    The second version, with -c, configures VNICs that do not have an IP configuration</span></span>
<span class="line"><span style="color: #CE9178">    and deletes the IP configurations of VNICs that are not currently provisioned.</span></span>
<span class="line"><span style="color: #CE9178">    This puts the instance IP configuration in sync with current OCI provisioning.</span></span>
<span class="line"><span style="color: #CE9178">    If one or more optional -e options are present the secondary IP addresses are</span></span>
<span class="line"><span style="color: #CE9178">    configured on the same interfaces as the corresponding VNIC.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #CE9178">    The configuring interfaces can optionally be placed inside separate network</span></span>
<span class="line"><span style="color: #CE9178">    namespaces. This is necessary when VNICs are in subnets (different VCNs) with</span></span>
<span class="line"><span style="color: #CE9178">    overlapping address blocks and the network applications are not bound directly</span></span>
<span class="line"><span style="color: #CE9178">    to interfaces. Network namespaces require applications to be launched in them</span></span>
<span class="line"><span style="color: #CE9178">    explicitly (via &#39;ip netns exec &lt;ns&gt;&#39;) in order to establish association with</span></span>
<span class="line"><span style="color: #CE9178">    the interface. When namespaces are not used, policy-based routing is configured</span></span>
<span class="line"><span style="color: #CE9178">    to provide a default route to the secondary VNIC\&#39;s virtual router (default</span></span>
<span class="line"><span style="color: #CE9178">    gateway) when the VNIC\&#39;s address is the source address.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #CE9178">    Bare Metal secondary VNICs are configured using VLANs (where there is no</span></span>
<span class="line"><span style="color: #CE9178">    corresponding physical interface). These will look like 2 addition interfaces</span></span>
<span class="line"><span style="color: #CE9178">    when showing IP links, with names like &#39;</span><span style="color: #9CDCFE">$MACVLAN_FORMAT</span><span style="color: #CE9178">&#39; for the MAC VLAN</span></span>
<span class="line"><span style="color: #CE9178">    and &#39;</span><span style="color: #9CDCFE">$VLAN_FORMAT</span><span style="color: #CE9178">&#39; for the IP VLAN.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #CE9178">    The third version, -d, deletes all IP configuration for provisioned secondary VNICs</span></span>
<span class="line"><span style="color: #CE9178">    as long as there is no -e option. If one or more optional -e options are present</span></span>
<span class="line"><span style="color: #CE9178">    only the given secondary IP addresses are deconfigured and the remaining configuration</span></span>
<span class="line"><span style="color: #CE9178">    is left as is.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #CE9178">    This script is made to be run periodically to pick up changes in VNIC provisioning</span></span>
<span class="line"><span style="color: #CE9178">    (whether adding or deleting). Note that these IP configuration changes are not</span></span>
<span class="line"><span style="color: #CE9178">    persistent, the script must, at a minimum, be run on each startup.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #CE9178">    -c          Add IP configuration for VNICs that are not configured and delete</span></span>
<span class="line"><span style="color: #CE9178">                for VNICs that are no longer provisioned.</span></span>
<span class="line"><span style="color: #CE9178">    -d          Deconfigure all VNICs (except the primary). If a -e option is also</span></span>
<span class="line"><span style="color: #CE9178">                present only the secondary IP address(es) are deconfigured.</span></span>
<span class="line"><span style="color: #CE9178">    -e &lt;IP address&gt; &lt;VNIC OCID&gt;</span></span>
<span class="line"><span style="color: #CE9178">                Secondary private IP address to configure or deconfigure.</span></span>
<span class="line"><span style="color: #CE9178">    -h          Print help.</span></span>
<span class="line"><span style="color: #CE9178">    -n [&lt;format&gt;]</span></span>
<span class="line"><span style="color: #CE9178">                When configuring, place interfaces in namespace identified by the given</span></span>
<span class="line"><span style="color: #CE9178">                format. Format can include </span><span style="color: #D7BA7D">\$</span><span style="color: #CE9178">nic and </span><span style="color: #D7BA7D">\$</span><span style="color: #CE9178">vltag variables. The name</span></span>
<span class="line"><span style="color: #CE9178">                defaults to &#39;</span><span style="color: #9CDCFE">$DEF_NS_FORMAT_BM</span><span style="color: #CE9178">&#39; for BMs and &#39;</span><span style="color: #9CDCFE">$DEF_NS_FORMAT_VM</span><span style="color: #CE9178">&#39; for VMs.</span></span>
<span class="line"><span style="color: #CE9178">                When configuring multiple VNICs ensure the namespaces are unique.</span></span>
<span class="line"><span style="color: #CE9178">    -q          Suppress information messages.</span></span>
<span class="line"><span style="color: #CE9178">    -r          Start sshd in namespace (if -n is present)</span></span>
<span class="line"><span style="color: #CE9178">    -s          Show information on all provisioning and interface configuration.</span></span>
<span class="line"><span style="color: #CE9178">                This is the default action if no options are given.</span></span>
<span class="line"><span style="color: #CE9178">                Columns:</span></span>
<span class="line"><span style="color: #CE9178">                    CONFIG  &#39;</span><span style="color: #9CDCFE">$ADD</span><span style="color: #CE9178">&#39; indicates missing IP config, &#39;</span><span style="color: #9CDCFE">$DELETE</span><span style="color: #CE9178">&#39; missing VNIC</span></span>
<span class="line"><span style="color: #CE9178">                    ADDR    IP address</span></span>
<span class="line"><span style="color: #CE9178">                    SPREFIX subnet CIDR prefix</span></span>
<span class="line"><span style="color: #CE9178">                    SBITS   subnet mask bits</span></span>
<span class="line"><span style="color: #CE9178">                    VIRTRT  virutal router IP address</span></span>
<span class="line"><span style="color: #CE9178">                    NS      namespace (if any)</span></span>
<span class="line"><span style="color: #CE9178">                    IND     interface index (if BM)</span></span>
<span class="line"><span style="color: #CE9178">                    IFACE   interface (underlying physical if VLAN is also set)</span></span>
<span class="line"><span style="color: #CE9178">                    VLTAG   VLAN tag (if BM)</span></span>
<span class="line"><span style="color: #CE9178">                    VLAN    IP virtual LAN (if any)</span></span>
<span class="line"><span style="color: #CE9178">                    STATE   state of interface</span></span>
<span class="line"><span style="color: #CE9178">                    MAC     MAC address</span></span>
<span class="line"><span style="color: #CE9178">                    VNIC    VNIC object identifier</span></span>
<span class="line"><span style="color: #CE9178">    -v          Verbose information messages.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #CE9178">EXAMPLES</span></span>
<span class="line"><span style="color: #CE9178">    </span><span style="color: #9CDCFE">$THIS</span></span>
<span class="line"><span style="color: #CE9178">        Show all provisioned VNICs and configured IP addresses.</span></span>
<span class="line"><span style="color: #CE9178">    </span><span style="color: #9CDCFE">$THIS</span><span style="color: #CE9178"> -c</span></span>
<span class="line"><span style="color: #CE9178">        Set configuration without a namespace.</span></span>
<span class="line"><span style="color: #CE9178">    </span><span style="color: #9CDCFE">$THIS</span><span style="color: #CE9178"> -c -n &#39;&#39;</span></span>
<span class="line"><span style="color: #CE9178">        Set configuration using a namespace with the default format.</span></span>
<span class="line"><span style="color: #CE9178">    </span><span style="color: #9CDCFE">$THIS</span><span style="color: #CE9178"> -c -n &#39;myns</span><span style="color: #D7BA7D">\$</span><span style="color: #CE9178">vltag&#39;</span></span>
<span class="line"><span style="color: #CE9178">        Set configuration using a namespace with format &#39;myns</span><span style="color: #D7BA7D">\$</span><span style="color: #CE9178">vltag&#39;.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #CE9178">SEE ALSO:</span></span>
<span class="line"><span style="color: #CE9178">    OCI networking overview including route tables and security lists:</span></span>
<span class="line"><span style="color: #CE9178">        https://docs.us-phoenix-1.oraclecloud.com/Content/Network/Concepts/overview.htm</span></span>
<span class="line"><span style="color: #CE9178">    Note: secondary VNIC in different VCN not handled, requires manually adding default route:</span></span>
<span class="line"><span style="color: #CE9178">        ip route add &lt;VCN2 CIDR&gt; via &lt;VCN2 sec VNIC subnet virt router ip&gt; dev &lt;VCN2 sec VNIC ifname&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">EOF</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># TODO secondary private IPs in metadata</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">show</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">deconfig</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;&#39;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">os_ver</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$OS_ID</span><span style="color: #CE9178">-</span><span style="color: #9CDCFE">$OS_VERSION</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">os_maj_ver</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$OS_ID</span><span style="color: #CE9178">-</span><span style="color: #9CDCFE">$OS_MAJ_VERSION</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #C586C0">while</span><span style="color: #D4D4D4"> [ </span><span style="color: #569CD6">$#</span><span style="color: #D4D4D4"> -ge </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">do</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">declare</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">opt</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$1</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">shift</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">case</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$opt</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span></span>
<span class="line"><span style="color: #D4D4D4">        -c) config=</span><span style="color: #CE9178">&#39;t&#39;</span><span style="color: #D4D4D4">;;</span></span>
<span class="line"><span style="color: #D4D4D4">        -d) deconfig=</span><span style="color: #CE9178">&#39;t&#39;</span><span style="color: #D4D4D4">;;</span></span>
<span class="line"><span style="color: #D4D4D4">        -e) </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #569CD6">$#</span><span style="color: #D4D4D4"> -lt </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;secondary private IP address option requires &lt;IP address&gt; &lt;VNIC OCID&gt;&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">SEC_ADDRS</span><span style="color: #D4D4D4">+=(</span><span style="color: #9CDCFE">$1</span><span style="color: #D4D4D4">); </span><span style="color: #DCDCAA">shift</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">SEC_VNICS</span><span style="color: #D4D4D4">+=(</span><span style="color: #9CDCFE">$1</span><span style="color: #D4D4D4">); </span><span style="color: #DCDCAA">shift</span></span>
<span class="line"><span style="color: #D4D4D4">            ;;</span></span>
<span class="line"><span style="color: #D4D4D4">        -n) </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$os_maj_ver</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;ol-6&quot;</span><span style="color: #D4D4D4"> ] || [ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$os_maj_ver</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;centos-6&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;namespaces not supported on this os version (</span><span style="color: #9CDCFE">$os_ver</span><span style="color: #CE9178">)&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ </span><span style="color: #569CD6">$#</span><span style="color: #D4D4D4"> -ge </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> ] &amp;&amp; ! [[ </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$1</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #D4D4D4">=~</span><span style="color: #D4D4D4"> ^</span><span style="color: #D7BA7D">\-</span><span style="color: #D4D4D4"> ]]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">                [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$1</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #9CDCFE">NS_FORMAT</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$1</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #DCDCAA">shift</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">USE_NS</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;t&#39;</span><span style="color: #D4D4D4">;;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">-r</span><span style="color: #D4D4D4">) START_SSHD=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">            [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$SSHD</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;missing sshd command&quot;</span><span style="color: #D4D4D4">;;</span></span>
<span class="line"><span style="color: #D4D4D4">        -s) show=</span><span style="color: #CE9178">&#39;t&#39;</span><span style="color: #D4D4D4">;;</span></span>
<span class="line"><span style="color: #D4D4D4">        -h) oci_vcn_help; </span><span style="color: #DCDCAA">exit</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;;</span></span>
<span class="line"><span style="color: #D4D4D4">        -q) </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$DEBUG</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot specify quiet with verbose&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">QUIET</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;t&#39;</span><span style="color: #D4D4D4">;;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">-v</span><span style="color: #D4D4D4">) </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$QUIET</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot specify verbose with quiet&quot;</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">DEBUG</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;t&#39;</span><span style="color: #D4D4D4">;;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">-*</span><span style="color: #D4D4D4">) oci_vcn_err </span><span style="color: #CE9178">&quot;unknown option </span><span style="color: #9CDCFE">$opt</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">;;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">esac</span></span>
<span class="line"><span style="color: #C586C0">done</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">[ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$START_SSHD</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$USE_NS</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;cannot start sshd if namespace is not created&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">[ </span><span style="color: #9CDCFE">$EUID</span><span style="color: #D4D4D4"> -eq </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;must be run as root&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># read all metadata and ip config</span></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_md_read</span></span>
<span class="line"><span style="color: #DCDCAA">oci_vcn_read</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># process options</span></span>
<span class="line"><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$config</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">    [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$deconfig</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_err</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;conflicting options&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">oci_vcn_config</span></span>
<span class="line"><span style="color: #D4D4D4">    [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$show</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_read</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># reread if show</span></span>
<span class="line"><span style="color: #C586C0">elif</span><span style="color: #D4D4D4"> [ -n </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$deconfig</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> [ ${#</span><span style="color: #9CDCFE">SEC_ADDRS</span><span style="color: #D4D4D4">[@]} -gt </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ]; </span><span style="color: #C586C0">then</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># just deconfig addrs</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_config_or_deconfig_sec_addrs</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># deconfig all</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">oci_vcn_deconfig_all</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">    [ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$show</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_read</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># reread if show</span></span>
<span class="line"><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">show</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#39;t&#39;</span></span>
<span class="line"><span style="color: #C586C0">fi</span></span>
<span class="line"><span style="color: #D4D4D4">[ -z </span><span style="color: #CE9178">&quot;</span><span style="color: #9CDCFE">$show</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4"> ] || </span><span style="color: #DCDCAA">oci_vcn_show</span></span>
<span class="line"></span></code></pre></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Como ativar o Slow Query log no SQL Server?</title>
		<link>https://furushima.com.br/blog/como-ativar-o-slow-query-log-no-sql-server/</link>
		
		<dc:creator><![CDATA[Matsuo]]></dc:creator>
		<pubDate>Thu, 13 Mar 2025 18:25:39 +0000</pubDate>
				<category><![CDATA[Banco De Dados]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[MSSQL]]></category>
		<category><![CDATA[TUNING]]></category>
		<guid isPermaLink="false">https://furushima.com.br/?p=2655</guid>

					<description><![CDATA[Como Capturar Queries Lentas no SQL Server? Se você vem do mundo MySQL, PostgreSQL ou até mesmo Oracle, pode já ter se perguntado: como capturar queries lentas no SQL Server? No MySQL, temos o slow_query_log , no PostgreSQL, o pg_stat_statements/ slowquery e Oracle AWR/ASH* podem ajudar. Mas e no SQL Server? Podemos analisar queries em [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Como Capturar Queries Lentas no SQL Server?</h2>



<p>Se você vem do mundo MySQL, PostgreSQL ou até mesmo Oracle, pode já ter se perguntado: <strong>como capturar queries lentas no SQL Server?</strong></p>



<p>No MySQL, temos o <code>slow_query_log</code> , no PostgreSQL, o <code>pg_stat_statements</code>/ slowquery  e Oracle AWR/ASH* podem ajudar. Mas e no SQL Server? </p>



<p>Podemos analisar queries em execução no momento utilizando <code>sys.dm_exec_requests</code>, mas e se quisermos consultar o histórico?</p>



<p>Err.. Dai habilitamos o Query Store!</p>



<p>Uma boa solução o <strong>Query Store</strong>. Ele permite armazenar e analisar estatísticas de execução de queries ao longo do tempo. No entanto, dependendo do volume de dados e da granularidade desejada, ele pode não ser a melhor opção para um monitoramento detalhado.</p>



<p>Foi nesse contexto que pesquisei alternativas e encontrei uma solução eficiente: <strong>o uso de Extended Events (XEvents)</strong>. Se você também busca uma forma confiável de capturar queries lentas no SQL Server, este artigo é para você.</p>



<p><strong>Referências:</strong></p>



<ul class="wp-block-list">
<li>Documentação oficial da Microsoft sobre <a href="https://learn.microsoft.com/en-us/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store?view=sql-server-ver16">Query Store</a></li>



<li>Blog do <a href="https://www.dirceuresende.com/">Dirceu Resende</a></li>
</ul>



<p></p>



<p><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Monitorando Queries Lentas com Extended Events</p>



<p>A partir do SQL Server 2012, os <strong>Extended Events (XEvents)</strong> se tornaram uma das melhores formas de capturar eventos internos do SQL Server. Eles funcionam como um sistema de auditoria leve e personalizável, permitindo registrar queries lentas, deadlocks, commits e por ai vai..</p>



<p>Podemos compará-los a <strong>triggers</strong>, mas ao invés de serem executados em nível de tabela, eles capturam eventos no nível da instância do SQL Server.</p>



<p><a href="https://learn.microsoft.com/en-us/sql/relational-databases/extended-events/quick-start-extended-events-in-sql-server?view=sql-server-ver16">Extended Events (XEvents)</a></p>



<h2 class="wp-block-heading">1º Criar o Evento de Captura</h2>



<p>Antes de tudo, precisamos criar um <strong>evento de captura</strong> para registrar as queries demoradas. Para isso, utilizaremos o Extended Events, garantindo que os arquivos de saída sejam gravados em um diretório onde o SQL Server tenha permissão de escrita, no meu caso.</p>



<p>K:\SLOW_QUERIES</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="CREATE EVENT SESSION [SLOW_QUERIES] ON SERVER  
ADD EVENT sqlserver.sql_batch_completed (  
    ACTION (  
        sqlserver.session_id,  
        sqlserver.client_app_name,  
        sqlserver.client_hostname,  
        sqlserver.database_name,  
        sqlserver.username,  
        sqlserver.session_nt_username,  
        sqlserver.session_server_principal_name,  
        sqlserver.sql_text  
    )  
    WHERE duration &gt; 5000000  -- AJUSTE O TEMPO CONFORME SUA NECESSIDADE
)  
ADD TARGET package0.event_file (  
    SET filename = N'K:\SLOW_QUERIES\slow.xel',   -- AQUI TAMBEM, AJUSTE SEU DIRETORIO
        max_file_size = 10,  
        max_rollover_files = 10  
)  
WITH (STARTUP_STATE = ON);  
GO  

-- Ativa o Extended Event
ALTER EVENT SESSION [SLOW_QUERIES] ON SERVER STATE = START
GO" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">EVENT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SESSION</span><span style="color: #D4D4D4"> [SLOW_QUERIES] </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SERVER</span><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #569CD6">ADD</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">EVENT</span><span style="color: #D4D4D4"> sqlserver.sql_batch_completed (  </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">ACTION</span><span style="color: #D4D4D4"> (  </span></span>
<span class="line"><span style="color: #D4D4D4">        sqlserver.session_id,  </span></span>
<span class="line"><span style="color: #D4D4D4">        sqlserver.client_app_name,  </span></span>
<span class="line"><span style="color: #D4D4D4">        sqlserver.client_hostname,  </span></span>
<span class="line"><span style="color: #D4D4D4">        sqlserver.database_name,  </span></span>
<span class="line"><span style="color: #D4D4D4">        sqlserver.username,  </span></span>
<span class="line"><span style="color: #D4D4D4">        sqlserver.session_nt_username,  </span></span>
<span class="line"><span style="color: #D4D4D4">        sqlserver.session_server_principal_name,  </span></span>
<span class="line"><span style="color: #D4D4D4">        sqlserver.sql_text  </span></span>
<span class="line"><span style="color: #D4D4D4">    )  </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> duration &gt; </span><span style="color: #B5CEA8">5000000</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- AJUSTE O TEMPO CONFORME SUA NECESSIDADE</span></span>
<span class="line"><span style="color: #D4D4D4">)  </span></span>
<span class="line"><span style="color: #569CD6">ADD</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">TARGET</span><span style="color: #D4D4D4"> package0.event_file (  </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">SET</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">filename</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">N&#39;K:\SLOW_QUERIES\slow.xel&#39;</span><span style="color: #D4D4D4">,   </span><span style="color: #6A9955">-- AQUI TAMBEM, AJUSTE SEU DIRETORIO</span></span>
<span class="line"><span style="color: #D4D4D4">        max_file_size = </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">,  </span></span>
<span class="line"><span style="color: #D4D4D4">        max_rollover_files = </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">)  </span></span>
<span class="line"><span style="color: #569CD6">WITH</span><span style="color: #D4D4D4"> (STARTUP_STATE = </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4">);  </span></span>
<span class="line"><span style="color: #569CD6">GO</span><span style="color: #D4D4D4">  </span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- Ativa o Extended Event</span></span>
<span class="line"><span style="color: #569CD6">ALTER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">EVENT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SESSION</span><span style="color: #D4D4D4"> [SLOW_QUERIES] </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SERVER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">STATE</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">START</span></span>
<span class="line"><span style="color: #569CD6">GO</span></span></code></pre></div>



<p>neste caso iremos coletar tudo que for acima de 5 segundos , com 10 arquivos de no maximo 10MB, em D:\SLOW_QUERIES\.</p>



<h2 class="wp-block-heading">2º Criar uma Tabela para salvar estes dados</h2>



<p>Agora, precisamos de um local para armazenar os dados coletados pelo XEvents. Criamos uma tabela que receberá as informações capturadas.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="CREATE TABLE dbo.Historico_Query_Lenta (
    [Dt_Evento] DATETIME,
    [session_id] INT,
    [database_name] VARCHAR(128),
    [username] VARCHAR(128),
    [session_server_principal_name] VARCHAR(128),
    [session_nt_username] VARCHAR(128),
    [client_hostname] VARCHAR(128),
    [client_app_name] VARCHAR(128),
    [duration] DECIMAL(18, 2),
    [cpu_time] DECIMAL(18, 2),
    [logical_reads] BIGINT,
    [physical_reads] BIGINT,
    [writes] BIGINT,
    [row_count] BIGINT,
    [sql_text] XML,
    [batch_text] XML,
    [result] VARCHAR(100)
) WITH(DATA_COMPRESSION=PAGE)
GO" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">TABLE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">dbo</span><span style="color: #D4D4D4">.Historico_Query_Lenta (</span></span>
<span class="line"><span style="color: #D4D4D4">    [Dt_Evento] </span><span style="color: #569CD6">DATETIME</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    [session_id] </span><span style="color: #569CD6">INT</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    [database_name] </span><span style="color: #569CD6">VARCHAR</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    [username] </span><span style="color: #569CD6">VARCHAR</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    [session_server_principal_name] </span><span style="color: #569CD6">VARCHAR</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    [session_nt_username] </span><span style="color: #569CD6">VARCHAR</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    [client_hostname] </span><span style="color: #569CD6">VARCHAR</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    [client_app_name] </span><span style="color: #569CD6">VARCHAR</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    [duration] </span><span style="color: #569CD6">DECIMAL</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">18</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    [cpu_time] </span><span style="color: #569CD6">DECIMAL</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">18</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    [logical_reads] </span><span style="color: #569CD6">BIGINT</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    [physical_reads] </span><span style="color: #569CD6">BIGINT</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    [writes] </span><span style="color: #569CD6">BIGINT</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    [row_count] </span><span style="color: #569CD6">BIGINT</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    [sql_text] </span><span style="color: #569CD6">XML</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    [batch_text] </span><span style="color: #569CD6">XML</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    [result] </span><span style="color: #569CD6">VARCHAR</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">) </span><span style="color: #569CD6">WITH</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">DATA_COMPRESSION</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">PAGE</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #569CD6">GO</span></span></code></pre></div>



<h2 class="wp-block-heading">3º Criar uma Procedure para Captura dos Dados</h2>



<p>O próximo passo é criar uma <strong>Stored Procedure</strong> para extrair os dados do Extended Events e armazená-los na tabela criada no Passo 2, crie um database de sua escolha , recomendo a ter sempre um database administrativo para tais acoes.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code=" 
CREATE PROCEDURE dbo.stpCarga_Query_Lenta
AS
BEGIN
    
    
    DECLARE 
        @TimeZone INT = DATEDIFF(HOUR, GETUTCDATE(), GETDATE()),
        @Dt_Ultimo_Registro DATETIME = ISNULL((SELECT MAX(Dt_Evento) FROM dbo.Historico_Query_Lenta), '1900-01-01')
 
 
    IF (OBJECT_ID('tempdb..#Eventos') IS NOT NULL) DROP TABLE #Eventos
    ;WITH CTE AS (
        SELECT CONVERT(XML, event_data) AS event_data
        FROM sys.fn_xe_file_target_read_file(N'K:\SLOW_QUERIES\slow*.xel', NULL, NULL, NULL)
    )
    SELECT
        DATEADD(HOUR, @TimeZone, CTE.event_data.value('(//event/@timestamp)[1]', 'datetime')) AS Dt_Evento,
        CTE.event_data
    INTO
        #Eventos
    FROM
        CTE
    WHERE
        DATEADD(HOUR, @TimeZone, CTE.event_data.value('(//event/@timestamp)[1]', 'datetime')) &gt; @Dt_Ultimo_Registro
    
 
    INSERT INTO dbo.Historico_Query_Lenta
    SELECT
        A.Dt_Evento,
        xed.event_data.value('(action[@name=&quot;session_id&quot;]/value)[1]', 'int') AS session_id,
        xed.event_data.value('(action[@name=&quot;database_name&quot;]/value)[1]', 'varchar(128)') AS [database_name],
        xed.event_data.value('(action[@name=&quot;username&quot;]/value)[1]', 'varchar(128)') AS username,
        xed.event_data.value('(action[@name=&quot;session_server_principal_name&quot;]/value)[1]', 'varchar(128)') AS session_server_principal_name,
        xed.event_data.value('(action[@name=&quot;session_nt_username&quot;]/value)[1]', 'varchar(128)') AS [session_nt_username],
        xed.event_data.value('(action[@name=&quot;client_hostname&quot;]/value)[1]', 'varchar(128)') AS [client_hostname],
        xed.event_data.value('(action[@name=&quot;client_app_name&quot;]/value)[1]', 'varchar(128)') AS [client_app_name],
        CAST(xed.event_data.value('(//data[@name=&quot;duration&quot;]/value)[1]', 'bigint') / 1000000.0 AS NUMERIC(18, 2)) AS duration,
        CAST(xed.event_data.value('(//data[@name=&quot;cpu_time&quot;]/value)[1]', 'bigint') / 1000000.0 AS NUMERIC(18, 2)) AS cpu_time,
        xed.event_data.value('(//data[@name=&quot;logical_reads&quot;]/value)[1]', 'bigint') AS logical_reads,
        xed.event_data.value('(//data[@name=&quot;physical_reads&quot;]/value)[1]', 'bigint') AS physical_reads,
        xed.event_data.value('(//data[@name=&quot;writes&quot;]/value)[1]', 'bigint') AS writes,
        xed.event_data.value('(//data[@name=&quot;row_count&quot;]/value)[1]', 'bigint') AS row_count,
        TRY_CAST(xed.event_data.value('(//action[@name=&quot;sql_text&quot;]/value)[1]', 'varchar(max)') AS XML) AS sql_text,
        TRY_CAST(xed.event_data.value('(//data[@name=&quot;batch_text&quot;]/value)[1]', 'varchar(max)') AS XML) AS batch_text,
        xed.event_data.value('(//data[@name=&quot;result&quot;]/text)[1]', 'varchar(100)') AS result
    FROM
        #Eventos A
        CROSS APPLY A.event_data.nodes('//event') AS xed (event_data)
 
 
END" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #DCDCAA">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">PROCEDURE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dbo.stpCarga_Query_Lenta</span></span>
<span class="line"><span style="color: #DCDCAA">AS</span></span>
<span class="line"><span style="color: #DCDCAA">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">DECLARE</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">@TimeZone</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">INT</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">DATEDIFF</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">HOUR,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">GETUTCDATE</span><span style="color: #D4D4D4">()</span><span style="color: #CE9178">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">GETDATE</span><span style="color: #D4D4D4">())</span><span style="color: #CE9178">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">@Dt_Ultimo_Registro</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">DATETIME</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ISNULL</span><span style="color: #D4D4D4">((SELECT MAX(Dt_Evento) FROM dbo.Historico_Query_Lenta), &#39;</span><span style="color: #B5CEA8">1900</span><span style="color: #D4D4D4">-</span><span style="color: #B5CEA8">01</span><span style="color: #D4D4D4">-</span><span style="color: #B5CEA8">01</span><span style="color: #D4D4D4">&#39;)</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">IF</span><span style="color: #D4D4D4"> (OBJECT_ID(</span><span style="color: #CE9178">&#39;tempdb..#Eventos&#39;</span><span style="color: #D4D4D4">) IS NOT NULL) DROP TABLE </span><span style="color: #6A9955">#Eventos</span></span>
<span class="line"><span style="color: #D4D4D4">    ;</span><span style="color: #DCDCAA">WITH</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">CTE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">AS</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">CONVERT</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">XML,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">event_data</span><span style="color: #D4D4D4">) </span><span style="color: #CE9178">AS</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">event_data</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">FROM</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">sys.fn_xe_file_target_read_file</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">N</span><span style="color: #DCDCAA">&#39;K:\SLOW_QUERIES\slow*.xel&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">NULL,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">NULL,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">NULL</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    )</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">SELECT</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">DATEADD(HOUR,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">@TimeZone,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">CTE.event_data.value</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">&#39;(//event/@timestamp)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;datetime&#39;</span><span style="color: #D4D4D4">)) AS Dt_Evento,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">CTE.event_data</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">INTO</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">#Eventos</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">FROM</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">CTE</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">WHERE</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">DATEADD(HOUR,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">@TimeZone,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">CTE.event_data.value</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">&#39;(//event/@timestamp)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;datetime&#39;</span><span style="color: #D4D4D4">)) &gt; @Dt_Ultimo_Registro</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">INSERT</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">INTO</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dbo.Historico_Query_Lenta</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">SELECT</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">A.Dt_Evento,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(action[@name=&quot;session_id&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;int&#39;</span><span style="color: #D4D4D4">) AS session_id,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(action[@name=&quot;database_name&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(128)&#39;</span><span style="color: #D4D4D4">) AS [database_name],</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(action[@name=&quot;username&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(128)&#39;</span><span style="color: #D4D4D4">) AS username,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(action[@name=&quot;session_server_principal_name&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(128)&#39;</span><span style="color: #D4D4D4">) AS session_server_principal_name,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(action[@name=&quot;session_nt_username&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(128)&#39;</span><span style="color: #D4D4D4">) AS [session_nt_username],</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(action[@name=&quot;client_hostname&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(128)&#39;</span><span style="color: #D4D4D4">) AS [client_hostname],</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(action[@name=&quot;client_app_name&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(128)&#39;</span><span style="color: #D4D4D4">) AS [client_app_name],</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">CAST(xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//data[@name=&quot;duration&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;bigint&#39;</span><span style="color: #D4D4D4">) / 1000000.0 AS NUMERIC(</span><span style="color: #DCDCAA">18,</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">)) AS duration,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">CAST(xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//data[@name=&quot;cpu_time&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;bigint&#39;</span><span style="color: #D4D4D4">) / 1000000.0 AS NUMERIC(</span><span style="color: #DCDCAA">18,</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">)) AS cpu_time,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//data[@name=&quot;logical_reads&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;bigint&#39;</span><span style="color: #D4D4D4">) AS logical_reads,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//data[@name=&quot;physical_reads&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;bigint&#39;</span><span style="color: #D4D4D4">) AS physical_reads,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//data[@name=&quot;writes&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;bigint&#39;</span><span style="color: #D4D4D4">) AS writes,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//data[@name=&quot;row_count&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;bigint&#39;</span><span style="color: #D4D4D4">) AS row_count,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">TRY_CAST(xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//action[@name=&quot;sql_text&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(max)&#39;</span><span style="color: #D4D4D4">) AS XML) AS sql_text,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">TRY_CAST(xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//data[@name=&quot;batch_text&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(max)&#39;</span><span style="color: #D4D4D4">) AS XML) AS batch_text,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//data[@name=&quot;result&quot;]/text)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(100)&#39;</span><span style="color: #D4D4D4">) AS result</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">FROM</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">#Eventos A</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">CROSS</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">APPLY</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">A.event_data.nodes</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">&#39;//event&#39;</span><span style="color: #D4D4D4">) </span><span style="color: #CE9178">AS</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">xed</span><span style="color: #D4D4D4"> (event_data)</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #DCDCAA">END</span></span></code></pre></div>



<h2 class="wp-block-heading">4º Criar um Job para coletas frequentes.</h2>



<p>Para garantir que a coleta de queries lentas ocorra de forma contínua, podemos configurar um <strong>SQL Server Agent Job</strong> para executar a stored procedure periodicamente.</p>



<figure class="wp-block-image size-full"><img alt="" fetchpriority="high" decoding="async" width="699" height="651" src="https://furushima.com.br/wp-content/uploads/2025/03/Slow_query-1.gif" alt="" class="wp-image-2657"/></figure>



<p>Então podemos consultar nossa tabela Historico_Query_Lenta onde estarão nossos dados.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
