How to update /etc/hosts with python script

Here is the quick dirty script which helps me to update a /etc/hosts automatically.
It’s simply pings a computer in the office network, in my case its: local_ip = ‘192.168.1.120’
If it responds then script updates /etc/hosts like: mysupersite.com 192.168.1.120.
If Im at home then it becomes like: mysupersite.com 289.38.34.116 (remote ip of a computer in the office )

Requirements:

sudo apt-get install augeas-tools python-augeas python-notify2

File: ~/hosts.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import os
import subprocess
import sys
from pynotify import *

__mydir = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, __mydir + "/..")

import augeas

def setHostAt(at, local_ip, remote_ip):
    """docstring for setHostAt"""
    MYROOT = '/'
    a = augeas.Augeas(root=MYROOT)
    #matches = a.match("/files/etc/hosts/*[. = '%s']" % host)
    matches = a.match("/files/etc/hosts/*/*[ . = '%s']" % host)
    if matches:
        index = matches[0].split('/')[4]
        record_exists = True
        print(index)
    else:
        record_exists = False
        index = len(a.match("/files/etc/hosts/*"))
        print ( index)

    if at == 'work':
        #Im at work
        a.set("/files/etc/hosts/%s/ipaddr" % index, local_ip)
        a.set("/files/etc/hosts/%s/canonical" % index, host)
        a.save()
        msg =  "Im in the office, set host ip to %s" % local_ip
    else:
        #Im at home
        a.set("/files/etc/hosts/%s/ipaddr" % index, remote_ip)
        a.set("/files/etc/hosts/%s/canonical" % index, host)
        a.save()
        msg =  "Im at home, set host %s ip to %s " % ( host, remote_ip )


    init("Server checker")
    Notification("Server checker", msg).show()

host = 'mysupersite.com'
local_ip = '192.168.1.120'
remote_ip ='289.38.34.116'

ret = subprocess.call("ping -c 5 %s" % local_ip,
                shell=True,
                stdout=open('/dev/null', 'w'),
                stderr=subprocess.STDOUT)
if ret == 0:
    setHostAt('work', local_ip, remote_ip)
else:
    setHostAt('home', local_ip, remote_ip)

You can now check it with : sudo ~/hosts.py

Syntax error or access violation: 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126.

Problem:

Fatal error: Uncaught exception 'Exception' with message 'exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs' in /var/www/html/library/Zend/Db/Statement/Pdo.php:228 Stack trace: #0 /var/www/html/library/Zend/Db/Statement/Pdo.php(228): PDOStatement->execute(Array) #1 /var/www/html/library/Zend/Db/Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array) #2 /var/www/html/library/Zend/Db/Adapter/Abstract.php(479): Zend_Db_Statement->execute(Array) #3 /var/www/html/library/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('UPDATE `setting...', Array) #4 /var/www/html/library/Zend/Db/Adapter/Abstract.php(632): Zend_Db_Adapter_Pdo_Abstract->query('UPDATE `setting...', Array) #5 /var/www/html/application/controllers/TWController.php(239): Zend_Db_Adapter_Abstract->update('settings', Array, 'id=1') #6 /var in /var/www/html/index.php on line 307

When I tried to copy values from one table to another using phpmyadmin I get #1030 – Got error 139 from storage engine.

After googling for similar problems I found http://forums.mysql.com/read.php?22,63584,63584#msg-63584

Solution: Changing table’s storage engine from “InnoDB” to “MyISAM” helped me.

How to find iframe inside a div ?

Problem: I need to find an iframe inside a div and then an element inside that iframe.

It’s easy with JQuery:

<div class="container">
    <iframe frameborder="0" src="javascript:void(0)" role="listbox" aria-label="tag" title="tag">
.
.
        <div id="div-inside-iframe"></div>
.
    </iframe>
</div>
$('.container iframe').contents().find('#div-inside-iframe');

Javascript is not working on content loaded by jquery’s .get()

IE made me cry again.

Problem: When you want to load some html data into document using JQuery’s .get() .post() .ajax() functions but events like “onclick, onmouseover” don’t work exactly inside loaded content in all versions of Internet Explorer.

Solution:
1. Check carefully if loaded html is valid with any online validator.
In my case IE didn’t show errors and even notices, for some reason, so it’s always better to check html with other online tools.

2. Use jquery .live() function to bind events.

$('#foo').live('click', function() {
  alert('User clicked on "foo');
});

3. Other developers suggest also to avoid <script> tags inside loaded content.

Well, probably they are right, but it worked for me without moving those.

See “.bind()” documentation at http://api.jquery.com/bind/

Nearly the same problem was described at http://stackoverflow.com/questions/4293195/click-event-is-not-working-on-ajax-loaded-content.

Permalink is not working in wordpress

If you always get 404 error after changing permalink structure try to check if:

  1. .htaccess file is in the web site root, normally in the same directory where index.php is.
  2. Is .htaccess is readable by web-server.
    The simplest and fastest way to check that is to add an extra line with random text and save it. If you see 500 error then it’s readable. Do not forget to remove extra text.
  3. Is “Rewrite Engine” enabled. Usually it’s enabled by default on majority hosting servers otherwise you should get error 500.
  4. If “Rewrite Engine” works ok but the above did not help you can try this code in your .htaccess:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(js|ico|gif|jpg|png|css|php|html|src|pdf|zip|txt|doc|docx)$ index.php [L]

Simple site pinger

This simple script pings your websites and notifies when a website is down.
It’s written in python >= 2.5 and might be usefull for administrators and programmers.
Some parts of it was found somewhere in the internet and adjusted a bit for my needs.

Required packages can be installed easily from repository ( Ubuntu example ):

sudo apt-get install python-notify

or using pip/easy_install as well

sudo pip install notify

Running this script from command line is a bit annoying so I put to run it by crontab each 30 min:

$ crontab -e
*/30 * * * * DISPLAY=:0 /usr/bin/python /home/vs/bin/pingwebsites.py

Note that you need to set DISPLAY option to make notification visible for current X session.

#!/usr/bin/env python
from threading import Thread
import subprocess
from Queue import Queue
from pynotify import *

num_threads = 4
queue = Queue()
hosts = [
    ,"mysite.com"
    ,"myanothersite.com"
]
#wraps system ping command
def pinger(i, q):
    """Pings subnet"""
    while True:
        host = q.get()
        #print "Thread %s: Pinging %s" % (i, host)
        ret = subprocess.call("ping -c 5 %s" % host,
                        shell=True,
                        stdout=open('/dev/null', 'w'),
                        stderr=subprocess.STDOUT)
        if ret == 0:
            pass
            #print "%s: is alive" % host
        else:
            init("Server checker")
            msg =  "%s: did not respond" % host
            Notification("Server checker", msg).show()
        q.task_done()
#Spawn thread pool
for i in range(num_threads):

    worker = Thread(target=pinger, args=(i, queue))
    worker.setDaemon(True)
    worker.start()
#Place work in queue
for host in hosts:
    queue.put(host)
#Wait until worker threads are done to exit
queue.join()