[Add] Make machine services persistant.
This commit is contained in:
		
							parent
							
								
									761283ca63
								
							
						
					
					
						commit
						e0ef512969
					
				@ -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. */
 | 
				
			||||||
 | 
				
			|||||||
@ -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;
 | 
				
			||||||
 | 
				
			|||||||
@ -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());
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user