Python Script to Monitor Network Connection and saving into Log File - GeeksforGeeks

23 Feb, 2022
In this article, we are going to see how to monitor the network connection and save the log file in Python. 
The basic ideology of this script is to give real-time information about if the system the script is being run on is connected to an internet connection or not, and save that information into a log file simultaneously, keeping records of when the system was connected to the internet when it was disconnected and the time duration it was disconnected for.
This script is made using the socket library in Python, which in this program is used to send or receive packets on a network.
Starting simply by creating a log file in the current working directory to store the internet connectivity status.
Python
FILE = os.path.join(os.getcwd(), "networkinfo.log")
Using this function the script will try connecting to the defined server, to check if the system has a live internet connection. This task will be done using exception handling in python (try, except, else). 
The system will try pinging a specific server(PORT at an IP)If the machine fails to connect, EXCEPT statement will be executedElse the connection will be closed after the system is successfully connected to the server
The system will try pinging a specific server(PORT at an IP)
If the machine fails to connect, EXCEPT statement will be executed
Else the connection will be closed after the system is successfully connected to the server
 Code:
Python
def ping():       # to ping a particular PORT at an IP    # if the machine won't receive any packets from    # the server for more than 3 seconds    # i.e no connection is    # made(machine doesn't have a live internet connection)    # <except> part will be executed    try:        socket.setdefaulttimeout(3)         # AF_INET: address family (IPv4)        # SOCK_STREAM: type for TCP (PORT)        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)                 host = "8.8.8.8"        port = 53         server_address = (host, port)                 # send connection request to the defined server        s.connect(server_address)     except OSError as error:               # function returning false after        # data interruption(no connection)        return False    else:               # the connection is closed after        # machine being connected        s.close()        return True
Functions Used in above program
socket.setdefaulttimeout() : It is an inbuilt socket library function in python. by setting default timeout as 3 seconds, we specify if we do not get any response from the server for more than 3 seconds, the connection is not made.
socket.socket(socket.AF_INET, socket.SOCK_STREAM): socket.socket() is used to define parameters to connect two nodes in a network, i.e. your system to a particular PORT at a particular IP so that they can communicate to each other.AF_INET is an address family used to accept IP of address type v4 as a parameter to which the defined socket will communicateSOCK_STREAM is a connection-based protocol, in this program using TCP(transmission control protocol) is used to accept a port no. as a parameter
AF_INET is an address family used to accept IP of address type v4 as a parameter to which the defined socket will communicate
SOCK_STREAM is a connection-based protocol, in this program using TCP(transmission control protocol) is used to accept a port no. as a parameter
Unavailability time is the time duration for which the internet connection was unavailable. is calculated using downtime(stop) time when the internet connection got lost and uptime(start) time when the internet connection got restored
Python
def calculate_time(start, stop):       # to calculate unavailability time    difference = stop - start    seconds = float(str(difference.total_seconds()))    return str(datetime.timedelta(seconds=seconds)).split(".")[0]
This function will only be executed once, i.e. at the beginning of the script to check if the system is already connected to an internet connection or not, and write that into the log file. ping() function is called
If ping returns true(machine is connected to the internet), the script will print “CONNECTION ACQUIRED” and write the same into the log file.If ping returns false(the system is not connected to the internet), the script will print “CONNECTION NOT ACQUIRED” and write the same into the log file.
If ping returns true(machine is connected to the internet), the script will print “CONNECTION ACQUIRED” and write the same into the log file.
If ping returns false(the system is not connected to the internet), the script will print “CONNECTION NOT ACQUIRED” and write the same into the log file.
Python
def first_check():    # to check if the machine already have a live internet connection     # if ping returns true    if ping():        live = "\nCONNECTION ACQUIRED\n"        print(live)        connection_acquired_time = datetime.datetime.now()        acquiring_message = "connection acquired at: " + \            str(connection_acquired_time).split(".")[0]        print(acquiring_message)         # writes into the log file        with open(FILE, "a") as file:            file.write(live)            file.write(acquiring_message)        return True     # if ping returns false    else:        not_live = "\nCONNECTION NOT ACQUIRED\n"        print(not_live)         # writes into the log file        with open(FILE, "a") as file:            file.write(not_live)        return False
The main function, where all the user-defined programs will be executed and the live internet status will be written into a log file.
Python
def main():    # MAIN    monitor_start_time = datetime.datetime.now()         # monitoring time is when the script    # started monitoring internet connection status    monitoring_date_time = "monitoring started at: " + \        str(monitor_start_time).split(".")[0]     if first_check():        # if true        print(monitoring_date_time)                 # monitoring will only start when        # the connection will be acquired     else:        # if false        while True:                       # infinite loop to check if the connection is acquired            # will run until there is a live internet connection            if not ping():                               # if connection not acquired                time.sleep(1)            else:                               # if connection is acquired                first_check()                print(monitoring_date_time)                break             with open(FILE, "a") as file:                # writes into the log file                file.write("\n")                file.write(monitoring_date_time + "\n")     while True:               # FIRST WHILE, infinite loop,        # will run until the machine is on        # or the script is manually terminated        if ping():            # if true: the loop will execute after every 5 seconds            time.sleep(5)         else:                       # if false: fail message will be displayed            down_time = datetime.datetime.now()            fail_msg = "disconnected at: " + str(down_time).split(".")[0]            print(fail_msg)             with open(FILE, "a") as file:                # writes into the log file                file.write(fail_msg + "\n")             while not ping():                # infinite loop,                # will run till ping() return true                time.sleep(1)             up_time = datetime.datetime.now()                         # will execute after while true is            # false (connection restored)            uptime_message = "connected again: " + str(up_time).split(".")[0]             down_time = calculate_time(down_time, up_time)                         # calling time calculating            # function, printing down time            unavailablity_time = "connection was unavailable for: " + down_time             print(uptime_message)            print(unavailablity_time)             with open(FILE, "a") as file:                                 # log entry for connected restoration time,                # and unavailability time                file.write(uptime_message + "\n")                file.write(unavailablity_time + "\n")
Explanation:
First, first_check() will be executed (this function will be executed only one time, i.e. at the beginning of the script)If true(connection acquired): monitoring will startIf false(connection not acquired): else statement will be executed having infinite while loop to check for the internet connection using ping() functionIf ping will return false, the loop will be executed after every second until the ping() function returns trueIf ping will return true(connection acquired), the loop will break, and monitoring will be started
If true(connection acquired): monitoring will startIf false(connection not acquired): else statement will be executed having infinite while loop to check for the internet connection using ping() functionIf ping will return false, the loop will be executed after every second until the ping() function returns trueIf ping will return true(connection acquired), the loop will break, and monitoring will be started
If true(connection acquired): monitoring will start
If false(connection not acquired): else statement will be executed having infinite while loop to check for the internet connection using ping() functionIf ping will return false, the loop will be executed after every second until the ping() function returns trueIf ping will return true(connection acquired), the loop will break, and monitoring will be started
If ping will return false, the loop will be executed after every second until the ping() function returns trueIf ping will return true(connection acquired), the loop will break, and monitoring will be started
If ping will return false, the loop will be executed after every second until the ping() function returns true
If ping will return true(connection acquired), the loop will break, and monitoring will be started
Second, to monitor the network connection, the first while statement will be executed, which is an infinite loopIf ping returns true, the loop will be executed after every 5 seconds until it returns falseIf ping returns false, downtime will be printed, and the loop will execute after every second until an internet connection is restoredAfter internet connection is restored, uptime and unavailability time will be printed, and iteration will get back to the start of the loop
If ping returns true, the loop will be executed after every 5 seconds until it returns falseIf ping returns false, downtime will be printed, and the loop will execute after every second until an internet connection is restoredAfter internet connection is restored, uptime and unavailability time will be printed, and iteration will get back to the start of the loop
If ping returns true, the loop will be executed after every 5 seconds until it returns false
If ping returns false, downtime will be printed, and the loop will execute after every second until an internet connection is restored
After internet connection is restored, uptime and unavailability time will be printed, and iteration will get back to the start of the loop
Python
import osimport sysimport socketimport datetimeimport time  FILE = os.path.join(os.getcwd(), "networkinfo.log") # creating log file in the currenty directory# ??getcwd?? get current directory,# os function, ??path?? to specify path  def ping():    # to ping a particular IP    try:        socket.setdefaulttimeout(3)                 # if data interruption occurs for 3        # seconds, <except> part will be executed         s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)        # AF_INET: address family        # SOCK_STREAM: type for TCP         host = "8.8.8.8"        port = 53         server_address = (host, port)        s.connect(server_address)     except OSError as error:        return False        # function returns false value        # after data interruption     else:        s.close()        # closing the connection after the        # communication with the server is completed        return True  def calculate_time(start, stop):       # calculating unavailability    # time and converting it in seconds    difference = stop - start    seconds = float(str(difference.total_seconds()))    return str(datetime.timedelta(seconds=seconds)).split(".")[0]  def first_check():    # to check if the system was already    # connected to an internet connection     if ping():        # if ping returns true        live = "\nCONNECTION ACQUIRED\n"        print(live)        connection_acquired_time = datetime.datetime.now()        acquiring_message = "connection acquired at: " + \            str(connection_acquired_time).split(".")[0]        print(acquiring_message)         with open(FILE, "a") as file:                       # writes into the log file            file.write(live)            file.write(acquiring_message)         return True     else:        # if ping returns false        not_live = "\nCONNECTION NOT ACQUIRED\n"        print(not_live)         with open(FILE, "a") as file:                       # writes into the log file            file.write(not_live)        return False  def main():       # main function to call functions    monitor_start_time = datetime.datetime.now()    monitoring_date_time = "monitoring started at: " + \        str(monitor_start_time).split(".")[0]     if first_check():        # if true        print(monitoring_date_time)        # monitoring will only start when        # the connection will be acquired     else:        # if false        while True:                       # infinite loop to see if the connection is acquired            if not ping():                                 # if connection not acquired                time.sleep(1)            else:                                 # if connection is acquired                first_check()                print(monitoring_date_time)                break     with open(FILE, "a") as file:               # write into the file as a into networkinfo.log,        # "a" - append: opens file for appending,        # creates the file if it does not exist???        file.write("\n")        file.write(monitoring_date_time + "\n")     while True:               # infinite loop, as we are monitoring        # the network connection till the machine runs        if ping():                         # if true: the loop will execute after every 5 seconds            time.sleep(5)         else:            # if false: fail message will be displayed            down_time = datetime.datetime.now()            fail_msg = "disconnected at: " + str(down_time).split(".")[0]            print(fail_msg)             with open(FILE, "a") as file:                # writes into the log file                file.write(fail_msg + "\n")             while not ping():                               # infinite loop, will run till ping() return true                time.sleep(1)             up_time = datetime.datetime.now()                         # after loop breaks, connection restored            uptime_message = "connected again: " + str(up_time).split(".")[0]             down_time = calculate_time(down_time, up_time)            unavailablity_time = "connection was unavailable for: " + down_time             print(uptime_message)            print(unavailablity_time)             with open(FILE, "a") as file:                                 # log entry for connection restoration time,                # and unavailability time                file.write(uptime_message + "\n")                file.write(unavailablity_time + "\n") main()
Output:
CONNECTION ACQUIRED

connection acquired at: 2021-09-16 15:03:18
monitoring started at: 2021-09-16 15:03:18
disconnected at: 2021-09-16 15:03:49
connected again: 2021-09-16 15:03:50
connection was unavailable for: 0:00:01
surinderdawra388
sumitgumber28
simranarora5sos
khushboogoyal499
clintra
rkbhola5
anikakapoor
adnanirshad158
kk9826225
germanshephered48
Blogathon-2021
Python-Networking
Blogathon
Python
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
How to Create a Table With Multiple Foreign Keys in SQL?
How to Import JSON Data into SQL Server?
Stratified Sampling in Pandas
SQL Query to Convert Datetime to Date
How to pass data into table from a form using React Components
Read JSON file using Python
Adding new column to existing DataFrame in Pandas
Python map() function
How to get column names in Pandas dataframe