dropshell release 2025.0519.0021
Some checks failed
Dropshell Test / Build_and_Test (push) Has been cancelled
Some checks failed
Dropshell Test / Build_and_Test (push) Has been cancelled
This commit is contained in:
160
source/src/autogen/_agent-local.cpp
Normal file
160
source/src/autogen/_agent-local.cpp
Normal file
@@ -0,0 +1,160 @@
|
||||
#include <fstream>
|
||||
#include <filesystem>
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <cstring>
|
||||
|
||||
/*
|
||||
|
||||
THIS FILE IS AUTO-GENERATED BY DEHYDRATE.
|
||||
DO NOT EDIT THIS FILE.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#include "_agent-local.hpp"
|
||||
namespace recreate_agent_local {
|
||||
|
||||
|
||||
// Tiny dependency-free FNV-1a 64-bit hash
|
||||
static uint64_t fnv1a_64(const void* data, size_t len) {
|
||||
const uint8_t* p = static_cast<const uint8_t*>(data);
|
||||
uint64_t h = 0xcbf29ce484222325ULL;
|
||||
for (size_t i = 0; i < len; ++i)
|
||||
h = (h ^ p[i]) * 0x100000001b3ULL;
|
||||
return h;
|
||||
}
|
||||
|
||||
|
||||
// Base64 decoding function - no dependencies
|
||||
static void base64_decode(const char* encoded_data, size_t encoded_len, unsigned char* output, size_t* output_len) {
|
||||
const char* base64_chars =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
size_t out_pos = 0;
|
||||
int val = 0, valb = -8;
|
||||
|
||||
for (size_t i = 0; i < encoded_len; i++) {
|
||||
char c = encoded_data[i];
|
||||
if (c == '=') break;
|
||||
|
||||
// Find position in base64_chars
|
||||
const char* pos = strchr(base64_chars, c);
|
||||
if (pos == nullptr) continue; // Skip invalid characters
|
||||
|
||||
val = (val << 6) + static_cast<int>(pos - base64_chars);
|
||||
valb += 6;
|
||||
if (valb >= 0) {
|
||||
output[out_pos++] = static_cast<unsigned char>((val >> valb) & 0xFF);
|
||||
valb -= 8;
|
||||
}
|
||||
}
|
||||
|
||||
*output_len = out_pos;
|
||||
}
|
||||
|
||||
// Utility function to recreate a file with proper permissions
|
||||
static bool _recreate_file_(const std::filesystem::path& outpath, uint64_t file_hash, std::filesystem::perms file_perms, const unsigned char* filedata, size_t filedata_len) {
|
||||
namespace fs = std::filesystem;
|
||||
bool needs_write = false;
|
||||
|
||||
// Check if file exists and has correct hash
|
||||
if (fs::exists(outpath)) {
|
||||
// Check content hash
|
||||
std::ifstream in(outpath, std::ios::binary);
|
||||
std::ostringstream oss;
|
||||
oss << in.rdbuf();
|
||||
std::string data = oss.str();
|
||||
uint64_t existing_hash = fnv1a_64(data.data(), data.size());
|
||||
needs_write = existing_hash != file_hash;
|
||||
} else {
|
||||
needs_write = true; // File doesn't exist, need to create it
|
||||
}
|
||||
|
||||
bool needs_permission_update = true;
|
||||
if (!needs_write) { // we always update permissions if the file is written or changed. Othewise we check.
|
||||
fs::perms current_perms = fs::status(outpath).permissions();
|
||||
needs_permission_update = current_perms != file_perms;
|
||||
}
|
||||
|
||||
if (needs_write) {
|
||||
fs::create_directories(outpath.parent_path());
|
||||
std::ofstream out(outpath, std::ios::binary);
|
||||
out.write(reinterpret_cast<const char*>(filedata), filedata_len);
|
||||
out.close();
|
||||
// Set the file permissions
|
||||
fs::permissions(outpath, file_perms);
|
||||
|
||||
if (!fs::exists(outpath)) {
|
||||
std::cout << "[dehydrate] " << outpath.filename() << ": created\n";
|
||||
} else {
|
||||
std::cout << "[dehydrate] " << outpath.filename() << ": updated (hash changed)\n";
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
if (needs_permission_update) {
|
||||
// Update only permissions
|
||||
fs::permissions(outpath, file_perms);
|
||||
std::cout << "[dehydrate] " << outpath.filename() << ": updated (permissions changed)\n";
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool recreate_tree(std::string destination_folder) {
|
||||
namespace fs = std::filesystem;
|
||||
bool any_written = false;
|
||||
{
|
||||
// File: agent-install.sh
|
||||
fs::path outpath = fs::path(destination_folder) / "agent-install.sh";
|
||||
static const char filedata_base64[] = "IyEvYmluL2Jhc2gKClNDUklQVF9ESVI9JChkaXJuYW1lICIkMCIpCgplY2hvICJJbnN0YWxsaW5n"\
|
||||
"IGRyb3BzaGVsbCBob3N0IGFnZW50IG9uIHRoaXMgY29tcHV0ZXIuLi4iCgoKIyBQcmludHMgYW4g"\
|
||||
"ZXJyb3IgbWVzc2FnZSBpbiByZWQgYW5kIGV4aXRzIHdpdGggc3RhdHVzIGNvZGUgMS4KX2RpZSgp"\
|
||||
"IHsKICAgIGVjaG8gLWUgIkVycm9yOiAkMSIKICAgIGV4aXQgMQp9CgoKIyBDaGVja3MgaWYgbGlz"\
|
||||
"dGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0OyBjYWxscyBfZGllKCkgaWYgYW55IGFy"\
|
||||
"ZSBtaXNzaW5nLgpfY2hlY2tfcmVxdWlyZWRfZW52X3ZhcnMoKSB7CiAgICBsb2NhbCByZXF1aXJl"\
|
||||
"ZF92YXJzPSgiJEAiKQogICAgZm9yIHZhciBpbiAiJHtyZXF1aXJlZF92YXJzW0BdfSI7IGRvCiAg"\
|
||||
"ICAgICAgaWYgWyAteiAiJHshdmFyfSIgXTsgdGhlbgogICAgICAgICAgICBfZGllICJSZXF1aXJl"\
|
||||
"ZCBlbnZpcm9ubWVudCB2YXJpYWJsZSAkdmFyIGlzIG5vdCBzZXQiCiAgICAgICAgZmkKICAgIGRv"\
|
||||
"bmUKfQoKIyBDaGVja3MgaWYgRG9ja2VyIGlzIGluc3RhbGxlZCwgcnVubmluZywgYW5kIHVzZXIg"\
|
||||
"aGFzIHBlcm1pc3Npb24uIFJldHVybnMgMSBvbiBmYWlsdXJlLgpfY2hlY2tfZG9ja2VyX2luc3Rh"\
|
||||
"bGxlZCgpIHsKICAgIGlmICEgY29tbWFuZCAtdiBkb2NrZXIgJj4gL2Rldi9udWxsOyB0aGVuCiAg"\
|
||||
"ICAgICAgZWNobyAiRG9ja2VyIGlzIG5vdCBpbnN0YWxsZWQiCiAgICAgICAgcmV0dXJuIDEKICAg"\
|
||||
"IGZpCgogICAgIyBjaGVjayBpZiBkb2NrZXIgZGFlbW9uIGlzIHJ1bm5pbmcKICAgIGlmICEgZG9j"\
|
||||
"a2VyIGluZm8gJj4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAiRG9ja2VyIGRhZW1vbiBp"\
|
||||
"cyBub3QgcnVubmluZyIKICAgICAgICByZXR1cm4gMQogICAgZmkKCiAgICAjIGNoZWNrIGlmIHVz"\
|
||||
"ZXIgaGFzIHBlcm1pc3Npb24gdG8gcnVuIGRvY2tlcgogICAgaWYgISBkb2NrZXIgcnVuIC0tcm0g"\
|
||||
"aGVsbG8td29ybGQgJj4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAiVXNlciBkb2VzIG5v"\
|
||||
"dCBoYXZlIHBlcm1pc3Npb24gdG8gcnVuIGRvY2tlciIKICAgICAgICByZXR1cm4gMQogICAgZmkK"\
|
||||
"CiAgICByZXR1cm4gMAp9CgpmdW5jdGlvbiBpbnN0YWxsX2JiNjQoKSB7ICAgIAogICAgIyBjaGVj"\
|
||||
"ayBjdXJsIGluc3RhbGxlZAogICAgaWYgISBjb21tYW5kIC12IGN1cmwgJj4gL2Rldi9udWxsOyB0"\
|
||||
"aGVuCiAgICAgICAgX2RpZSAiQ3VybCBpcyBub3QgaW5zdGFsbGVkLiBDdXJsIGlzIHJlcXVpcmVk"\
|
||||
"IGZvciBhZ2VudCBpbnN0YWxsYXRpb24uIgogICAgZmkKCiAgICBjdXJsIC1mc1NMICJodHRwczov"\
|
||||
"L2dpdGVhLmpkZS5uei9wdWJsaWMvYmI2NC9yZWxlYXNlcy9kb3dubG9hZC9sYXRlc3QvaW5zdGFs"\
|
||||
"bC5zaCIgfCBiYXNoIC1zIC0tICIkQUdFTlRfUEFUSCIgIiQoaWQgLXUgJFVTRVIpOiQoaWQgLWcg"\
|
||||
"JFVTRVIpIgoKICAgICMgdGVzdCByZXN1bHQgY29kZSBmcm9tIGN1cmwKICAgIGlmIFsgJD8gLW5l"\
|
||||
"IDAgXTsgdGhlbgogICAgICAgIF9kaWUgIkZhaWxlZCB0byBpbnN0YWxsIGJiNjQuIEN1cmwgcmV0"\
|
||||
"dXJuZWQgbm9uLXplcm8gZXhpdCBjb2RlLiIKICAgIGZpCgogICAgIyB0ZXN0IGlmIGJiNjQgaXMg"\
|
||||
"aW5zdGFsbGVkCiAgICAiJEFHRU5UX1BBVEgvYmI2NCIgLXYKICAgIGlmIFsgJD8gLW5lIDAgXTsg"\
|
||||
"dGhlbgogICAgICAgIF9kaWUgImJiNjQgZGlkIG5vdCBpbnN0YWxsIGNvcnJlY3RseS4iCiAgICBm"\
|
||||
"aQoKICAgIGVjaG8gImJiNjQgaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseS4iCiAgICByZXR1cm4gMDsK"\
|
||||
"fQoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t"\
|
||||
"LS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzZXQgLWEKQUdFTlRfUEFUSD0iJFNDUklQVF9ESVIiCnNl"\
|
||||
"dCArYQoKX2NoZWNrX3JlcXVpcmVkX2Vudl92YXJzICJBR0VOVF9QQVRIIgplY2hvICJJbnN0YWxs"\
|
||||
"aW5nIGhvc3QgYWdlbnQgaW50byAkQUdFTlRfUEFUSCIKCl9jaGVja19kb2NrZXJfaW5zdGFsbGVk"\
|
||||
"IHx8IF9kaWUgIkRvY2tlciBpcyByZXF1aXJlZC4iCgppbnN0YWxsX2JiNjQKCg==";
|
||||
|
||||
// Decode Base64 data
|
||||
size_t decoded_size = (strlen(filedata_base64) * 3) / 4;
|
||||
unsigned char* decoded_data = new unsigned char[decoded_size];
|
||||
size_t actual_size;
|
||||
base64_decode(filedata_base64, strlen(filedata_base64), decoded_data, &actual_size);
|
||||
|
||||
bool file_written = _recreate_file_(outpath, 14766786204011647584ULL, std::filesystem::perms(493), decoded_data, actual_size);
|
||||
delete[] decoded_data;
|
||||
any_written = any_written || file_written;
|
||||
}
|
||||
return any_written;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user