I’m currently writing a python script to analyse web servers for connectivity. Due to various issues I have encountered whilst running this and other sites such as DDOS attacks and Mysql failing due to lack of memory. So far it probes a given site to see if it is active. If it detects connectivity it will attempt to restart the apache server.
One cool thing I learnt whilst doing this was correctly logging the output of the script using the python logging lib. The next update in this project will be to add a feature whereby it will e-mail and attach these logs for viewing by an admin should the site be down. Another idea I’m mulling over is the ability to tail the access log of apache and detect if a site is currently under attack. Then hopefully update the IPTables to block that address.
The code so far – Note this is still in development!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <span class = "pln" > < / span><span class = "kwd" > import < / span><span class = "pln" > requests < / span><span class = "kwd" > import < / span><span class = "pln" > sys < / span><span class = "kwd" > import < / span><span class = "pln" > subprocess < / span><span class = "kwd" > import < / span><span class = "pln" > logging < / span><span class = "kwd" > class < / span><span class = "pln" > < / span><span class = "typ" >WebUp< / span><span class = "pun" >():< / span><span class = "pln" > < / span><span class = "kwd" > def < / span><span class = "pln" > __init__< / span><span class = "pun" >(< / span><span class = "kwd" > self < / span><span class = "pun" >):< / span><span class = "pln" > < / span><span class = "kwd" > if < / span><span class = "pun" >(< / span><span class = "pln" > len < / span><span class = "pun" >(< / span><span class = "pln" >sys< / span><span class = "pun" >.< / span><span class = "pln" >argv< / span><span class = "pun" >)< / span><span class = "pln" > < / span><span class = "pun" ><< / span><span class = "pln" > < / span><span class = "lit" > 2 < / span><span class = "pun" >)< / span><span class = "pln" > < / span><span class = "pun" >:< / span><span class = "pln" > < / span><span class = "kwd" > print < / span><span class = "pln" > < / span><span class = "pun" >(< / span><span class = "str" > 'Usage : python webup.py http://example.com' < / span><span class = "pun" >)< / span><span class = "pln" > sys< / span><span class = "pun" >.< / span><span class = "kwd" >exit< / span><span class = "pun" >()< / span><span class = "pln" > < / span><span class = "kwd" > self < / span><span class = "pun" >.< / span><span class = "pln" >url < / span><span class = "pun" > = < / span><span class = "pln" > sys< / span><span class = "pun" >.< / span><span class = "pln" >argv< / span><span class = "pun" >[< / span><span class = "lit" > 1 < / span><span class = "pun" >]< / span><span class = "pln" > logging< / span><span class = "pun" >.< / span><span class = "pln" >basicConfig< / span><span class = "pun" >(< / span><span class = "pln" >filename< / span><span class = "pun" > = < / span><span class = "str" > '/home/usrname/WebUp.log' < / span><span class = "pun" >,< / span><span class = "pln" > format < / span><span class = "pun" > = < / span><span class = "str" > '%(asctime)s %(levelname)s:%(message)s' < / span><span class = "pun" >,< / span><span class = "pln" > level< / span><span class = "pun" > = < / span><span class = "pln" >logging< / span><span class = "pun" >.< / span><span class = "pln" >DEBUG< / span><span class = "pun" >,< / span><span class = "pln" > datefmt< / span><span class = "pun" > = < / span><span class = "str" > '%d/%m/%Y %I:%M:%S %p' < / span><span class = "pun" >)< / span><span class = "pln" > < / span><span class = "kwd" > def < / span><span class = "pln" > checkURL< / span><span class = "pun" >(< / span><span class = "kwd" > self < / span><span class = "pun" >):< / span><span class = "pln" > < / span><span class = "kwd" > try < / span><span class = "pun" >:< / span><span class = "pln" > r < / span><span class = "pun" > = < / span><span class = "pln" > requests< / span><span class = "pun" >.< / span><span class = "pln" >head< / span><span class = "pun" >(< / span><span class = "kwd" > self < / span><span class = "pun" >.< / span><span class = "pln" >url< / span><span class = "pun" >)< / span><span class = "pln" > < / span><span class = "kwd" > if < / span><span class = "pln" > r< / span><span class = "pun" >.< / span><span class = "pln" >status_code < / span><span class = "pun" > = = < / span><span class = "pln" > < / span><span class = "lit" > 200 < / span><span class = "pun" >:< / span><span class = "pln" > logging< / span><span class = "pun" >.< / span><span class = "pln" >info< / span><span class = "pun" >(< / span><span class = "str" > "Website OK" < / span><span class = "pln" > < / span><span class = "pun" > + < / span><span class = "pln" > str < / span><span class = "pun" >(< / span><span class = "pln" >r< / span><span class = "pun" >.< / span><span class = "pln" >status_code< / span><span class = "pun" >))< / span><span class = "pln" > < / span><span class = "kwd" > return < / span><span class = "pln" > r< / span><span class = "pun" >.< / span><span class = "pln" >status_code < / span><span class = "pun" > = = < / span><span class = "pln" > < / span><span class = "lit" > 200 < / span><span class = "pln" > < / span><span class = "kwd" > except < / span><span class = "pln" > < / span><span class = "pun" >(< / span><span class = "pln" > requests< / span><span class = "pun" >.< / span><span class = "pln" >exceptions< / span><span class = "pun" >.< / span><span class = "typ" >RequestException< / span><span class = "pun" >)< / span><span class = "pln" > < / span><span class = "kwd" >as< / span><span class = "pln" > e< / span><span class = "pun" >:< / span><span class = "pln" > < / span><span class = "com" > # print("Connection Error " + str(e))</span><span class="pln"> < / span><span class = "kwd" > self < / span><span class = "pun" >.< / span><span class = "pln" >handleError< / span><span class = "pun" >(< / span><span class = "pln" >e< / span><span class = "pun" >)< / span><span class = "pln" > < / span><span class = "kwd" > def < / span><span class = "pln" > handleError< / span><span class = "pun" >(< / span><span class = "kwd" > self < / span><span class = "pun" >,< / span><span class = "pln" >e< / span><span class = "pun" >):< / span><span class = "pln" > < / span><span class = "com" > # Log error </span><span class="pln"> < / span><span class = "com" > # Get latest tail of access.log</span><span class="pln"> < / span><span class = "com" > # Attach to e-mail?</span><span class="pln"> < / span><span class = "com" > # Exit</span><span class="pln"> logging< / span><span class = "pun" >.< / span><span class = "pln" >warning< / span><span class = "pun" >(< / span><span class = "str" > 'Website is down due to:' < / span><span class = "pln" > < / span><span class = "pun" > + < / span><span class = "pln" > str < / span><span class = "pun" >(< / span><span class = "pln" >e< / span><span class = "pun" >))< / span><span class = "pln" > < / span><span class = "com" > # restart apache</span><span class="pln"> logging< / span><span class = "pun" >.< / span><span class = "pln" >info< / span><span class = "pun" >(< / span><span class = "str" > "Attempting to restart apache2 service" < / span><span class = "pun" >)< / span><span class = "pln" > p < / span><span class = "pun" > = < / span><span class = "pln" > subprocess< / span><span class = "pun" >.< / span><span class = "typ" >Popen< / span><span class = "pun" >(< / span><span class = "str" > "sudo service apache2 restart" < / span><span class = "pun" >,< / span><span class = "pln" > shell< / span><span class = "pun" > = < / span><span class = "kwd" > True < / span><span class = "pun" >,< / span><span class = "pln" > stdout< / span><span class = "pun" > = < / span><span class = "pln" >subprocess< / span><span class = "pun" >.< / span><span class = "pln" >PIPE< / span><span class = "pun" >,< / span><span class = "pln" > stderr< / span><span class = "pun" > = < / span><span class = "pln" >subprocess< / span><span class = "pun" >.< / span><span class = "pln" >STDOUT< / span><span class = "pun" >)< / span><span class = "pln" > < / span><span class = "kwd" > for < / span><span class = "pln" > line < / span><span class = "kwd" > in < / span><span class = "pln" > p< / span><span class = "pun" >.< / span><span class = "pln" >stdout< / span><span class = "pun" >.< / span><span class = "pln" >readlines< / span><span class = "pun" >():< / span><span class = "pln" > < / span><span class = "kwd" > print < / span><span class = "pln" > < / span><span class = "pun" >(< / span><span class = "pln" >line< / span><span class = "pun" >)< / span><span class = "pln" > retval < / span><span class = "pun" > = < / span><span class = "pln" > p< / span><span class = "pun" >.< / span><span class = "pln" >wait< / span><span class = "pun" >()< / span><span class = "pln" > < / span><span class = "kwd" > self < / span><span class = "pun" >.< / span><span class = "pln" >checkURL< / span><span class = "pun" >()< / span><span class = "pln" > < / span><span class = "kwd" > if < / span><span class = "pln" > __name__ < / span><span class = "pun" > = = < / span><span class = "pln" > < / span><span class = "str" > '__main__' < / span><span class = "pun" >:< / span><span class = "pln" > checker < / span><span class = "pun" > = < / span><span class = "pln" > < / span><span class = "typ" >WebUp< / span><span class = "pun" >()< / span><span class = "pln" > checker< / span><span class = "pun" >.< / span><span class = "pln" >checkURL< / span><span class = "pun" >()< / span><span class = "pln" > < / span> |