diff --git a/package/lienol/luci-app-passwall/Makefile b/package/lienol/luci-app-passwall/Makefile index b06f887a93..186356fd89 100644 --- a/package/lienol/luci-app-passwall/Makefile +++ b/package/lienol/luci-app-passwall/Makefile @@ -7,8 +7,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall PKG_VERSION:=3.6 -PKG_RELEASE:=9 -PKG_DATE:=20200302 +PKG_RELEASE:=10 +PKG_DATE:=20200303 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) diff --git a/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua b/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua index 69cee959cc..b6421638ae 100644 --- a/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua +++ b/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua @@ -23,8 +23,8 @@ function index() _("Basic Settings"), 1).dependent = true entry({"admin", "vpn", "passwall", "node_list"}, cbi("passwall/node_list"), _("Node List"), 2).dependent = true - -- entry({"admin", "vpn", "passwall", "auto_switch"}, - -- cbi("passwall/auto_switch"), _("Auto Switch"), 3).leaf = true + entry({"admin", "vpn", "passwall", "auto_switch"}, + cbi("passwall/auto_switch"), _("Auto Switch"), 3).leaf = true entry({"admin", "vpn", "passwall", "other"}, cbi("passwall/other", {autoapply = true}), _("Other Settings"), 94).leaf = true @@ -36,9 +36,6 @@ function index() _("Rule Update"), 96).leaf = true entry({"admin", "vpn", "passwall", "acl"}, cbi("passwall/acl"), _("Access control"), 97).leaf = true - entry({"admin", "vpn", "passwall", "rule_list"}, - cbi("passwall/rule_list", {autoapply = true}), - _("Set Blacklist And Whitelist"), 98).leaf = true entry({"admin", "vpn", "passwall", "log"}, form("passwall/log"), _("Watch Logs"), 99).leaf = true entry({"admin", "vpn", "passwall", "node_config"}, diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/acl.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/acl.lua index 5a8342814a..c283acc5b3 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/acl.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/acl.lua @@ -1,26 +1,77 @@ local sys = require "luci.sys" local webadmin = require "luci.tools.webadmin" local uci = require"luci.model.uci".cursor() +local fs = require "nixio.fs" local api = require "luci.model.cbi.passwall.api.api" local appname = "passwall" -local n = {} -uci:foreach(appname, "nodes", function(e) - if e.type and e.address and e.remarks then - if e.use_kcp and e.use_kcp == "1" then - n[e[".name"]] = "%s+%s:[%s]" % {e.type, "Kcptun", e.remarks} - else - n[e[".name"]] = "%s:[%s]" % {e.type, e.remarks} - end - end -end) - -local key_table = {} -for key, _ in pairs(n) do table.insert(key_table, key) end -table.sort(key_table) - m = Map("passwall") +-- [[ Rule List Settings ]]-- +s = m:section(TypedSection, "global_rules") +s.anonymous = true + +---- Whitelist Hosts +s:tab("w_hosts", translate("Whitelist Hosts"), "" .. + translate("Join the white list of domain names will not go agent.") .. + "") +local w_host_file = "/usr/share/passwall/rules/whitelist_host" +o = s:taboption("w_hosts", TextValue, "whitelist_host") +o.rows = 8 +o.wrap = "off" +o.cfgvalue = function(self, section) return fs.readfile(w_host_file) or "" end +o.write = function(self, section, value) + fs.writefile(w_host_file, value:gsub("\r\n", "\n"):gsub("http://", ""):gsub( + "https://", "")) +end +o.remove = function(self, section, value) fs.writefile(w_host_file, "") end + +---- Whitelist IP +s:tab("w_ip", translate("Whitelist IP"), "" .. translate( + "These had been joined ip addresses will not use proxy.Please input the ip address or ip address segment,every line can input only one ip address.For example,192.168.0.0/24 or 223.5.5.5.") .. + "") +local w_ip_file = "/usr/share/passwall/rules/whitelist_ip" +o = s:taboption("w_ip", TextValue, "whitelist_ip") +o.rows = 8 +o.wrap = "off" +o.cfgvalue = function(self, section) return fs.readfile(w_ip_file) or "" end +o.write = function(self, section, value) + fs.writefile(w_ip_file, value:gsub("\r\n", "\n"):gsub("http://", ""):gsub( + "https://", "")) +end +o.remove = function(self, section, value) fs.writefile(w_ip_file, "") end + +---- Blacklist Hosts +s:tab("b_hosts", translate("Blacklist Hosts"), + "" .. translate( + "These had been joined websites will use proxy.Please input the domain names of websites,every line can input only one website domain.For example,google.com.") .. + "") +local b_host_file = "/usr/share/passwall/rules/blacklist_host" +o = s:taboption("b_hosts", TextValue, "blacklist_host") +o.rows = 8 +o.wrap = "off" +o.cfgvalue = function(self, section) return fs.readfile(b_host_file) or "" end +o.write = function(self, section, value) + fs.writefile(b_host_file, value:gsub("\r\n", "\n"):gsub("http://", ""):gsub( + "https://", "")) +end +o.remove = function(self, section, value) fs.writefile(b_host_file, "") end + +---- Blacklist IP +s:tab("b_ip", translate("Blacklist IP"), "" .. translate( + "These had been joined ip addresses will use proxy.Please input the ip address or ip address segment,every line can input only one ip address.For example,35.24.0.0/24 or 8.8.4.4.") .. + "") +local b_ip_file = "/usr/share/passwall/rules/blacklist_ip" +o = s:taboption("b_ip", TextValue, "blacklist_ip") +o.rows = 8 +o.wrap = "off" +o.cfgvalue = function(self, section) return fs.readfile(b_ip_file) or "" end +o.write = function(self, section, value) + fs.writefile(b_ip_file, value:gsub("\r\n", "\n"):gsub("http://", ""):gsub( + "https://", "")) +end +o.remove = function(self, section, value) fs.writefile(b_ip_file, "") end + -- [[ ACLs Settings ]]-- s = m:section(TypedSection, "acl_rule", translate("ACLs"), "" .. translate( "ACLs is a tools which used to designate specific IP proxy mode, IP or MAC address can be entered.") .. "") diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/auto_switch.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/auto_switch.lua index 05be47e3c4..1d33b08c28 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/auto_switch.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/auto_switch.lua @@ -5,8 +5,9 @@ local appname = "passwall" local n = {} uci:foreach(appname, "nodes", function(e) if e.type and e.remarks and e.address and e.port then - n[e[".name"]] = "%s:[%s] %s:%s" % - {e.type, e.remarks, e.address, e.port} + if (e.type == "V2ray_balancing" or e.type == "V2ray_shunt") or (e.address:match("[\u4e00-\u9fa5]") and e.address:find("%.") and e.address:sub(#e.address) ~= ".") then + n[e[".name"]] = "%s:[%s] %s:%s" % {e.type, e.remarks, e.address, e.port} + end end end) diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/balancing.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/balancing.lua index b142782562..2921cd133b 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/balancing.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/balancing.lua @@ -6,9 +6,11 @@ local appname = "passwall" local n = {} uci:foreach(appname, "nodes", function(e) - if e.remarks and e.address and e.port and e.address ~= "127.0.0.1" then - e.remark = "[%s] %s:%s" % {e.remarks, e.address, e.port} - n[e[".name"]] = e + if e.type and e.remarks and e.port and e.address and e.address ~= "127.0.0.1" then + if e.address:match("[\u4e00-\u9fa5]") and e.address:find("%.") and e.address:sub(#e.address) ~= "." then + e.remark = "%s:[%s] %s:%s" % {translate(e.type), e.remarks, e.address, e.port} + n[e[".name"]] = e + end end end) diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua index 9881b07059..262c7333fe 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua @@ -17,15 +17,20 @@ end local n = {} uci:foreach(appname, "nodes", function(e) local type = e.type + if type == nil then type = "" end local address = e.address if address == nil then address = "" end - if type and address and e.remarks then - if e.use_kcp and e.use_kcp == "1" then - n[e[".name"]] = "%s+%s:[%s] %s" % - {translate(type), "Kcptun", e.remarks, address} - else - n[e[".name"]] = "%s:[%s] %s" % - {translate(type), e.remarks, address} + if (type == "V2ray_balancing" or type == "V2ray_shunt") or (address:match("[\u4e00-\u9fa5]") and address:find("%.") and address:sub(#address) ~= ".") then + if type and address and e.remarks then + if e.use_kcp and e.use_kcp == "1" then + n[e[".name"]] = "%s+%s:[%s] %s" % + { + translate(type), "Kcptun", e.remarks, address + } + else + n[e[".name"]] = "%s:[%s] %s" % + {translate(type), e.remarks, address} + end end end end) diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_config.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_config.lua index 56dc563ef4..9346ae1dea 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_config.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_config.lua @@ -97,7 +97,9 @@ brook_tls:depends("brook_protocol", "wsclient") local n = {} uci:foreach(appname, "nodes", function(e) if e.type and e.type == "V2ray" and e.remarks and e.port then - n[e[".name"]] = "[%s] %s:%s" % {e.remarks, e.address, e.port} + if e.address:match("[\u4e00-\u9fa5]") and e.address:find("%.") and e.address:sub(#e.address) ~= "." then + n[e[".name"]] = "[%s] %s:%s" % {e.remarks, e.address, e.port} + end end end) diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/rule_list.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/rule_list.lua deleted file mode 100644 index fa9c620c1b..0000000000 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/rule_list.lua +++ /dev/null @@ -1,69 +0,0 @@ -local fs = require "nixio.fs" - -m = Map("passwall") --- [[ Rule List Settings ]]-- -s = m:section(TypedSection, "global_rules") -s.anonymous = true - ----- Whitelist Hosts -s:tab("w_hosts", translate("Whitelist Hosts"), "" .. - translate("Join the white list of domain names will not go agent.") .. - "") -local w_host_file = "/usr/share/passwall/rules/whitelist_host" -o = s:taboption("w_hosts", TextValue, "whitelist_host") -o.rows = 20 -o.wrap = "off" -o.cfgvalue = function(self, section) return fs.readfile(w_host_file) or "" end -o.write = function(self, section, value) - fs.writefile(w_host_file, value:gsub("\r\n", "\n"):gsub("http://", ""):gsub( - "https://", "")) -end -o.remove = function(self, section, value) fs.writefile(w_host_file, "") end - ----- Whitelist IP -s:tab("w_ip", translate("Whitelist IP"), "" .. translate( - "These had been joined ip addresses will not use proxy.Please input the ip address or ip address segment,every line can input only one ip address.For example,192.168.0.0/24 or 223.5.5.5.") .. - "") -local w_ip_file = "/usr/share/passwall/rules/whitelist_ip" -o = s:taboption("w_ip", TextValue, "whitelist_ip") -o.rows = 20 -o.wrap = "off" -o.cfgvalue = function(self, section) return fs.readfile(w_ip_file) or "" end -o.write = function(self, section, value) - fs.writefile(w_ip_file, value:gsub("\r\n", "\n"):gsub("http://", ""):gsub( - "https://", "")) -end -o.remove = function(self, section, value) fs.writefile(w_ip_file, "") end - ----- Blacklist Hosts -s:tab("b_hosts", translate("Blacklist Hosts"), - "" .. translate( - "These had been joined websites will use proxy.Please input the domain names of websites,every line can input only one website domain.For example,google.com.") .. - "") -local b_host_file = "/usr/share/passwall/rules/blacklist_host" -o = s:taboption("b_hosts", TextValue, "blacklist_host") -o.rows = 20 -o.wrap = "off" -o.cfgvalue = function(self, section) return fs.readfile(b_host_file) or "" end -o.write = function(self, section, value) - fs.writefile(b_host_file, value:gsub("\r\n", "\n"):gsub("http://", ""):gsub( - "https://", "")) -end -o.remove = function(self, section, value) fs.writefile(b_host_file, "") end - ----- Blacklist IP -s:tab("b_ip", translate("Blacklist IP"), "" .. translate( - "These had been joined ip addresses will use proxy.Please input the ip address or ip address segment,every line can input only one ip address.For example,35.24.0.0/24 or 8.8.4.4.") .. - "") -local b_ip_file = "/usr/share/passwall/rules/blacklist_ip" -o = s:taboption("b_ip", TextValue, "blacklist_ip") -o.rows = 20 -o.wrap = "off" -o.cfgvalue = function(self, section) return fs.readfile(b_ip_file) or "" end -o.write = function(self, section, value) - fs.writefile(b_ip_file, value:gsub("\r\n", "\n"):gsub("http://", ""):gsub( - "https://", "")) -end -o.remove = function(self, section, value) fs.writefile(b_ip_file, "") end - -return m diff --git a/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh b/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh index 90c5bb8d96..9f55d1a83c 100755 --- a/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh +++ b/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh @@ -517,9 +517,6 @@ start_crontab() { autoupdate=$(config_t_get global_rules auto_update) weekupdate=$(config_t_get global_rules week_update) dayupdate=$(config_t_get global_rules time_update) - autoupdatesubscribe=$(config_t_get global_subscribe auto_update_subscribe) - weekupdatesubscribe=$(config_t_get global_subscribe week_update_subscribe) - dayupdatesubscribe=$(config_t_get global_subscribe time_update_subscribe) #if [ "$autoupdate" = "1" ]; then # local t="0 $dayupdate * * $weekupdate" # [ "$weekupdate" = "7" ] && t="0 $dayupdate * * *" @@ -527,8 +524,11 @@ start_crontab() { # echolog "配置定时任务:自动更新规则。" #fi + autoupdatesubscribe=$(config_t_get global_subscribe auto_update_subscribe) + weekupdatesubscribe=$(config_t_get global_subscribe week_update_subscribe) + dayupdatesubscribe=$(config_t_get global_subscribe time_update_subscribe) if [ "$autoupdatesubscribe" = "1" ]; then - local t="0 $dayupdatesubscribe * * $weekupdate" + local t="0 $dayupdatesubscribe * * $weekupdatesubscribe" [ "$weekupdatesubscribe" = "7" ] && t="0 $dayupdatesubscribe * * *" echo "$t lua $APP_PATH/subscribe.lua start log > /dev/null 2>&1 &" >>/etc/crontabs/root echolog "配置定时任务:自动更新节点订阅。" diff --git a/package/lienol/luci-app-passwall/root/usr/share/passwall/iptables.sh b/package/lienol/luci-app-passwall/root/usr/share/passwall/iptables.sh index be61590129..88c540edf2 100755 --- a/package/lienol/luci-app-passwall/root/usr/share/passwall/iptables.sh +++ b/package/lienol/luci-app-passwall/root/usr/share/passwall/iptables.sh @@ -155,7 +155,7 @@ load_acl() { fi } [ "$UDP_NODE" != "nil" ] && { - [ "$UDP_NO_REDIR_PORTS" != "disable" ] && $ipt_m -A PSW_ACL $(factor $ip "-s") $(factor $mac "-m mac --mac-source") -p udp -m multiport --dport $udp_no_redir_ports -j RETURN + [ "$udp_no_redir_ports" != "disable" ] && $ipt_m -A PSW_ACL $(factor $ip "-s") $(factor $mac "-m mac --mac-source") -p udp -m multiport --dport $udp_no_redir_ports -j RETURN eval udp_redir_port=\$UDP_REDIR_PORT$udp_node $ipt_m -A PSW_ACL $(factor $ip "-s") $(factor $mac "-m mac --mac-source") -p udp $(factor $udp_redir_ports "-m multiport --dport") $(comment "$remarks") -$(get_jump_mode $proxy_mode) $(get_action_chain $proxy_mode)$udp_node $ipt_m -A PSW_ACL $(factor $ip "-s") $(factor $mac "-m mac --mac-source") -p udp $(comment "$remarks") -j RETURN diff --git a/package/lienol/luci-app-passwall/root/usr/share/passwall/test.sh b/package/lienol/luci-app-passwall/root/usr/share/passwall/test.sh index b5742acc2b..7fcaa14312 100755 --- a/package/lienol/luci-app-passwall/root/usr/share/passwall/test.sh +++ b/package/lienol/luci-app-passwall/root/usr/share/passwall/test.sh @@ -9,22 +9,32 @@ echolog() { echo -e "$d: $1" >> $LOG_FILE } +config_t_get() { + local index=0 + [ -n "$4" ] && index=$4 + local ret=$(uci -q get $CONFIG.@$1[$index].$2 2>/dev/null) + echo ${ret:=$3} +} + test_url() { - status=$(/usr/bin/curl -I -o /dev/null -s --connect-timeout 2 --retry 1 -w %{http_code} "$1" | grep 200) - [ "$?" != 0 ] && { - status=$(/usr/bin/wget --no-check-certificate --spider --timeout=2 --tries 1 "$1") - [ "$?" == 0 ] && status=200 - } + local url=$1 + local try=1 + [ -n "$2" ] && try=$2 + local timeout=2 + [ -n "$3" ] && timeout=$3 + status=$(/usr/bin/wget --no-check-certificate --spider --timeout=$timeout --tries $try "$url") + [ "$?" == 0 ] && status=200 echo $status } test_proxy() { + local try=5 result=0 - status=$(test_url "https://www.google.com") + status=$(test_url "https://www.google.com" $try) if [ "$status" = "200" ]; then result=0 else - status2=$(test_url "https://www.baidu.com") + status2=$(test_url "https://www.baidu.com" $try) if [ "$status2" = "200" ]; then result=1 else @@ -35,85 +45,48 @@ test_proxy() { } test_auto_switch() { - if [ -f "/var/etc/$CONFIG/tcp_server_id" ]; then - TCP_NODES1=$(cat /var/etc/$CONFIG/tcp_server_id) + local type=$1 + local index=$2 + local b_tcp_nodes=$3 + local now_node + if [ -f "/var/etc/$CONFIG/id/${type}_${index}" ]; then + now_node=$(cat /var/etc/$CONFIG/id/${type}_${index}) else - rm -f $LOCK_FILE - exit 1 + return 1 fi - failcount=1 - while [ "$failcount" -le 5 ]; do - status=$(test_proxy) - if [ "$status" == 2 ]; then - echolog "自动切换检测:无法连接到网络,请检查网络是否正常!" - break - elif [ "$status" == 1 ]; then - echolog "自动切换检测:第$failcount次检测异常" - let "failcount++" - [ "$failcount" -ge 5 ] && { - echolog "自动切换检测:检测异常,切换节点" - TCP_NODES=$(uci -q get $CONFIG.@auto_switch[0].tcp_node) - has_backup_server=$(echo $TCP_NODES | grep $TCP_NODES1) - setserver= - if [ -z "$has_backup_server" ]; then - setserver=$(echo $TCP_NODES | awk -F ' ' '{print $1}') - else - setserver=$TCP_NODES1 - flag=0 - for server in $has_backup_server; do - if [ "$flag" == 0 ]; then - if [ "$TCP_NODES1" == "$server" ]; then - flag=1 - continue - fi - fi - if [ "$flag" == 1 ]; then - flag=2 - continue - fi - if [ "$flag" == 2 ]; then - setserver=$server - break - fi - done - fi - rm -f $LOCK_FILE - uci set $CONFIG.@global[0].tcp_node=$setserver - uci commit $CONFIG - /etc/init.d/$CONFIG restart - exit 1 - } - sleep 5s - elif [ "$status" == 0 ]; then - echolog "自动切换检测:检测正常" - break + status=$(test_proxy) + if [ "$status" == 2 ]; then + echolog "自动切换检测:无法连接到网络,请检查网络是否正常!" + return 1 + elif [ "$status" == 1 ]; then + echolog "自动切换检测:${type}_${index}节点异常,开始切换节点!" + new_node= + in_backup_nodes=$(echo $b_tcp_nodes | grep $now_node) + # 判断当前节点是否存在于备用节点列表里 + if [ -z "$in_backup_nodes" ]; then + # 如果不存在,设置第一次节点为新的节点 + new_node=$(echo $b_tcp_nodes | awk -F ' ' '{print $1}') + else + # 如果存在,设置下一个备用节点为新的节点 + local count=$(expr $(echo $b_tcp_nodes | grep -o ' ' | wc -l) + 1) + local next_node=$(echo $b_tcp_nodes | awk -F "$now_node" '{print $2}' | awk -F " " '{print $1}') + if [ -z "$next_node" ]; then + new_node=$(echo $b_tcp_nodes | awk -F ' ' '{print $1}') + else + new_node=$next_node + fi fi - done -} - -test_reconnection() { - failcount=1 - while [ "$failcount" -le 5 ]; do - status=$(test_proxy) - if [ "$status" == 2 ]; then - echolog "掉线重连检测:无法连接到网络,请检查网络是否正常!" - break - elif [ "$status" == 1 ]; then - echolog "掉线重连检测:第$failcount次检测异常" - let "failcount++" - [ "$failcount" -ge 5 ] && { - echolog "掉线重连检测:检测异常,重启程序" - rm -f $LOCK_FILE - /etc/init.d/$CONFIG restart - exit 1 - } - sleep 5s - elif [ "$status" == 0 ]; then - echolog "掉线重连检测:检测正常" - break - fi - done + rm -f $LOCK_FILE + uci set $CONFIG.@global[0].tcp_node${index}=$new_node + uci commit $CONFIG + /etc/init.d/$CONFIG restart > /dev/null & + echolog "自动切换检测:${type}_${index}节点切换完毕!" + return 0 + elif [ "$status" == 0 ]; then + echolog "自动切换检测:${type}_${index}节点正常。" + return 0 + fi } start() { @@ -123,13 +96,19 @@ start() { else touch $LOCK_FILE fi - - is_auto_switch=$(uci show $CONFIG.@auto_switch[0] | grep "tcp_node") - if [ -z "$is_auto_switch" ]; then - test_reconnection - else - test_auto_switch - fi + + ENABLED=$(config_t_get global enabled 0) + [ "$ENABLED" != 1 ] && return 1 + ENABLED=$(config_t_get auto_switch enable 0) + [ "$ENABLED" != 1 ] && return 1 + TCP_NODE_NUM=$(config_t_get global_other tcp_node_num 1) + for i in $(seq 1 $TCP_NODE_NUM); do + eval TCP_NODE$i=\"$(config_t_get auto_switch tcp_node$i nil)\" + eval tmp=\$TCP_NODE$i + [ -n "$tmp" ] && { + test_auto_switch TCP $i $tmp + } + done rm -f $LOCK_FILE exit