99 "net/http"
1010 "os"
1111 "os/signal"
12- "sync"
1312 "syscall"
1413
1514 "github.com/openziti/zrok/environment"
@@ -18,14 +17,13 @@ import (
1817 "github.com/spf13/cobra"
1918)
2019
20+ // Service struct must match Hive Controller response
2121type Service struct {
2222 Name string `json:"name"`
2323 Port string `json:"port"`
2424 Token string `json:"token"`
2525}
2626
27- var controllerURL string
28-
2927var hiveConnectCmd = & cobra.Command {
3028 Use : "connect --hive <token>" ,
3129 Short : "Connect to all services in a Hive" ,
@@ -35,21 +33,14 @@ var hiveConnectCmd = &cobra.Command{
3533 log .Fatal ("must provide --hive token" )
3634 }
3735
38- if controllerURL == "" {
39- controllerURL = "http://localhost:8081"
40- }
41-
36+ // Load zrok root identity
4237 root , err := environment .LoadRoot ()
4338 if err != nil {
4439 log .Fatal (err )
4540 }
4641
47- << << << < HEAD
48- url := fmt .Sprintf ("%s/hives/services?hive=%s" , controllerURL , hiveToken )
49- == == == =
5042 // Fetch services from Hive Controller
5143 url := fmt .Sprintf ("%s/hives/services?hive=%s" , BaseURL , hiveToken )
52- >> >> >> > eb03ba59dbe0f48a9a05c705ffbfd12b477ec1dd
5344 resp , err := http .Get (url )
5445 if err != nil {
5546 log .Fatalf ("error querying hive controller: %v" , err )
@@ -71,77 +62,61 @@ var hiveConnectCmd = &cobra.Command{
7162 return
7263 }
7364
74- var wg sync.WaitGroup
75- var listeners []net.Listener
76-
65+ // Start listeners for each service
7766 for _ , svc := range services {
78- wg .Add (1 )
79- go func (s Service ) {
80- defer wg .Done ()
81- l , err := startLocalListener (s , root )
82- if err == nil {
83- listeners = append (listeners , l )
84- }
85- }(svc )
67+ go startLocalListener (svc , root )
8668 }
8769
88- // graceful shutdown
70+ // Keep running until Ctrl+C
71+ log .Println ("Connected to Hive! Press Ctrl+C to exit." )
8972 c := make (chan os.Signal , 1 )
9073 signal .Notify (c , os .Interrupt , syscall .SIGTERM )
9174 <- c
92-
93- log .Println ("Shutting down listeners..." )
94- for _ , l := range listeners {
95- _ = l .Close ()
96- }
9775 },
9876}
9977
100- func startLocalListener (svc Service , root env_core.Root ) (net.Listener , error ) {
78+ func startLocalListener (svc Service , root env_core.Root ) {
79+ // Create Access for this service
10180 acc , err := sdk .CreateAccess (root , & sdk.AccessRequest {ShareToken : svc .Token })
10281 if err != nil {
10382 log .Printf ("[%s] create access error: %v" , svc .Name , err )
104- return nil , err
83+ return
10584 }
10685 defer sdk .DeleteAccess (root , acc )
10786
10887 listener , err := net .Listen ("tcp" , "127.0.0.1:" + svc .Port )
10988 if err != nil {
11089 log .Printf ("[%s] listener error: %v" , svc .Name , err )
111- return nil , err
90+ return
11291 }
92+ defer listener .Close ()
11393
11494 log .Printf ("Service '%s' ready at http://127.0.0.1:%s" , svc .Name , svc .Port )
11595
116- go func () {
117- for {
118- client , err := listener .Accept ()
96+ for {
97+ client , err := listener .Accept ()
98+ if err != nil {
99+ log .Printf ("[%s] accept error: %v" , svc .Name , err )
100+ continue
101+ }
102+
103+ go func (c net.Conn ) {
104+ defer c .Close ()
105+
106+ remote , err := sdk .NewDialer (svc .Token , root )
119107 if err != nil {
120- log .Printf ("[%s] accept error: %v" , svc .Name , err )
108+ log .Printf ("[%s] dial error: %v" , svc .Name , err )
121109 return
122110 }
111+ defer remote .Close ()
123112
124- go func (c net.Conn ) {
125- defer c .Close ()
126-
127- remote , err := sdk .NewDialer (svc .Token , root )
128- if err != nil {
129- log .Printf ("[%s] dial error: %v" , svc .Name , err )
130- return
131- }
132- defer remote .Close ()
133-
134- log .Printf ("[%s] client connected" , svc .Name )
135- go io .Copy (remote , c )
136- io .Copy (c , remote )
137- }(client )
138- }
139- }()
140-
141- return listener , nil
113+ log .Printf ("[%s] client connected" , svc .Name )
114+ go io .Copy (remote , c )
115+ io .Copy (c , remote )
116+ }(client )
117+ }
142118}
143119
144120func init () {
145121 hiveConnectCmd .Flags ().String ("hive" , "" , "hive invite token" )
146- hiveConnectCmd .Flags ().StringVar (& controllerURL , "controller" , "http://localhost:8081" , "Hive controller URL" )
147122}
0 commit comments