summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rhctl/switch_control.go47
-rw-r--r--src/rhctl/telnet.go85
2 files changed, 123 insertions, 9 deletions
diff --git a/src/rhctl/switch_control.go b/src/rhctl/switch_control.go
index 40dd788..b48ac07 100644
--- a/src/rhctl/switch_control.go
+++ b/src/rhctl/switch_control.go
@@ -21,9 +21,48 @@
package main
+type CommandType uint8
+
+const (
+ CmdStatus CommandType = iota
+ CmdListen
+ CmdServer
+ CmdSwitch
+)
+
+func (c CommandType) String() string {
+ switch c {
+ case CmdStatus:
+ return "status"
+ case CmdListen:
+ return "listen"
+ case CmdServer:
+ return "server"
+ case CmdSwitch:
+ return "switch"
+ }
+ return "unknown"
+}
+
+type Command struct {
+ Type CommandType
+ args []string
+}
+
type SwitchControl struct {
- sw *AudioSwitch
- servers []*PlayoutServer
+ sw *AudioSwitch
+ servers []*PlayoutServer
+ Commands chan *Command
+}
+
+func (ctrl *SwitchControl) handleCommand(cmd *Command) {
+ rhdl.Printf("Telnet: got command: %+v", cmd)
+ switch cmd.Type {
+ case CmdStatus:
+ case CmdListen:
+ case CmdServer:
+ case CmdSwitch:
+ }
}
func handleServer(in <-chan ServerStatus, out chan<- ServerStatus) {
@@ -52,8 +91,9 @@ func (ctrl *SwitchControl) Run() {
case status := <-serverUpdates:
rhdl.Printf("got server status update: %+v", status)
// TODO: recalculate overall status and send out commands to switch
+ case cmd := <-ctrl.Commands:
+ ctrl.handleCommand(cmd)
}
- // TODO: add handler for requests from control clients
}
}
@@ -61,5 +101,6 @@ func SwitchControlInit(conf *Config, sw *AudioSwitch, servers []*PlayoutServer)
ctrl = &SwitchControl{}
ctrl.sw = sw
ctrl.servers = servers
+ ctrl.Commands = make(chan *Command, 8)
return
}
diff --git a/src/rhctl/telnet.go b/src/rhctl/telnet.go
index 3cc2b44..8d73846 100644
--- a/src/rhctl/telnet.go
+++ b/src/rhctl/telnet.go
@@ -29,13 +29,82 @@ type TelnetInterface struct {
server *telgo.Server
}
-func status(c *telgo.Client, args []string, ctrl *SwitchControl) bool {
- // TODO: get status from ctrl
- c.Sayln("not yet implemented!")
+func telnetStatus(c *telgo.Client, args []string, ctrl *SwitchControl) bool {
+ ctrl.Commands <- &Command{Type: CmdStatus}
+ // TODO: implement this
return false
}
-func quit(c *telgo.Client, args []string) bool {
+func telnetListen(c *telgo.Client, args []string, ctrl *SwitchControl) bool {
+ ctrl.Commands <- &Command{Type: CmdListen}
+ // TODO: implement this
+ return false
+}
+
+func telnetServer(c *telgo.Client, args []string, ctrl *SwitchControl) bool {
+ ctrl.Commands <- &Command{Type: CmdServer}
+ // TODO: implement this
+ return false
+}
+
+func telnetSwitch(c *telgo.Client, args []string, ctrl *SwitchControl) bool {
+ ctrl.Commands <- &Command{Type: CmdSwitch}
+ // TODO: implement this
+ return false
+}
+
+func telnetHelp(c *telgo.Client, args []string) bool {
+ switch len(args) {
+ case 2:
+ switch args[1] {
+ case "quit":
+ c.Sayln("usage: quit")
+ c.Sayln(" terminates the client connection. You may also use Ctrl-D to do this.")
+ return false
+ case "help":
+ c.Sayln("usage: help [ <cmd> ]")
+ c.Sayln(" prints command overview or detailed info to <cmd>.")
+ return false
+ case "status":
+ c.Sayln("usage: status")
+ c.Sayln(" show the status of the switch and servers")
+ return false
+ case "listen":
+ c.Sayln("usage: listen [ <type> ]")
+ c.Sayln(" subscribe to messages of type <type>. The following types are allowed:")
+ c.Sayln(" - status audio input/output mapping changes")
+ c.Sayln(" - gpi general purpose input status messages")
+ c.Sayln(" - oc open-collector status messages")
+ c.Sayln(" - relay relay status messages")
+ c.Sayln(" - silence status of the silence detector")
+ c.Sayln("")
+ c.Sayln(" if you omit the type this client you will be subscribed to all types.")
+ return false
+ case "server":
+ c.Sayln("usage: server <name>")
+ c.Sayln(" switch to the server of name <name>. If the given server name does not")
+ c.Sayln(" exist or is dead, the switch-over will be denied")
+ return false
+ case "switch":
+ c.Sayln("usage: switch <cmd> [ [ <arg1> ] ... ]")
+ c.Sayln(" send commands to tha audio switch directley.")
+ return false
+ }
+ fallthrough
+ default:
+ c.Sayln("usage: <cmd> [ [ <arg1> ] ... ]")
+ c.Sayln(" available commands:")
+ c.Sayln(" quit close connection (or use Ctrl-D)")
+ c.Sayln(" help [ <cmd> ] print this, or help for specific command")
+ c.Sayln(" status show status of switch and all servers")
+ c.Sayln(" listen [ <type> ] add listener for messages of type <type>")
+ c.Sayln(" server <name> switch to server <name>")
+ c.Sayln(" switch <cmd> [ [ <arg1> ] ... ] send command to switch")
+ }
+ return false
+}
+
+func telnetQuit(c *telgo.Client, args []string) bool {
return true
}
@@ -50,8 +119,12 @@ func TelnetInit(conf *Config, ctrl *SwitchControl) (telnet *TelnetInterface) {
telnet = &TelnetInterface{}
cmdlist := make(telgo.CmdList)
- cmdlist["status"] = func(c *telgo.Client, args []string) bool { return status(c, args, ctrl) }
- cmdlist["quit"] = quit
+ cmdlist["status"] = func(c *telgo.Client, args []string) bool { return telnetStatus(c, args, ctrl) }
+ cmdlist["listen"] = func(c *telgo.Client, args []string) bool { return telnetListen(c, args, ctrl) }
+ cmdlist["server"] = func(c *telgo.Client, args []string) bool { return telnetServer(c, args, ctrl) }
+ cmdlist["switch"] = func(c *telgo.Client, args []string) bool { return telnetSwitch(c, args, ctrl) }
+ cmdlist["help"] = telnetHelp
+ cmdlist["quit"] = telnetQuit
telnet.server = telgo.NewServer(conf.Clients.Telnet.Address, "rhctl> ", cmdlist, ctrl)