diff --git a/crt2foss.py b/crt2foss.py new file mode 100755 index 0000000..3263d35 --- /dev/null +++ b/crt2foss.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import os +import sys +import errno +import re + +from typing import List + +item_regex = re.compile(r'.*(?P\w):"(?P.+?)"=(?P.*)$', re.DOTALL) + +def parse_ini(path: str) -> dict: + values = [] + with open(path) as f: + for line in f.readlines(): + line = line.strip() + if line.startswith("\ufeff"): + line = line[1:] + if len(line) > 2 and (line[1] == ":" or line[2] == ":"): + values.append(line) + elif line == "": + continue + else: + values[-1] += "\n" + line + + matches = [] + for i in values: + try: + match = item_regex.match(i) + matches.append(match.groupdict()) + except Exception: + pass + + result = {} + for match in matches: + t = match["type"] + k = match["key"] + v = match["value"] + + if t == "S": + result[k] = v + if t == "D": + result[k] = int(v, 16) + # We don't care about the other types + + return result + + +def gen_cmdlines_ssh(ini: dict, cfgdir: str) -> List[str]: + hostname = ini["Hostname"] + port = ini.get("[SSH2] Port", 22) + username = ini["Username"] + keyfile = ini.get("Identity Filename V2", None) + if keyfile: + keyfile = os.path.normpath( + keyfile \ + .replace('\\', '/') \ + .replace('${VDS_CONFIG_PATH}', cfgdir) + ) \ + .replace('"', '\\"') + + cmdline = [] + if keyfile: + cmdline += ["-i", f'"{keyfile}"'] + if port != 22: + cmdline += ["-p", str(port)] + + cmdline.append(f"{username}@{hostname}") + + ssh = ["ssh"] + cmdline + scp = ["scp"] + cmdline + + return [' '.join(ssh), ' '.join(scp)] + + +def gen_cmdlines(ini: dict, cfgdir: str) -> List[str]: + if ini["Protocol Name"].startswith("SSH"): + return gen_cmdlines_ssh(ini, cfgdir) + return [] + + +if __name__ == "__main__": + if len(sys.argv) < 2: + print(f"Usage: {sys.argv[0]} path/to/Config path/to/session.ini", file=sys.stderr) + sys.exit(1) + + cfg = sys.argv[1] + ini = sys.argv[2] + + if not os.path.exists(ini): + raise OSError(f"Session file does not exist: '{ini}'", errno=errno.ENOENT) + + if not os.path.isfile(ini): + raise OSError(f"Not a file: '{ini}'", errno=errno.ENFILE) + + inidict = parse_ini(ini) + cmdlines = gen_cmdlines(inidict, cfg) + print('\n'.join(cmdlines)) diff --git a/shcrt b/shcrt index 952b4c5..37fa3a2 100755 --- a/shcrt +++ b/shcrt @@ -2,8 +2,18 @@ export supermode="dialog" -export SHELL_LIBRARY_PATH="$SHELL_LIBRARY_PATH:./easybashgui/lib" -export PATH="$PATH:./easybashgui/src" +# Determine script location +SOURCE="${BASH_SOURCE[0]}" +while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink + DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )" + SOURCE="$(readlink "$SOURCE")" + # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located + [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" +done +DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )" + +export SHELL_LIBRARY_PATH="$SHELL_LIBRARY_PATH:$DIR/easybashgui/lib" +export PATH="$PATH:$DIR/easybashgui/src" source easybashgui function is_wsl { @@ -86,8 +96,6 @@ function scrt_ls { function scrt_menu { listing="$(scrt_ls)" menu_listing="$(echo "$listing" | cut -d "\\" -f 1)" - echo "LISTING" - echo "$listing" IFSBAK="$IFS" IFS=$'\n' @@ -102,11 +110,9 @@ function scrt_menu { scrt_cd "$choice" scrt_menu elif [ -f "$choice_path" ]; then - echo "$choice_path" - return + scrt_session "$choice_path" elif [[ "$menu_choice" == "" ]]; then scrt_cd .. - echo "$current_path" if [[ "$current_path" == "" ]] || [[ "$current_path" == ".." ]]; then return else @@ -117,6 +123,20 @@ function scrt_menu { fi } +function scrt_session { + if [[ "$mode" == "dialog" ]] || [[ "$supermode" == "dialog" ]]; then + clear + fi + + session="$1" + echo + echo "Session file:" + echo "$session" + echo + echo "Commands:" + "$DIR/crt2foss.py" "$session_path/../" "$session" +} + function main { scrt_menu }