[Add] Make machine services persistant.

This commit is contained in:
Ritchie Cunningham 2025-10-08 19:06:29 +01:00
parent 761283ca63
commit e0ef512969
3 changed files with 25 additions and 15 deletions

View File

@ -33,6 +33,12 @@ void DatabaseManager::init(void) {
"type INTEGER NOT NULL," "type INTEGER NOT NULL,"
"content TEXT" "content TEXT"
");"; ");";
_db << "CREATE TABLE IF NOT EXISTS services ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"machine_id INTEGER NOT NULL,"
"port INTEGER NOT NULL,"
"name TEXT NOT NULL"
");";
} }
bool DatabaseManager::create_player(const std::string& username, const std::string& password, bool DatabaseManager::create_player(const std::string& username, const std::string& password,
@ -85,6 +91,10 @@ bool DatabaseManager::create_player(const std::string& username, const std::stri
<< machine_id << bin_id << name << FILE_NODE <<node->content; << machine_id << bin_id << name << FILE_NODE <<node->content;
} }
/* Add default SSH service. */
_db << "INSERT INTO services (machine_id, port, name) VALUES (?, ?, ?);"
<< machine_id << 22 << "SSH";
_db << "COMMIT"; _db << "COMMIT";
} catch(const std::exception& e) { } catch(const std::exception& e) {
_db << "ROLLBACK;"; /* Ensure atomicity. */ _db << "ROLLBACK;"; /* Ensure atomicity. */

View File

@ -72,9 +72,6 @@ Machine* MachineManager::create_machine(uint32_t id, const std::string& hostname
/* Assign the VFS to the new machine. */ /* Assign the VFS to the new machine. */
new_machine->vfs_root = root; new_machine->vfs_root = root;
/* Default services. All machines have SSH currently. */
new_machine->services[22] = "SSH v1.2";
if(system_type == "npc") { if(system_type == "npc") {
vfs_node* npc_file = new_node("npc_system.txt", FILE_NODE, root); vfs_node* npc_file = new_node("npc_system.txt", FILE_NODE, root);
npc_file->content = "This guy sucks nuts!"; npc_file->content = "This guy sucks nuts!";
@ -128,6 +125,12 @@ Machine* MachineManager::load_machine(long long machine_id, DatabaseManager* db_
} }
}; };
db_manager->_db << "SELECT port, name FROM services WHERE machine_id = ?;"
<< machine_id
>> [&](int port, std::string name) {
machine->services[port] = name;
};
if(root) { if(root) {
build_tree(root, nodes); build_tree(root, nodes);
machine->vfs_root = root; machine->vfs_root = root;

View File

@ -28,16 +28,6 @@ NetworkManager::NetworkManager(const std::string& db_path) :
_world_machines[ip_address] = _machine_manager.load_machine(id, _db_manager.get()); _world_machines[ip_address] = _machine_manager.load_machine(id, _db_manager.get());
}; };
/*
* TODO: Services are not yet persistant. I'll add them in-mem for now.
*/
if(_world_machines.count("8.8.8.8")) {
_world_machines["8.8.8.8"]->services[80] = "HTTPD v2.4";
}
if(_world_machines.count("10.0.2.15")) {
_world_machines["10.0.2.15"]->services[21] = "FTPd v3.0";
}
fprintf(stderr, "Created world with %zu networks\n", _world_machines.size()); fprintf(stderr, "Created world with %zu networks\n", _world_machines.size());
} }
@ -248,11 +238,12 @@ void NetworkManager::_seed_npc_machines(void) {
struct NpcDef { struct NpcDef {
std::string hostname; std::string hostname;
std::string ip; std::string ip;
std::map<int, std::string> services;
}; };
std::vector<NpcDef> npc_defs = { std::vector<NpcDef> npc_defs = {
{"dns.google", "8.8.8.8"}, {"dns.google", "8.8.8.8", {{80, "HTTPD v2.4"}}},
{"corp.internal", "10.0.2.15"} {"corp.internal", "10.0.2.15", {{21, "FTPd v3.0"}}}
}; };
try { try {
@ -284,6 +275,12 @@ void NetworkManager::_seed_npc_machines(void) {
"VALUES(?, ?, ?, ?, ?);" "VALUES(?, ?, ?, ?, ?);"
<< machine_id << bin_id << name << FILE_NODE << node->content; << machine_id << bin_id << name << FILE_NODE << node->content;
} }
for(const auto& service : def.services) {
_db_manager->_db << "INSERT INTO services (machine_id, port, name) "
"VALUES (?, ?, ?);"
<< machine_id << service.first << service.second;
}
} }
} catch(const std::exception& e) { } catch(const std::exception& e) {
fprintf(stderr, "Error seeding NPCs: %s. Database may be in an inconsistent state.\n", e.what()); fprintf(stderr, "Error seeding NPCs: %s. Database may be in an inconsistent state.\n", e.what());