proxy: set up and tear down host port forwards

This patch uses the /port 9P filesystem to set up and tear down port
forwards on the host.

Signed-off-by: David Scott <dave.scott@docker.com>
This commit is contained in:
David Scott 2016-04-03 15:28:20 +01:00
parent 00ff8897a7
commit e8fa5ace35

View File

@ -1,10 +1,13 @@
package main
import (
"errors"
"fmt"
"log"
"net"
"os"
"pkg/proxy"
"strings"
)
func main() {
@ -27,10 +30,50 @@ func main() {
}
func exposePort(host net.Addr) error {
log.Printf("exposePort %#v\n", host)
name := host.String()
log.Printf("exposePort %s\n", name)
err := os.Mkdir("/port/"+name, 0)
if err != nil {
log.Printf("Failed to mkdir /port/%s: %#v\n", name, err)
return err
}
ctl, err := os.OpenFile("/port/"+name+"/ctl", os.O_RDWR, 0)
if err != nil {
log.Printf("Failed to open /port/%s/ctl: %#v\n", name, err)
return err
}
_, err = ctl.WriteString(fmt.Sprintf("%s:%s", name, name))
if err != nil {
log.Printf("Failed to open /port/%s/ctl: %#v\n", name, err)
return err
}
_, err = ctl.Seek(0, 0)
if err != nil {
log.Printf("Failed to seek on /port/%s/ctl: %#v\n", name, err)
return err
}
results := make([]byte, 100)
count, err := ctl.Read(results)
if err != nil {
log.Printf("Failed to read from /port/%s/ctl: %#v\n", name, err)
return err
}
response := string(results[0:count])
if strings.HasPrefix(response, "ERROR ") {
os.Remove("/port/" + name + "/ctl")
response = strings.Trim(response[6:], " \t\r\n")
return errors.New(response)
}
// TODO: consider whether close/clunk of ctl would be a better tear down
// signal
return nil
}
func unexposePort(host net.Addr) {
log.Printf("unexposePort %#v\n", host)
name := host.String()
log.Printf("unexposePort %s\n", name)
err := os.Remove("/port/" + name)
if err != nil {
log.Printf("Failed to remove /port/%s: %#v\n", name, err)
}
}