diff --git a/alpine/packages/proxy/main.go b/alpine/packages/proxy/main.go index 1c5492d34..383a580f2 100644 --- a/alpine/packages/proxy/main.go +++ b/alpine/packages/proxy/main.go @@ -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) + } }