refactor: :recycle: Use Bash instead of Deno
Tim Izzo tim@octree.ch
Wed, 11 Dec 2024 17:22:54 +0100
10 files changed,
120 insertions(+),
284 deletions(-)
A
README.md
@@ -0,0 +1,31 @@
+# SSH Portal + +SSH Portal est un outil en ligne de commande permettant d'exécuter +des raccourcis de commandes à travers SSH sur des instances connues. + +## Pré-requis + +- [gum](https://github.com/charmbracelet/gum) +- [jq](https://github.com/jqlang/jq) +- ssh + +## Installation + +```bash +curl https://git.5ika.ch/ssh-portal.git/blob/main/ssh-portal?raw=true -o sp +chmod +x sp +mv sp <somewhere in your $PATH> +``` + +## Configuration + +```bash +curl https://git.5ika.ch/ssh-portal.git/blob/main/ssh-portal.example.json?raw=true -o $HOME/.config/ssh-portal.json +vi $HOME/.config/ssh-portal.json +``` + +## Utilisation + +```bash +sp +```
D
actions.json
@@ -1,14 +0,0 @@
-[ - { - "name": "Voir les logs en continu", - "cmd": "tail -f -n 50 /var/log/run.log" - }, - { - "name": "Voir les derniers logs", - "cmd": "tail -n 100 /var/log/run.log" - }, - { - "name": "Voir les variables d'environnement", - "cmd": "env" - } -]
D
deno.json
@@ -1,6 +0,0 @@
-{ - "tasks": { - "start": "deno run --allow-net --allow-read main.ts", - "compile": "deno compile -o $HOME/bin/sp --allow-net --allow-read main.ts" - } -}
D
deno.lock
@@ -1,147 +0,0 @@
-{ - "version": "4", - "specifiers": { - "npm:ssh2@*": "1.16.0" - }, - "npm": { - "asn1@0.2.6": { - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": [ - "safer-buffer" - ] - }, - "bcrypt-pbkdf@1.0.2": { - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": [ - "tweetnacl" - ] - }, - "buildcheck@0.0.6": { - "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==" - }, - "cpu-features@0.0.10": { - "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", - "dependencies": [ - "buildcheck", - "nan" - ] - }, - "nan@2.22.0": { - "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==" - }, - "safer-buffer@2.1.2": { - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "ssh2@1.16.0": { - "integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==", - "dependencies": [ - "asn1", - "bcrypt-pbkdf", - "cpu-features", - "nan" - ] - }, - "tweetnacl@0.14.5": { - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - } - }, - "remote": { - "https://deno.land/std@0.221.0/assert/assert.ts": "bec068b2fccdd434c138a555b19a2c2393b71dfaada02b7d568a01541e67cdc5", - "https://deno.land/std@0.221.0/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8", - "https://deno.land/std@0.221.0/encoding/_util.ts": "beacef316c1255da9bc8e95afb1fa56ed69baef919c88dc06ae6cb7a6103d376", - "https://deno.land/std@0.221.0/encoding/base64.ts": "8ccae67a1227b875340a8582ff707f37b131df435b07080d3bb58e07f5f97807", - "https://deno.land/std@0.221.0/fmt/colors.ts": "d239d84620b921ea520125d778947881f62c50e78deef2657073840b8af9559a", - "https://deno.land/std@0.221.0/path/_common/assert_path.ts": "dbdd757a465b690b2cc72fc5fb7698c51507dec6bfafce4ca500c46b76ff7bd8", - "https://deno.land/std@0.221.0/path/_common/basename.ts": "569744855bc8445f3a56087fd2aed56bdad39da971a8d92b138c9913aecc5fa2", - "https://deno.land/std@0.221.0/path/_common/common.ts": "ef73c2860694775fe8ffcbcdd387f9f97c7a656febf0daa8c73b56f4d8a7bd4c", - "https://deno.land/std@0.221.0/path/_common/constants.ts": "dc5f8057159f4b48cd304eb3027e42f1148cf4df1fb4240774d3492b5d12ac0c", - "https://deno.land/std@0.221.0/path/_common/dirname.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", - "https://deno.land/std@0.221.0/path/_common/format.ts": "92500e91ea5de21c97f5fe91e178bae62af524b72d5fcd246d6d60ae4bcada8b", - "https://deno.land/std@0.221.0/path/_common/from_file_url.ts": "d672bdeebc11bf80e99bf266f886c70963107bdd31134c4e249eef51133ceccf", - "https://deno.land/std@0.221.0/path/_common/glob_to_reg_exp.ts": "6cac16d5c2dc23af7d66348a7ce430e5de4e70b0eede074bdbcf4903f4374d8d", - "https://deno.land/std@0.221.0/path/_common/normalize.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", - "https://deno.land/std@0.221.0/path/_common/normalize_string.ts": "33edef773c2a8e242761f731adeb2bd6d683e9c69e4e3d0092985bede74f4ac3", - "https://deno.land/std@0.221.0/path/_common/relative.ts": "faa2753d9b32320ed4ada0733261e3357c186e5705678d9dd08b97527deae607", - "https://deno.land/std@0.221.0/path/_common/strip_trailing_separators.ts": "7024a93447efcdcfeaa9339a98fa63ef9d53de363f1fbe9858970f1bba02655a", - "https://deno.land/std@0.221.0/path/_common/to_file_url.ts": "7f76adbc83ece1bba173e6e98a27c647712cab773d3f8cbe0398b74afc817883", - "https://deno.land/std@0.221.0/path/_interface.ts": "8dfeb930ca4a772c458a8c7bbe1e33216fe91c253411338ad80c5b6fa93ddba0", - "https://deno.land/std@0.221.0/path/_os.ts": "8fb9b90fb6b753bd8c77cfd8a33c2ff6c5f5bc185f50de8ca4ac6a05710b2c15", - "https://deno.land/std@0.221.0/path/basename.ts": "7ee495c2d1ee516ffff48fb9a93267ba928b5a3486b550be73071bc14f8cc63e", - "https://deno.land/std@0.221.0/path/common.ts": "03e52e22882402c986fe97ca3b5bb4263c2aa811c515ce84584b23bac4cc2643", - "https://deno.land/std@0.221.0/path/constants.ts": "0c206169ca104938ede9da48ac952de288f23343304a1c3cb6ec7625e7325f36", - "https://deno.land/std@0.221.0/path/dirname.ts": "85bd955bf31d62c9aafdd7ff561c4b5fb587d11a9a5a45e2b01aedffa4238a7c", - "https://deno.land/std@0.221.0/path/extname.ts": "593303db8ae8c865cbd9ceec6e55d4b9ac5410c1e276bfd3131916591b954441", - "https://deno.land/std@0.221.0/path/format.ts": "6ce1779b0980296cf2bc20d66436b12792102b831fd281ab9eb08fa8a3e6f6ac", - "https://deno.land/std@0.221.0/path/from_file_url.ts": "911833ae4fd10a1c84f6271f36151ab785955849117dc48c6e43b929504ee069", - "https://deno.land/std@0.221.0/path/glob_to_regexp.ts": "7f30f0a21439cadfdae1be1bf370880b415e676097fda584a63ce319053b5972", - "https://deno.land/std@0.221.0/path/is_absolute.ts": "4791afc8bfd0c87f0526eaa616b0d16e7b3ab6a65b62942e50eac68de4ef67d7", - "https://deno.land/std@0.221.0/path/is_glob.ts": "a65f6195d3058c3050ab905705891b412ff942a292bcbaa1a807a74439a14141", - "https://deno.land/std@0.221.0/path/join.ts": "ae2ec5ca44c7e84a235fd532e4a0116bfb1f2368b394db1c4fb75e3c0f26a33a", - "https://deno.land/std@0.221.0/path/join_globs.ts": "5b3bf248b93247194f94fa6947b612ab9d3abd571ca8386cf7789038545e54a0", - "https://deno.land/std@0.221.0/path/mod.ts": "2821a1bb3a4148a0ffe79c92aa41aa9319fef73c6d6f5178f52b2c720d3eb02d", - "https://deno.land/std@0.221.0/path/normalize.ts": "4155743ccceeed319b350c1e62e931600272fad8ad00c417b91df093867a8352", - "https://deno.land/std@0.221.0/path/normalize_glob.ts": "cc89a77a7d3b1d01053b9dcd59462b75482b11e9068ae6c754b5cf5d794b374f", - "https://deno.land/std@0.221.0/path/parse.ts": "3e172974e3c71025f5fbd2bd9db4307acb9cc2de14cf6f4464bf40957663cabe", - "https://deno.land/std@0.221.0/path/posix/_util.ts": "1e3937da30f080bfc99fe45d7ed23c47dd8585c5e473b2d771380d3a6937cf9d", - "https://deno.land/std@0.221.0/path/posix/basename.ts": "d2fa5fbbb1c5a3ab8b9326458a8d4ceac77580961b3739cd5bfd1d3541a3e5f0", - "https://deno.land/std@0.221.0/path/posix/common.ts": "26f60ccc8b2cac3e1613000c23ac5a7d392715d479e5be413473a37903a2b5d4", - "https://deno.land/std@0.221.0/path/posix/constants.ts": "93481efb98cdffa4c719c22a0182b994e5a6aed3047e1962f6c2c75b7592bef1", - "https://deno.land/std@0.221.0/path/posix/dirname.ts": "76cd348ffe92345711409f88d4d8561d8645353ac215c8e9c80140069bf42f00", - "https://deno.land/std@0.221.0/path/posix/extname.ts": "e398c1d9d1908d3756a7ed94199fcd169e79466dd88feffd2f47ce0abf9d61d2", - "https://deno.land/std@0.221.0/path/posix/format.ts": "185e9ee2091a42dd39e2a3b8e4925370ee8407572cee1ae52838aed96310c5c1", - "https://deno.land/std@0.221.0/path/posix/from_file_url.ts": "951aee3a2c46fd0ed488899d024c6352b59154c70552e90885ed0c2ab699bc40", - "https://deno.land/std@0.221.0/path/posix/glob_to_regexp.ts": "76f012fcdb22c04b633f536c0b9644d100861bea36e9da56a94b9c589a742e8f", - "https://deno.land/std@0.221.0/path/posix/is_absolute.ts": "cebe561ad0ae294f0ce0365a1879dcfca8abd872821519b4fcc8d8967f888ede", - "https://deno.land/std@0.221.0/path/posix/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9", - "https://deno.land/std@0.221.0/path/posix/join.ts": "7fc2cb3716aa1b863e990baf30b101d768db479e70b7313b4866a088db016f63", - "https://deno.land/std@0.221.0/path/posix/join_globs.ts": "a9475b44645feddceb484ee0498e456f4add112e181cb94042cdc6d47d1cdd25", - "https://deno.land/std@0.221.0/path/posix/mod.ts": "2301fc1c54a28b349e20656f68a85f75befa0ee9b6cd75bfac3da5aca9c3f604", - "https://deno.land/std@0.221.0/path/posix/normalize.ts": "baeb49816a8299f90a0237d214cef46f00ba3e95c0d2ceb74205a6a584b58a91", - "https://deno.land/std@0.221.0/path/posix/normalize_glob.ts": "9c87a829b6c0f445d03b3ecadc14492e2864c3ebb966f4cea41e98326e4435c6", - "https://deno.land/std@0.221.0/path/posix/parse.ts": "0b1fc4cb890dbb699ec1d2c232d274843b4a7142e1ad976b69fe51c954eb6080", - "https://deno.land/std@0.221.0/path/posix/relative.ts": "3907d6eda41f0ff723d336125a1ad4349112cd4d48f693859980314d5b9da31c", - "https://deno.land/std@0.221.0/path/posix/resolve.ts": "08b699cfeee10cb6857ccab38fa4b2ec703b0ea33e8e69964f29d02a2d5257cf", - "https://deno.land/std@0.221.0/path/posix/to_file_url.ts": "7aa752ba66a35049e0e4a4be5a0a31ac6b645257d2e031142abb1854de250aaf", - "https://deno.land/std@0.221.0/path/posix/to_namespaced_path.ts": "28b216b3c76f892a4dca9734ff1cc0045d135532bfd9c435ae4858bfa5a2ebf0", - "https://deno.land/std@0.221.0/path/relative.ts": "ab739d727180ed8727e34ed71d976912461d98e2b76de3d3de834c1066667add", - "https://deno.land/std@0.221.0/path/resolve.ts": "a6f977bdb4272e79d8d0ed4333e3d71367cc3926acf15ac271f1d059c8494d8d", - "https://deno.land/std@0.221.0/path/to_file_url.ts": "88f049b769bce411e2d2db5bd9e6fd9a185a5fbd6b9f5ad8f52bef517c4ece1b", - "https://deno.land/std@0.221.0/path/to_namespaced_path.ts": "b706a4103b104cfadc09600a5f838c2ba94dbcdb642344557122dda444526e40", - "https://deno.land/std@0.221.0/path/windows/_util.ts": "d5f47363e5293fced22c984550d5e70e98e266cc3f31769e1710511803d04808", - "https://deno.land/std@0.221.0/path/windows/basename.ts": "6bbc57bac9df2cec43288c8c5334919418d784243a00bc10de67d392ab36d660", - "https://deno.land/std@0.221.0/path/windows/common.ts": "26f60ccc8b2cac3e1613000c23ac5a7d392715d479e5be413473a37903a2b5d4", - "https://deno.land/std@0.221.0/path/windows/constants.ts": "5afaac0a1f67b68b0a380a4ef391bf59feb55856aa8c60dfc01bd3b6abb813f5", - "https://deno.land/std@0.221.0/path/windows/dirname.ts": "33e421be5a5558a1346a48e74c330b8e560be7424ed7684ea03c12c21b627bc9", - "https://deno.land/std@0.221.0/path/windows/extname.ts": "165a61b00d781257fda1e9606a48c78b06815385e7d703232548dbfc95346bef", - "https://deno.land/std@0.221.0/path/windows/format.ts": "bbb5ecf379305b472b1082cd2fdc010e44a0020030414974d6029be9ad52aeb6", - "https://deno.land/std@0.221.0/path/windows/from_file_url.ts": "ced2d587b6dff18f963f269d745c4a599cf82b0c4007356bd957cb4cb52efc01", - "https://deno.land/std@0.221.0/path/windows/glob_to_regexp.ts": "e45f1f89bf3fc36f94ab7b3b9d0026729829fabc486c77f414caebef3b7304f8", - "https://deno.land/std@0.221.0/path/windows/is_absolute.ts": "4a8f6853f8598cf91a835f41abed42112cebab09478b072e4beb00ec81f8ca8a", - "https://deno.land/std@0.221.0/path/windows/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9", - "https://deno.land/std@0.221.0/path/windows/join.ts": "8d03530ab89195185103b7da9dfc6327af13eabdcd44c7c63e42e27808f50ecf", - "https://deno.land/std@0.221.0/path/windows/join_globs.ts": "a9475b44645feddceb484ee0498e456f4add112e181cb94042cdc6d47d1cdd25", - "https://deno.land/std@0.221.0/path/windows/mod.ts": "2301fc1c54a28b349e20656f68a85f75befa0ee9b6cd75bfac3da5aca9c3f604", - "https://deno.land/std@0.221.0/path/windows/normalize.ts": "78126170ab917f0ca355a9af9e65ad6bfa5be14d574c5fb09bb1920f52577780", - "https://deno.land/std@0.221.0/path/windows/normalize_glob.ts": "9c87a829b6c0f445d03b3ecadc14492e2864c3ebb966f4cea41e98326e4435c6", - "https://deno.land/std@0.221.0/path/windows/parse.ts": "dbdfe2bc6db482d755b5f63f7207cd019240fcac02ad2efa582adf67ff10553a", - "https://deno.land/std@0.221.0/path/windows/relative.ts": "3e1abc7977ee6cc0db2730d1f9cb38be87b0ce4806759d271a70e4997fc638d7", - "https://deno.land/std@0.221.0/path/windows/resolve.ts": "8dae1dadfed9d46ff46cc337c9525c0c7d959fb400a6308f34595c45bdca1972", - "https://deno.land/std@0.221.0/path/windows/to_file_url.ts": "40e560ee4854fe5a3d4d12976cef2f4e8914125c81b11f1108e127934ced502e", - "https://deno.land/std@0.221.0/path/windows/to_namespaced_path.ts": "4ffa4fb6fae321448d5fe810b3ca741d84df4d7897e61ee29be961a6aac89a4c", - "https://deno.land/std@0.221.0/text/levenshtein_distance.ts": "24be5cc88326bbba83ca7c1ea89259af0050cffda2817ff3a6d240ad6495eae2", - "https://deno.land/x/cliffy@v1.0.0-rc.4/ansi/ansi_escapes.ts": "193b3c3a4e520274bd8322ca4cab1c3ce38070bed1898cb2ade12a585dddd7c9", - "https://deno.land/x/cliffy@v1.0.0-rc.4/ansi/colors.ts": "21c6702197d0871c700279d22fc54e4b15152be4ece1f433d6714595b018d265", - "https://deno.land/x/cliffy@v1.0.0-rc.4/ansi/cursor_position.ts": "7a07410b312885db92ada9ecab095db0ff72ffe339b4e2d31e8c705f2c60c7fa", - "https://deno.land/x/cliffy@v1.0.0-rc.4/ansi/deps.ts": "4d93b041735f4967fa56c7aeb6be490c07522fb81c419f5fe3bef6b72190db8c", - "https://deno.land/x/cliffy@v1.0.0-rc.4/ansi/tty.ts": "a42ec713ff18186492c4b5184039d4f54174065773fa5833330b543c53bb4d79", - "https://deno.land/x/cliffy@v1.0.0-rc.4/keycode/_key_codes.ts": "917f0a2da0dbace08cf29bcfdaaa2257da9fe7e705fff8867d86ed69dfb08cfe", - "https://deno.land/x/cliffy@v1.0.0-rc.4/keycode/key_code.ts": "730fa675ca12fc2a99ba718aa8dbebb1f2c89afd47484e30ef3cb705ddfca367", - "https://deno.land/x/cliffy@v1.0.0-rc.4/prompt/_figures.ts": "e22413ddd51bb271b6b861a058742e83aaa3f62c14e8162cb73ae6f047062f51", - "https://deno.land/x/cliffy@v1.0.0-rc.4/prompt/_generic_input.ts": "f1cb8eff5868d1c1adb3a643c451ba3227b546c56caaa21a617a56311e228cca", - "https://deno.land/x/cliffy@v1.0.0-rc.4/prompt/_generic_list.ts": "138540a55f62f3f6be6bdc81eed3a6268a46dc6ef5333c83b83b0d5b813ba4fd", - "https://deno.land/x/cliffy@v1.0.0-rc.4/prompt/_generic_prompt.ts": "5eef7354f0490f083c5df8ce3cffdfbe1216f7ccff2e3afaa48e0ee8ddaacd25", - "https://deno.land/x/cliffy@v1.0.0-rc.4/prompt/_utils.ts": "498ae639d7666599d612b615ee85de9103b3c3a913d5196f6b265072674258c7", - "https://deno.land/x/cliffy@v1.0.0-rc.4/prompt/deps.ts": "d8e30bf0433d03144ab664b68db85679838e6561e8f098f3e2383b0f79a71418", - "https://deno.land/x/cliffy@v1.0.0-rc.4/prompt/select.ts": "c10902aeaca02a55d9b846934958dd166ee39c741faebdaa9800689e402186cf" - } -}
D
instances.json
@@ -1,42 +0,0 @@
-[ - { - "name": "R-21 Client Test", - "username": "82099-616", - "category": "R-21" - }, - { - "name": "R-21 Admin Test", - "username": "183771-616", - "category": "R-21" - }, - { - "name": "EVOSPE Test", - "username": "81781-616", - "category": "SPE" - }, - { - "name": "EVOSPE Prod", - "username": "159286-616", - "category": "SPE" - }, - { - "name": "SPE Data Gateway Test", - "username": "168997-616", - "category": "SPE" - }, - { - "name": "SPE Data Gateway Prod", - "username": "182105-616", - "category": "SPE" - }, - { - "name": "Caroster Test", - "username": "171840-616", - "category": "Caroster" - }, - { - "name": "Caroster Prod", - "username": "175258-616", - "category": "Caroster" - } -]
D
main.ts
@@ -1,72 +0,0 @@
-import { Client } from "npm:ssh2"; -import { Select } from "https://deno.land/x/cliffy@v1.0.0-rc.4/prompt/select.ts"; -import { tty } from "https://deno.land/x/cliffy@v1.0.0-rc.4/ansi/tty.ts"; -import { colors } from "https://deno.land/x/cliffy@v1.0.0-rc.4/ansi/colors.ts"; - -const instances = ( - await import("./instances.json", { - with: { type: "json" }, - }) -).default; -const actions = ( - await import("./actions.json", { - with: { type: "json" }, - }) -).default; - -const baseConfig = { - host: "gate.hidora.com", - port: 3022, - privateKey: Deno.readTextFileSync("/home/tim/.ssh/id_rsa"), -}; - -const instancesByCategory = Object.groupBy(instances, i => i.category); -const configOptions = Object.entries(instancesByCategory).map( - ([category, instances]) => { - return { - name: category, - options: instances?.map(instance => ({ - name: instance.name, - value: instance, - })), - }; - } -); -const selectedConfig = await Select.prompt<(typeof instances)[number]>({ - message: "Instance", - search: true, - groupIcon: "🔵", - options: configOptions, -}); - -const selectedAction = await Select.prompt<(typeof actions)[number]>({ - message: "Action", - options: actions.map(c => ({ name: c.name, value: c })), -}); - -const secondaryText = colors.gray; - -const client = new Client().connect({ ...selectedConfig, ...baseConfig }); -console.log(`🚀 Connecting to ${selectedConfig.name}...`); -client.on("ready", () => { - tty.cursorTo(0, 0).eraseScreen(); - console.log(secondaryText(`✅ Connected to ${selectedConfig.name}`)); - console.log(secondaryText(`$ ${selectedAction.cmd}`)); - client.exec(selectedAction.cmd, (err: Error, stream: any) => { - if (err) throw err; - stream - .on("close", () => { - client.end(); - }) - .on("data", (data: string) => { - const date = new Date(); - const dateText = colors.bold.black.bgBlue; - console.log(dateText(`${date.toLocaleString()}\n`) + data); - }) - .stderr.on("data", (data: string) => { - const date = new Date(); - const dateText = colors.bold.black.bgRed; - console.log(`${dateText(date.toLocaleString())}) - ERROR\n` + data); - }); - }); -});
A
ssh-portal
@@ -0,0 +1,50 @@
+#!/bin/bash + +if ! [ -x "$(command -v gum)" ]; then + echo 'Error: gum is not installed.' >&2 + echo 'See https://github.com/charmbracelet/gum' >&2 + exit 1 +fi + +if ! [ -x "$(command -v jq)" ]; then + echo 'Error: jq is not installed.' >&2 + echo 'See https://github.com/jqlang/jq' >&2 + exit 1 +fi + +CONFIG_FILE="$HOME/.config/ssh-portal.json" + +if [ ! -f "$CONFIG_FILE" ]; then + echo "⚠ $CONFIG_FILE doesn't exist. Please create it." + exit 1 +fi + +INSTANCES=$(cat $CONFIG_FILE | jq .instances) +ACTIONS=$(cat $CONFIG_FILE | jq .actions) + +CATEGORY=$(echo $INSTANCES| jq -r 'map(.category) | unique | .[]' | gum choose --header "📍 Catégorie") +INSTANCE_NAME=$(echo $INSTANCES | jq -r ".[] | select(.category == \"$CATEGORY\") | .name" | gum choose --header "🔵 Instance") +ACTION_NAME=$(echo $ACTIONS| jq -r .[].name | gum choose --header "$ Action") + +if [ -z "$INSTANCE_NAME" ] || [ -z "$ACTION_NAME" ]; then + exit 0 +fi + +INSTANCE=$(echo $INSTANCES | jq ".[] | select(.name == \"$INSTANCE_NAME\")") +INSTANCE_USERNAME=$(echo $INSTANCE | jq -r '.username') +ACTION_CMD=$(echo $ACTIONS | jq -r ".[] | select(.name == \"$ACTION_NAME\") | .cmd") +SSH_HOST=$(echo $INSTANCE | jq -r '.host') +SSH_PORT=$(echo $INSTANCE | jq -r '.port') + + +if [ -z "$SSH_HOST" ] || [ "$SSH_HOST" = "null" ]; then + SSH_HOST=$(cat $CONFIG_FILE | jq -r .defaultSSH.host) +fi +if [ -z "$SSH_PORT" ] || [ "$SSH_PORT" = "null" ]; then + SSH_PORT=$(cat $CONFIG_FILE | jq -r .defaultSSH.port) +fi + +echo "🚀 Connecting to $INSTANCE_NAME..." +echo "$ $ACTION_CMD" + +ssh -p $SSH_PORT "$INSTANCE_USERNAME@$SSH_HOST" $ACTION_CMD
A
ssh-portal.example.json
@@ -0,0 +1,38 @@
+{ + "defaultSSH": { + "host": "gate.hidora.com", + "port": 3022 + }, + "instances": [ + { + "name": "My App in test", + "username": "42099-7543", + "category": "Test" + }, + { + "name": "My App in prod", + "username": "23771-7543", + "category": "Prod", + "host": "10.253.23.1", + "port": "2222" + } + ], + "actions": [ + { + "name": "Voir les logs en continu", + "cmd": "tail -f -n 50 /var/log/run.log" + }, + { + "name": "Voir les derniers logs", + "cmd": "tail -n 100 /var/log/run.log" + }, + { + "name": "Voir les variables d'environnement", + "cmd": "env" + }, + { + "name": "Ouvrir un shell", + "cmd": "" + } + ] +}