From 828171c977d5752c8a5ac1fd5c234b5bac53dd9c Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 18 May 2025 13:00:35 +1200 Subject: [PATCH] dropshell release 2025.0518.1300 --- source/agent/common.sh | 14 +--- source/src/autogen/_agent.cpp | 132 +++++++++++++++++----------------- source/src/main.cpp | 1 + source/src/utils/execute.cpp | 31 +++++++- source/src/utils/output.cpp | 119 ++++++++++++++++++++++++++++++ source/src/utils/output.hpp | 33 +++++++++ 6 files changed, 246 insertions(+), 84 deletions(-) create mode 100644 source/src/utils/output.cpp diff --git a/source/agent/common.sh b/source/agent/common.sh index 9f650f0..6b638fc 100755 --- a/source/agent/common.sh +++ b/source/agent/common.sh @@ -28,20 +28,10 @@ # Prints an error message in red and exits with status code 1. _die() { - echo -e "\033[91mError: $1\033[0m" + echo -e "Error: $1" exit 1 } -# Switches terminal output color to grey. -_grey_start() { - echo -e -n "\033[90m" -} - -# Resets terminal output color from grey. -_grey_end() { - echo -e -n "\033[0m" -} - # Creates/starts a container, verifying it runs. _create_and_start_container() { if [ -z "$1" ] || [ -z "$2" ]; then @@ -55,9 +45,7 @@ _create_and_start_container() { _is_container_running $container_name && return 0 _start_container $container_name else - _grey_start $run_cmd - _grey_end fi if ! _is_container_running $container_name; then diff --git a/source/src/autogen/_agent.cpp b/source/src/autogen/_agent.cpp index 94b0370..7109976 100644 --- a/source/src/autogen/_agent.cpp +++ b/source/src/autogen/_agent.cpp @@ -360,73 +360,69 @@ bool recreate_tree(std::string destination_folder) { "LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t"\ "LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIFByaW50cyBh"\ "biBlcnJvciBtZXNzYWdlIGluIHJlZCBhbmQgZXhpdHMgd2l0aCBzdGF0dXMgY29kZSAxLgpfZGll"\ - "KCkgewogICAgZWNobyAtZSAiXDAzM1s5MW1FcnJvcjogJDFcMDMzWzBtIgogICAgZXhpdCAxCn0K"\ - "CiMgU3dpdGNoZXMgdGVybWluYWwgb3V0cHV0IGNvbG9yIHRvIGdyZXkuCl9ncmV5X3N0YXJ0KCkg"\ - "ewogICAgZWNobyAtZSAtbiAiXDAzM1s5MG0iCn0KCiMgUmVzZXRzIHRlcm1pbmFsIG91dHB1dCBj"\ - "b2xvciBmcm9tIGdyZXkuCl9ncmV5X2VuZCgpIHsKICAgIGVjaG8gLWUgLW4gIlwwMzNbMG0iCn0K"\ - "CiMgQ3JlYXRlcy9zdGFydHMgYSBjb250YWluZXIsIHZlcmlmeWluZyBpdCBydW5zLgpfY3JlYXRl"\ - "X2FuZF9zdGFydF9jb250YWluZXIoKSB7CiAgICBpZiBbIC16ICIkMSIgXSB8fCBbIC16ICIkMiIg"\ - "XTsgdGhlbgogICAgICAgIF9kaWUgIlRlbXBsYXRlIGVycm9yOiBjcmVhdGVfYW5kX3N0YXJ0X2Nv"\ - "bnRhaW5lciA8cnVuX2NtZD4gPGNvbnRhaW5lcl9uYW1lPiIKICAgIGZpCgogICAgbG9jYWwgcnVu"\ - "X2NtZD0iJDEiCiAgICBsb2NhbCBjb250YWluZXJfbmFtZT0iJDIiCgogICAgaWYgX2lzX2NvbnRh"\ - "aW5lcl9leGlzdHMgJGNvbnRhaW5lcl9uYW1lOyB0aGVuCiAgICAgICAgX2lzX2NvbnRhaW5lcl9y"\ - "dW5uaW5nICRjb250YWluZXJfbmFtZSAmJiByZXR1cm4gMAogICAgICAgIF9zdGFydF9jb250YWlu"\ - "ZXIgJGNvbnRhaW5lcl9uYW1lCiAgICBlbHNlCiAgICAgICAgX2dyZXlfc3RhcnQKICAgICAgICAk"\ - "cnVuX2NtZAogICAgICAgIF9ncmV5X2VuZAogICAgZmkKCiAgICBpZiAhIF9pc19jb250YWluZXJf"\ - "cnVubmluZyAkY29udGFpbmVyX25hbWU7IHRoZW4KICAgICAgICBfZGllICJDb250YWluZXIgJHtj"\ - "b250YWluZXJfbmFtZX0gZmFpbGVkIHRvIHN0YXJ0IgogICAgZmkKCiAgICBJRD0kKF9nZXRfY29u"\ - "dGFpbmVyX2lkICRjb250YWluZXJfbmFtZSkKICAgIGVjaG8gIkNvbnRhaW5lciAke2NvbnRhaW5l"\ - "cl9uYW1lfSBpcyBydW5uaW5nIHdpdGggSUQgJHtJRH0iCn0KCiMgQ3JlYXRlcyBhIGRpcmVjdG9y"\ - "eSBpZiBpdCBkb2Vzbid0IGV4aXN0IChjaG1vZCA3NzcpLgpfY3JlYXRlX2ZvbGRlcigpIHsKICAg"\ - "IGxvY2FsIGZvbGRlcj0iJDEiCiAgICBpZiBbIC1kICIkZm9sZGVyIiBdOyB0aGVuCiAgICAgICAg"\ - "cmV0dXJuIDAKICAgIGZpCiAgICBpZiAhIG1rZGlyIC1wICIkZm9sZGVyIjsgdGhlbgogICAgICAg"\ - "IF9kaWUgIkZhaWxlZCB0byBjcmVhdGUgZm9sZGVyOiAkZm9sZGVyIgogICAgZmkKICAgIGNobW9k"\ - "IDc3NyAiJGZvbGRlciIKICAgIGVjaG8gIkZvbGRlciBjcmVhdGVkOiAkZm9sZGVyIgp9CgojIENo"\ - "ZWNrcyBpZiBEb2NrZXIgaXMgaW5zdGFsbGVkLCBydW5uaW5nLCBhbmQgdXNlciBoYXMgcGVybWlz"\ - "c2lvbi4gUmV0dXJucyAxIG9uIGZhaWx1cmUuCl9jaGVja19kb2NrZXJfaW5zdGFsbGVkKCkgewog"\ - "ICAgaWYgISBjb21tYW5kIC12IGRvY2tlciAmPiAvZGV2L251bGw7IHRoZW4KICAgICAgICBlY2hv"\ - "ICJEb2NrZXIgaXMgbm90IGluc3RhbGxlZCIKICAgICAgICByZXR1cm4gMQogICAgZmkKCiAgICAj"\ - "IGNoZWNrIGlmIGRvY2tlciBkYWVtb24gaXMgcnVubmluZwogICAgaWYgISBkb2NrZXIgaW5mbyAm"\ - "PiAvZGV2L251bGw7IHRoZW4KICAgICAgICBlY2hvICJEb2NrZXIgZGFlbW9uIGlzIG5vdCBydW5u"\ - "aW5nIgogICAgICAgIHJldHVybiAxCiAgICBmaQoKICAgICMgY2hlY2sgaWYgdXNlciBoYXMgcGVy"\ - "bWlzc2lvbiB0byBydW4gZG9ja2VyCiAgICBpZiAhIGRvY2tlciBydW4gLS1ybSBoZWxsby13b3Js"\ - "ZCAmPiAvZGV2L251bGw7IHRoZW4KICAgICAgICBlY2hvICJVc2VyIGRvZXMgbm90IGhhdmUgcGVy"\ - "bWlzc2lvbiB0byBydW4gZG9ja2VyIgogICAgICAgIHJldHVybiAxCiAgICBmaQoKICAgIHJldHVy"\ - "biAwCn0KCiMgQ2hlY2tzIGlmIGEgY29udGFpbmVyIChhbnkgc3RhdGUpIGV4aXN0cy4gUmV0dXJu"\ - "cyAxIGlmIG5vdCBmb3VuZC4KX2lzX2NvbnRhaW5lcl9leGlzdHMoKSB7CiAgICBpZiAhIGRvY2tl"\ - "ciBwcyAtYSAtLWZvcm1hdCAie3suTmFtZXN9fSIgfCBncmVwIC1xICJeJDEkIjsgdGhlbgogICAg"\ - "ICAgIHJldHVybiAxCiAgICBmaQogICAgcmV0dXJuIDAKfQoKIyBDaGVja3MgaWYgYSBjb250YWlu"\ - "ZXIgaXMgY3VycmVudGx5IHJ1bm5pbmcuIFJldHVybnMgMSBpZiBub3QgcnVubmluZy4KX2lzX2Nv"\ - "bnRhaW5lcl9ydW5uaW5nKCkgewogICAgaWYgISBkb2NrZXIgcHMgLS1mb3JtYXQgInt7Lk5hbWVz"\ - "fX0iIHwgZ3JlcCAtcSAiXiQxJCI7IHRoZW4KICAgICAgICByZXR1cm4gMQogICAgZmkKICAgIHJl"\ - "dHVybiAwCn0KCiMgUHJpbnRzIHRoZSBJRCBvZiB0aGUgbmFtZWQgY29udGFpbmVyLgpfZ2V0X2Nv"\ - "bnRhaW5lcl9pZCgpIHsKICAgIGRvY2tlciBwcyAtLWZvcm1hdCAie3suSUR9fSIgLS1maWx0ZXIg"\ - "Im5hbWU9JDEiCn0KCiMgUHJpbnRzIHRoZSBzdGF0dXMgc3RyaW5nIG9mIHRoZSBuYW1lZCBjb250"\ - "YWluZXIuCl9nZXRfY29udGFpbmVyX3N0YXR1cygpIHsKICAgIGRvY2tlciBwcyAtLWZvcm1hdCAi"\ - "e3suU3RhdHVzfX0iIC0tZmlsdGVyICJuYW1lPSQxIgp9CgojIFN0YXJ0cyBhbiBleGlzdGluZywg"\ - "c3RvcHBlZCBjb250YWluZXIuCl9zdGFydF9jb250YWluZXIoKSB7CiAgICBfaXNfY29udGFpbmVy"\ - "X2V4aXN0cyAkMSB8fCByZXR1cm4gMQogICAgX2lzX2NvbnRhaW5lcl9ydW5uaW5nICQxICYmIHJl"\ - "dHVybiAwCiAgICBkb2NrZXIgc3RhcnQgJDEKfQoKIyBTdG9wcyBhIHJ1bm5pbmcgY29udGFpbmVy"\ - "Lgpfc3RvcF9jb250YWluZXIoKSB7CiAgICBfaXNfY29udGFpbmVyX3J1bm5pbmcgJDEgfHwgcmV0"\ - "dXJuIDA7CiAgICBkb2NrZXIgc3RvcCAkMQp9ICAgCgojIFN0b3BzIChpZiBuZWVkZWQpIGFuZCBy"\ - "ZW1vdmVzIGEgY29udGFpbmVyLgpfcmVtb3ZlX2NvbnRhaW5lcigpIHsKICAgIF9zdG9wX2NvbnRh"\ - "aW5lciAkMQogICAgX2lzX2NvbnRhaW5lcl9leGlzdHMgJDEgfHwgcmV0dXJuIDA7CiAgICBkb2Nr"\ - "ZXIgcm0gJDEKfQoKIyBQcmludHMgdGhlIGxvZ3MgZm9yIGEgY29udGFpbmVyLgpfZ2V0X2NvbnRh"\ - "aW5lcl9sb2dzKCkgewogICAgaWYgISBfaXNfY29udGFpbmVyX2V4aXN0cyAkMTsgdGhlbgogICAg"\ - "ICAgIGVjaG8gIkNvbnRhaW5lciAkMSBkb2VzIG5vdCBleGlzdCIKICAgICAgICByZXR1cm4gMQog"\ - "ICAgZmkKCiAgICBkb2NrZXIgbG9ncyAkMQp9CgojIENoZWNrcyBpZiBsaXN0ZWQgZW52aXJvbm1l"\ - "bnQgdmFyaWFibGVzIGFyZSBzZXQ7IGNhbGxzIF9kaWUoKSBpZiBhbnkgYXJlIG1pc3NpbmcuCl9j"\ - "aGVja19yZXF1aXJlZF9lbnZfdmFycygpIHsKICAgIGxvY2FsIHJlcXVpcmVkX3ZhcnM9KCIkQCIp"\ - "CiAgICBmb3IgdmFyIGluICIke3JlcXVpcmVkX3ZhcnNbQF19IjsgZG8KICAgICAgICBpZiBbIC16"\ - "ICIkeyF2YXJ9IiBdOyB0aGVuCiAgICAgICAgICAgIF9kaWUgIlJlcXVpcmVkIGVudmlyb25tZW50"\ - "IHZhcmlhYmxlICR2YXIgaXMgbm90IHNldCIKICAgICAgICBmaQogICAgZG9uZQp9CgojIFJlbW92"\ - "ZXMgYSBwYXRoIHVzaW5nIGEgcm9vdCBEb2NrZXIgY29udGFpbmVyIChmb3IgcGVybWlzc2lvbnMp"\ - "Lgpfcm9vdF9yZW1vdmVfdHJlZSgpIHsKICAgIGxvY2FsIHRvX3JlbW92ZT0iJDEiCiAgICBwYXJl"\ - "bnQ9JChkaXJuYW1lICIkdG9fcmVtb3ZlIikKICAgIGFic19wYXJlbnQ9JChyZWFscGF0aCAiJHBh"\ - "cmVudCIpCiAgICBjaGlsZD0kKGJhc2VuYW1lICIkdG9fcmVtb3ZlIikKICAgIGRvY2tlciBydW4g"\ - "LS1ybSAtdiAiJGFic19wYXJlbnQiOi9kYXRhIGFscGluZSBybSAtcmYgIi9kYXRhLyRjaGlsZCIK"\ - "fQoKCiMgTG9hZCBhdXRvY29tbWFuZHMKc291cmNlICIke0FHRU5UX1BBVEh9L2RhdGFjb21tYW5k"\ - "cy5zaCI="; + "KCkgewogICAgZWNobyAtZSAiRXJyb3I6ICQxIgogICAgZXhpdCAxCn0KCiMgQ3JlYXRlcy9zdGFy"\ + "dHMgYSBjb250YWluZXIsIHZlcmlmeWluZyBpdCBydW5zLgpfY3JlYXRlX2FuZF9zdGFydF9jb250"\ + "YWluZXIoKSB7CiAgICBpZiBbIC16ICIkMSIgXSB8fCBbIC16ICIkMiIgXTsgdGhlbgogICAgICAg"\ + "IF9kaWUgIlRlbXBsYXRlIGVycm9yOiBjcmVhdGVfYW5kX3N0YXJ0X2NvbnRhaW5lciA8cnVuX2Nt"\ + "ZD4gPGNvbnRhaW5lcl9uYW1lPiIKICAgIGZpCgogICAgbG9jYWwgcnVuX2NtZD0iJDEiCiAgICBs"\ + "b2NhbCBjb250YWluZXJfbmFtZT0iJDIiCgogICAgaWYgX2lzX2NvbnRhaW5lcl9leGlzdHMgJGNv"\ + "bnRhaW5lcl9uYW1lOyB0aGVuCiAgICAgICAgX2lzX2NvbnRhaW5lcl9ydW5uaW5nICRjb250YWlu"\ + "ZXJfbmFtZSAmJiByZXR1cm4gMAogICAgICAgIF9zdGFydF9jb250YWluZXIgJGNvbnRhaW5lcl9u"\ + "YW1lCiAgICBlbHNlCiAgICAgICAgJHJ1bl9jbWQKICAgIGZpCgogICAgaWYgISBfaXNfY29udGFp"\ + "bmVyX3J1bm5pbmcgJGNvbnRhaW5lcl9uYW1lOyB0aGVuCiAgICAgICAgX2RpZSAiQ29udGFpbmVy"\ + "ICR7Y29udGFpbmVyX25hbWV9IGZhaWxlZCB0byBzdGFydCIKICAgIGZpCgogICAgSUQ9JChfZ2V0"\ + "X2NvbnRhaW5lcl9pZCAkY29udGFpbmVyX25hbWUpCiAgICBlY2hvICJDb250YWluZXIgJHtjb250"\ + "YWluZXJfbmFtZX0gaXMgcnVubmluZyB3aXRoIElEICR7SUR9Igp9CgojIENyZWF0ZXMgYSBkaXJl"\ + "Y3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdCAoY2htb2QgNzc3KS4KX2NyZWF0ZV9mb2xkZXIoKSB7"\ + "CiAgICBsb2NhbCBmb2xkZXI9IiQxIgogICAgaWYgWyAtZCAiJGZvbGRlciIgXTsgdGhlbgogICAg"\ + "ICAgIHJldHVybiAwCiAgICBmaQogICAgaWYgISBta2RpciAtcCAiJGZvbGRlciI7IHRoZW4KICAg"\ + "ICAgICBfZGllICJGYWlsZWQgdG8gY3JlYXRlIGZvbGRlcjogJGZvbGRlciIKICAgIGZpCiAgICBj"\ + "aG1vZCA3NzcgIiRmb2xkZXIiCiAgICBlY2hvICJGb2xkZXIgY3JlYXRlZDogJGZvbGRlciIKfQoK"\ + "IyBDaGVja3MgaWYgRG9ja2VyIGlzIGluc3RhbGxlZCwgcnVubmluZywgYW5kIHVzZXIgaGFzIHBl"\ + "cm1pc3Npb24uIFJldHVybnMgMSBvbiBmYWlsdXJlLgpfY2hlY2tfZG9ja2VyX2luc3RhbGxlZCgp"\ + "IHsKICAgIGlmICEgY29tbWFuZCAtdiBkb2NrZXIgJj4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAg"\ + "ZWNobyAiRG9ja2VyIGlzIG5vdCBpbnN0YWxsZWQiCiAgICAgICAgcmV0dXJuIDEKICAgIGZpCgog"\ + "ICAgIyBjaGVjayBpZiBkb2NrZXIgZGFlbW9uIGlzIHJ1bm5pbmcKICAgIGlmICEgZG9ja2VyIGlu"\ + "Zm8gJj4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAiRG9ja2VyIGRhZW1vbiBpcyBub3Qg"\ + "cnVubmluZyIKICAgICAgICByZXR1cm4gMQogICAgZmkKCiAgICAjIGNoZWNrIGlmIHVzZXIgaGFz"\ + "IHBlcm1pc3Npb24gdG8gcnVuIGRvY2tlcgogICAgaWYgISBkb2NrZXIgcnVuIC0tcm0gaGVsbG8t"\ + "d29ybGQgJj4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAiVXNlciBkb2VzIG5vdCBoYXZl"\ + "IHBlcm1pc3Npb24gdG8gcnVuIGRvY2tlciIKICAgICAgICByZXR1cm4gMQogICAgZmkKCiAgICBy"\ + "ZXR1cm4gMAp9CgojIENoZWNrcyBpZiBhIGNvbnRhaW5lciAoYW55IHN0YXRlKSBleGlzdHMuIFJl"\ + "dHVybnMgMSBpZiBub3QgZm91bmQuCl9pc19jb250YWluZXJfZXhpc3RzKCkgewogICAgaWYgISBk"\ + "b2NrZXIgcHMgLWEgLS1mb3JtYXQgInt7Lk5hbWVzfX0iIHwgZ3JlcCAtcSAiXiQxJCI7IHRoZW4K"\ + "ICAgICAgICByZXR1cm4gMQogICAgZmkKICAgIHJldHVybiAwCn0KCiMgQ2hlY2tzIGlmIGEgY29u"\ + "dGFpbmVyIGlzIGN1cnJlbnRseSBydW5uaW5nLiBSZXR1cm5zIDEgaWYgbm90IHJ1bm5pbmcuCl9p"\ + "c19jb250YWluZXJfcnVubmluZygpIHsKICAgIGlmICEgZG9ja2VyIHBzIC0tZm9ybWF0ICJ7ey5O"\ + "YW1lc319IiB8IGdyZXAgLXEgIl4kMSQiOyB0aGVuCiAgICAgICAgcmV0dXJuIDEKICAgIGZpCiAg"\ + "ICByZXR1cm4gMAp9CgojIFByaW50cyB0aGUgSUQgb2YgdGhlIG5hbWVkIGNvbnRhaW5lci4KX2dl"\ + "dF9jb250YWluZXJfaWQoKSB7CiAgICBkb2NrZXIgcHMgLS1mb3JtYXQgInt7LklEfX0iIC0tZmls"\ + "dGVyICJuYW1lPSQxIgp9CgojIFByaW50cyB0aGUgc3RhdHVzIHN0cmluZyBvZiB0aGUgbmFtZWQg"\ + "Y29udGFpbmVyLgpfZ2V0X2NvbnRhaW5lcl9zdGF0dXMoKSB7CiAgICBkb2NrZXIgcHMgLS1mb3Jt"\ + "YXQgInt7LlN0YXR1c319IiAtLWZpbHRlciAibmFtZT0kMSIKfQoKIyBTdGFydHMgYW4gZXhpc3Rp"\ + "bmcsIHN0b3BwZWQgY29udGFpbmVyLgpfc3RhcnRfY29udGFpbmVyKCkgewogICAgX2lzX2NvbnRh"\ + "aW5lcl9leGlzdHMgJDEgfHwgcmV0dXJuIDEKICAgIF9pc19jb250YWluZXJfcnVubmluZyAkMSAm"\ + "JiByZXR1cm4gMAogICAgZG9ja2VyIHN0YXJ0ICQxCn0KCiMgU3RvcHMgYSBydW5uaW5nIGNvbnRh"\ + "aW5lci4KX3N0b3BfY29udGFpbmVyKCkgewogICAgX2lzX2NvbnRhaW5lcl9ydW5uaW5nICQxIHx8"\ + "IHJldHVybiAwOwogICAgZG9ja2VyIHN0b3AgJDEKfSAgIAoKIyBTdG9wcyAoaWYgbmVlZGVkKSBh"\ + "bmQgcmVtb3ZlcyBhIGNvbnRhaW5lci4KX3JlbW92ZV9jb250YWluZXIoKSB7CiAgICBfc3RvcF9j"\ + "b250YWluZXIgJDEKICAgIF9pc19jb250YWluZXJfZXhpc3RzICQxIHx8IHJldHVybiAwOwogICAg"\ + "ZG9ja2VyIHJtICQxCn0KCiMgUHJpbnRzIHRoZSBsb2dzIGZvciBhIGNvbnRhaW5lci4KX2dldF9j"\ + "b250YWluZXJfbG9ncygpIHsKICAgIGlmICEgX2lzX2NvbnRhaW5lcl9leGlzdHMgJDE7IHRoZW4K"\ + "ICAgICAgICBlY2hvICJDb250YWluZXIgJDEgZG9lcyBub3QgZXhpc3QiCiAgICAgICAgcmV0dXJu"\ + "IDEKICAgIGZpCgogICAgZG9ja2VyIGxvZ3MgJDEKfQoKIyBDaGVja3MgaWYgbGlzdGVkIGVudmly"\ + "b25tZW50IHZhcmlhYmxlcyBhcmUgc2V0OyBjYWxscyBfZGllKCkgaWYgYW55IGFyZSBtaXNzaW5n"\ + "LgpfY2hlY2tfcmVxdWlyZWRfZW52X3ZhcnMoKSB7CiAgICBsb2NhbCByZXF1aXJlZF92YXJzPSgi"\ + "JEAiKQogICAgZm9yIHZhciBpbiAiJHtyZXF1aXJlZF92YXJzW0BdfSI7IGRvCiAgICAgICAgaWYg"\ + "WyAteiAiJHshdmFyfSIgXTsgdGhlbgogICAgICAgICAgICBfZGllICJSZXF1aXJlZCBlbnZpcm9u"\ + "bWVudCB2YXJpYWJsZSAkdmFyIGlzIG5vdCBzZXQiCiAgICAgICAgZmkKICAgIGRvbmUKfQoKIyBS"\ + "ZW1vdmVzIGEgcGF0aCB1c2luZyBhIHJvb3QgRG9ja2VyIGNvbnRhaW5lciAoZm9yIHBlcm1pc3Np"\ + "b25zKS4KX3Jvb3RfcmVtb3ZlX3RyZWUoKSB7CiAgICBsb2NhbCB0b19yZW1vdmU9IiQxIgogICAg"\ + "cGFyZW50PSQoZGlybmFtZSAiJHRvX3JlbW92ZSIpCiAgICBhYnNfcGFyZW50PSQocmVhbHBhdGgg"\ + "IiRwYXJlbnQiKQogICAgY2hpbGQ9JChiYXNlbmFtZSAiJHRvX3JlbW92ZSIpCiAgICBkb2NrZXIg"\ + "cnVuIC0tcm0gLXYgIiRhYnNfcGFyZW50IjovZGF0YSBhbHBpbmUgcm0gLXJmICIvZGF0YS8kY2hp"\ + "bGQiCn0KCgojIExvYWQgYXV0b2NvbW1hbmRzCnNvdXJjZSAiJHtBR0VOVF9QQVRIfS9kYXRhY29t"\ + "bWFuZHMuc2gi"; // Decode Base64 data size_t decoded_size = (strlen(filedata_base64) * 3) / 4; @@ -434,7 +430,7 @@ bool recreate_tree(std::string destination_folder) { size_t actual_size; base64_decode(filedata_base64, strlen(filedata_base64), decoded_data, &actual_size); - bool file_written = _recreate_file_(outpath, 15958097326741776083ULL, std::filesystem::perms(493), decoded_data, actual_size); + bool file_written = _recreate_file_(outpath, 6967493376886731479ULL, std::filesystem::perms(493), decoded_data, actual_size); delete[] decoded_data; any_written = any_written || file_written; } diff --git a/source/src/main.cpp b/source/src/main.cpp index 139dc85..de72de4 100644 --- a/source/src/main.cpp +++ b/source/src/main.cpp @@ -8,6 +8,7 @@ #include "autocomplete.hpp" #include "utils/hash.hpp" #include "command_registry.hpp" +#include "output.hpp" #include #include diff --git a/source/src/utils/execute.cpp b/source/src/utils/execute.cpp index 7749cd2..144e0f2 100644 --- a/source/src/utils/execute.cpp +++ b/source/src/utils/execute.cpp @@ -13,6 +13,7 @@ #include "utils/b64ed.hpp" #include "config.hpp" #include "utils/directories.hpp" +#include "utils/output.hpp" namespace dropshell { @@ -21,6 +22,10 @@ namespace dropshell return (ret != -1 && WIFEXITED(ret) && (WEXITSTATUS(ret) == 0)); // ret is -1 if the command failed to execute. } + + // ---------------------------------------------------------------------------------------------------------- + // execute_local_command_interactive + // ---------------------------------------------------------------------------------------------------------- bool execute_local_command_interactive(const sCommand &command) { if (command.get_command_to_run().empty()) @@ -51,6 +56,9 @@ namespace dropshell } } + // ---------------------------------------------------------------------------------------------------------- + // execute_local_command_and_capture_output + // ---------------------------------------------------------------------------------------------------------- bool execute_local_command_and_capture_output(const sCommand &command, std::string *output) { ASSERT(output != nullptr, "Output string must be provided"); @@ -71,6 +79,9 @@ namespace dropshell return EXITSTATUSCHECK(ret); } + // ---------------------------------------------------------------------------------------------------------- + // execute_local_command + // ---------------------------------------------------------------------------------------------------------- bool execute_local_command(std::string command, std::string *output, cMode mode) { return execute_local_command("", command, {}, output, mode); @@ -100,17 +111,25 @@ namespace dropshell return false; bool silent = hasFlag(mode, cMode::Silent); std::string full_cmd = command.construct_cmd(localpath::agent()) + " 2>&1" + (silent ? " > /dev/null" : ""); - int ret = system(full_cmd.c_str()); + + int ret=0; + { + SwitchColour sc(sColour::DEBUG, std::cerr); + ret = system(full_cmd.c_str()); + } bool ok = EXITSTATUSCHECK(ret); if (!ok && !silent) { - std::cerr << "Error: Failed to execute command: " << std::endl; - std::cerr << full_cmd << std::endl; + PrintError("Error: Failed to execute command: "); + PrintError(full_cmd); } return ok; } + // ---------------------------------------------------------------------------------------------------------- + // execute_ssh_command + // ---------------------------------------------------------------------------------------------------------- bool execute_ssh_command(const sSSHInfo &ssh_info, const sCommand &remote_command, cMode mode, std::string *output) { if (remote_command.get_command_to_run().empty()) @@ -144,6 +163,9 @@ namespace dropshell return rval; } + // ---------------------------------------------------------------------------------------------------------- + // makesafecmd + // ---------------------------------------------------------------------------------------------------------- std::string sCommand::makesafecmd(std::string agent_path, const std::string &command) const { if (command.empty()) @@ -153,6 +175,9 @@ namespace dropshell return commandstr; } + // ---------------------------------------------------------------------------------------------------------- + // construct_cmd + // ---------------------------------------------------------------------------------------------------------- std::string sCommand::construct_cmd(std::string agent_path) const { if (mCmd.empty()) diff --git a/source/src/utils/output.cpp b/source/src/utils/output.cpp new file mode 100644 index 0000000..9d7cd13 --- /dev/null +++ b/source/src/utils/output.cpp @@ -0,0 +1,119 @@ +#include "output.hpp" +#include +#include + +namespace { + // Mutex to synchronize output + std::mutex output_mutex; + + // ANSI colour codes + constexpr const char* GREY = "\033[90m"; + constexpr const char* RESET = "\033[0m"; + constexpr const char* DEBUG_COLOUR = "\033[36m"; // Cyan + constexpr const char* INFO_COLOUR = "\033[32m"; // Green + constexpr const char* WARNING_COLOUR = "\033[33m"; // Yellow + constexpr const char* ERROR_COLOUR = "\033[31m"; // Red + + // Tag and colour for each stream + struct StreamInfo { + const char* tag; + const char* colour; + }; + + const StreamInfo stream_infos[] = { + {"[DBG]", DEBUG_COLOUR}, + {"[INF]", INFO_COLOUR}, + {"[WRN]", WARNING_COLOUR}, + {"[ERR]", ERROR_COLOUR} + }; + + // Custom streambuf to prefix and colour each line + class PrefixStreambuf : public std::streambuf { + public: + PrefixStreambuf(std::ostream& dest, const char* tag, const char* colour) + : dest_(dest), tag_(tag), colour_(colour), at_line_start_(true) {} + + protected: + int overflow(int c) override { + std::lock_guard lock(output_mutex); + if (c == EOF) return !EOF; + if (at_line_start_ && c != '\n') { + dest_ << GREY << tag_ << RESET << ' ' << colour_; + at_line_start_ = false; + } + dest_.put(static_cast(c)); + if (c == '\n') { + dest_ << RESET; + at_line_start_ = true; + } + return c; + } + private: + std::ostream& dest_; + const char* tag_; + const char* colour_; + bool at_line_start_; + }; + + PrefixStreambuf debug_buf(std::clog, stream_infos[0].tag, stream_infos[0].colour); + PrefixStreambuf info_buf(std::clog, stream_infos[1].tag, stream_infos[1].colour); + PrefixStreambuf warning_buf(std::clog, stream_infos[2].tag, stream_infos[2].colour); + PrefixStreambuf error_buf(std::cerr, stream_infos[3].tag, stream_infos[3].colour); + + std::ostream debug_stream(&debug_buf); + std::ostream info_stream(&info_buf); + std::ostream warning_stream(&warning_buf); + std::ostream error_stream(&error_buf); +} + +std::ostream& debug = debug_stream; +std::ostream& info = info_stream; +std::ostream& warning = warning_stream; +std::ostream& error = error_stream; + +void SetColour(sColour colour, std::ostream& os) { + switch (colour) { + case sColour::RESET: + os << RESET; + break; + case sColour::DEBUG: + os << DEBUG_COLOUR; + break; + case sColour::INFO: + os << INFO_COLOUR; + break; + case sColour::WARNING: + os << WARNING_COLOUR; + break; + case sColour::ERROR: + os << ERROR_COLOUR; + break; + } +} + +void PrintDebug(const std::string& msg) { + std::lock_guard lock(output_mutex); + debug << msg << '\n'; +} +void PrintInfo(const std::string& msg) { + std::lock_guard lock(output_mutex); + info << msg << '\n'; +} +void PrintWarning(const std::string& msg) { + std::lock_guard lock(output_mutex); + warning << msg << '\n'; +} +void PrintError(const std::string& msg) { + std::lock_guard lock(output_mutex); + error << msg << '\n'; +} + +SwitchColour::SwitchColour(sColour colour, std::ostream& os) : os_(os), colour_(colour) +{ + SetColour(colour_, os_); +} + +SwitchColour::~SwitchColour() +{ + SetColour(sColour::RESET, os_); +} diff --git a/source/src/utils/output.hpp b/source/src/utils/output.hpp index 19e23b1..1e4c412 100644 --- a/source/src/utils/output.hpp +++ b/source/src/utils/output.hpp @@ -4,6 +4,7 @@ #include #include #include +#include /* @@ -47,5 +48,37 @@ enum class sColour { */ +// Output streams for different log levels +extern std::ostream& debug; +extern std::ostream& info; +extern std::ostream& warning; +extern std::ostream& error; +// Enum for colours +enum class sColour { + RESET, + DEBUG, + INFO, + WARNING, + ERROR +}; + +// Set colour for a stream +void SetColour(sColour colour, std::ostream& os = std::cerr); + +// Helper print functions +void PrintDebug(const std::string& msg); +void PrintInfo(const std::string& msg); +void PrintWarning(const std::string& msg); +void PrintError(const std::string& msg); + +class SwitchColour +{ + public: + SwitchColour(sColour colour, std::ostream& os = std::cerr); + ~SwitchColour(); + private: + std::ostream& os_; + sColour colour_; +}; #endif // OUTPUT_HPP \ No newline at end of file