def watchdognetstatus(allnetstatus=None): import pilib import netconfig import subprocess from cupiddaemon import pgrepstatus """ And now comes the checking of configuration specific statuses and restarting them if enabled and necessary NOW Set number configuration types: eth0 is always dhcp if interface is not specified, it is assumed that the specified configuration applies to wlan0 ap : access point on wlan0. Currently, address is hard-coded as 192.168.0.1 as set in hostapd (to have dhcp all on same subnet) station : station mode on wlan0 IP address mode set in 'addtype' field. If DHCP, set as DHCP. If static, set as address field eth0wlan0bridge : wlan0 set as AP mode with bridge to eth0 wlan0wlan1bridge : wlan0 set as station mode, wlan1 as ap mode with bridge wlan1wlan0bridge wlan1 set as station mode, wlan0 as ap mode with bridge IN THE FUTURE netconfigdata will have a row for each interface that needs to be configured. Each interface can be either static, dhcp, or ap. Each interface can also bridge, but this will be limited at first, due to the number of combinations. If bridge is selected, the mode will be checked, and the appropriate IPTables will be set based on which one is AP """ if not allnetstatus: allnetstatus = updatenetstatus() netconfigdata = allnetstatus['netconfigdata'] netstatus = allnetstatus['netstatusdict'] # Refactor ifaces array. We could probably do this earlier and pass it around like this ifacedict = {} for iface in allnetstatus['ifacesdictarray']: # print(iface['name']) # print(iface) ifacedict[iface['name']] = iface # print(ifacedict) statusmsg = '' currenttime = pilib.gettimestring() runconfig = False if netconfigdata['mode'] in ['ap', 'tempap']: pilib.log(pilib.networklog, 'AP Mode is set. ', 1, pilib.networkloglevel) """ THIS NEEDS TO BE REWRITTEN ( or absorbed into eth0wlan0bridge ) """ if netconfigdata['mode'] == 'tempap': timesincelastretry = pilib.timestringtoseconds(currenttime) - pilib.timestringtoseconds(netconfigdata['laststationretry']) pilib.log(pilib.networklog, 'TempAP mode: Time since last retry: ' + str(timesincelastretry) + '. Station retry time: ' + str(netconfigdata['stationretrytime']), 1, pilib.networkloglevel) if timesincelastretry > netconfigdata['stationretrytime']: # We go back to station mode statusmsg += 'Time to go back to station mode. ' pilib.log(pilib.networklog, 'Time to go back to station mode. ', 1, pilib.networkloglevel) pilib.setsinglevalue(pilib.systemdatadatabase, 'netconfig', 'mode', 'station') pilib.setsinglevalue(pilib.systemdatadatabase, 'netconfig', 'laststationretry', '') netconfig.runconfig() else: # If we have ap up, do nothing if netstatus['dhcpstatus']: statusmsg += 'AP checked and ok. ' pilib.log(pilib.networklog, 'AP checked and ok. ', 1, pilib.networkloglevel) pilib.setsinglevalue(pilib.systemdatadatabase, 'netstatus', 'mode', 'ap') pilib.setsinglevalue(pilib.systemdatadatabase, 'netstatus', 'SSID', 'cupidwifi') pilib.setsinglevalue(pilib.systemdatadatabase, 'netstatus', 'offlinetime', '') # If we don't have dhcp up, restart ap mode # this will currently cause reboot if we don't set onboot=True # We set status message in case we change our minds and reboot here. else: statusmsg += 'Restarting AP. ' pilib.log(pilib.networklog, 'Restarting AP mode. ', 1, pilib.networkloglevel) pilib.setsinglevalue(pilib.systemdatadatabase, 'netstatus', 'statusmsg', statusmsg) netconfig.runconfig() # Station Mode. Again, like above, this should be modular. elif netconfigdata['mode'] == 'station': pilib.log(pilib.networklog, 'Station mode is set. ', 3, pilib.networkloglevel) # Check station address (not yet implemented) and wpa status (implemented) stationinterface = 'wlan0' try: stationifacedata = ifacedict[stationinterface] except KeyError: pilib.log(pilib.networklog, 'No stationiface data(' + stationinterface + ') present for mode ' + netconfigdata['mode'], 1, pilib.networkloglevel) statusmsg += 'No stationiface data(' + stationinterface + ') present for mode ' + netconfigdata['mode'] runconfig = True else: wpadata = pilib.parseoptions(stationifacedata['wpastate']) if wpadata['wpa_state'] == 'COMPLETED' and stationifacedata['address']: pilib.log(pilib.networklog, 'station interface ' + stationinterface + ' wpastatus appears ok with address ' + str(stationifacedata['address']), 3, pilib.networkloglevel) else: pilib.log(pilib.networklog, 'station interface for ' + stationinterface + ' does not appear ok judged by wpa_state: wpastate = ' + wpadata['wpa_state'] + ' address= ' + stationifacedata['address'], 1, pilib.networkloglevel) statusmsg += 'station interface does not appear ok judged by wpa_state. ' runconfig = True # Should do special handling in here to verify address for static mode. # # If we have wpa up, do nothing # if int(netstatus['connected']): # statusmsg += 'Station wpamode appears ok. ' # pilib.log(pilib.networklog, 'wpamode appears ok. ', 1, pilib.networkloglevel) # # # If wpa is not connected # else: # statusmsg += 'Station wpamode appears disconnected. ' # pilib.log(pilib.networklog, 'wpamode appears disconnected. ', 1, pilib.networkloglevel) # # if netstatus['offlinetime'] == '': # pilib.log(pilib.networklog, 'Setting offline time for empty value. ', 4, # pilib.networkloglevel) # pilib.setsinglevalue('netstatus', 'offlinetime', pilib.gettimestring()) # offlinetime = 0 # else: # pilib.log(pilib.networklog, 'Calculating offline time. ', 4, pilib.networkloglevel) # offlinetime = pilib.timestringtoseconds(currenttime) - pilib.timestringtoseconds( # netstatus['offlinetime']) # # pilib.log(pilib.networklog, 'wpa has been offline for ' + str(offlinetime) + '. ', 3, # pilib.networkloglevel) # statusmsg += 'We have been offline for ' + str(offlinetime) + '. ' # # # If aprevert is aprevert or temprevert and we've been offline long enough, flip over to ap # # then set offline time to now (otherwise this keeps happening) # if netconfigdata['aprevert'] in ['temprevert', 'aprevert'] and offlinetime > netconfigdata[ # 'apreverttime']: # # # set laststationretry to currenttime. This marks when we flipped over to ap # statusmsg += 'Setting last station retry time. ' # pilib.log(pilib.networklog, 'Reverting to AP mode', 3, pilib.networkloglevel) # pilib.log(pilib.networklog, # 'Setting last station retry time to ' + str(currenttime), 0, # pilib.networkloglevel) # pilib.setsinglevalue(pilib.systemdatadatabase, 'netconfig', 'laststationretry', currenttime) # pilib.setsinglevalue('netstatus', 'offlinetime', currenttime) # # if netconfigdata['aprevert'] == 'aprevert': # # set mode to ap # statusmsg += 'Setting mode to ap. ' # pilib.log(pilib.networklog, 'Setting mode to ap ' + str(currenttime), 3, # pilib.networkloglevel) # pilib.setsinglevalue(pilib.systemdatadatabase, 'netconfig', 'mode', 'ap') # elif netconfigdata['aprevert'] == 'temprevert': # # set mode to tempap # statusmsg += 'Setting mode to tempap. ' # pilib.log(pilib.networklog, 'Setting mode to tempap ' + str(currenttime), 3, # pilib.networkloglevel) # pilib.setsinglevalue(pilib.systemdatadatabase, 'netconfig', 'mode', 'tempap') # # # Unfortunately, to revert to ap mode successfully, we currently have to reboot # # this is built into the netconfig script - any time you set ap mode except at boot, it reboots # pilib.setsinglevalue(pilib.systemdatadatabase, 'netstatus', 'statusmsg', statusmsg) # pilib.log(pilib.syslog, 'Running netconfig . ', 4, # pilib.sysloglevel) # netconfig.runconfig() # elif offlinetime > 15: # pilib.log(pilib.syslog, 'Restarting netconfig on bad wpastatus', 1, # pilib.sysloglevel) # runconfig = True # # # Here, we need to check the ifaces address. Netstatus address is ambiguous # if netstatus['ip_address'] != netconfigdata['address']: # pilib.log(pilib.networklog, 'IP address mismatch ( Configured for ' + netconfigdata['address'] + '. Reporting' + netstatus['ip_address'] + ' ). Running config.', 1, pilib.networkloglevel) # runconfig = True # else: # pilib.log(pilib.networklog, 'IP address match for ' + netconfigdata['address'] + '. ', 3, pilib.networkloglevel) elif netconfigdata['mode'] == 'eth0wlan0bridge': # We don't actually check eth0. This is because we shouldn't have to. Also, if we don't check on eth0, we can # use the same mode for wlan0 AP and eth0wlan0 bridge. Hot plug, works fine. # Check wlan0 dhcp and hostapd status try: wlan0ifacedata =ifacedict['wlan0'] except KeyError: pilib.log(pilib.networklog, 'No wlan0 data present in configuration of eth0wlan0bridge. ', 1, pilib.networkloglevel) statusmsg += 'wlan0 data is not present. ' runconfig = True else: pilib.log(pilib.networklog, 'Checking dhcp server status on wlan0. ', 4, pilib.networkloglevel) try: result = subprocess.check_output(['/usr/sbin/service', 'isc-dhcp-server', 'status'], stderr=subprocess.PIPE) except Exception, e: # If not running, the subprocess call will throw an error pilib.log(pilib.networklog, 'Error in reading dhcp server status. Assumed down. ', 1, pilib.networkloglevel) statusmsg += 'dhcp server appears down. ' runconfig = True else: pilib.log(pilib.networklog, 'DHCP server appears to be up. ', 1, pilib.networkloglevel) """ Check ifconfig ipaddress for wlan0 This should be programmable. """ if wlan0ifacedata['address'] == '192.168.0.1': pilib.log(pilib.networklog, 'wlan0 address is appears to be set properly: ' + str(wlan0ifacedata['address']), 3, pilib.networkloglevel) else: pilib.log(pilib.networklog, 'wlan0 address is not set properly: ' + str(wlan0ifacedata['address']), 1, pilib.networkloglevel) statusmsg += 'wlan0 address does not appear ok. ' runconfig = True if pgrepstatus('hostapd.*wlan0')['count'] == 1: pilib.log(pilib.networklog, 'hostapd on wlan0 appears to be ok. ', 3, pilib.networkloglevel) else: pilib.log(pilib.networklog, 'hostapd on wlan0 does NOT appear to be ok. ', 1, pilib.networkloglevel) statusmsg += 'wlan0 hostpad does not appear ok. ' runconfig=True
statusmsg += 'Error in reading dhcp server status. Assumed down. ' print('SETTING TRUE') runconfig = True else: pilib.log(pilib.networklog, 'DHCP server appears to be up. ', 1, pilib.networkloglevel) # Check ifconfig ipaddress for ap # This should be programmable. if apifacedata['address'] == '192.168.0.1': pilib.log(pilib.networklog, 'ap interface ' + apinterface + ' address is appears to be set properly: ' + str(apifacedata['address']), 3, pilib.networkloglevel) else: pilib.log(pilib.networklog, 'ap interface ' + apinterface + ' address is not set properly: ' + str(apifacedata['address']), 1, pilib.networkloglevel) runconfig = True if pgrepstatus('hostapd.*' + apinterface)['count'] == 1: pilib.log(pilib.networklog, 'hostapd on ' + apinterface + ' appears to be ok. ', 3, pilib.networkloglevel) else: pilib.log(pilib.networklog, 'hostapd on ' + apinterface + ' does NOT appear to be ok. ', 1, pilib.networkloglevel) statusmsg += 'hostapd on ' + apinterface + ' does NOT appear to be ok. ' runconfig=True elif netconfigdata['mode'] in ['']: statusmsg += 'mode not handled: ' + netconfigdata['mode'] # Now do some sleuthing if we are being stringent about WAN access. Have to be careful about this if we are on a # private network if netconfigdata['requireWANaccess']: pilib.log(pilib.networklog, 'Requiring WAN access. Checking status and times. ', 3, pilib.networkloglevel) print('NETSTATUS')