提交 b21873d8 编写于 作者: P peterq

add: slave 进程代码

上级 71c81675
ubuntu16.04/root.pan-light
package executor
import (
"github.com/peterq/pan-light/demo/realtime"
"github.com/peterq/pan-light/demo/slave/ui"
"github.com/peterq/pan-light/demo/slave/vnc-password"
"log"
"os"
"time"
)
type gson = map[string]interface{}
type executor struct {
hostName string
slaveName string
userSessionId string
order int64
}
func (e *executor) startX() {
defer rt.Emit("state.change", gson{
"state": "shutting",
})
log.Println("set password")
vnc_password.SetPassword(env("vnc_operate_pwd"), env("vnc_view_pwd"))
e.notifyHost("start.ok", gson{})
startTime := time.Now()
endTime := startTime.Add(5 * time.Minute)
endCh := time.After(5 * time.Minute)
rt.Emit("state.change", gson{
"state": "running",
"startTime": startTime.Unix(),
"endTime": endTime.Unix(),
})
rt.RegisterEventListener(map[string]func(data interface{}, room string){
"room.member.remove": func(data interface{}, room string) {
if room == "room.slave.all.user."+e.slaveName {
if data.(string) == e.userSessionId {
log.Println("operator.leave")
rt.Broadcast(room, "operator.leave", nil)
e.shutdown("该demo的操作用户已离开, 即将关闭本demo")
}
}
},
})
infoMap, err := rt.Call("session.public.info", gson{
"sessionIds": []string{e.userSessionId},
})
nickname := "nickname"
if err != nil {
nickname = "nickname err: " + err.Error()
} else {
nickname = infoMap.(gson)[e.userSessionId].(gson)["nickname"].(string)
}
// 启动面板
go func() {
ui.Init(int(endTime.Unix()), nickname)
}()
log.Println(os.Environ())
// 启动程序
go func() {
for {
runCmd("./deploy/linux", "sh", "./pc.sh")
time.Sleep(time.Second)
if endTime.Sub(time.Now()) < 10 {
break
}
}
}()
// 等待体验结束
<-endCh
e.shutdown("体验结束, 即将关闭本demo")
}
func (e *executor) notifyHost(event string, data gson) {
data["order"] = e.order
data["slave"] = e.slaveName
rt.Broadcast("room.host.slaves."+e.hostName, event, data)
}
func (e *executor) shutdown(msg string) {
ui.Shutdown(msg)
time.Sleep(5 * time.Second)
rt.Emit("state.change", gson{
"state": "shutting",
})
os.Exit(0)
}
var rt *realtime.RealTime
var exe *executor
package executor
import (
"github.com/peterq/pan-light/demo/realtime"
"log"
"os"
"os/exec"
"path/filepath"
"strconv"
)
func Start() {
log.Println("hello pan light, real_time connecting")
pwd := env("host_password")
os.Unsetenv("host_password")
rt = &realtime.RealTime{
WsAddr: env("ws_addr"),
Role: "slave",
HostName: env("host_name"),
HostPassWord: pwd,
SlaveName: env("slave_name"),
OnConnected: nil,
}
rt.Init()
order, _ := strconv.ParseInt(env("demo_order"), 10, 64)
exe = &executor{
hostName: rt.HostName,
slaveName: rt.SlaveName,
order: order,
userSessionId: env("demo_user"),
}
exe.startX()
}
func cmd(name string, arg ...string) *exec.Cmd {
cmd := exec.Command(name, arg...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Stdin = os.Stdin
return cmd
}
func runCmd(path, name string, arg ...string) {
c := cmd(name, arg...)
c.Dir, _ = filepath.Abs(path)
c.Run()
}
func env(key string) string {
v, ok := os.LookupEnv(key)
if !ok {
panic("this env var must be set: " + key)
}
return v
}
FROM queeno/ubuntu-desktop
MAINTAINER Peter Q <me@peterq.cn>
RUN sed -i 's#http://archive.ubuntu.com/#http://cn.archive.ubuntu.com/#' /etc/apt/sources.list;
RUN apt-get update
RUN apt-get install -y libqt5multimedia5-plugins
WORKDIR /root/pan-light
COPY root.pan-light/ /root/pan-light/
RUN sh /root/pan-light/fix-file.sh
CMD /root/pan-light/demo_instance_manager.sh
package ui
type syncHandler func(p map[string]interface{}) interface{}
type asyncHandler func(p map[string]interface{}, resolve func(interface{}),
reject func(interface{}), progress func(interface{}), qmlMsg chan interface{})
var syncRoutes []map[string]syncHandler
var asyncRoutes []map[string]asyncHandler
func syncMap(r map[string]syncHandler) {
syncRoutes = append(syncRoutes, r)
}
func asyncMap(r map[string]asyncHandler) {
asyncRoutes = append(asyncRoutes, r)
}
func RegisterAsync(regitser func(routes map[string]func(map[string]interface{},
func(interface{}), func(interface{}), func(interface{}), chan interface{}))) {
for _, r := range asyncRoutes {
r1 := map[string]func(map[string]interface{},
func(interface{}), func(interface{}), func(interface{}), chan interface{}){}
for p, h := range r {
r1[p] = h
}
regitser(r1)
}
}
func RegisterSync(register func(routes map[string]func(map[string]interface{}) interface{})) {
for _, r := range syncRoutes {
r1 := map[string]func(map[string]interface{}) interface{}{}
for p, h := range r {
r1[p] = h
}
register(r1)
}
}
package ui
import (
"log"
"path/filepath"
"plugin"
)
var endTime int
var nickname string
type gson = map[string]interface{}
func Init(t int, name string) {
endTime = t
nickname = name
log.SetFlags(log.LstdFlags | log.Lshortfile)
p, err := plugin.Open("./lib/gui-plugin.so")
if err != nil {
panic(err)
}
StartGui, err := p.Lookup("StartGui")
if err != nil {
panic(err)
}
SyncRouteRegister, err := p.Lookup("SyncRouteRegister")
if err != nil {
panic(err)
}
AsyncRouteRegister, err := p.Lookup("AsyncRouteRegister")
if err != nil {
panic(err)
}
RegisterAsync(AsyncRouteRegister.(func(routes map[string]func(map[string]interface{},
func(interface{}), func(interface{}), func(interface{}), chan interface{}))))
RegisterSync(SyncRouteRegister.(func(routes map[string]func(map[string]interface{}) interface{})))
StartGui.(func(rccFile, mainQml string))("./lib/qml.rcc", "qrc:/demo/main.qml")
}
var shutdownMagChan chan string
func Shutdown(msg string) {
shutdownMagChan <- msg
}
func init() {
shutdownMagChan = make(chan string)
syncMap(map[string]syncHandler{
"conf": func(p map[string]interface{}) interface{} {
return gson{
"endTime": endTime,
"nickname": nickname,
}
},
})
asyncMap(map[string]asyncHandler{
"shutdownMsg": func(p map[string]interface{}, resolve func(interface{}), reject func(interface{}), progress func(interface{}), qmlMsg chan interface{}) {
resolve(<-shutdownMagChan)
},
})
}
func abs(t string) string {
p, _ := filepath.Abs("./deploy/linux/" + t)
log.Println(p)
return p
}
package vnc_password
import (
"github.com/ThomasRooney/gexpect"
"log"
)
func SetPassword(op, view string) {
//return
child, err := gexpect.Spawn("vncpasswd")
if err != nil {
panic(err)
}
child.Expect("Password")
child.SendLine(op)
child.Expect("Verify")
child.SendLine(op)
child.Expect("Would you like to enter a view-only password")
child.SendLine("y")
child.Expect("Password")
child.SendLine(view)
child.Expect("Verify")
child.SendLine(view)
child.Interact()
child.Close()
log.Println(op, view)
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册