diff options
author | 2023-10-04 01:22:43 +0600 | |
---|---|---|
committer | 2023-10-04 01:33:28 +0600 | |
commit | 735d125f79fc8bb8234bb255ccd8573d010c13a1 (patch) | |
tree | 0ca778e99532805b6ae141ddfabaaa622560645d /src | |
parent | ac24c495d06522303652232a6ede276c2d630f9e (diff) | |
download | jadupc-remote-support-console-735d125f79fc8bb8234bb255ccd8573d010c13a1.tar.gz jadupc-remote-support-console-735d125f79fc8bb8234bb255ccd8573d010c13a1.zip |
Implement basic tmate stdout parser
Signed-off-by: Mubashshir <ahm@jadupc.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/tmate/meson.build | 1 | ||||
-rw-r--r-- | src/tmate/stdout.vala | 92 |
2 files changed, 93 insertions, 0 deletions
diff --git a/src/tmate/meson.build b/src/tmate/meson.build index e42ed65..7b907aa 100644 --- a/src/tmate/meson.build +++ b/src/tmate/meson.build @@ -2,4 +2,5 @@ srcs += files( 'config.vala', 'sessiontype.vala', 'session.vala', + 'stdout.vala', ) diff --git a/src/tmate/stdout.vala b/src/tmate/stdout.vala new file mode 100644 index 0000000..804ccbb --- /dev/null +++ b/src/tmate/stdout.vala @@ -0,0 +1,92 @@ +namespace Tmate +{ + [SingleInstance] + // *INDENT-OFF* + class Stdout : Object + { + public enum TokenType { + SOCKET, ADDRESS, MATES, EMPTY, + COMMENT, RESTART, INIT, TERM, + UNRECOGNIZED, NET_ERROR; + + public string to_string() { + return EnumClass.to_string(typeof(TokenType), this) + .replace("TMATE_STDOUT_TOKEN_TYPE_", "Tmate.Stdout.TokenType."); + } + } + + public class Token + { + public TokenType @class {get; private set;} + public string[] tokens {get; private set;} + public Token(string[] tokens, TokenType @class = UNRECOGNIZED) + { + this.class = @class; + this.tokens = tokens; + } + public string to_string() + { + var sep = ""; + var end = ""; + + if (this.tokens.length > 1) { + sep += "\n\t"; + end += "\n"; + } + if(this.tokens.length > 0) { + sep += "\""; + end += "\""; + } + return @"<$(this.class) {$sep$( + string.joinv(@"\", $sep", this.tokens) + )$(end.reverse()) + }>"; + } + } + + private Regex r_connect = /^Connecting to (.+)\.\.\.$/; + private Regex r_socket = /^To connect.+ tmate -S (.+) attach$/; + private Regex r_mates = /^.+ (joined|left) \(([^()]+)\) -- (\d+) clients? .+$/; + private Regex r_closed = /^Session closed$/; + private Regex r_restarted = /^Session shell restarted$/; + private Regex r_comment = /^(Note: |Reconnecting)/; + private Regex r_dnsfail = /^([^ ]+ lookup failure\.).+ \((.+)\)$/; + private Regex r_netfail = /^(Error [^:]+)[:] [^:]+[:] (.+)$/; + private Regex r_address = /^(ssh|web) \w+ ?(|read only)[:](?:|.+) ([^ ]+)$/; + + public Token parse(string line) + { + MatchInfo info; + if(line == "") + return new Token({}, EMPTY); + else if(r_mates.match(line, 0, out info)) + return new Token({ + info.fetch(1), // joined | left + info.fetch(2), // mate ip/domain + info.fetch(3) // active mates + }, MATES); + else if(r_dnsfail.match(line, 0, out info) || r_netfail.match(line, 0, out info)) + return new Token({ + info.fetch(1), + info.fetch(2), + }, NET_ERROR); + else if(r_comment.match(line)) + return new Token({line}, COMMENT); + else if(r_restarted.match(line)) + return new Token({}, RESTART); + else if(r_address.match(line, 0, out info)) + return new Token({ + info.fetch(1), // web | ssh + info.fetch(2), // read only? + info.fetch(3) // address + }, ADDRESS); + else if(r_socket.match(line, 0, out info)) + return new Token({ info.fetch(1) }, SOCKET); + else if(r_closed.match(line)) + return new Token({}, TERM); + else if(r_connect.match(line, 0, out info)) + return new Token({ info.fetch(1) }, INIT); + return new Token({line}); + } + } +} |