File tree 2 files changed +74
-4
lines changed
server/common/oursrc/scripts-proxy
2 files changed +74
-4
lines changed Original file line number Diff line number Diff line change @@ -28,14 +28,27 @@ func always(context.Context, string) bool {
28
28
}
29
29
30
30
type ldapTarget struct {
31
- localPoolRange * net.IPNet
32
- ldap * ldap.Pool
31
+ localPoolRange * net.IPNet
32
+ ldap * ldap.Pool
33
+ statuszServer * HijackedServer
34
+ unavailableServer * HijackedServer
33
35
}
34
36
35
37
func (l * ldapTarget ) HandleConn (netConn net.Conn ) {
36
38
var pool string
37
39
var err error
38
40
if conn , ok := netConn .(* tcpproxy.Conn ); ok {
41
+ switch conn .HostName {
42
+ case "proxy.scripts.scripts.mit.edu" :
43
+ // Special handling for proxy.scripts.scripts.mit.edu
44
+ l .statuszServer .HandleConn (netConn )
45
+ return
46
+ case "heartbeat.scripts.scripts.mit.edu" :
47
+ if nolvsPresent () {
48
+ l .unavailableServer .HandleConn (netConn )
49
+ return
50
+ }
51
+ }
39
52
pool , err = l .ldap .ResolvePool (conn .HostName )
40
53
if err != nil {
41
54
log .Printf ("resolving %q: %v" , conn .HostName , err )
@@ -87,8 +100,10 @@ func main() {
87
100
88
101
var p tcpproxy.Proxy
89
102
t := & ldapTarget {
90
- localPoolRange : ipnet ,
91
- ldap : ldapPool ,
103
+ localPoolRange : ipnet ,
104
+ ldap : ldapPool ,
105
+ statuszServer : NewHijackedServer (nil ),
106
+ unavailableServer : NewUnavailableServer (),
92
107
}
93
108
for _ , addr := range strings .Split (* httpAddrs , "," ) {
94
109
p .AddHTTPHostMatchRoute (addr , always , t )
Original file line number Diff line number Diff line change
1
+ package main
2
+
3
+ import (
4
+ "errors"
5
+ "net"
6
+ "net/http"
7
+ _ "net/http/pprof"
8
+ "os"
9
+ )
10
+
11
+ func nolvsPresent () bool {
12
+ if _ , err := os .Stat ("/etc/nolvs" ); err == nil {
13
+ return true
14
+ }
15
+ return false
16
+ }
17
+
18
+ type HijackedServer struct {
19
+ connCh chan net.Conn
20
+ }
21
+
22
+ func NewHijackedServer (handler http.Handler ) * HijackedServer {
23
+ s := & HijackedServer {
24
+ connCh : make (chan net.Conn ),
25
+ }
26
+ go http .Serve (s , handler )
27
+ return s
28
+ }
29
+
30
+ func (s * HijackedServer ) Accept () (net.Conn , error ) {
31
+ c , ok := <- s .connCh
32
+ if ok {
33
+ return c , nil
34
+ }
35
+ return nil , errors .New ("closed" )
36
+ }
37
+
38
+ func (s * HijackedServer ) Close () error {
39
+ close (s .connCh )
40
+ return nil
41
+ }
42
+
43
+ func (s * HijackedServer ) Addr () net.Addr {
44
+ return nil
45
+ }
46
+
47
+ func (s * HijackedServer ) HandleConn (c net.Conn ) {
48
+ s .connCh <- c
49
+ }
50
+
51
+ func NewUnavailableServer () * HijackedServer {
52
+ return NewHijackedServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
53
+ http .Error (w , "0 proxy nolvs" , http .StatusServiceUnavailable )
54
+ }))
55
+ }
You can’t perform that action at this time.
0 commit comments