- Introduce Executor for remote container orchestration - Add Container lifecycle management with tmux - Support Alpine and Alpine Python base images - Auto-install core dependencies on remote node - Include full usage examples and updated README
207 lines
4.3 KiB
V
207 lines
4.3 KiB
V
module tmux
|
|
|
|
import freeflowuniverse.herolib.osal.core as osal
|
|
import freeflowuniverse.herolib.core.texttools
|
|
import freeflowuniverse.herolib.core.redisclient
|
|
// import freeflowuniverse.herolib.session
|
|
import os
|
|
import time
|
|
import freeflowuniverse.herolib.ui.console
|
|
|
|
@[heap]
|
|
pub struct Tmux {
|
|
pub mut:
|
|
sessions []&Session
|
|
sessionid string // unique link to job
|
|
redis &redisclient.Redis @[skip] // Redis client for command state tracking
|
|
}
|
|
|
|
// get session (session has windows) .
|
|
// returns none if not found
|
|
pub fn (mut t Tmux) session_get(name_ string) !&Session {
|
|
name := texttools.name_fix(name_)
|
|
for s in t.sessions {
|
|
if s.name == name {
|
|
return s
|
|
}
|
|
}
|
|
return error('Can not find session with name: \'${name_}\', out of loaded sessions.')
|
|
}
|
|
|
|
pub fn (mut t Tmux) session_exist(name_ string) bool {
|
|
name := texttools.name_fix(name_)
|
|
t.session_get(name) or { return false }
|
|
return true
|
|
}
|
|
|
|
pub fn (mut t Tmux) session_delete(name_ string) ! {
|
|
if !(t.session_exist(name_)) {
|
|
return
|
|
}
|
|
name := texttools.name_fix(name_)
|
|
mut i := 0
|
|
for mut s in t.sessions {
|
|
if s.name == name {
|
|
s.stop()!
|
|
break
|
|
}
|
|
i += 1
|
|
}
|
|
t.sessions.delete(i)
|
|
}
|
|
|
|
@[params]
|
|
pub struct SessionCreateArgs {
|
|
pub mut:
|
|
name string @[required]
|
|
reset bool
|
|
}
|
|
|
|
// create session, if reset will re-create
|
|
pub fn (mut t Tmux) session_create(args SessionCreateArgs) !&Session {
|
|
name := texttools.name_fix(args.name)
|
|
if !(t.session_exist(name)) {
|
|
$if debug {
|
|
console.print_header(' tmux - create session: ${args}')
|
|
}
|
|
mut s2 := Session{
|
|
tmux: t // reference back
|
|
name: name
|
|
}
|
|
s2.create()!
|
|
t.sessions << &s2
|
|
}
|
|
mut s := t.session_get(name)!
|
|
if args.reset {
|
|
$if debug {
|
|
console.print_header(' tmux - session ${name} will be restarted.')
|
|
}
|
|
s.restart()!
|
|
}
|
|
t.scan()!
|
|
return s
|
|
}
|
|
|
|
@[params]
|
|
pub struct TmuxNewArgs {
|
|
pub:
|
|
sessionid string
|
|
}
|
|
|
|
// return tmux instance
|
|
pub fn new(args TmuxNewArgs) !Tmux {
|
|
// Initialize Redis client for command state tracking
|
|
mut redis := redisclient.core_get()!
|
|
|
|
mut t := Tmux{
|
|
sessionid: args.sessionid
|
|
redis: redis
|
|
}
|
|
// t.load()!
|
|
t.scan()!
|
|
return t
|
|
}
|
|
|
|
@[params]
|
|
pub struct WindowNewArgs {
|
|
pub mut:
|
|
session_name string = 'main'
|
|
name string
|
|
cmd string
|
|
env map[string]string
|
|
reset bool
|
|
}
|
|
|
|
pub fn (mut t Tmux) window_new(args WindowNewArgs) !&Window {
|
|
// Get or create session
|
|
mut session := if t.session_exist(args.session_name) {
|
|
t.session_get(args.session_name)!
|
|
} else {
|
|
t.session_create(name: args.session_name)!
|
|
}
|
|
|
|
// Create window in session
|
|
return session.window_new(
|
|
name: args.name
|
|
cmd: args.cmd
|
|
env: args.env
|
|
reset: args.reset
|
|
)!
|
|
}
|
|
|
|
pub fn (mut t Tmux) stop() ! {
|
|
$if debug {
|
|
console.print_debug('Stopping tmux...')
|
|
}
|
|
|
|
t.sessions = []&Session{}
|
|
t.scan()!
|
|
|
|
for _, mut session in t.sessions {
|
|
session.stop()!
|
|
}
|
|
|
|
cmd := 'tmux kill-server'
|
|
_ := osal.exec(cmd: cmd, stdout: false, name: 'tmux_kill_server', ignore_error: true) or {
|
|
panic('bug')
|
|
}
|
|
os.log('TMUX - All sessions stopped .')
|
|
}
|
|
|
|
pub fn (mut t Tmux) start() ! {
|
|
cmd := 'tmux new-sess -d -s main'
|
|
_ := osal.exec(cmd: cmd, stdout: false, name: 'tmux_start') or {
|
|
return error("Can't execute ${cmd} \n${err}")
|
|
}
|
|
// scan and add default bash window created with session init
|
|
time.sleep(time.Duration(100 * time.millisecond))
|
|
t.scan()!
|
|
}
|
|
|
|
// print list of tmux sessions
|
|
pub fn (mut t Tmux) list_print() {
|
|
// os.log('TMUX - Start listing ....')
|
|
for _, session in t.sessions {
|
|
for _, window in session.windows {
|
|
console.print_debug(window)
|
|
}
|
|
}
|
|
}
|
|
|
|
// get all windows as found in all sessions
|
|
pub fn (mut t Tmux) windows_get() []&Window {
|
|
mut res := []&Window{}
|
|
// os.log('TMUX - Start listing ....')
|
|
for _, session in t.sessions {
|
|
for _, window in session.windows {
|
|
res << window
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
|
|
// checks whether tmux server is running
|
|
pub fn (mut t Tmux) is_running() !bool {
|
|
res := os.execute('tmux info')
|
|
if res.exit_code != 0 {
|
|
if is_tmux_server_not_running_error(res.output) {
|
|
// console.print_debug(" TMUX NOT RUNNING")
|
|
return false
|
|
}
|
|
if res.output.contains('no current client') {
|
|
return true
|
|
}
|
|
return error('could not execute tmux info.\n${res.output}')
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
pub fn (mut t Tmux) str() string {
|
|
mut out := '# Tmux\n\n'
|
|
for s in t.sessions {
|
|
out += '${*s}\n'
|
|
}
|
|
return out
|
|
}
|