@@ -28,8 +28,10 @@ func always(context.Context, string) bool {
2828}
2929
3030type ldapTarget struct {
31- localPoolRange * net.IPNet
32- ldap * ldap.Pool
31+ localPoolRange * net.IPNet
32+ ldap * ldap.Pool
33+ statuszServer * HijackedServer
34+ unavailableServer * HijackedServer
3335}
3436
3537// HandleConn is called by tcpproxy after receiving a connection and sniffing the host.
@@ -39,6 +41,17 @@ func (l *ldapTarget) HandleConn(netConn net.Conn) {
3941 var pool string
4042 var err error
4143 if conn , ok := netConn .(* tcpproxy.Conn ); ok {
44+ switch conn .HostName {
45+ case "proxy.scripts.scripts.mit.edu" :
46+ // Special handling for proxy.scripts.scripts.mit.edu
47+ l .statuszServer .HandleConn (netConn )
48+ return
49+ case "heartbeat.scripts.scripts.mit.edu" :
50+ if nolvsPresent () {
51+ l .unavailableServer .HandleConn (netConn )
52+ return
53+ }
54+ }
4255 pool , err = l .ldap .ResolvePool (conn .HostName )
4356 if err != nil {
4457 log .Printf ("resolving %q: %v" , conn .HostName , err )
@@ -50,9 +63,9 @@ func (l *ldapTarget) HandleConn(netConn net.Conn) {
5063 log .Printf ("resolving default pool: %v" , err )
5164 }
5265 }
53- // TODO: Serve an error page? Forward to scripts- director?
66+ // TODO: Forward to sorry server on director?
5467 if pool == "" {
55- netConn . Close ( )
68+ l . unavailableServer . HandleConn ( netConn )
5669 return
5770 }
5871 laddr := netConn .LocalAddr ().(* net.TCPAddr )
@@ -91,8 +104,10 @@ func main() {
91104
92105 var p tcpproxy.Proxy
93106 t := & ldapTarget {
94- localPoolRange : ipnet ,
95- ldap : ldapPool ,
107+ localPoolRange : ipnet ,
108+ ldap : ldapPool ,
109+ statuszServer : NewHijackedServer (nil ),
110+ unavailableServer : NewUnavailableServer (),
96111 }
97112 for _ , addr := range strings .Split (* httpAddrs , "," ) {
98113 p .AddHTTPHostMatchRoute (addr , always , t )
0 commit comments