...
This commit is contained in:
@@ -58,5 +58,5 @@ mut cl := hetznermanager.get(name: 'main')!
|
|||||||
|
|
||||||
// n.shell("")!
|
// n.shell("")!
|
||||||
|
|
||||||
cl.ubuntu_install(name: 'kristof2', wait: true, hero_install: true, sshkey_name: 'kristof')!
|
// cl.ubuntu_install(name: 'kristof2', wait: true, hero_install: true, sshkey_name: 'kristof')!
|
||||||
cl.ubuntu_install(name: 'kristof20', wait: true, hero_install: true, sshkey_name: 'kristof')!
|
cl.ubuntu_install(name: 'kristof20', wait: true, hero_install: true, sshkey_name: 'kristof')!
|
||||||
|
|||||||
@@ -131,37 +131,37 @@ pub fn play(mut plbook PlayBook) ! {
|
|||||||
|
|
||||||
// Handle access token generation
|
// Handle access token generation
|
||||||
mut token_create_actions := plbook.find(filter: 'livekit.token_create')!
|
mut token_create_actions := plbook.find(filter: 'livekit.token_create')!
|
||||||
for mut action in token_create_actions {
|
// for mut action in token_create_actions {
|
||||||
mut p := action.params
|
// mut p := action.params
|
||||||
|
|
||||||
client_name := texttools.name_fix(p.get_default('client', 'default')!)
|
// client_name := texttools.name_fix(p.get_default('client', 'default')!)
|
||||||
identity := p.get('identity')!
|
// identity := p.get('identity')!
|
||||||
name := p.get_default('name', identity)!
|
// name := p.get_default('name', identity)!
|
||||||
room := p.get_default('room', '')!
|
// room := p.get_default('room', '')!
|
||||||
ttl := p.get_int_default('ttl', 21600)!
|
// ttl := p.get_int_default('ttl', 21600)!
|
||||||
can_publish := p.get_default_false('can_publish')
|
// can_publish := p.get_default_false('can_publish')
|
||||||
can_subscribe := p.get_default_true('can_subscribe')
|
// can_subscribe := p.get_default_true('can_subscribe')
|
||||||
can_publish_data := p.get_default_false('can_publish_data')
|
// can_publish_data := p.get_default_false('can_publish_data')
|
||||||
|
|
||||||
mut client := get(name: client_name)!
|
// mut client := get(name: client_name)!
|
||||||
|
|
||||||
mut token := client.new_access_token(
|
// mut token := client.new_access_token(
|
||||||
identity: identity
|
// identity: identity
|
||||||
name: name
|
// name: name
|
||||||
ttl: ttl
|
// ttl: ttl
|
||||||
)!
|
// )!
|
||||||
|
|
||||||
token.add_video_grant(VideoGrant{
|
// token.add_video_grant(VideoGrant{
|
||||||
room: room
|
// room: room
|
||||||
room_join: true
|
// room_join: true
|
||||||
can_publish: can_publish
|
// can_publish: can_publish
|
||||||
can_subscribe: can_subscribe
|
// can_subscribe: can_subscribe
|
||||||
can_publish_data: can_publish_data
|
// can_publish_data: can_publish_data
|
||||||
})
|
// })
|
||||||
|
|
||||||
jwt := token.to_jwt()!
|
// jwt := token.to_jwt()!
|
||||||
console.print_header('Access token generated for "${identity}"')
|
// console.print_header('Access token generated for "${identity}"')
|
||||||
console.print_debug('Token: ${jwt}')
|
// console.print_debug('Token: ${jwt}')
|
||||||
action.done = true
|
// action.done = true
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,10 +26,10 @@ pub fn ping(args PingArgs) !bool {
|
|||||||
// if platform_ == .windows {
|
// if platform_ == .windows {
|
||||||
// cmd += ' -n 1 -w 1000'
|
// cmd += ' -n 1 -w 1000'
|
||||||
if platform_ == .osx {
|
if platform_ == .osx {
|
||||||
cmd += ' -c 1 -t 2'
|
cmd += ' -c1 -t2'
|
||||||
} else {
|
} else {
|
||||||
// linux
|
// linux
|
||||||
cmd += ' -c 1 -w 2'
|
cmd += ' -c1 -w2'
|
||||||
}
|
}
|
||||||
cmd += ' ${args.address}'
|
cmd += ' ${args.address}'
|
||||||
if args.nr_ok > args.nr_ping {
|
if args.nr_ok > args.nr_ping {
|
||||||
@@ -38,12 +38,11 @@ pub fn ping(args PingArgs) !bool {
|
|||||||
for _ in 0 .. math.max(1, args.retry) {
|
for _ in 0 .. math.max(1, args.retry) {
|
||||||
mut nrerrors := 0
|
mut nrerrors := 0
|
||||||
for _ in 0 .. args.nr_ping {
|
for _ in 0 .. args.nr_ping {
|
||||||
// console.print_debug(cmd)
|
|
||||||
res := os.execute(cmd)
|
res := os.execute(cmd)
|
||||||
if res.exit_code > 0 {
|
if res.exit_code > 0 {
|
||||||
nrerrors += 1
|
nrerrors += 1
|
||||||
}
|
}
|
||||||
// println(res)
|
console.print_debug("${cmd} ${res.exit_code} ${nrerrors}")
|
||||||
}
|
}
|
||||||
successes := args.nr_ping - nrerrors
|
successes := args.nr_ping - nrerrors
|
||||||
if successes >= args.nr_ok {
|
if successes >= args.nr_ok {
|
||||||
@@ -197,7 +196,7 @@ pub fn ssh_wait(args TcpPortTestArgs) ! {
|
|||||||
run_time = time.now().unix_milli()
|
run_time = time.now().unix_milli()
|
||||||
|
|
||||||
errmsg, res := ssh_testrun_internal(args)!
|
errmsg, res := ssh_testrun_internal(args)!
|
||||||
console.print_debug(errmsg)
|
// console.print_debug(errmsg)
|
||||||
|
|
||||||
if run_time > start_time + args.timeout {
|
if run_time > start_time + args.timeout {
|
||||||
return error(errmsg)
|
return error(errmsg)
|
||||||
@@ -211,7 +210,8 @@ pub fn ssh_wait(args TcpPortTestArgs) ! {
|
|||||||
|
|
||||||
fn ssh_testrun_internal(args TcpPortTestArgs) !(string, SSHResult) {
|
fn ssh_testrun_internal(args TcpPortTestArgs) !(string, SSHResult) {
|
||||||
cmd := '
|
cmd := '
|
||||||
ssh -o BatchMode=yes -o ConnectTimeout=3 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -q "${args.address}" exit
|
set -ex
|
||||||
|
ssh -o BatchMode=yes -o ConnectTimeout=3 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -q root@${args.address} exit
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
echo "OK: SSH works"
|
echo "OK: SSH works"
|
||||||
exit 0
|
exit 0
|
||||||
@@ -233,10 +233,11 @@ fn ssh_testrun_internal(args TcpPortTestArgs) !(string, SSHResult) {
|
|||||||
fi
|
fi
|
||||||
echo "ERROR: Host unreachable, over ping and ssh"
|
echo "ERROR: Host unreachable, over ping and ssh"
|
||||||
exit 3
|
exit 3
|
||||||
' // console.print_debug('ssh test cmd: ${cmd}')
|
'
|
||||||
|
|
||||||
res := exec(cmd: cmd, ignore_error: true, stdout: false, debug: false)!
|
res := exec(cmd: cmd, ignore_error: true, stdout: false, debug: false)!
|
||||||
// console.print_debug('ssh test result: ${res}')
|
// console.print_debug('ssh test ${res.exit_code}: ===== cmd:\n${cmd}\n=====\n${res.output}')
|
||||||
|
|
||||||
if res.exit_code == 0 {
|
if res.exit_code == 0 {
|
||||||
return res.output, SSHResult.ok
|
return res.output, SSHResult.ok
|
||||||
} else if res.exit_code == 1 {
|
} else if res.exit_code == 1 {
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ pub fn (mut h HetznerManager) connection() !&httpconnection.HTTPConnection {
|
|||||||
|
|
||||||
fn obj_init(mycfg_ HetznerManager) !HetznerManager {
|
fn obj_init(mycfg_ HetznerManager) !HetznerManager {
|
||||||
mut mycfg := mycfg_
|
mut mycfg := mycfg_
|
||||||
|
mycfg.whitelist = mycfg.whitelist.map(it.trim_space())
|
||||||
return mycfg
|
return mycfg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
19
lib/virt/hetznermanager/protection.v
Normal file
19
lib/virt/hetznermanager/protection.v
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
module hetznermanager
|
||||||
|
|
||||||
|
import freeflowuniverse.herolib.core.texttools
|
||||||
|
import time
|
||||||
|
import freeflowuniverse.herolib.ui.console
|
||||||
|
import freeflowuniverse.herolib.osal.core as osal
|
||||||
|
import freeflowuniverse.herolib.builder
|
||||||
|
|
||||||
|
|
||||||
|
pub fn (mut h HetznerManager) check_whitelist(name string)! {
|
||||||
|
|
||||||
|
if whitelist.len == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !whitelist.contains(name) {
|
||||||
|
return error('Server ${name} is not whitelisted')
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -38,6 +38,7 @@ pub fn (mut h HetznerManager) server_rescue(args_ ServerRescueArgs) !ServerInfoD
|
|||||||
for _ in 0 .. args_.retry - 1 {
|
for _ in 0 .. args_.retry - 1 {
|
||||||
return h.server_rescue_internal(args_) or { continue }
|
return h.server_rescue_internal(args_) or { continue }
|
||||||
}
|
}
|
||||||
|
console.print_header('server ${args_.name} failed to rescue we retry: now ${args_.retry} attempts')
|
||||||
}
|
}
|
||||||
return h.server_rescue_internal(args_)!
|
return h.server_rescue_internal(args_)!
|
||||||
}
|
}
|
||||||
@@ -46,6 +47,8 @@ fn (mut h HetznerManager) server_rescue_internal(args_ ServerRescueArgs) !Server
|
|||||||
mut args := args_
|
mut args := args_
|
||||||
mut serverinfo := h.server_info_get(id: args.id, name: args.name)!
|
mut serverinfo := h.server_info_get(id: args.id, name: args.name)!
|
||||||
|
|
||||||
|
os.execute_opt('ssh-keygen -R ${serverinfo.server_ip}')!
|
||||||
|
|
||||||
if serverinfo.rescue && !args.reset {
|
if serverinfo.rescue && !args.reset {
|
||||||
if osal.ssh_test(address: serverinfo.server_ip, port: 22)! == .ok {
|
if osal.ssh_test(address: serverinfo.server_ip, port: 22)! == .ok {
|
||||||
console.print_debug('test server ${serverinfo.server_name} is in rescue mode?')
|
console.print_debug('test server ${serverinfo.server_name} is in rescue mode?')
|
||||||
@@ -84,7 +87,7 @@ fn (mut h HetznerManager) server_rescue_internal(args_ ServerRescueArgs) !Server
|
|||||||
dataformat: .urlencoded
|
dataformat: .urlencoded
|
||||||
)!
|
)!
|
||||||
|
|
||||||
// console.print_debug('hetzner rescue\n${rescue}')
|
console.print_debug('Request for hetzner rescue done.\n${rescue}')
|
||||||
|
|
||||||
h.server_reset(
|
h.server_reset(
|
||||||
id: args.id
|
id: args.id
|
||||||
@@ -149,8 +152,9 @@ pub fn (mut h HetznerManager) ubuntu_install(args ServerInstallArgs) !&builder.N
|
|||||||
// n.file_write("/tmp/installconfig",installconfig)!
|
// n.file_write("/tmp/installconfig",installconfig)!
|
||||||
// n.exec_interactive("installimage -a -c /tmp/installconfig")!
|
// n.exec_interactive("installimage -a -c /tmp/installconfig")!
|
||||||
|
|
||||||
mut rstr := ''
|
mut rstr := '-r no '
|
||||||
if args.raid {
|
if args.raid {
|
||||||
|
panic("should not use RAID for now")
|
||||||
rstr = '-r yes -l 1 '
|
rstr = '-r yes -l 1 '
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,8 +162,20 @@ pub fn (mut h HetznerManager) ubuntu_install(args ServerInstallArgs) !&builder.N
|
|||||||
cmd: '
|
cmd: '
|
||||||
set -ex
|
set -ex
|
||||||
echo "go into install mode, try to install ubuntu 24.04"
|
echo "go into install mode, try to install ubuntu 24.04"
|
||||||
/root/.oldroot/nfs/install/installimage -a -n kristof2 ${rstr} -i /root/.oldroot/nfs/images/Ubuntu-2404-noble-amd64-base.tar.gz -f yes -t yes -p swap:swap:4G,/boot:ext3:1024M,/:btrfs:all
|
|
||||||
reboot'
|
if [ -d /sys/firmware/efi ]; then
|
||||||
|
echo "UEFI system detected → need ESP"
|
||||||
|
PARTS="/boot/efi:esp:256M,swap:swap:4G,/boot:ext3:1024M,/:btrfs:all"
|
||||||
|
else
|
||||||
|
echo "BIOS/legacy system detected → no ESP"
|
||||||
|
PARTS="swap:swap:4G,/boot:ext3:1024M,/:btrfs:all"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# installimage invocation
|
||||||
|
/root/.oldroot/nfs/install/installimage -a -n "${args.name}" ${rstr} -i /root/.oldroot/nfs/images/Ubuntu-2404-noble-amd64-base.tar.gz -f yes -t yes -p "\$PARTS"
|
||||||
|
|
||||||
|
reboot
|
||||||
|
'
|
||||||
)!
|
)!
|
||||||
|
|
||||||
os.execute_opt('ssh-keygen -R ${serverinfo.server_ip}')!
|
os.execute_opt('ssh-keygen -R ${serverinfo.server_ip}')!
|
||||||
@@ -172,6 +188,9 @@ pub fn (mut h HetznerManager) ubuntu_install(args ServerInstallArgs) !&builder.N
|
|||||||
timeout_up: 60 * 5
|
timeout_up: 60 * 5
|
||||||
)!
|
)!
|
||||||
|
|
||||||
|
//wait 20 sec to make sure ssh is there
|
||||||
|
osal.ssh_wait(address: serverinfo.server_ip, timeout: 20)!
|
||||||
|
|
||||||
if args.hero_install {
|
if args.hero_install {
|
||||||
n.exec_silent('apt update && apt install -y mc redis')!
|
n.exec_silent('apt update && apt install -y mc redis')!
|
||||||
n.hero_install(compile: args.hero_install_compile)!
|
n.hero_install(compile: args.hero_install_compile)!
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ pub fn (mut h HetznerManager) server_reset(args ServerRebootArgs) !ResetInfo {
|
|||||||
// now need to wait till it goes off
|
// now need to wait till it goes off
|
||||||
if serveractive {
|
if serveractive {
|
||||||
for {
|
for {
|
||||||
console.print_debug('wait for server ${serverinfo.server_name} to go down.')
|
console.print_debug('wait for server ${serverinfo.server_name} on ${serverinfo.server_ip} to go down.')
|
||||||
pingresult := osal.ping(address: serverinfo.server_ip)!
|
pingresult := osal.ping(address: serverinfo.server_ip)!
|
||||||
if !pingresult {
|
if !pingresult {
|
||||||
console.print_debug('server ${serverinfo.server_name} is now down, now waitig for reboot.')
|
console.print_debug('server ${serverinfo.server_name} is now down, now waitig for reboot.')
|
||||||
@@ -64,7 +64,7 @@ pub fn (mut h HetznerManager) server_reset(args ServerRebootArgs) !ResetInfo {
|
|||||||
if args.wait {
|
if args.wait {
|
||||||
for {
|
for {
|
||||||
time.sleep(1000 * time.millisecond)
|
time.sleep(1000 * time.millisecond)
|
||||||
console.print_debug('wait for ${serverinfo.server_name} ${args.msg}')
|
console.print_debug('wait for ${serverinfo.server_name} on ${serverinfo.server_ip} ${args.msg}')
|
||||||
if osal.ssh_test(address: serverinfo.server_ip)! == .ok {
|
if osal.ssh_test(address: serverinfo.server_ip)! == .ok {
|
||||||
console.print_debug('ssh test ok')
|
console.print_debug('ssh test ok')
|
||||||
console.print_header('server is rebooted: ${serverinfo.server_name}')
|
console.print_header('server is rebooted: ${serverinfo.server_name}')
|
||||||
|
|||||||
Reference in New Issue
Block a user