diff options
Diffstat (limited to 'src/moo/moo')
-rwxr-xr-x | src/moo/moo | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/src/moo/moo b/src/moo/moo new file mode 100755 index 0000000..828df08 --- /dev/null +++ b/src/moo/moo @@ -0,0 +1,244 @@ +#! /usr/bin/env python2.2 + +import os +import sys +import time +import signal + +CONFDIR="/tmp/moo" + +class Config: + pass + +def die(code, msg): + sys.stdout.write(msg + "\n") + sys.edit(code) + +def printUsage(): + print "Usage: moo <options> [command] <command-options>\n" + \ + "Where [command] is one of:\n" + \ + "scan - scan for available networks\n" + \ + "list - list available profiles\n"+ \ + "select - select a particular profile\n" + +def scanNetworks(): + pass + +def runCmd(cmd): + if Config.verbosity > 5: + print "Executing \"" + cmd + "\"" + v = os.system(cmd) + if Config.verbosity > 5: + print "Result: " + str(v) + return v + +class ProfileHandler: + def __init__(self): + self.profiles = {} + self._loadProfiles() + def _loadProfiles(self): + for x in os.listdir(CONFDIR+"/profiles"): + if x[-1] != "~" and x[0] != ".": + self.profiles[x] = Profile(CONFDIR+"/profiles/"+x) + def listProfiles(self,detailed=0): + for x in self.profiles.keys(): + if detailed: + print x + ":" + self.profiles[x].dump() + else: + print x + " [" + self.profiles[x].description + "]" + def getProfileNames(self): + return self.profiles.keys() + def getProfile(self,name): + return self.profiles[name] + + +class Profile: + def __init__(self, filename): + self._loadFromFile(filename) + def _loadFromFile(self,filename): + self.desc = "" + self.ifaceName = "" + self.ip = "" + self.broadcast = "" + self.gateway = "" + self.exclusive = "no" + self.netmask = "" + self.nameserver = "" + + ins = open(filename) + for s in ins.readlines(): + for x in ["description","ifaceName","ip","broadcast", + "gateway","exclusive","nameserver","wepkey"]: + if s.find(x+"=") == 0: + val=s.replace(x+"=","").strip() + self.__dict__[x] = val + def dump(self): + print "description = " + self.description + "\n" + \ + "iface = " + self.ifaceName + "\n" + \ + "ip = " + self.ip + "\n" + \ + "broadcast = " + self.broadcast + "\n" + \ + "gateway = " + self.gateway + "\n" + \ + "gateway = " + self.nameserver + "\n" + \ + "exclusive = " + self.exclusive + "\n" + +class Interface: + def __init__(self, name): + self.name = name + self.netmask = "" + self.broadcast = "" + self.ip = "" + self.gateway = "" + self.nameserver = "" + self.wepkey = "" + self._loadIPV4Info() + def _loadIPV4Info(self): + pass + def getNameserver(self): + return self.nameserver + def getNetmask(self): + return self.netmask + def getName(self): + return self.name + def getBroadcast(self): + return self.broadcast + def getWEPKey(self): + return self.wepkey + def getGateway(self): + return self.gateway + def setNameserver(self,nameserver): + self.nameserver = nameserver + def setIP(self, ip): + self.ip = ip + def setWEPKey(self,key): + self.wepkey = key + def setGateway(self,gw): + self.gateway = gw + def setBroadcast(self,broadcast): + self.broadcast = broadcast + def setNetmask(self,netmask): + self.netmask = netmask + def runDHCP(self): + runCmd("dhcpcd " + self.name) + def down(self): + runCmd("ifconfig " + self.name + " down") + pidFile = "/var/run/dhcpcd-" + self.name + ".pid" + if os.path.exists(pidFile): + ins = open(pidFile) + pid = int(ins.readline()) + os.kill(pid,signal.SIGTERM) + time.sleep(1) + def up(self): + options = "" + + if self.wepkey: + if runCmd("iwconfig eth1 key " + self.wepkey): + die(4, "Failed to set WEP key for " + self.name) + + if self.ip: + options += self.ip + " " + if self.broadcast: + options += "broadcast " + self.broadcast + " " + if self.netmask: + options += "netmask " + self.netmask + " " + + if runCmd("ifconfig " + self.name + " " + options + " up"): + die(2, "Failed to bring up " + self.name) + + if self.gateway: + if runCmd("route add default gw " + self.gateway + " " + self.name): + die(3, "Failed to set default gateway for " + self.name) + + if self.nameserver: + if Config.verbosity > 5: + print("Using nameserver " + self.nameserver) + try: + ous = open("/etc/resolv.conf","w") + ous.write("nameserver " + self.nameserver) + ous.close() + except OSError: + die("Failed to set nameserver") + if Config.verbosity > 3: + print "Brough interface " + self.name + " up" + +class InterfaceHandler: + def __init__(self): + self.ifaces = {} + self._loadAllInterfaces() + def _loadAllInterfaces(self): + ins=open("/proc/net/dev") + for line in ins.readlines(): + tokens = line.split(":") + if len(tokens) > 1: + ifaceName = tokens[0].strip() + iface = Interface(ifaceName) + self.ifaces[ifaceName] = iface + def getInterface(self,ifaceName): + return self.ifaces[ifaceName] + def downAll(self): + for x in self.ifaces.values(): + if x.getName() != "lo": + x.down() + +class Moo: + def __init__(self): + self.profileHandler = ProfileHandler() + self.ifaceHandler = InterfaceHandler() + + def selectProfile(self,profile): + prof = self.profileHandler.getProfile(profile) + + if prof.exclusive == "yes": + self.ifaceHandler.downAll() + + iface = self.ifaceHandler.getInterface(prof.ifaceName) + + if prof.ip == "dhcp": + iface.runDHCP() + else: + iface.setIP(prof.ip) + iface.setBroadcast(prof.broadcast) + iface.setNetmask(prof.netmask) + iface.setGateway(prof.gateway) + iface.setNameserver(prof.nameserver) + iface.up() + + def listProfiles(self,detailed=0): + self.profileHandler.listProfiles(detailed) + +def initConfig(): + Config.verbosity = 3 + +def main(): + + initConfig() + + if len(sys.argv) < 2: + printUsage() + sys.exit(1) + + moo = Moo() + + for i in xrange(len(sys.argv)): + if sys.argv[i] == "list": + detailed = 0 + for x in sys.argv[i:]: + if x == "--detailed": + detailed = 1 + moo.listProfiles(detailed) + + elif sys.argv[i] == "select": + moo.selectProfile(sys.argv[2]) + +if __name__ == "__main__": + main() + + +# TODO +# - automatically create profile +# - specify wireless network name +# - specify wep key +# - specify access point +# - specify pre_run/post_run commands +# - with parameters +# |