agent/share/mode.go
2020-03-03 13:52:52 -05:00

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,
}
}