2021-07-25 19:31:23 +02:00
|
|
|
extends "res://addons/godot_xterm/terminal.gd"
|
2021-07-02 19:34:31 +02:00
|
|
|
|
2022-11-09 21:57:46 +01:00
|
|
|
@export var exec_path: String := "bash"
|
|
|
|
@export var socat_path: String := "socat" # E.g. /usr/bin/socat
|
|
|
|
@export var port: int := 2023
|
|
|
|
@export var verbose: bool := false
|
2021-07-02 19:34:31 +02:00
|
|
|
|
|
|
|
var _timeout = 30
|
|
|
|
var _pid: int
|
|
|
|
var _stream := StreamPeerTCP.new()
|
|
|
|
|
|
|
|
|
|
|
|
func _ready():
|
|
|
|
var args = ["-v"] if verbose else []
|
|
|
|
args.append("tcp-l:%d,reuseaddr,fork" % port)
|
|
|
|
args.append("exec:%s,pty,setsid,setpgid,stderr,ctty" % exec_path)
|
|
|
|
|
|
|
|
_pid = OS.execute(socat_path, args, false)
|
|
|
|
|
|
|
|
|
|
|
|
func _process(delta):
|
|
|
|
match _stream.get_status():
|
|
|
|
StreamPeerTCP.STATUS_NONE, StreamPeerTCP.STATUS_CONNECTING:
|
|
|
|
_timeout -= 1
|
|
|
|
if _timeout < 1:
|
|
|
|
_error("Timeout: could not connect to socat")
|
|
|
|
|
|
|
|
if not _stream.is_connected_to_host():
|
|
|
|
if _stream.connect_to_host("127.0.0.1", port) != OK:
|
|
|
|
_error("Could not connect to socat")
|
|
|
|
|
|
|
|
StreamPeerTCP.STATUS_CONNECTED:
|
|
|
|
var avail = _stream.get_available_bytes()
|
2022-11-09 21:57:46 +01:00
|
|
|
var data = PackedByteArray()
|
2021-07-02 19:34:31 +02:00
|
|
|
for i in range(avail):
|
|
|
|
data.append(_stream.get_u8())
|
|
|
|
call_deferred("write", data)
|
|
|
|
|
|
|
|
|
|
|
|
func _on_Terminal_data_sent(data):
|
|
|
|
if _stream.get_status() == StreamPeerTCP.STATUS_CONNECTED:
|
|
|
|
_stream.put_data(data)
|
|
|
|
|
|
|
|
|
|
|
|
func _error(message):
|
|
|
|
push_error(message)
|
|
|
|
set_process(false)
|
|
|
|
|
|
|
|
|
|
|
|
func _exit_tree():
|
|
|
|
if OS.kill(_pid) != OK:
|
|
|
|
push_error("Failed to kill socat")
|