mirror of
https://github.com/vale981/agent
synced 2025-03-05 09:31:39 -05:00
178 lines
6.3 KiB
Go
178 lines
6.3 KiB
Go
package share
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
|
|
"github.com/fatih/color"
|
|
|
|
"github.com/indihub-space/agent/hostutils"
|
|
"github.com/indihub-space/agent/lib"
|
|
"github.com/indihub-space/agent/proto/indihub"
|
|
"github.com/indihub-space/agent/proxy"
|
|
)
|
|
|
|
type Mode struct {
|
|
indiHubClient indihub.INDIHubClient
|
|
regInfo *indihub.RegisterInfo
|
|
|
|
indiServerAddr string
|
|
phd2ServerAddr string
|
|
|
|
addrData []proxy.PublicServerAddr
|
|
|
|
stopCh chan struct{}
|
|
status string
|
|
mode string
|
|
}
|
|
|
|
func NewMode(indiHubClient indihub.INDIHubClient, regInfo *indihub.RegisterInfo, indiServerAddr string, phd2ServerAddr string, mode string) *Mode {
|
|
return &Mode{
|
|
indiHubClient: indiHubClient,
|
|
regInfo: regInfo,
|
|
indiServerAddr: indiServerAddr,
|
|
phd2ServerAddr: phd2ServerAddr,
|
|
mode: mode,
|
|
addrData: []proxy.PublicServerAddr{},
|
|
stopCh: make(chan struct{}, 1),
|
|
}
|
|
}
|
|
|
|
func (m *Mode) Start() {
|
|
// main equipment sharing mode
|
|
if m.mode == lib.ModeRobotic {
|
|
log.Println("'robotic' parameter was provided. Your session is in robotic-mode: equipment sharing is not available")
|
|
}
|
|
// open INDI server tunnel
|
|
log.Println("Starting INDI-Server in the cloud...")
|
|
indiServTunnel, err := m.indiHubClient.INDIServer(
|
|
context.Background(),
|
|
)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
log.Println("...OK")
|
|
|
|
indiFilterConf := &hostutils.INDIFilterConfig{} // TODO: add reading config
|
|
indiFilter := hostutils.NewINDIFilter(indiFilterConf)
|
|
indiServerProxy := proxy.New("INDI-Server", m.indiServerAddr, indiServTunnel, indiFilter)
|
|
|
|
// start PHD2 server proxy if specified
|
|
var phd2ServerProxy *proxy.TcpProxy
|
|
if m.phd2ServerAddr != "" {
|
|
// open PHD2 server tunnel
|
|
log.Println("Starting PHD2-Server in the cloud...")
|
|
phd2ServTunnel, err := m.indiHubClient.PHD2Server(
|
|
context.Background(),
|
|
)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
log.Println("...OK")
|
|
phd2ServerProxy = proxy.New("PHD2-Server", m.phd2ServerAddr, phd2ServTunnel, nil)
|
|
}
|
|
|
|
go func() {
|
|
<-m.stopCh
|
|
|
|
log.Printf("Closing %s-session\n", m.mode)
|
|
|
|
// close connections to tunnels
|
|
indiServTunnel.CloseSend()
|
|
if phd2ServerProxy != nil {
|
|
phd2ServerProxy.Tunnel.CloseSend()
|
|
}
|
|
|
|
// close connections to local INDI-server and PHD2-Server
|
|
indiServerProxy.Close()
|
|
if phd2ServerProxy != nil {
|
|
phd2ServerProxy.Close()
|
|
}
|
|
}()
|
|
|
|
serverAddrChan := make(chan proxy.PublicServerAddr, 3)
|
|
|
|
// INDI Server Proxy start
|
|
go indiServerProxy.Start(serverAddrChan, m.regInfo.SessionID, m.regInfo.SessionIDPublic)
|
|
sAddr := <-serverAddrChan
|
|
if m.mode != lib.ModeRobotic {
|
|
m.addrData = append(m.addrData, sAddr)
|
|
}
|
|
|
|
// PHD2 Server proxy start
|
|
if m.phd2ServerAddr != "" {
|
|
go phd2ServerProxy.Start(serverAddrChan, m.regInfo.SessionID, m.regInfo.SessionIDPublic)
|
|
sAddr := <-serverAddrChan
|
|
if m.mode != lib.ModeRobotic {
|
|
m.addrData = append(m.addrData, sAddr)
|
|
}
|
|
}
|
|
|
|
c := color.New(color.FgCyan)
|
|
gc := color.New(color.FgGreen)
|
|
yc := color.New(color.FgYellow)
|
|
if m.mode != lib.ModeRobotic {
|
|
c.Println()
|
|
c.Println(" ************************************************************")
|
|
c.Println(" * INDIHUB public address list!! *")
|
|
c.Println(" ************************************************************")
|
|
c.Println(" ")
|
|
for _, sAddr := range m.addrData {
|
|
gc.Printf(" %s: %s\n", sAddr.Name, sAddr.Addr)
|
|
}
|
|
c.Println(" ")
|
|
c.Println(" ************************************************************")
|
|
c.Println()
|
|
c.Println(" Please provide your guest with this information:")
|
|
c.Println()
|
|
c.Println(" 1. Public address list from the above")
|
|
c.Println(" 2. Focal length and aperture of your main telescope")
|
|
c.Println(" 3. Focal length and aperture of your guiding telescope")
|
|
c.Println(" 4. Type of guiding you use: PHD2 or guiding via camera")
|
|
c.Println(" 5. Names of your imaging camera and guiding cameras")
|
|
c.Println()
|
|
yc.Println(" NOTE: These public addresses will be available ONLY until")
|
|
yc.Println(" agent is running! (Ctrl+C will stop the session)")
|
|
c.Println()
|
|
} else {
|
|
c.Println()
|
|
c.Println(" ************************************************************")
|
|
c.Println(" * INDIHUB robotic-session started!! *")
|
|
c.Println(" ************************************************************")
|
|
c.Println(" ")
|
|
}
|
|
|
|
m.status = "running"
|
|
}
|
|
|
|
func (m *Mode) Stop() {
|
|
m.status = "stopped"
|
|
m.stopCh <- struct{}{}
|
|
|
|
c := color.New(color.FgCyan)
|
|
rc := color.New(color.FgMagenta)
|
|
c.Println()
|
|
c.Println(" ************************************************************")
|
|
c.Println(" * INDIHUB session finished!! *")
|
|
c.Println(" ************************************************************")
|
|
c.Println(" ")
|
|
if m.mode != lib.ModeRobotic {
|
|
for _, sAddr := range m.addrData {
|
|
rc.Printf(" %s: %s - CLOSED!!\n", sAddr.Name, sAddr.Addr)
|
|
}
|
|
} else {
|
|
c.Println(" * INDIHUB robotic-session finished. *")
|
|
c.Println(" * Thank you for your contribution! *")
|
|
}
|
|
c.Println(" ")
|
|
c.Println(" ************************************************************")
|
|
|
|
m.addrData = []proxy.PublicServerAddr{}
|
|
}
|
|
|
|
func (m *Mode) GetStatus() map[string]interface{} {
|
|
return map[string]interface{}{
|
|
"status": m.status,
|
|
"publicEndpoints": m.addrData,
|
|
}
|
|
}
|