diff --git a/usr/local/lib/default.bash b/usr/local/lib/default.bash index 7aa4240..4435023 100644 --- a/usr/local/lib/default.bash +++ b/usr/local/lib/default.bash @@ -12,6 +12,9 @@ fi # Global Variable #----------------------------------------------------------------------------------------------------------------------------------- +declare -g LOG_FILE="" +declare -g LOG_LOCK="" +declare -g LOG_ECHO="" @@ -253,7 +256,7 @@ file_lock() if ! flock ${flag} -w 5 ${desc} then - err_echo "Failed to acquire read lock on: [${file}]" + err_echo "Failed to acquire [${mode}] lock on: [${file}]" exit 1 fi } @@ -285,18 +288,67 @@ file_unlock() +#-------------------------------------------------------------------------------------------------------------------------- +# log_file_set +#-------------------------------------------------------------------------------------------------------------------------- + +log_set() +{ + local log_file="$1" + local lock_file="$2" + local echo_function="$3" + + + LOG_FILE="${log_file}" + LOG_LOCK="${lock_file}" + LOG_ECHO="${echo_function}" +} + + + + + +#-------------------------------------------------------------------------------------------------------------------------- +# log_print_file +#-------------------------------------------------------------------------------------------------------------------------- + +log_print_file() +{ + local log_file="$1" + local lock_file="$2" + local echo_function="$3" + local log_prefix="$4" + + + shift; shift; shift; shift + + ${echo_function} "($BASHPID):" "$*" + + if [[ "${log_file}" != "" ]] + then + if [[ "${lock_file}" != "" ]] + then + file_lock "${lock_file}" WRITE 8 + fi + + printf >> "${log_file}" "%s %9s %8s %s\n" "$(date --rfc-3339=seconds -u)" "($BASHPID)" "${log_prefix}:" "$*" + + if [[ "${lock_file}" != "" ]] + then + file_unlock 8 + fi + fi +} + + + + + #-------------------------------------------------------------------------------------------------------------------------- # log_print #-------------------------------------------------------------------------------------------------------------------------- log_print() { - local log_file="$1" - local echo_function="$2" - - - shift; shift - - ${echo_function} "($BASHPID):" "$*" - echo >> ${VPN_LOG_FILE} $(date) "($BASHPID):" "$*" + log_print_file "${LOG_FILE}" "${LOG_LOCK}" "${LOG_ECHO}" $* } diff --git a/usr/local/lib/dns.bash b/usr/local/lib/dns.bash index 11fcbf3..3fa70e5 100644 --- a/usr/local/lib/dns.bash +++ b/usr/local/lib/dns.bash @@ -31,17 +31,17 @@ declare -g DNS_A_ID_LIST declare -Ag DNS_PTR_TAB declare -g DNS_PTR_ID_LIST -declare -g DNS_CACHE_FILE="/var/cache/network/dns.cache" -declare -g DNS_CACHE_LOCK="/var/lock/network/dns.lock" +declare -g DNS_CACHE_FILE +declare -g DNS_CACHE_LOCK #declare -g DNS_CACHE_LOCK="${DNS_CACHE_FILE}" declare -g DNS_CACHE_UPDATED=0 -if [ ! -v LOG ] || [[ "${LOG}" == "" ]] -then - export LOG=":" -fi +#if [ ! -v LOG ] || [[ "${LOG}" == "" ]] +#then +# export LOG=":" +#fi @@ -53,13 +53,13 @@ fi dns_tab_load() { - ${LOG} 1>&2 "Loading DNS cache..." - + log_print "DNS" "Loading DNS cache..." + file_lock "${DNS_CACHE_LOCK}" READ 9 if [[ ( -e "${DNS_CACHE_FILE}" ) && ( "${NETWORK_CONFIG_FILE}" -ot "${DNS_CACHE_FILE}" ) ]] then - ${LOG} 1>&2 "DNS: Read CacheFile" + log_print "DNS" "Read CacheFile" while IFS= read -r line do @@ -76,7 +76,7 @@ dns_tab_load() fi done < ${DNS_CACHE_FILE} else - ${LOG} 1>&2 "DNS: Init CacheFile" + log_print "DNS" "Init CacheFile" >${DNS_CACHE_FILE} fi @@ -96,13 +96,13 @@ dns_tab_load() dns_tab_save() { - ${LOG} 1>&2 "Saving DNS cache..." + log_print "DNS" "Saving DNS cache..." if [[ "${DNS_CACHE_UPDATED}" != "0" ]] then file_lock "${DNS_CACHE_LOCK}" WRITE 9 - ${LOG} 1>&2 "DNS: Write CacheFile" + log_print "DNS" "Write CacheFile" ( for key in "${!DNS_A_TAB[@]}" @@ -143,7 +143,7 @@ dns_tab_get() then dns_value="${DNS_A_TAB["${dns_key}"]}" else - ${LOG} "DNS: Lookup failed: Type: [${dns_type}] Key: [${dns_key}]" + log_print "DNS" "Lookup failed: Type: [${dns_type}] Key: [${dns_key}]" return 1 fi ;; @@ -153,13 +153,13 @@ dns_tab_get() then dns_value="${DNS_PTR_TAB["${dns_key}"]}" else - ${LOG} "DNS: Lookup failed: Type: [${dns_type}] Key: [${dns_key}]" + log_print "DNS" "Lookup failed: Type: [${dns_type}] Key: [${dns_key}]" return 1 fi ;; esac - ${LOG} "DNS: Lookup succeed: Type: [${dns_type}] Key: [${dns_key}] Value: [${dns_value}]" + log_print "DNS" "Lookup succeed: Type: [${dns_type}] Key: [${dns_key}] Value: [${dns_value}]" return 0 } @@ -181,9 +181,9 @@ dns_tab_put() if [[ "${dtp_value}" == "" ]] then - ${LOG} 1>&2 "DNS: Skiping cache entry: Type: [${dtp_type}] Key: [${dtp_key}] Value: [${dtp_value}]" + log_print "DNS" "Skiping cache entry: Type: [${dtp_type}] Key: [${dtp_key}] Value: [${dtp_value}]" else - ${LOG} 1>&2 "DNS: Update cache entry: Type: [${dtp_type}] Key: [${dtp_key}] Value: [${dtp_value}]" + log_print "DNS" "Update cache entry: Type: [${dtp_type}] Key: [${dtp_key}] Value: [${dtp_value}]" var_assign DNS_${dtp_type}_ID_LIST "${dtp_key}" INC tab_assign DNS_${dtp_type}_TAB "${dtp_key}" "${dtp_value}" @@ -216,7 +216,7 @@ dns_lookup() if [[ "$?" != "0" ]] then - ${LOG} "DNS: Out of Cache: Type: [${dl_type}] Key: [${dl_key}] Flag: [${dl_flag}]" + log_print "DNS" "Out of Cache: Type: [${dl_type}] Key: [${dl_key}] Flag: [${dl_flag}]" case ${dl_type} in diff --git a/usr/local/lib/network.bash b/usr/local/lib/network.bash index f251138..ea34490 100644 --- a/usr/local/lib/network.bash +++ b/usr/local/lib/network.bash @@ -39,24 +39,12 @@ declare -Ag NETWORK_DST_NAME_IDX declare -Ag NETWORK_DST_DEV_IDX declare -g NETWORK_CONFIG_FILE="/etc/sysconfig/rx3-network" -declare -g NETWORK_CONFIG_LOCK="/var/lock/network/rx3-network" +declare -g NETWORK_CONFIG_LOCK="/var/lock/network/config" #declare -g NETWORK_CONFIG_LOCK="${NETWORK_CONFIG_FILE}" - - - - -file_lock ${NETWORK_CONFIG_LOCK} READ 9 - -[ -e "${NETWORK_CONFIG_FILE}" ] && . "${NETWORK_CONFIG_FILE}" - -file_unlock 9 - - -if [ ! -v LOG ] || [[ "${LOG}" == "" ]] -then - export LOG=":" -fi +declare -g NETWORK_LOG_FILE +declare -g NETWORK_LOG_LOCK +#declare -g NETWORK_LOG_LOCK="${NETWORK_LOG_FILE}" @@ -150,7 +138,7 @@ num_to_ip() network_common_load() { - ${LOG} 1>&2 "Loading common..." + log_print "Network" "Loading common..." NETWORK_OPENVPN_STATUS="$( sudo /usr/local/sbin/openvpn-status)" NETWORK_TABLE_LIST="" @@ -185,7 +173,7 @@ network_ip_route_tab_load() nirtl_id=0 - ${LOG} 1>&2 "Loading IP Route tab..." + log_print "Network" "Loading IP Route tab..." while IFS= read -r line do @@ -273,7 +261,7 @@ network_dst_tab_load() ndtl_id=0 - ${LOG} 1>&2 "Loading Dst tab..." + log_print "Network" "Loading Dst tab..." while IFS= read -r line do @@ -459,7 +447,7 @@ network_src_tab_load() nstl_port_default=3000 - ${LOG} 1>&2 "Loading Src tab..." + log_print "Network" "Loading Src tab..." ip_base=$( ip_to_num ${NETWORK_SRC_LOCAL_ADDRESS}) @@ -669,7 +657,7 @@ network_src_tab_ip_lookup() network_tab_load() { - ${LOG} 1>&2 "Loading config..." + log_print "Network" "Loading config..." dns_tab_load @@ -717,14 +705,14 @@ network_table_init() if [[ ${dst_type} == "0" ]] then - ${LOG} "Copy main default route into table 3 (VPN Local routing table)" + log_print "Network" "Copy main default route into table 3 (VPN Local routing table)" if [[ "$(ip route list match 0.0.0.0 table main)" != "" ]] then ${DEBUG} ip route add $(ip route list match 0.0.0.0 table main) table 3 fi else - ${LOG} "Define default route to device: [${dst_device}] into table: [${dst_table}]" + log_print "Network" "Define default route to device: [${dst_device}] into table: [${dst_table}]" if [[ "$(ip link show ${dst_device})" != "" ]] then @@ -732,7 +720,7 @@ network_table_init() fi fi - ${LOG} "Add Rx3 routes in VPN tables" + log_print "Network" "Add Rx3 routes in VPN tables" for ip_route_id in ${NETWORK_IP_ROUTE_ID_LIST} do @@ -753,7 +741,7 @@ network_table_init() network_table_deinit() { - ${LOG} "Remove Rx3 routes in VPN tables" + log_print "Network" "Remove Rx3 routes in VPN tables" for table in ${NETWORK_TABLE_LIST} do @@ -770,9 +758,9 @@ network_table_deinit() network_dst_tab_get ${dst_id} - ${LOG} "Remove default route in table: [${dst_table}]" + log_print "Network" "Remove default route in table: [${dst_table}]" - ${DEBUG} ip route del default table ${dst_table} + ${DEBUG} ip route del default table ${dst_table} 2>/dev/null done } @@ -832,21 +820,21 @@ network_dst_address_refresh() local proxy_port=8080 - dst_ip_new=$( nc ${proxy_host} ${proxy_port}) + dst_ip_new=$( nc -w 5 ${proxy_host} ${proxy_port}) if is_valid_ip ${dst_ip_new} then if [[ "${dst_ip_old}" != "${dst_ip_new}" ]] then - ${LOG} "Update ${dst_host_name}: Old: [${dst_ip_old}] New: [${dst_ip_new}]" + log_print "Network" "Update ${dst_host_name}: Old: [${dst_ip_old}] New: [${dst_ip_new}]" ${DEBUG} /usr/local/sbin/ip_host_update "${dst_host_name/.*}" "${dst_host_name#*.}" "${dst_ip_new}" 60 tab_assign NETWORK_DST_TAB "${dst_id},IP" "${dst_ip_new}" else - ${LOG} "Skiping ${dst_host_name}: IP: [${dst_ip_old}]" + log_print "Network" "Skiping ${dst_host_name}: IP: [${dst_ip_old}]" fi else - ${LOG} "Skiping ${dst_host_name}: Invalid IP: [${dst_ip_new}] Old IP[${dst_ip_old}]" + log_print "Network" "Skiping ${dst_host_name}: Invalid IP: [${dst_ip_new}] Old IP: [${dst_ip_old}]" fi } @@ -886,18 +874,18 @@ function bridge_up bu_table=$6 - ${LOG} "Create bridge [${bu_bridge_device}]..." + log_print "Network" "Create bridge [${bu_bridge_device}]..." ${DEBUG} ip link add name ${bu_bridge_device} type bridge - ${LOG} "Configure host side [${bu_bridge_device}:${bu_bridge_address}/${bu_bridge_mask}]..." + log_print "Network" "Configure host side [${bu_bridge_device}:${bu_bridge_address}/${bu_bridge_mask}]..." ${DEBUG} ip link set ${bu_bridge_device} up ${DEBUG} ip addr add ${bu_bridge_address}/${bu_bridge_mask} dev ${bu_bridge_device} - ${LOG} "Configure IP rule and routing [${bu_bridge_device}]..." + log_print "Network" "Configure IP rule and routing [${bu_bridge_device}]..." ${DEBUG} ip rule add from ${bu_peer_address} table ${bu_table} @@ -926,17 +914,17 @@ function bridge_down bd_table=$6 - ${LOG} "Remove IP routing and rule [${bd_bridge_device}]..." + log_print "Network" "Remove IP routing and rule [${bd_bridge_device}]..." for bd_tab in ${NETWORK_TABLE_LIST} do - ${DEBUG} ip route del ${bd_bridge_network}/${bd_bridge_mask} dev ${bd_bridge_device} table ${bd_tab} || true + ${DEBUG} ip route del ${bd_bridge_network}/${bd_bridge_mask} dev ${bd_bridge_device} table ${bd_tab} 2>/dev/null || true done - ${DEBUG} ip rule del from ${bd_peer_address} table ${bd_table} + ${DEBUG} ip rule del from ${bd_peer_address} table ${bd_table} 2>/dev/null - ${LOG} "Remove bridge [${bd_bridge_device}]..." + log_print "Network" "Remove bridge [${bd_bridge_device}]..." ${DEBUG} ip link show ${bd_bridge_device} &>/dev/null && ${DEBUG} ip link del ${bd_bridge_device} } @@ -951,7 +939,7 @@ function bridge_down network_bridge_init() { - ${LOG} "Add all Bridges" + log_print "Network" "Add all Bridges" for src_id in ${NETWORK_SRC_ID_LIST} do @@ -980,7 +968,7 @@ network_bridge_init() network_bridge_deinit() { - ${LOG} "Remove all Bridge" + log_print "Network" "Remove all Bridge" for src_id in ${NETWORK_SRC_ID_LIST} do @@ -1046,12 +1034,12 @@ network_forward_remove() network_forward_start() { - ${LOG} "Create VPN forward chain" + log_print "Network" "Create VPN forward chain" ${DEBUG} iptables -t nat -N PREROUTING-VPN - ${LOG} "Add jump rule for VPN" + log_print "Network" "Add jump rule for VPN" for dst_id in ${NETWORK_DST_ID_LIST} do @@ -1064,7 +1052,7 @@ network_forward_start() done - ${LOG} "Add VPN client addresse rules" + log_print "Network" "Add VPN client addresse rules" for src_id in ${NETWORK_SRC_ID_LIST} do @@ -1089,7 +1077,7 @@ network_forward_start() network_forward_stop() { - ${LOG} "Remove VPN client addresse rules" + log_print "Network" "Remove VPN client addresse rules" for src_id in ${NETWORK_SRC_ID_LIST} do @@ -1104,7 +1092,7 @@ network_forward_stop() done - ${LOG} "Remove Jump rule for VPN" + log_print "Network" "Remove Jump rule for VPN" for dst_id in ${NETWORK_DST_ID_LIST} do @@ -1112,14 +1100,14 @@ network_forward_stop() if [[ "${dst_type}" != "0" ]] then - ${DEBUG} iptables -t nat -D PREROUTING -i ${dst_device} -j PREROUTING-VPN + ${DEBUG} iptables -t nat -D PREROUTING -i ${dst_device} -j PREROUTING-VPN 2>/dev/null fi done - ${LOG} "Delete VPN forward chain" + log_print "Network" "Delete VPN forward chain" - ${DEBUG} iptables -t nat -X PREROUTING-VPN + ${DEBUG} iptables -t nat -X PREROUTING-VPN 2>/dev/null } @@ -1132,9 +1120,39 @@ network_forward_stop() network_init() { + file_dir_init ${NETWORK_CONFIG_LOCK} root apache + file_lock ${NETWORK_CONFIG_LOCK} READ 9 + + [ -e "${NETWORK_CONFIG_FILE}" ] && . "${NETWORK_CONFIG_FILE}" + + file_unlock 9 + + + # By default Loggin is enabled + # export LOG="" to disable it + + if [ -v LOG ] && [[ "${LOG}" == "" ]] + then + export NETWORK_LOG_FILE="" + export NETWORK_LOG_LOCK="" + fi + + + # By default Echoing is disabled + # export LOG="echo" to enable it + + if [ ! -v ECHO ] || [[ "${ECHO}" == "" ]] + then + export ECHO=":" + fi + + log_set "${NETWORK_LOG_FILE}" "${NETWORK_LOG_LOCK}" "${ECHO}" + + dns_init - file_dir_init ${NETWORK_CONFIG_LOCK} root apache + file_dir_init ${NETWORK_LOG_FILE} root apache + file_dir_init ${NETWORK_LOG_LOCK} root apache network_tab_load } @@ -1179,11 +1197,14 @@ network_start() network_stop() { + network_forward_stop network_bridge_deinit network_table_deinit + + return 0 } diff --git a/usr/local/lib/vpn.bash b/usr/local/lib/vpn.bash index 82c04a0..f8a7587 100644 --- a/usr/local/lib/vpn.bash +++ b/usr/local/lib/vpn.bash @@ -25,19 +25,18 @@ declare -Ag VPN_JOB_TAB declare -Ag VPN_JOB_ID_LIST declare -Ag VPN_JOB_NAME_IDX -declare -g VPN_LOG_FILE="/var/log/network/rx3-vpn.log" -declare -g VPN_PID_FILE="/var/lib/network/rx3-vpn.pid" -declare -g VPN_STATUS_FILE="/var/lib/network/rx3-vpn.status" -declare -g VPN_STATUS_LOCK="/var/lock/network/rx3-vpn.status" +declare -g VPN_PID_FILE +declare -g VPN_STATUS_FILE +declare -g VPN_STATUS_LOCK -if [ ! -v LOG ] || [[ "${LOG}" == "" ]] -then - export LOG=":" -fi +#if [ ! -v LOG ] || [[ "${LOG}" == "" ]] +#then +# export LOG=":" +#fi @@ -55,7 +54,7 @@ vpn_config_make() local mng_port=$(( 2330 + ${Device/tun/})) - ${LOG} "Creating config File: [${Config_File}] Device: [${Device}] Mng_Port: (${mng_port}) Target_Config: [${Target_Config}]" + log_print "VPN" "Creating config File: [${Config_File}] Device: [${Device}] Mng_Port: (${mng_port}) Target_Config: [${Target_Config}]" ${DEBUG} cp -f ${VPN_TEMPLATE_FILE} ${Config_File} ${DEBUG} sed -e "s/TARGET-CFG/${Target_Config}-client.conf/" -e "s/VPN-DEVICE/${Device}/" -e "s/MNG-PORT/${mng_port}/" -i ${Config_File} @@ -77,7 +76,7 @@ vpn_job_tab_load() local job_cmd - ${LOG} 1>&2 "Loading Job tab..." + log_print "VPN" "Loading Job tab..." while IFS= read -r line do @@ -198,7 +197,7 @@ vpn_job_tab_init() vpn_config_make "${config_file}" "${dst_device}" "${dst_config}" - log_print "${VPN_LOG_FILE}" "${LOG}" "Loading config: Id: [${job_id}] Name: [${dst_name}] Cmd: [${VPN_JOB_TAB["${job_id},Cmd"]}]" + log_print "VPN" "Loading config: Id: [${job_id}] Name: [${dst_name}] Cmd: [${VPN_JOB_TAB["${job_id},Cmd"]}]" job_id=$(( ${job_id} + 1)) fi @@ -224,13 +223,13 @@ vpn_job_tab_deinit() if [[ "${job_PId}" -gt 0 ]] then - log_print "${VPN_LOG_FILE}" "${LOG}" "Killing : Id: [${job_id}] Name: [${job_name}] PId: [${job_pid}]..." + log_print "VPN" "Killing : Id: [${job_id}] Name: [${job_name}] PId: [${job_pid}]..." kill -15 ${job_pid} fi done - ${LOG} "Flushing status file..." + log_print "VPN" "Flushing status file..." file_lock ${VPN_STATUS_LOCK} WRITE 9 @@ -285,7 +284,7 @@ vpn_supervisor() local job_pid - log_print "${VPN_LOG_FILE}" "${LOG}" "Starting Supervisor..." + log_print "VPN" "Starting Supervisor..." # Main Loop @@ -301,7 +300,7 @@ vpn_supervisor() if [[ ${job_pid} == 0 ]] || [[ $rc != 0 ]] then - log_print "${VPN_LOG_FILE}" "${LOG}" "Restarting Cmd: [${job_cmd}]..." + log_print "VPN" "Restarting Cmd: [${job_cmd}]..." eval ${DEBUG} ${job_cmd} @@ -315,16 +314,16 @@ vpn_supervisor() tab_assign VPN_JOB_TAB "${job_id},PId" "${job_pid}" tab_assign VPN_JOB_TAB "${job_id},Date" "$(date --rfc-3339=seconds -u)" - log_print "${VPN_LOG_FILE}" "${LOG}" "PId: [${VPN_JOB_TAB["${job_id},PId"]}]!" + log_print "VPN" "PId: [${VPN_JOB_TAB["${job_id},PId"]}]!" fi done - log_print "${VPN_LOG_FILE}" "${LOG}" "Saving VPN tab..." + log_print "VPN" "Saving VPN tab..." vpn_job_tab_save - sleep 30 + sleep ${VPN_LOOP_DELAY} - log_print "${VPN_LOG_FILE}" "${LOG}" "Refreshing DNS entries..." + log_print "VPN" "Refreshing DNS entries..." network_dst_address_refresh_all done } @@ -333,6 +332,38 @@ vpn_supervisor() +#-------------------------------------------------------------------------------------------------------------------------- +# vpn_kill_jobs +#-------------------------------------------------------------------------------------------------------------------------- + +vpn_jobs_kill() +{ + local job_id + + + for job_id in ${VPN_JOB_ID_LIST} + do + vpn_job_tab_get "${job_id}" + + ${DEBUG} kill -0 "${job_pid}" 2>/dev/null + rc=$? + + if [[ ${job_pid} != 0 ]] && [[ $rc == 0 ]] + then + log_print "VPN" "Killing Job Id: [${job_id}] Job_PId: [${job_pid}] Cmd: [${job_cmd}]..." + + kill -15 "${job_pid}" + fi + done + + log_print "VPN" "Saving VPN tab..." + vpn_job_tab_save +} + + + + + #-------------------------------------------------------------------------------------------------------------------------- # vpn_init #-------------------------------------------------------------------------------------------------------------------------- @@ -347,7 +378,7 @@ vpn_init() file_dir_init ${VPN_STATUS_FILE} root apache file_unlock 9 - file_dir_init ${VPN_LOG_FILE} root apache + # file_dir_init ${VPN_LOG_FILE} root apache if [[ -s "${VPN_STATUS_FILE}" ]] then @@ -404,11 +435,11 @@ vpn_start() vpn_supervisor & daemon_pid=$! - log_print "${VPN_LOG_FILE}" "${LOG}" "Daemon started, PId: [${daemon_pid}]" + log_print "VPN" "Daemon started, PId: [${daemon_pid}]" echo >${VPN_PID_FILE} "${daemon_pid}" else - log_print "${VPN_LOG_FILE}" "${LOG}" "Daemon already running PId: [${daemon_pid}]" + log_print "VPN" "Daemon already running PId: [${daemon_pid}]" fi } @@ -437,14 +468,16 @@ vpn_stop() if [[ "${daemon_pid}" == "0" ]] || [[ $rc != 0 ]] then - log_print "${VPN_LOG_FILE}" "${LOG}" "Daemon already stoped!" + log_print "VPN" "Daemon already stoped!" else - log_print "${VPN_LOG_FILE}" "${LOG}" "Stoping daemon, PId: [${daemon_pid}]..." + log_print "VPN" "Stoping daemon, PId: [${daemon_pid}]..." kill -15 ${daemon_pid} fi >${VPN_PID_FILE} + + vpn_jobs_kill vpn_job_tab_deinit } diff --git a/var/www/cgi-bin/vpn-admin_board.cgi b/var/www/cgi-bin/vpn-admin_board.cgi index 1e9bcd1..3c24399 100755 --- a/var/www/cgi-bin/vpn-admin_board.cgi +++ b/var/www/cgi-bin/vpn-admin_board.cgi @@ -2,6 +2,10 @@ time_in=$(date +%s%N) + +# No Log please +export LOG="" + . /usr/local/lib/network.bash