Skip to content

Commit

Permalink
[TASK] add console to backend
Browse files Browse the repository at this point in the history
  • Loading branch information
genofire committed May 30, 2017
1 parent 2e5873a commit 7aa5896
Show file tree
Hide file tree
Showing 10 changed files with 89 additions and 18 deletions.
6 changes: 4 additions & 2 deletions cmd/freifunkmanager/main.go
Expand Up @@ -25,6 +25,7 @@ var (
configFile string
config *configPackage.Config
nodes *runtime.Nodes
commands *runtime.Commands
yanicDialer *yanic.Dialer
stats *runtimeYanic.GlobalStats
)
Expand All @@ -38,14 +39,15 @@ func main() {
log.Log.Info("starting...")

sshmanager := ssh.NewManager(config.SSHPrivateKey)
nodes := runtime.NewNodes(config.StatePath, config.SSHInterface, sshmanager)
nodes = runtime.NewNodes(config.StatePath, config.SSHInterface, sshmanager)
commands = runtime.NewCommands(sshmanager)
nodesUpdateWorker := worker.NewWorker(time.Duration(3)*time.Minute, nodes.Updater)
nodesSaveWorker := worker.NewWorker(time.Duration(3)*time.Second, nodes.Saver)

go nodesUpdateWorker.Start()
go nodesSaveWorker.Start()

websocket.Start(nodes)
websocket.Start(nodes, commands)

if config.Yanic.Enable {
yanicDialer := yanic.Dial(config.Yanic.Type, config.Yanic.Address)
Expand Down
44 changes: 44 additions & 0 deletions runtime/cmd.go
@@ -0,0 +1,44 @@
package runtime

import (
"time"

"github.com/FreifunkBremen/freifunkmanager/ssh"
)

type Commands struct {
List map[string]*Command
mgmt *ssh.Manager
}

type Command struct {
ssh.List
Timestemp time.Time `json:"timestemp"`
ID string `json:"id"`
}

func NewCommands(mgmt *ssh.Manager) *Commands {
return &Commands{
mgmt: mgmt,
List: make(map[string]*Command),
}
}

func (cmds *Commands) AddCommand(c *Command) *Command {
cmd := mapCommand(cmds.mgmt, c)
cmds.List[cmd.ID] = cmd
return cmd
}

func mapCommand(mgmt *ssh.Manager, c *Command) *Command {
list := mgmt.CreateList(c.Command)
command := &Command{List: *list}
command.ID = c.ID
command.Timestemp = c.Timestemp
return command
}

func (cmd *Command) Run(f func()) {
cmd.List.Run()
f()
}
6 changes: 3 additions & 3 deletions ssh/list.go
Expand Up @@ -7,7 +7,7 @@ import (
)

type List struct {
cmd string `json:"cmd"`
Command string `json:"cmd"`
Clients map[string]*ListResult `json:"clients"`
sshManager *Manager
}
Expand All @@ -20,7 +20,7 @@ type ListResult struct {

func (m *Manager) CreateList(cmd string) *List {
list := &List{
cmd: cmd,
Command: cmd,
sshManager: m,
Clients: make(map[string]*ListResult),
}
Expand All @@ -42,7 +42,7 @@ func (l List) Run() {

func (l List) runlistelement(host string, client *ListResult, wg *sync.WaitGroup) {
defer wg.Done()
result, err := l.sshManager.run(host, client.ssh, l.cmd)
result, err := l.sshManager.run(host, client.ssh, l.Command)
client.Running = false
if err != nil {
client.WithError = true
Expand Down
7 changes: 6 additions & 1 deletion webroot/css/console.css
Expand Up @@ -26,11 +26,16 @@
width: 15%;
}
.console .cmd > div {
clear: both;
background-color: #ccc;
margin-bottom: 3px;
}
.console .cmd .status {
width: 15%;
height: 20px;
}
.console .cmd > div > div {
clear: both;
}
.console .cmd div .status {
width: 20px;
}
1 change: 1 addition & 0 deletions webroot/js/gui_console.js
Expand Up @@ -120,6 +120,7 @@ const guiConsole = {};

if (cmd.clients) {
Object.keys(cmd.clients).forEach((addr) => {
console.log(cmd, row, addr);
const clientEl = domlib.newAt(row.clientsContainer, 'div'),
clients = {
'host': domlib.newAt(clientEl, 'span'),
Expand Down
6 changes: 2 additions & 4 deletions webroot/js/socket.js
Expand Up @@ -36,9 +36,7 @@ let socket = {'readyState': 0};
}
break;
case 'cmd':
if (msg.body) {
store.updateCMD(msg.body);
}
store.updateCMD(msg.cmd);
break;
default:
notify.send('warn', `unable to identify message: ${raw}`);
Expand Down Expand Up @@ -69,7 +67,7 @@ let socket = {'readyState': 0};
function sendcmd (cmd) {
const notifyMsg = `Befehl '${cmd.cmd}' wird überall ausgeführt.`,
socketMsg = JSON.stringify({
'body': cmd,
'cmd': cmd,
'type': 'cmd'
});

Expand Down
21 changes: 19 additions & 2 deletions websocket/client.go
Expand Up @@ -2,8 +2,10 @@ package websocket

import (
"io"
"time"

"github.com/genofire/golang-lib/log"
"github.com/genofire/golang-lib/worker"
"golang.org/x/net/websocket"
)

Expand Down Expand Up @@ -53,23 +55,38 @@ func (c *Client) Close() {
func (c *Client) Listen() {
go c.listenWrite()
c.Write(&Message{Type: MessageTypeStats, Body: stats})
c.allNodes()
c.publishAllData()
c.listenRead()
}

func (c *Client) allNodes() {
func (c *Client) publishAllData() {
for _, node := range nodes.List {
c.Write(&Message{Type: MessageTypeSystemNode, Node: node})
}
for _, node := range nodes.Current {
c.Write(&Message{Type: MessageTypeCurrentNode, Node: node})
}
for _, cmd := range commands.List {
c.Write(&Message{Type: MessageTypeCommand, Command: cmd})
}
}

func (c *Client) handleMessage(msg *Message) {
switch msg.Type {
case MessageTypeSystemNode:
nodes.UpdateNode(msg.Node)
break
case MessageTypeCommand:
cmd := commands.AddCommand(msg.Command)
w := worker.NewWorker(time.Millisecond*300, func() {
SendAll(Message{Type: MessageTypeCommand, Command: cmd})
})
go w.Start()
go cmd.Run(func() {
w.Close()
SendAll(Message{Type: MessageTypeCommand, Command: cmd})
})
break
}
}

Expand Down
9 changes: 5 additions & 4 deletions websocket/msg.go
Expand Up @@ -3,14 +3,15 @@ package websocket
import "github.com/FreifunkBremen/freifunkmanager/runtime"

type Message struct {
Type string `json:"type"`
Body interface{} `json:"body,omitempty"`
Node *runtime.Node `json:"node,omitempty"`
Type string `json:"type"`
Body interface{} `json:"body,omitempty"`
Node *runtime.Node `json:"node,omitempty"`
Command *runtime.Command `json:"cmd,omitempty"`
}

const (
MessageTypeSystemNode = "system"
MessageTypeCurrentNode = "current"
MessageTypeStats = "stats"
MessageTypeCmd = "cmd"
MessageTypeCommand = "cmd"
)
4 changes: 3 additions & 1 deletion websocket/server.go
Expand Up @@ -16,9 +16,11 @@ var nodes *runtime.Nodes
var clients map[string]*Client
var clientsMutex sync.Mutex
var stats *runtimeYanic.GlobalStats
var commands *runtime.Commands

func Start(nodeBind *runtime.Nodes) {
func Start(nodeBind *runtime.Nodes, commandsBind *runtime.Commands) {
nodes = nodeBind
commands = commandsBind
clients = make(map[string]*Client)

http.Handle("/websocket", websocket.Handler(func(ws *websocket.Conn) {
Expand Down
3 changes: 2 additions & 1 deletion websocket/server_test.go
Expand Up @@ -10,8 +10,9 @@ import (
func TestStart(t *testing.T) {
assert := assert.New(t)
nodes := &runtime.Nodes{}
commands := &runtime.Commands{}
assert.Nil(clients)
Start(nodes)
Start(nodes, commands)
assert.NotNil(clients)
Close()
}

0 comments on commit 7aa5896

Please sign in to comment.