Author: fmueller
Date: Wed Jul 21 02:08:20 2010
New Revision: 8978
URL: http://svn.slimdevices.com/jive?rev=8978&view=rev
Log:
Bug: n/a
Description:
- Add network health check function (checks link, ip, gateway, dns, dns
resolution and ping)
- Improve network repair function to provide feedback of the next step
Modified:
7.6/trunk/squeezeplay/src/squeezeplay_squeezeos/share/jive/net/Networking.lua
Modified:
7.6/trunk/squeezeplay/src/squeezeplay_squeezeos/share/jive/net/Networking.lua
URL:
http://svn.slimdevices.com/jive/7.6/trunk/squeezeplay/src/squeezeplay_squeezeos/share/jive/net/Networking.lua?rev=8978&r1=8977&r2=8978&view=diff
==============================================================================
---
7.6/trunk/squeezeplay/src/squeezeplay_squeezeos/share/jive/net/Networking.lua
(original)
+++
7.6/trunk/squeezeplay/src/squeezeplay_squeezeos/share/jive/net/Networking.lua
Wed Jul 21 02:08:20 2010
@@ -73,6 +73,11 @@
local Process = require("jive.net.Process")
local Task = require("jive.ui.Task")
local network = require("jiveWireless")
+
+-- Needed for network health check function
+local DNS = require("jive.net.DNS")
+local jnt = jnt
+
module("jive.net.Networking")
oo.class(_M, Socket)
@@ -1936,6 +1941,151 @@
--[[
+=head2 jive.net.Networking:checkNetworkHealth()
+
+The following checks are done (wired or wireless):
+- Check for a valid network object
+- Check link
+- Check for valid ip address
+- Check for gateway ip address
+- Check for DNS ip address
+- Resolve IP for server_name (normally SN)
+- Ping server_name (normally SN)
+
+While the checks are running status messages are returned
+via callback function. The callback provides three params:
+- continue: true or false
+- err: -1 or 0
+- message: message according to what is happening or failed
+
+self - network object
+callback - callback function
+full_check - includes DNS resolution and ping
+server_name - server to ping
+
+=cut
+--]]
+
+function checkNetworkHealth(self, callback, full_check, server_name)
+ assert(type(callback) == 'function', "No callback function provided")
+
+ Task("checknetworkhealth", self, function()
+ log:info("checkNetworkHealth task started")
+
+ callback(true, -1, "NOT_CONNECTED")
+
+ -- Check for valid network interface
+ if self == nil then
+ callback(false, -1, "NET_ERROR_NO_NETWORK_INTERFACE")
+ return
+ end
+
+ -- Getting network status (link / no link)
+ callback(true, 0, "NET_INFO_GETTING_NETWORK_STATUS")
+
+ local status = self:t_wpaStatus()
+
+ if self:isWireless() then
+ if status.wpa_state ~= "COMPLETED" then
+ callback(false, -1,
"NET_ERROR_WIRELESS_NO_LINK")
+ return
+ end
+ callback(true, 0, "NET_INFO_WIRELESS_LINK_OK")
+ else
+ if status.link ~= true then
+ callback(false, -1,
"NET_ERROR_ETHERNET_NO_LINK")
+ return
+ end
+ callback(true, 0, "NET_INFO_ETHERNET_LINK_OK")
+ end
+
+ -- We have a network link (wired or wireless)
+
+ -- Check for valid ip address
+ if status.ip_address == nil or string.match(status.ip_address,
"^169.254.") then
+ callback(false, -1, "NET_ERROR_NO_VALID_IP_ADDRESS")
+ return
+ end
+
+ -- We have a valid ip address
+ callback(true, 0, "NET_INFO_IP_ADDRESS",
tostring(status.ip_address))
+
+ -- Check for valid gateway
+ if status.ip_gateway == nil then
+ callback(false, -1, "NET_ERROR_NO_VALID_GATEWAY")
+ return
+ end
+
+ -- We have a valid gateway
+ callback(true, 0, "NET_INFO_GATEWAY",
tostring(status.ip_gateway))
+
+ -- Check for valid dns
+ if status.ip_dns == nil then
+ callback(false, -1, "NET_ERROR_NO_VALID_DNS")
+ return
+ end
+
+ -- We have a valid dns
+ callback(true, 0, "NET_INFO_DNS", tostring(status.ip_dns))
+
+ -- Stop here if not full check is needed
+ if not full_check then
+ callback(false, 0, "NET_INFO_DNS",
tostring(status.ip_dns))
+
+ log:info("checkNetworkHealth task done (part)")
+ return
+ end
+
+ -- Get ip of SN
+ local server_ip, err
+ if DNS:isip(server_name) then
+ server_ip = server_name
+ else
+ callback(true, 0, "NET_INFO_RESOLVING_IP_ADDRESS_FOR",
server_name)
+ server_ip, err = DNS:toip(server_name)
+ end
+
+ -- Check for valid SN ip address
+ if server_ip == nil then
+ callback(false, -1,
"NET_ERROR_DNS_RESOLUTON_FAILED_FOR", server_name)
+ return
+ end
+
+ -- We have a valid ip address for SN
+ callback(true, 0, tostring(server_name .. ": " .. server_ip))
+
+ -- Ping target
+ callback(true, 0, "NET_INFO_PINGING", server_name)
+
+ -- Ping
+ local pingOK = false
+ pingProc = Process(jnt, "ping -c 1 " .. server_ip)
+ pingProc:read(function(chunk)
+ if chunk then
+ if string.match(chunk, "bytes from") then
+ pingOK = true
+ end
+ else
+ if pingOK then
+ callback(false, 0, "NET_INFO_PING_OK",
server_name)
+ else
+ callback(false, -1,
"NET_ERROR_PING_NOT_OK", server_name)
+ end
+ end
+ end)
+
+ -- Wait until ping has finished - takes a while especially if
it fails
+ while pingProc:status() ~= "dead" do
+ Task:yield()
+ end
+
+ log:info("checkNetworkHealth task done (full)")
+ end):addTask()
+end
+
+
+--[[
+
=head2 jive.net.Networking:repairNetwork()
Attempt to repair network connction doing the following:
@@ -1944,19 +2094,37 @@
- Bring up the active network - this also starts DHCP
- Conncet to wireless network / wired network
-=cut
---]]
-
-function repairNetwork(self)
+While it's running status messages are returned
+via callback function. The callback provides three params:
+- continue: true or false
+- err: -1 or 0
+- message: message according to what is happening or failed
+
+self - network object
+callback - callback function
+
+=cut
+--]]
+
+function repairNetwork(self, callback)
+ assert(type(callback) == 'function', "No callback function provided")
+
Task("repairnetwork", self, function()
- log:info("Repair network - start")
+ log:info("repairNetwork task started")
local active = self:_ifstate()
+ callback(true, 0, "NET_INFO_BRINGING_NETWORK_DOWN")
+
self:_ifDown()
+
+ callback(true, 0, "NET_INFO_BRINGING_NETWORK_UP")
+
self:_ifUp(active)
- log:info("Repair network - done")
+ callback(false, 0, "NET_INFO_REPAIR_NETWORK_DONE")
+
+ log:info("repairNetwork task done")
end):addTask()
end
_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/mailman/listinfo/jive-checkins