Add DHCP relay

Change-Id: I75aa18b6798824285de4cdc101917ed72d8149d6
diff --git a/trellis/trellislib.py b/trellis/trellislib.py
index db0fb65..11a57b0 100644
--- a/trellis/trellislib.py
+++ b/trellis/trellislib.py
@@ -7,7 +7,7 @@
 import sys
 sys.path.append('..')
 from mininet.node import Host
-from routinglib import RoutedHost
+from routinglib import RoutedHost, Router
 
 class TaggedRoutedHost(RoutedHost):
     """Host that can be configured with multiple IP addresses."""
@@ -95,6 +95,28 @@
         self.cmd('rm -rf  %s' % self.leasesFile)
         super(DhcpServer, self).terminate()
 
+class DhcpRelay(Router):
+    binFile = '/usr/sbin/dhcrelay'
+    pidFile = '/run/dhcp-relay.pid'
+    serverIp = None
+    gateway = None
+
+    def __init__(self, name, serverIp, gateway, *args, **kwargs):
+        super(DhcpRelay, self).__init__(name, **kwargs)
+        self.serverIp = serverIp
+        self.gateway = gateway
+
+    def config(self, **kwargs):
+        super(DhcpRelay, self).config(**kwargs)
+        ifacesStr = ' '.join(["-i " + ifaceName for ifaceName in self.interfaces.keys()])
+        self.cmd('route add default gw %s' % self.gateway)
+        self.cmd('%s -4 -a -pf %s %s %s' % (self.binFile, self.pidFile, ifacesStr, self.serverIp))
+
+    def terminate(self, **kwargs):
+        self.cmd('kill -9 `cat %s`', self.pidFile)
+        self.cmd('rm -rf %s' % self.pidFile)
+        super(DhcpRelay, self).terminate()
+
 class TaggedDhcpClient(Host):
     def __init__(self, name, vlan, *args, **kwargs):
         super(TaggedDhcpClient, self).__init__(name, **kwargs)