Experimensts with websockets over yamux failed. Now going to use a second connection to the server from the agent.
61 lines
1.5 KiB
Go
61 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"cidebug/pkg/converge"
|
|
"cidebug/pkg/websocketutil"
|
|
"fmt"
|
|
"log"
|
|
"net"
|
|
"net/http"
|
|
"regexp"
|
|
)
|
|
|
|
func parsePublicId(path string) (publicId string, _ error) {
|
|
pattern := regexp.MustCompile("^/[^/]+/([^/]+)$")
|
|
matches := pattern.FindStringSubmatch(path)
|
|
if len(matches) != 2 {
|
|
return "", fmt.Errorf("Invalid URL path '%s'", path)
|
|
}
|
|
return matches[1], nil
|
|
}
|
|
|
|
func main() {
|
|
|
|
admin := converge.NewAdmin()
|
|
registrationService := websocketutil.WebSocketService{
|
|
Handler: func(w http.ResponseWriter, r *http.Request, conn net.Conn) {
|
|
publicId, err := parsePublicId(r.URL.Path)
|
|
if err != nil {
|
|
log.Printf("Cannot parse public id from url: '%v'\n", err)
|
|
return
|
|
}
|
|
log.Printf("Got registration connection: '%s'\n", publicId)
|
|
err = admin.Register(publicId, conn)
|
|
if err != nil {
|
|
log.Printf("Error %v\n", err)
|
|
}
|
|
},
|
|
}
|
|
clientService := websocketutil.WebSocketService{
|
|
Handler: func(w http.ResponseWriter, r *http.Request, conn net.Conn) {
|
|
publicId, err := parsePublicId(r.URL.Path)
|
|
if err != nil {
|
|
log.Printf("Cannot parse public id from url: '%v'\n", err)
|
|
return
|
|
}
|
|
log.Printf("Got client connection: '%s'\n", publicId)
|
|
err = admin.Connect(publicId, conn)
|
|
if err != nil {
|
|
log.Printf("Error %v\n", err)
|
|
}
|
|
},
|
|
}
|
|
|
|
http.HandleFunc("/agent/", registrationService.Handle)
|
|
http.HandleFunc("/client/", clientService.Handle)
|
|
|
|
// Start HTTP server
|
|
fmt.Println("Rendez-vous server listening on :8000")
|
|
log.Fatal(http.ListenAndServe(":8000", nil))
|
|
}
|