To switch between the two, I have a launcher to a little gui I've written.
The Interface | |
The Dialog raised on request. |
works great.
the code is below.
Incidentally, as /etc/hosts required root permissions, I call the write using gksu. KDE users would need to change this.
Here's the full code.
#! /usr/bin/env python ''' This script modifies the /etc/hosts file so that I utilise this machines web server rather than doing a dns lookup and going to the online sites. It's for testing purposes. my /etc/hosts file has this text present. 127.0.0.1 localhost 127.0.0.1 rowinggolfer.org 127.0.0.1 openmolar.com 127.0.0.1 academydental.com 127.0.1.1 slim-maroon and when I want to use the "cloud" servers, the sites listed in variable SITES are commented out. ''' from PyQt4 import QtGui, QtCore import re, subprocess, sys, tempfile SITES = ["rowinggolfer.org", "academydental.com", "openmolar.com",] class Dialog(QtGui.QDialog): def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.setWindowTitle("toggle /etc/hosts file") self.local_rb = QtGui.QRadioButton("Using localhost") self.global_rb = QtGui.QRadioButton("Using remote host(s)") layout = QtGui.QVBoxLayout(self) layout.addWidget(self.local_rb) layout.addWidget(self.global_rb) self.global_rb.setChecked(True) self.local_rb.setChecked(self.check_state) self.local_rb.toggled.connect(self.apply_changes) def sizeHint(self): return QtCore.QSize(200,50) @property def check_state(self): ''' checks /etc/hosts to see if it is set to use the local instance of apache2 for the SITES ''' local = False f = open("/etc/hosts", "r") for line in f: for site in SITES: if re.match("127\.0\.0\.1[ \t]*%s"% site, line): local = True return local def apply_changes(self, use_local): host = "localhost" if use_local else "remote host(s)" message = '''modify <em>/etc/hosts</em> so that <b>%s</b> is used for the following sites?<ul>{sites}</ul>'''% host sites = "" for site in SITES: sites += "<li>%s</li>"% site message = message.replace("{sites}", sites) result = QtGui.QMessageBox.question(self, "confirm", message, QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel, QtGui.QMessageBox.Ok) == QtGui.QMessageBox.Ok if result: self.write_file(use_local) success = use_local == self.check_state if success: QtGui.QMessageBox.inforamtion(self, "success", "changes applied sucessfully") self.local_rb.toggled.disconnect(self.apply_changes) self.local_rb.setChecked(self.check_state) self.local_rb.toggled.connect(self.apply_changes) def write_file(self, local): def repl(arg): if local: return re.sub("\n#*", "\n", arg.group()) else: return arg.group().replace("\n", "\n#") f = open("/etc/hosts", "r") data = f.read() f.close() if not local: for site in SITES: data = re.sub( "(\n127\.0\.0\.1[ \t]*%s)"% site, repl, data) else: for site in SITES: data = re.sub( "\n#*127\.0\.0\.1[ \t]*(%s)"% site, repl, data) t = tempfile.NamedTemporaryFile("w", delete=False) t.write(data) t.close() p = subprocess.Popen(["gksu", "mv", t.name, "/etc/hosts"]) assert p.wait()==0 if __name__ == "__main__": app = QtGui.QApplication([]) dl = Dialog() dl.exec_()