NTnet refactor, assimilates exonet

This commit is contained in:
kevinz000
2017-11-17 19:45:33 -08:00
parent 1583a65e9c
commit 00966e2aaa
23 changed files with 297 additions and 395 deletions

View File

@@ -9,13 +9,13 @@
/datum/ntnet_conversation/New()
id = ntnrc_uid++
if(GLOB.ntnet_global)
GLOB.ntnet_global.chat_channels.Add(src)
if(SSnetworks.station_network)
SSnetworks.station_network.chat_channels.Add(src)
..()
/datum/ntnet_conversation/Destroy()
if(GLOB.ntnet_global)
GLOB.ntnet_global.chat_channels.Remove(src)
if(SSnetworks.station_network)
SSnetworks.station_network.chat_channels.Remove(src)
return ..()
/datum/ntnet_conversation/proc/add_message(message, username)

View File

@@ -1,145 +0,0 @@
GLOBAL_DATUM_INIT(ntnet_global, /datum/ntnet, new)
// This is the NTNet datum. There can be only one NTNet datum in game at once. Modular computers read data from this.
/datum/ntnet
var/list/relays = list()
var/list/logs = list()
var/list/available_station_software = list()
var/list/available_antag_software = list()
var/list/chat_channels = list()
var/list/fileservers = list()
// Amount of logs the system tries to keep in memory. Keep below 999 to prevent byond from acting weirdly.
// High values make displaying logs much laggier.
var/setting_maxlogcount = 100
// These only affect wireless. LAN (consoles) are unaffected since it would be possible to create scenario where someone turns off NTNet, and is unable to turn it back on since it refuses connections
var/setting_softwaredownload = 1
var/setting_peertopeer = 1
var/setting_communication = 1
var/setting_systemcontrol = 1
var/setting_disabled = 0 // Setting to 1 will disable all wireless, independently on relays status.
var/intrusion_detection_enabled = 1 // Whether the IDS warning system is enabled
var/intrusion_detection_alarm = 0 // Set when there is an IDS warning due to malicious (antag) software.
// If new NTNet datum is spawned, it replaces the old one.
/datum/ntnet/New()
if(GLOB.ntnet_global && (GLOB.ntnet_global != src))
GLOB.ntnet_global = src // There can be only one.
for(var/obj/machinery/ntnet_relay/R in GLOB.machines)
relays.Add(R)
R.NTNet = src
build_software_lists()
add_log("NTNet logging system activated.")
// Simplified logging: Adds a log. log_string is mandatory parameter, source is optional.
/datum/ntnet/proc/add_log(log_string, obj/item/computer_hardware/network_card/source = null)
var/log_text = "[worldtime2text()] - "
if(source)
log_text += "[source.get_network_tag()] - "
else
log_text += "*SYSTEM* - "
log_text += log_string
logs.Add(log_text)
// We have too many logs, remove the oldest entries until we get into the limit
if(logs.len > setting_maxlogcount)
logs = logs.Copy(logs.len-setting_maxlogcount,0)
// Checks whether NTNet operates. If parameter is passed checks whether specific function is enabled.
/datum/ntnet/proc/check_function(specific_action = 0)
if(!relays || !relays.len) // No relays found. NTNet is down
return FALSE
var/operating = FALSE
// Check all relays. If we have at least one working relay, network is up.
for(var/M in relays)
var/obj/machinery/ntnet_relay/R = M
if(R.is_operational())
operating = TRUE
break
if(setting_disabled)
return FALSE
switch(specific_action)
if(NTNET_SOFTWAREDOWNLOAD)
return (operating && setting_softwaredownload)
if(NTNET_PEERTOPEER)
return (operating && setting_peertopeer)
if(NTNET_COMMUNICATION)
return (operating && setting_communication)
if(NTNET_SYSTEMCONTROL)
return (operating && setting_systemcontrol)
return operating
// Builds lists that contain downloadable software.
/datum/ntnet/proc/build_software_lists()
available_station_software = list()
available_antag_software = list()
for(var/F in typesof(/datum/computer_file/program))
var/datum/computer_file/program/prog = new F
// Invalid type (shouldn't be possible but just in case), invalid filetype (not executable program) or invalid filename (unset program)
if(!prog || prog.filename == "UnknownProgram" || prog.filetype != "PRG")
continue
// Check whether the program should be available for station/antag download, if yes, add it to lists.
if(prog.available_on_ntnet)
available_station_software.Add(prog)
if(prog.available_on_syndinet)
available_antag_software.Add(prog)
// Attempts to find a downloadable file according to filename var
/datum/ntnet/proc/find_ntnet_file_by_name(filename)
for(var/N in available_station_software)
var/datum/computer_file/program/P = N
if(filename == P.filename)
return P
for(var/N in available_antag_software)
var/datum/computer_file/program/P = N
if(filename == P.filename)
return P
// Resets the IDS alarm
/datum/ntnet/proc/resetIDS()
intrusion_detection_alarm = 0
/datum/ntnet/proc/toggleIDS()
resetIDS()
intrusion_detection_enabled = !intrusion_detection_enabled
// Removes all logs
/datum/ntnet/proc/purge_logs()
logs = list()
add_log("-!- LOGS DELETED BY SYSTEM OPERATOR -!-")
// Updates maximal amount of stored logs. Use this instead of setting the number, it performs required checks.
/datum/ntnet/proc/update_max_log_count(lognumber)
if(!lognumber)
return FALSE
// Trim the value if necessary
lognumber = max(MIN_NTNET_LOGS, min(lognumber, MAX_NTNET_LOGS))
setting_maxlogcount = lognumber
add_log("Configuration Updated. Now keeping [setting_maxlogcount] logs in system memory.")
/datum/ntnet/proc/toggle_function(function)
if(!function)
return
function = text2num(function)
switch(function)
if(NTNET_SOFTWAREDOWNLOAD)
setting_softwaredownload = !setting_softwaredownload
add_log("Configuration Updated. Wireless network firewall now [setting_softwaredownload ? "allows" : "disallows"] connection to software repositories.")
if(NTNET_PEERTOPEER)
setting_peertopeer = !setting_peertopeer
add_log("Configuration Updated. Wireless network firewall now [setting_peertopeer ? "allows" : "disallows"] peer to peer network traffic.")
if(NTNET_COMMUNICATION)
setting_communication = !setting_communication
add_log("Configuration Updated. Wireless network firewall now [setting_communication ? "allows" : "disallows"] instant messaging and similar communication services.")
if(NTNET_SYSTEMCONTROL)
setting_systemcontrol = !setting_systemcontrol
add_log("Configuration Updated. Wireless network firewall now [setting_systemcontrol ? "allows" : "disallows"] remote control of station's systems.")

View File

@@ -1,122 +0,0 @@
// Relays don't handle any actual communication. Global NTNet datum does that, relays only tell the datum if it should or shouldn't work.
/obj/machinery/ntnet_relay
name = "NTNet Quantum Relay"
desc = "A very complex router and transmitter capable of connecting electronic devices together. Looks fragile."
use_power = ACTIVE_POWER_USE
active_power_usage = 10000 //10kW, apropriate for machine that keeps massive cross-Zlevel wireless network operational. Used to be 20 but that actually drained the smes one round
idle_power_usage = 100
icon = 'icons/obj/machines/telecomms.dmi'
icon_state = "bus"
anchored = TRUE
density = TRUE
circuit = /obj/item/circuitboard/machine/ntnet_relay
var/datum/ntnet/NTNet = null // This is mostly for backwards reference and to allow varedit modifications from ingame.
var/enabled = 1 // Set to 0 if the relay was turned off
var/dos_failure = 0 // Set to 1 if the relay failed due to (D)DoS attack
var/list/dos_sources = list() // Backwards reference for qdel() stuff
var/uid
var/static/gl_uid = 1
// Denial of Service attack variables
var/dos_overload = 0 // Amount of DoS "packets" in this relay's buffer
var/dos_capacity = 500 // Amount of DoS "packets" in buffer required to crash the relay
var/dos_dissipate = 1 // Amount of DoS "packets" dissipated over time.
// TODO: Implement more logic here. For now it's only a placeholder.
/obj/machinery/ntnet_relay/is_operational()
if(stat & (BROKEN | NOPOWER | EMPED))
return 0
if(dos_failure)
return 0
if(!enabled)
return 0
return 1
/obj/machinery/ntnet_relay/update_icon()
if(is_operational())
icon_state = "bus"
else
icon_state = "bus_off"
/obj/machinery/ntnet_relay/process()
if(is_operational())
use_power = ACTIVE_POWER_USE
else
use_power = IDLE_POWER_USE
update_icon()
if(dos_overload)
dos_overload = max(0, dos_overload - dos_dissipate)
// If DoS traffic exceeded capacity, crash.
if((dos_overload > dos_capacity) && !dos_failure)
dos_failure = 1
update_icon()
GLOB.ntnet_global.add_log("Quantum relay switched from normal operation mode to overload recovery mode.")
// If the DoS buffer reaches 0 again, restart.
if((dos_overload == 0) && dos_failure)
dos_failure = 0
update_icon()
GLOB.ntnet_global.add_log("Quantum relay switched from overload recovery mode to normal operation mode.")
..()
/obj/machinery/ntnet_relay/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "ntnet_relay", "NTNet Quantum Relay", 500, 300, master_ui, state)
ui.open()
/obj/machinery/ntnet_relay/ui_data(mob/user)
var/list/data = list()
data["enabled"] = enabled
data["dos_capacity"] = dos_capacity
data["dos_overload"] = dos_overload
data["dos_crashed"] = dos_failure
return data
/obj/machinery/ntnet_relay/ui_act(action, params)
if(..())
return
switch(action)
if("restart")
dos_overload = 0
dos_failure = 0
update_icon()
GLOB.ntnet_global.add_log("Quantum relay manually restarted from overload recovery mode to normal operation mode.")
if("toggle")
enabled = !enabled
GLOB.ntnet_global.add_log("Quantum relay manually [enabled ? "enabled" : "disabled"].")
update_icon()
/obj/machinery/ntnet_relay/attack_hand(mob/living/user)
ui_interact(user)
/obj/machinery/ntnet_relay/Initialize()
uid = gl_uid++
component_parts = list()
if(GLOB.ntnet_global)
GLOB.ntnet_global.relays.Add(src)
NTNet = GLOB.ntnet_global
GLOB.ntnet_global.add_log("New quantum relay activated. Current amount of linked relays: [NTNet.relays.len]")
. = ..()
/obj/machinery/ntnet_relay/Destroy()
if(GLOB.ntnet_global)
GLOB.ntnet_global.relays.Remove(src)
GLOB.ntnet_global.add_log("Quantum relay connection severed. Current amount of linked relays: [NTNet.relays.len]")
NTNet = null
for(var/datum/computer_file/program/ntnet_dos/D in dos_sources)
D.target = null
D.error = "Connection to quantum relay severed"
return ..()

View File

@@ -357,7 +357,7 @@
if(!get_ntnet_status())
return FALSE
var/obj/item/computer_hardware/network_card/network_card = all_components[MC_NET]
return GLOB.ntnet_global.add_log(text, network_card)
return SSnetworks.station_network.add_log(text, network_card)
/obj/item/device/modular_computer/proc/shutdown_computer(loud = 1)
kill_program(forced = TRUE)

View File

@@ -46,7 +46,7 @@
return 1
switch(action)
if("PRG_target_relay")
for(var/obj/machinery/ntnet_relay/R in GLOB.ntnet_global.relays)
for(var/obj/machinery/ntnet_relay/R in SSnetworks.station_network.relays)
if("[R.uid]" == params["targid"])
target = R
return 1
@@ -61,14 +61,14 @@
if(target)
executed = 1
target.dos_sources.Add(src)
if(GLOB.ntnet_global.intrusion_detection_enabled)
if(SSnetworks.station_network.intrusion_detection_enabled)
var/obj/item/computer_hardware/network_card/network_card = computer.all_components[MC_NET]
GLOB.ntnet_global.add_log("IDS WARNING - Excess traffic flood targeting relay [target.uid] detected from device: [network_card.get_network_tag()]")
GLOB.ntnet_global.intrusion_detection_alarm = 1
SSnetworks.station_network.add_log("IDS WARNING - Excess traffic flood targeting relay [target.uid] detected from device: [network_card.get_network_tag()]")
SSnetworks.station_network.intrusion_detection_alarm = 1
return 1
/datum/computer_file/program/ntnet_dos/ui_data(mob/user)
if(!GLOB.ntnet_global)
if(!SSnetworks.station_network)
return
var/list/data = list()
@@ -93,7 +93,7 @@
data["dos_strings"] += list(list("nums" = string))
else
data["relays"] = list()
for(var/obj/machinery/ntnet_relay/R in GLOB.ntnet_global.relays)
for(var/obj/machinery/ntnet_relay/R in SSnetworks.station_network.relays)
data["relays"] += list(list("id" = R.uid))
data["focus"] = target ? target.uid : null

View File

@@ -23,7 +23,7 @@
if(downloaded_file)
return 0
var/datum/computer_file/program/PRG = GLOB.ntnet_global.find_ntnet_file_by_name(filename)
var/datum/computer_file/program/PRG = SSnetworks.station_network.find_ntnet_file_by_name(filename)
if(!PRG || !istype(PRG))
return 0
@@ -39,10 +39,10 @@
ui_header = "downloader_running.gif"
if(PRG in GLOB.ntnet_global.available_station_software)
if(PRG in SSnetworks.station_network.available_station_software)
generate_network_log("Began downloading file [PRG.filename].[PRG.filetype] from NTNet Software Repository.")
hacked_download = 0
else if(PRG in GLOB.ntnet_global.available_antag_software)
else if(PRG in SSnetworks.station_network.available_antag_software)
generate_network_log("Began downloading file **ENCRYPTED**.[PRG.filetype] from unspecified server.")
hacked_download = 1
else
@@ -127,7 +127,7 @@
data["disk_size"] = hard_drive.max_capacity
data["disk_used"] = hard_drive.used_capacity
var/list/all_entries[0]
for(var/A in GLOB.ntnet_global.available_station_software)
for(var/A in SSnetworks.station_network.available_station_software)
var/datum/computer_file/program/P = A
// Only those programs our user can run will show in the list
if(!P.can_run(user,transfer = 1) || hard_drive.find_file_by_name(P.filename))
@@ -142,7 +142,7 @@
data["hackedavailable"] = 0
if(computer.emagged) // If we are running on emagged computer we have access to some "bonus" software
var/list/hacked_programs[0]
for(var/S in GLOB.ntnet_global.available_antag_software)
for(var/S in SSnetworks.station_network.available_antag_software)
var/datum/computer_file/program/P = S
if(hard_drive.find_file_by_name(P.filename))
continue

View File

@@ -15,22 +15,22 @@
switch(action)
if("resetIDS")
. = 1
if(GLOB.ntnet_global)
GLOB.ntnet_global.resetIDS()
if(SSnetworks.station_network)
SSnetworks.station_network.resetIDS()
return 1
if("toggleIDS")
. = 1
if(GLOB.ntnet_global)
GLOB.ntnet_global.toggleIDS()
if(SSnetworks.station_network)
SSnetworks.station_network.toggleIDS()
return 1
if("toggleWireless")
. = 1
if(!GLOB.ntnet_global)
if(!SSnetworks.station_network)
return 1
// NTNet is disabled. Enabling can be done without user prompt
if(GLOB.ntnet_global.setting_disabled)
GLOB.ntnet_global.setting_disabled = 0
if(SSnetworks.station_network.setting_disabled)
SSnetworks.station_network.setting_disabled = 0
return 1
// NTNet is enabled and user is about to shut it down. Let's ask them if they really want to do it, as wirelessly connected computers won't connect without NTNet being enabled (which may prevent people from turning it back on)
@@ -39,43 +39,43 @@
return 1
var/response = alert(user, "Really disable NTNet wireless? If your computer is connected wirelessly you won't be able to turn it back on! This will affect all connected wireless devices.", "NTNet shutdown", "Yes", "No")
if(response == "Yes")
GLOB.ntnet_global.setting_disabled = 1
SSnetworks.station_network.setting_disabled = 1
return 1
if("purgelogs")
. = 1
if(GLOB.ntnet_global)
GLOB.ntnet_global.purge_logs()
if(SSnetworks.station_network)
SSnetworks.station_network.purge_logs()
if("updatemaxlogs")
. = 1
var/mob/user = usr
var/logcount = text2num(input(user,"Enter amount of logs to keep in memory ([MIN_NTNET_LOGS]-[MAX_NTNET_LOGS]):"))
if(GLOB.ntnet_global)
GLOB.ntnet_global.update_max_log_count(logcount)
if(SSnetworks.station_network)
SSnetworks.station_network.update_max_log_count(logcount)
if("toggle_function")
. = 1
if(!GLOB.ntnet_global)
if(!SSnetworks.station_network)
return 1
GLOB.ntnet_global.toggle_function(text2num(params["id"]))
SSnetworks.station_network.toggle_function(text2num(params["id"]))
/datum/computer_file/program/ntnetmonitor/ui_data(mob/user)
if(!GLOB.ntnet_global)
if(!SSnetworks.station_network)
return
var/list/data = get_header_data()
data["ntnetstatus"] = GLOB.ntnet_global.check_function()
data["ntnetrelays"] = GLOB.ntnet_global.relays.len
data["idsstatus"] = GLOB.ntnet_global.intrusion_detection_enabled
data["idsalarm"] = GLOB.ntnet_global.intrusion_detection_alarm
data["ntnetstatus"] = SSnetworks.station_network.check_function()
data["ntnetrelays"] = SSnetworks.station_network.relays.len
data["idsstatus"] = SSnetworks.station_network.intrusion_detection_enabled
data["idsalarm"] = SSnetworks.station_network.intrusion_detection_alarm
data["config_softwaredownload"] = GLOB.ntnet_global.setting_softwaredownload
data["config_peertopeer"] = GLOB.ntnet_global.setting_peertopeer
data["config_communication"] = GLOB.ntnet_global.setting_communication
data["config_systemcontrol"] = GLOB.ntnet_global.setting_systemcontrol
data["config_softwaredownload"] = SSnetworks.station_network.setting_softwaredownload
data["config_peertopeer"] = SSnetworks.station_network.setting_peertopeer
data["config_communication"] = SSnetworks.station_network.setting_communication
data["config_systemcontrol"] = SSnetworks.station_network.setting_systemcontrol
data["ntnetlogs"] = list()
for(var/i in GLOB.ntnet_global.logs)
for(var/i in SSnetworks.station_network.logs)
data["ntnetlogs"] += list(list("entry" = i))
data["ntnetmaxlogs"] = GLOB.ntnet_global.setting_maxlogcount
data["ntnetmaxlogs"] = SSnetworks.station_network.setting_maxlogcount
return data

View File

@@ -39,7 +39,7 @@
if("PRG_joinchannel")
. = 1
var/datum/ntnet_conversation/C
for(var/datum/ntnet_conversation/chan in GLOB.ntnet_global.chat_channels)
for(var/datum/ntnet_conversation/chan in SSnetworks.station_network.chat_channels)
if(chan.id == text2num(params["id"]))
C = chan
break
@@ -183,7 +183,7 @@
..()
/datum/computer_file/program/chatclient/ui_data(mob/user)
if(!GLOB.ntnet_global || !GLOB.ntnet_global.chat_channels)
if(!SSnetworks.station_network || !SSnetworks.station_network.chat_channels)
return
var/list/data = list()
@@ -212,7 +212,7 @@
else // Channel selection screen
var/list/all_channels[0]
for(var/C in GLOB.ntnet_global.chat_channels)
for(var/C in SSnetworks.station_network.chat_channels)
var/datum/ntnet_conversation/conv = C
if(conv && conv.title)
all_channels.Add(list(list(

View File

@@ -88,7 +88,7 @@
return 1
switch(action)
if("PRG_downloadfile")
for(var/datum/computer_file/program/nttransfer/P in GLOB.ntnet_global.fileservers)
for(var/datum/computer_file/program/nttransfer/P in SSnetworks.station_network.fileservers)
if("[P.unique_token]" == params["id"])
remote = P
break
@@ -106,8 +106,8 @@
error = ""
upload_menu = 0
finalize_download()
if(src in GLOB.ntnet_global.fileservers)
GLOB.ntnet_global.fileservers.Remove(src)
if(src in SSnetworks.station_network.fileservers)
SSnetworks.station_network.fileservers.Remove(src)
for(var/datum/computer_file/program/nttransfer/T in connected_clients)
T.crash_download("Remote server has forcibly closed the connection")
provided_file = null
@@ -133,7 +133,7 @@
if(!P.can_run(usr,transfer = 1))
error = "Access Error: Insufficient rights to upload file."
provided_file = F
GLOB.ntnet_global.fileservers.Add(src)
SSnetworks.station_network.fileservers.Add(src)
return
error = "I/O Error: Unable to locate file on hard drive."
return 1
@@ -171,7 +171,7 @@
data["upload_filelist"] = all_files
else
var/list/all_servers[0]
for(var/datum/computer_file/program/nttransfer/P in GLOB.ntnet_global.fileservers)
for(var/datum/computer_file/program/nttransfer/P in SSnetworks.station_network.fileservers)
all_servers.Add(list(list(
"uid" = P.unique_token,
"filename" = "[P.provided_file.filename].[P.provided_file.filetype]",

View File

@@ -41,7 +41,7 @@
if(ethernet) // Computer is connected via wired connection.
return 3
if(!GLOB.ntnet_global || !GLOB.ntnet_global.check_function(specific_action)) // NTNet is down and we are not connected via wired connection. No signal.
if(!SSnetworks.station_network || !SSnetworks.station_network.check_function(specific_action)) // NTNet is down and we are not connected via wired connection. No signal.
return 0
if(holder)