Third‑party API Reference (authoritative)

Note: Any prior "Used in" lines in this document are deprecated and should be ignored. This section is the definitive spec for external integrations, with precise request and response formats.

Conventions
- Base URL: {BASE}/ (session cookie auth; withCredentials true)
- JSON wrapper used by backend: typically { status: 'success'|'error', data?: any, message?: string }
- UI helper returns: { valid: boolean, message: any } where message ≈ backend data

Examples below list Method Path, Request Body (if any), and Response.

Auth
- GET api/auth
  Response: 200 { status: 'success', data: { username: string, role: 'admin'|'editor'|'user', lab: string, html5: number, ... }, eve_uid: string, eve_expire: string }
- GET api/poll
  Response: 200 { status: 'success', data: any }
- GET api/auth/logout
  Response: 200 { status: 'success', data: any }

Version
- GET /VERSION → 200 text/plain
- GET /local_version → 200 text/plain (no-cache)
- GET /online_version → 200 text/plain (no-cache)

Folders/Labs
- GET api/folders{path}
  Response: 200 { status: 'success', data: { folders: Array<...>, labs: Array<...> } }
- POST api/folders { path: string, name: string }
  Response: 200 { status: 'success', data: any }
- PUT api/folders{sourcePath} { path: string }
  Response: 200 { status: 'success', data: any }
- POST api/labs (Create)
  Body: { path, author, body, countdown, description, grid, linkwidth, name, sat, scripttimeout, shared, version }
  Response: 200 { status: 'success', data: any }
- POST api/labs (Clone)
  Body: { source: string, name: string }
  Response: 200 { status: 'success', data: any }
- PUT api/labs{path} { ...subset of Create fields }
  Response: 200 { status: 'success', data: any }
- PUT api/labs{labpath}/move { path: string }
  Response: 200 { status: 'success', data: any }
- DELETE api/labs{path}
  Response: 200 { status: 'success', data: any }
- DELETE api/labs/close
  Response: 200 { status: 'success', data: any }
- GET api/labs{path}
  Response: 200 { status: 'success', data: object }
- GET api/labs{path}/topology[/{spy}]
  Response: 200 { status: 'success', data: object }

Export/Import
- POST api/export { "0": string, ..., path: string }
  Response: 200 { status: 'success', data: string } // download URL
- POST /api/import (multipart: path, local, name, file)
  Response: 200 { status: 'success', data?: any } | { status: 'error', message }

Nodes/Networks
- GET api/labs{path}/nodes[/id]
  Response: 200 { status: 'success', data: object|array }
- PUT api/labs{path}/nodes[/id] { config: '1'|'0'|string }
  Response: 200 { status: 'success', data: any }
- POST api/labs{path}/nodes { ... }
  Response: 200 { status: 'success', data: any }
- DELETE api/labs{path}/nodes/{id}
  Response: 200 { status: 'success', data: any }
- GET api/labs{path}/nodes/{id}/start|stop/stopmode={m}|wipe
  Response: 200 { status: 'success', data: any }
- PUT api/labs{path}/nodes/{id}/export
  Response: 200 { status: 'success', data?: any, message?: string }
- GET api/labs{path}/nodes/{id}/interfaces
  Response: 200 { status: 'success', data: object }
- PUT api/labs{path}/nodes/{id}/interfaces { "<ifId>": string }
  Response: 200 { status: 'success', data: any }
- GET/POST/PUT/DELETE api/labs{path}/networks[/{id}]
  Response: 200 { status: 'success', data: any }
- PUT api/labs{path}/network/manage { ... }
  Response: 200 { status: 'success', data: any }

Links/Capture
- PUT api/labs{path}/quality { ... }
  Response: 200 { status: 'success', data: any }
- PUT api/labs{path}/nodes/{nodeId}/style <style>
  Response: 200 { status: 'success', data: any }
- PUT api/labs{path}/suspend|resume { nodeId, interfaceId }
  Response: 200 { status: 'success', data: any }
- POST api/capture/{path} { ... }
  Response: 200 { status: 'success', data: any }

Canvas Objects
- Text Objects (GET/PUT/PUT id/POST/DELETE) api/labs{path}/textobjects[/{id}]
  Response: 200 { status: 'success', data: any }
- Line Objects (GET/PUT/PUT id/POST/DELETE) api/labs{path}/lineobjects[/{id}] | api/labs{path}/lines/0
  Response: 200 { status: 'success', data: any } (add_lineobject → { result })

Logical Topology (Pictures)
- GET/GET id/POST/PUT/DELETE api/labs{path}/pictures[/{id}]
  POST Body (multipart): name, file
  PUT Body: { name: string, map: string, custommap: string }
  Response: 200 { status: 'success', data: any }

Startup Config Sets
- GET api/labs{path}/configsets → 200 { status: 'success', data: Record<string, { id?: string|number, name?: string }> }
- POST api/labs{path}/configs { cfsid: string } → 200 { status: 'success', data: Record<string, { name: string, config: number, configdata: string }> }
- PUT api/labs{path}/configs/{nodeId} { id: string, data: string, cfsid: string } → 200 { status: 'success', data: any }
- POST api/labs{path}/configsets { name } → 200 { status: 'success', id?: string|number, message?: any }
- PUT api/labs{path}/configsets/{id} { name } → 200 { status: 'success', message?: any }
- DELETE api/labs{path}/configsets/{id} (data: { id }) → 200 { status: 'success', message?: any }

Lab Tasks
- GET api/labs{path}/tasks → 200 { status: 'success', data: Record<string, { id?: string|number, name: string, type: 'public', data?: string }> }
- GET api/labs{path}/task/{id} → 200 { status: 'success', data: { id, name, type: 'public', data /* base64 */ } }
- POST api/labs{path}/task { name, type: 'public', data /* base64 */ } → 200 { status: 'success', result?: { id }, message?: any }
- PUT api/labs{path}/task/{id} { name, type: 'public', data? /* base64 */ } → 200 { status: 'success', message?: any }
- DELETE api/labs{path}/task/{id} → 200 { status: 'success', message?: any }

Lock/Unlock
- PUT api/labs{path}/Lock|Unlock { password: string } → 200 { status: 'success', message?: any }

System/Cluster/Stats
- GET api/status → 200 { status: 'success', data: any }
- DELETE api/status → 200 { status: 'success', data: any }
- GET/POST/DELETE api/cluster[/{id}] → 200 { status: 'success', data: any }
- GET api/resetcluster/{id} | api/stopcluster/{id} | api/purgecluster/{id} → 200 { status: 'success', data: any }
- GET/POST api/system/settings → 200 { status: 'success', data: object }

Logs
- GET api/logs/{path}/{lines}/{pattern} → 200 { status: 'success', data: string|object }

Licensing
- GET api/licrequest → 200 { status: 'success', data: { licrequest: string, expire: string, admins: number, editors: number, users: number } }
- POST api/uploadlic { newlic: string } → 200 { status: 'success', data: any }

Users
- GET api/users/ | GET api/users/{username} → 200 { status: 'success', data: object|array }
- POST api/users { username, extauth, email, name, role, cpu, ram, html5, sat, expiration, datestart, password } → 200 { status: 'success', data: any }
- PUT api/users/{username} { ...as above, password optional } → 200 { status: 'success', data: any }
- DELETE api/users/{username} | POST api/users/kick/{username} → 200 { status: 'success', data: any }

Lists & Icons
- GET api/list/templates/{type} | GET api/list/networks | GET api/usernames | GET api/icons → 200 { status: 'success', data: object|array }

--- End authoritative section ---

EVE API - Function Usage and Syntax Documentation

Notes
- All functions return an http_response-like object: { valid: boolean, message: any }
- Base URL prefix: eve_globals.url_prefix
- All requests use withCredentials: true

1) eve_auth(redirect: boolean = true)
- HTTP: GET 'api/auth'
- Used in: 
  - src/components/EVE_login.vue
  - src/components/EVE_entry.vue
  - src/components/Layout/EVE_Header.vue
  - src/pages/labview.vue
  - src/pages/main.vue
  - src/pages/clustersettings.vue
  - src/pages/labmgnt.vue
  - src/pages/usermgnt.vue
  - src/pages/systemsettings.vue
  - src/pages/systemlogs.vue
  - src/pages/sysstats.vue
  - src/pages/nodemgnt.vue

2) eve_version()
- HTTP: GET '/VERSION' (text)
- Used in:
  - src/components/EVE_login.vue
  - src/components/Layout/EVE_Header.vue

3) eve_local_version()
- HTTP: GET '/local_version' (text, no-cache)
- Used in:
  - src/components/Layout/EVE_Header.vue

4) eve_online_version()
- HTTP: GET '/online_version' (text, no-cache)
- Used in:
  - src/components/Layout/EVE_Header.vue

5) update_session(router: Router)
- HTTP: GET 'api/poll'
- Used in:
  - src/components/Common/EVE_Poller.vue

6) select_folder(path: string)
- HTTP: GET 'api/folders{path}'
- Used in:
  - src/components/EVE_Main/EVE_FileManager.vue

7) get_labinfo(path: string)
- HTTP: GET 'api/labs{path}'
- Used in:
  - src/components/EVE_Main/EVE_FileManager.vue
  - src/components/EVE_Main/EVE_Preview.vue

8) get_topology(path: string, spy: number = -1)
- HTTP: GET 'api/labs{path}/topology[/{spy}]'
- Used in:
  - src/components/EVE_Main/EVE_FileManager.vue
  - src/components/EVE_Main/EVE_Preview.vue

9) get_networks(path: string, id: number = 0)
- HTTP: GET 'api/labs{path}/networks[/id]'
- Used in:
  - src/components/Topology/NetworkManage.vue

10) getLabLines(path: string)
- HTTP: GET 'api/labs{path}/lineobjects'
- Used in:
  - src/components/EVE_Main.vue

11) getNodes(path: string, id: number = 0)
- HTTP: GET 'api/labs{path}/nodes[/id]'
- Used in:
  - src/components/Topology/NodesList.vue

12) get_objects(path: string)
- HTTP: GET 'api/labs{path}/textobjects'
- Used in:
  - (no direct imports found)

13) get_clusterfull()
- HTTP: GET 'api/clusterfull'
- Used in:
  - src/components/Common/CreateLab.vue
  - src/components/Common/EditLab.vue

14) get_roles()
- HTTP: GET 'api/list/roles'
- Used in:
  - src/components/EVE_UserMgnt.vue

15) get_shared_lab(pod: number)
- HTTP: GET 'api/sharedlabs/{pod}'
- Used in:
  - src/components/EVE_UserMgnt.vue

16) get_clusterfullnd()
- HTTP: GET 'api/clusterfullnd'
- Used in:
  - src/components/EVE_UserMgnt.vue

17) get_usernames()
- HTTP: GET 'api/usernames'
- Used in:
  - src/components/Common/CreateLab.vue
  - src/components/Common/EditLab.vue

18) get_users()
- HTTP: GET 'api/users/'
- Used in:
  - src/components/EVE_UserMgnt.vue

19) get_user(username: string)
- HTTP: GET 'api/users/{username}'
- Used in:
  - src/components/Layout/EVE_Header.vue

20) eve_logout()
- HTTP: GET 'api/auth/logout'
- Used in:
  - src/components/Layout/EVE_Header.vue

21) edit_lab(path: string, payload: string)
- HTTP: PUT 'api/labs{path}'
- Used in:
  - src/components/Common/EditLab.vue

22) create_lab(payload: string)
- HTTP: POST 'api/labs'
- Used in:
  - src/components/Common/CreateLab.vue

23) kick_user(username: string)
- HTTP: POST 'api/users/kick/{username}'
- Used in:
  - src/components/EVE_UserMgnt.vue

24) clone_lab(payload: string)
- HTTP: POST 'api/labs'
- Used in:
  - src/components/EVE_Main/EVE_FileManager.vue

25) del_lab(path: string)
- HTTP: DELETE 'api/labs{path}'
- Used in:
  - src/components/EVE_Main/EVE_FileManager.vue
  - src/components/EVE_Main/EVE_Preview.vue

26) close_lab()
- HTTP: DELETE 'api/labs/close'
- Used in:
  - src/components/EVE_Main.vue

27) del_dir(path: string)
- HTTP: DELETE 'api/folders{path}'
- Used in:
  - src/components/EVE_Main/EVE_FileManager.vue

28) create_dir(payload: string)
- HTTP: POST 'api/folders'
- Used in:
  - src/components/EVE_Main/EVE_FileManager.vue

29) move_folder(sourcePath: string, payload: string)
- HTTP: PUT 'api/folders{sourcePath}'
- Used in:
  - src/components/EVE_Main/EVE_FileManager.vue

30) rename_lab(labpath: string, payload: string)
- HTTP: PUT 'api/labs{labpath}'
- Used in:
  - src/components/EVE_Main/EVE_FileManager.vue

31) move_lab(labpath: string, payload: string)
- HTTP: PUT 'api/labs{labpath}/move'
- Used in:
  - src/components/EVE_Main/EVE_FileManager.vue

32) import_labs(formData: FormData)
- HTTP: POST '/api/import' (multipart/form-data)
- Used in:
  - src/components/EVE_Main/EVE_FileManager.vue

33) export_labs(payload: string)
- HTTP: POST 'api/export'
- Used in:
  - src/components/EVE_Main/EVE_FileManager.vue

34) edit_user(username: string, payload: string)
- HTTP: PUT 'api/users/{username}'
- Used in:
  - src/components/EVE_UserMgnt.vue

35) add_user(payload: string)
- HTTP: POST 'api/users'
- Used in:
  - src/components/EVE_UserMgnt.vue

36) del_user(username: string)
- HTTP: DELETE 'api/users/{username}'
- Used in:
  - src/components/EVE_UserMgnt.vue

37) get_running_nodes()
- HTTP: GET 'api/runningnodes'
- Used in:
  - src/components/EVE_NodeMgnt.vue

38) kill_node(port: number)
- HTTP: GET 'api/kill/node/{port}'
- Used in:
  - src/components/EVE_NodeMgnt.vue

39) get_running_labs()
- HTTP: GET 'api/runninglabs'
- Used in:
  - src/components/EVE_LabMgnt.vue

40) stop_lab(labid: number)
- HTTP: GET 'api/kill/lab/{labid}'
- Used in:
  - src/components/EVE_LabMgnt.vue

41) wipe_lab(podid: number, labuuid: string)
- HTTP: GET 'api/wipe/{podid}/{labuuid}'
- Used in:
  - src/components/EVE_LabMgnt.vue

42) get_status()
- HTTP: GET 'api/status'
- Used in:
  - src/components/Topology/NodesList.vue
  - src/components/EVE_SysStats.vue

43) get_cluster()
- HTTP: GET 'api/cluster'
- Used in:
  - src/components/EVE_SysStats.vue
  - src/components/EVE_ClusterSettings.vue

44) get_tasks(path: string)
- HTTP: GET 'api/labs{path}/tasks'
- Used in:
  - src/components/Topology/LabTask.vue
  - src/components/Common/Lab_Sidebar.vue

45) get_task(path: string, id: number | string)
- HTTP: GET 'api/labs{path}/task/{id}'
- Used in:
  - src/components/Topology/LabTask.vue
  - src/components/Topology/TaskManager.vue

46) rename_task(path: string, id: number | string, payload: string)
- HTTP: PUT 'api/labs{path}/task/{id}'
- Used in:
  - src/components/Topology/LabTask.vue

47) delete_task(path: string, id: number | string)
- HTTP: DELETE 'api/labs{path}/task/{id}'
- Used in:
  - src/components/Topology/LabTask.vue

48) save_task(path: string, id: number | string, payload: string)
- HTTP: PUT 'api/labs{path}/task/{id}'
- Used in:
  - src/components/Topology/LabTask.vue

49) create_task(path: string, payload: string)
- HTTP: POST 'api/labs{path}/task'
- Used in:
  - src/components/Topology/LabTask.vue

50) ksm_set(payload: string)
- HTTP: POST 'api/ksm'
- Used in:
  - src/components/EVE_SysStats.vue

51) cpulimit_set(payload: string)
- HTTP: POST 'api/cpulimit'
- Used in:
  - src/components/EVE_SysStats.vue

52) get_system_settings()
- HTTP: GET 'api/system/settings'
- Used in:
  - src/components/EVE_SystemSettings.vue

53) post_system_settings(payload: string)
- HTTP: POST 'api/system/settings'
- Used in:
  - src/components/EVE_SystemSettings.vue

54) post_add_member(payload: string)
- HTTP: POST 'api/cluster'
- Used in:
  - src/components/EVE_ClusterSettings.vue

55) get_log(log_path: string, lines_count: number = 100, search_pattern: string = '')
- HTTP: GET 'api/logs/{log_path}/{lines_count}/{search_pattern}'
- Used in:
  - src/components/LogViewer.vue

56) delete_satellite(id: number)
- HTTP: DELETE 'api/cluster/{id}'
- Used in:
  - src/components/EVE_ClusterSettings.vue

57) reset_satellite(id: number)
- HTTP: GET 'api/resetcluster/{id}'
- Used in:
  - src/components/EVE_ClusterSettings.vue

58) shutdown_satellite(id: number)
- HTTP: GET 'api/stopcluster/{id}'
- Used in:
  - src/components/EVE_ClusterSettings.vue

59) purge_satellite(id: number)
- HTTP: GET 'api/purgecluster/{id}'
- Used in:
  - src/components/EVE_ClusterSettings.vue

60) stop_allnodes()
- HTTP: DELETE 'api/status'
- Used in:
  - src/components/Layout/EVE_Header.vue

61) delete_node(labpath: string, id: number)
- HTTP: DELETE 'api/labs{labpath}/nodes/{id}'
- Used in:
  - src/components/Topology/NodesList.vue
  - src/components/Common/LabNode.vue

62) delete_network(labpath: string, id: number)
- HTTP: DELETE 'api/labs{labpath}/networks/{id}'
- Used in:
  - src/components/Common/Lab_Sidebar.vue
  - src/components/Common/LabNetwork.vue
  - src/components/Topology/NodesList.vue

63) get_license_request()
- HTTP: GET 'api/licrequest'
- Used in:
  - src/components/Layout/EVE_Header.vue

64) post_license(payload: string)
- HTTP: POST 'api/uploadlic'
- Used in:
  - src/components/Layout/EVE_Header.vue

65) update_password(payload: string)
- HTTP: PUT 'api/user/password'
- Used in:
  - src/components/Layout/EVE_Header.vue

66) get_labstatus(path: string)
- HTTP: GET 'api/labs{path}/nodes/status'
- Used in:
  - (no direct imports found)

67) edit_textobjects(path: string, payload: string)
- HTTP: PUT 'api/labs{path}/textobjects'
- Used in:
  - (no direct imports found)

68) edit_textobject(path: string, object_id: string, payload: string)
- HTTP: PUT 'api/labs{path}/textobjects/{object_id}'
- Used in:
  - src/components/Common/LabObject.vue

69) add_textobject(path: string, payload: string)
- HTTP: POST 'api/labs{path}/textobjects'
- Used in:
  - src/components/Common/LabObject.vue

70) delete_textobject(labpath: string, id: number)
- HTTP: DELETE 'api/labs{labpath}/textobjects/{id}'
- Used in:
  - src/components/Common/LabObject.vue

71) edit_nodes(path: string, payload: string, id: number = 0)
- HTTP: PUT 'api/labs{path}/nodes[/id]'
- Used in:
  - src/components/Topology/StartupConfigsDialog.vue
  - src/components/Common/LabNode.vue

72) add_nodes(path: string, payload: string)
- HTTP: POST 'api/labs{path}/nodes'
- Used in:
  - (no direct imports found)

73) edit_networks(path: string, payload: string, id: number = 0)
- HTTP: PUT 'api/labs{path}/networks[/id]'
- Used in:
  - (no direct imports found)

74) manage_network(path: string, payload: string)
- HTTP: PUT 'api/labs{path}/network/manage'
- Used in:
  - src/components/Topology/NetworkManage.vue

75) add_networks(path: string, payload: string)
- HTTP: POST 'api/labs{path}/networks'
- Used in:
  - (no direct imports found)

76) edit_lineobjects(path: string, payload: string)
- HTTP: PUT 'api/labs{path}/lineobjects'
- Used in:
  - (no direct imports found)

77) edit_lineobject_style(path: string, id: number, payload: string)
- HTTP: PUT 'api/labs{path}/lineobjects/{id}'
- Used in:
  - (no direct imports found)

78) add_lineobject(path: string, payload: string)
- HTTP: POST 'api/labs{path}/lines/0'
- Used in:
  - (no direct imports found)

79) delete_lineobject(labpath: string, id: number)
- HTTP: DELETE 'api/labs{labpath}/lineobjects/{id}'
- Used in:
  - (no direct imports found)

80) get_templates(template_type: string = '')
- HTTP: GET 'api/list/templates/{template_type}'
- Used in:
  - src/components/Topology/NodesList.vue
  - src/components/Topology/NodeForm.vue
  - src/components/Topology/EVE_Labview.vue (imported via barrel of many functions)

81) get_networks_list()
- HTTP: GET 'api/list/networks'
- Used in:
  - src/components/Topology/NetworkForm.vue

82) get_node_interfaces(path: string, nodeId: number)
- HTTP: GET 'api/labs{path}/nodes/{nodeId}/interfaces'
- Used in:
  - src/components/Topology/LinkFormDialog.vue
  - src/components/Common/LabNode.vue

83) start_node(path: string, nodeId: number)
- HTTP: GET 'api/labs{path}/nodes/{nodeId}/start'
- Used in:
  - src/components/Topology/NodesList.vue

84) set_node_interface(path: string, nodeId: number, interfaceId: number, networkId: string)
- HTTP: PUT 'api/labs{path}/nodes/{nodeId}/interfaces'
- Used in:
  - (no direct imports found)

85) stop_node(path: string, nodeId: number, stopmode: number = 3)
- HTTP: GET 'api/labs{path}/nodes/{nodeId}/stop/stopmode={stopmode}'
- Used in:
  - src/components/Topology/NodesList.vue

86) export_nodeconfig(path: string, id: number)
- HTTP: PUT 'api/labs{path}/nodes/{id}/export'
- Used in:
  - src/components/Common/LabNode.vue

87) set_node_link_style(path: string, nodeId: number, linkStyle: string)
- HTTP: PUT 'api/labs{path}/nodes/{nodeId}/style'
- Used in:
  - (no direct imports found)

88) set_node_link_quality(path: string, payload: string)
- HTTP: PUT 'api/labs{path}/quality'
- Used in:
  - (no direct imports found)

89) interface_suspend(path: string, payload: string)
- HTTP: PUT 'api/labs{path}/suspend'
- Used in:
  - (no direct imports found)

90) interface_resume(path: string, payload: string)
- HTTP: PUT 'api/labs{path}/resume'
- Used in:
  - (no direct imports found)

91) start_capture(path: string, payload: string)
- HTTP: POST 'api/capture/{path}'
- Used in:
  - (no direct imports found)

92) get_logicalTopologyList(path: string)
- HTTP: GET 'api/labs{path}/pictures'
- Used in:
  - src/components/Topology/LogicalTopologyDialog.vue

93) get_logicalTopology(path: string, id: number | string)
- HTTP: GET 'api/labs{path}/pictures/{id}'
- Used in:
  - src/components/Topology/LogicalTopologyDialog.vue

94) setLogicalTopologyMap(path: string, id: number | string, payload: string)
- HTTP: PUT 'api/labs{path}/pictures/{id}'
- Used in:
  - src/components/Topology/LogicalTopologyDialog.vue

95) addLogicalTopology(path: string, imageFile: File, pictureName: string)
- HTTP: POST 'api/labs{path}/pictures' (multipart)
- Used in:
  - src/components/Topology/AddLogicalTopologyDialog.vue

96) deleteLogicalTopology(path: string, id: number | string)
- HTTP: DELETE 'api/labs{path}/pictures/{id}'
- Used in:
  - src/components/Topology/LogicalTopologyDialog.vue

97) editLogicalTopology(path: string, id: number | string, payload: { name: string, map: string, custommap: string })
- HTTP: PUT 'api/labs{path}/pictures/{id}'
- Used in:
  - src/components/Topology/LogicalTopologyDialog.vue

98) wipe_node(path: string, podid: number)
- HTTP: GET 'api/labs{path}/nodes/{podid}/wipe'
- Used in:
  - src/components/Topology/NodesList.vue
  - src/components/Common/LabNode.vue

99) get_icons()
- HTTP: GET 'api/icons'
- Used in:
  - src/components/Topology/NodesList.vue

100) get_configsets(path: string)
- HTTP: GET 'api/labs{path}/configsets'
- Used in:
  - src/components/Topology/StartupConfigsDialog.vue
  - src/components/Topology/NodesList.vue
  - src/components/Topology/NodeForm.vue

101) get_startup_configs(path: string, cfsid: string)
- HTTP: POST 'api/labs{path}/configs'
- Used in:
  - src/components/Topology/StartupConfigsDialog.vue

102) save_node_config(path: string, nodeId: number, configData: string, configsetId: string)
- HTTP: PUT 'api/labs{path}/configs/{nodeId}'
- Used in:
  - src/components/Topology/StartupConfigsDialog.vue
  - src/components/Common/LabNode.vue

103) create_configset(path: string, name: string)
- HTTP: POST 'api/labs{path}/configsets'
- Used in:
  - src/components/Topology/StartupConfigsDialog.vue

104) rename_configset(path: string, configsetId: string, name: string)
- HTTP: PUT 'api/labs{path}/configsets/{configsetId}'
- Used in:
  - src/components/Topology/StartupConfigsDialog.vue

105) delete_configset(path: string, configsetId: string)
- HTTP: DELETE 'api/labs{path}/configsets/{configsetId}'
- Used in:
  - src/components/Topology/StartupConfigsDialog.vue

106) locklab(path: string, password: string)
- HTTP: PUT 'api/labs{path}/Lock'
- Used in:
  - src/components/Common/Lab_Sidebar.vue

107) unlocklab(path: string, password: string)
- HTTP: PUT 'api/labs{path}/Unlock'
- Used in:
  - src/components/Common/Lab_Sidebar.vue

Payload reference (exact JSON shapes)

- create_lab(path: string, payload: string)
  Payload:
  {
    "path": string,                     // parent folder (e.g. "/Root/Folder")
    "author": string,
    "body": string,                      // lab tasks text
    "countdown": number,                // seconds
    "description": string,
    "grid": 0 | 1,                      // 1 to display grid
    "linkwidth": number,                // default link width
    "name": string,                     // lab file name without .unl
    "sat": string,                      // satellite id
    "scripttimeout": number,
    "shared": string[],                 // usernames
    "version": number
  }

- edit_lab(path: string, payload: string)
  Payload: similar to create_lab; fields vary by edit scenario. Common fields include any of:
  { "author": string, "description": string, "grid": 0|1, "linkwidth": number, "name": string, "version": number, ... }

- clone_lab(payload: string)
  Payload:
  {
    "source": string,                   // full source path + ".unl" (e.g. "/Root/Folder/Lab.unl")
    "name": string                      // new base name without extension
  }

- create_dir(payload: string)
  Payload:
  {
    "path": string,                     // parent folder
    "name": string                      // new folder name
  }

- move_folder(sourcePath: string, payload: string)
  Payload:
  { "path": string }                    // target folder path

- rename_lab(labpath: string, payload: string)
  Payload:
  { "name": string }                    // new lab base name (no extension)

- move_lab(labpath: string, payload: string)
  Payload:
  { "path": string }                    // target folder path

- export_labs(payload: string)
  Payload: numbered entries of full item paths plus folder context
  {
    "0": string,                        // e.g. "/Root/Folder/Lab1.unl"
    "1": string,                        // e.g. "/Root/Folder/Lab2.unl"
    ...,
    "path": string                      // current folder path used for export context
  }

- edit_user(username: string, payload: string)
  Payload (password optional when unchanged):
  {
    "username": string,
    "extauth": string,                  // "internal" | "radius" | "active directory"
    "email": string,
    "name": string,
    "role": string,                     // "admin" | "editor" | "user"
    "pod": number,
    "cpu": number,                      // -1 for unlimited
    "ram": number,                      // -1 for unlimited (GB)
    "html5": string,                    // "0" | "100" | "101" | "102"
    "lab": string,                      // lab path or ''
    "sat": number,                      // -1 any | id | bitmask with bit30 set
    "expiration": number,               // epoch seconds or -1
    "datestart": number,                // epoch seconds or -1
    "sticky": 0 | 1,                    // 1 if lab pinned
    "password"?: string                 // only when changing password
  }

- add_user(payload: string)
  Payload:
  {
    "username": string,
    "extauth": string,
    "email": string,
    "name": string,
    "role": string,
    "cpu": number,
    "ram": number,
    "html5": string,
    "sat": number,                      // -1 any | id | bitmask with bit30 set
    "expiration": number,               // epoch seconds or -1
    "datestart": number,                // epoch seconds or -1
    "password": string
  }

- update_password(payload: string)
  Payload:
  {
    "oldpassword": string,
    "newpassword": string,              // empty string keeps current password
    "newemail": string
  }

- get_startup_configs(path, cfsid)
  Payload (POST body):
  { "cfsid": string }                   // "default" or config set id

- save_node_config(path, nodeId, configData, configsetId)
  Payload (PUT body):
  {
    "id": string,                       // nodeId as string
    "data": string,                     // config text
    "cfsid": string                     // "default" or config set id
  }

- create_configset(path, name)
  Payload:
  { "name": string }

- rename_configset(path, configsetId, name)
  Payload:
  { "name": string }

- delete_configset(path, configsetId)
  Payload (sent as DELETE data by axios):
  { "id": string }

- edit_nodes(path, payload, id)
  Payload (for startup-config toggle in UI):
  { "config": string }                  // "1" to enable (or configset id), "0" to disable

- get_task(path, id) / save_task(path, id, payload)
  Payload for save_task:
  {
    "type": "public",                  // currently always 'public'
    "name": string,
    "data": string                      // base64-encoded HTML content
  }

- create_task(path, payload)
  Payload:
  {
    "name": string,
    "type": "public",
    "data": string                      // base64-encoded HTML content
  }

- rename_task(path, id, payload)
  Payload:
  {
    "name": string,
    "type": "public"
  }

- set_node_interface(path, nodeId, interfaceId, networkId)
  Payload (PUT body):
  { "<interfaceId>": string }           // key is interfaceId, value is networkId or '' to disconnect

- interface_suspend(path, payload)
  Payload:
  {
    "nodeId": string | number,
    "interfaceId": string | number
  }

- interface_resume(path, payload)
  Payload:
  {
    "nodeId": string | number,
    "interfaceId": string | number
  }

- post_system_settings(payload: string)
  Payload: object with system settings (varies by form). Exact keys mirror System Settings UI fields.

- ksm_set(payload: string)
  Payload: object with KSM parameters (varies).

- cpulimit_set(payload: string)
  Payload: object with CPU limit parameters (varies).

- post_add_member(payload: string)
  Payload: object describing satellite to add (id/host/keys as required by backend).

- post_license(payload: string)
  Payload:
  { "newlic": string }                  // license code

- add_textobject/edit_textobject/edit_textobjects
  Payload: text object structure for lab canvas (varies: includes positions, text, style).

- add_lineobject/edit_lineobjects/edit_lineobject_style
  Payload: line object structure for lab canvas (varies: includes endpoints, style).

- edit_networks/add_networks/manage_network
  Payload: network definition/changes (varies: includes id/type/name, members or management flags).

- start_capture(path, payload)
  Payload: capture options (varies: interface/node/network, filter, duration).

- setLogicalTopologyMap/editLogicalTopology
  Payload:
  { "name": string, "map": string, "custommap": string }

Notes
- Where marked "varies", the exact structure depends on UI forms not fully shown here; see corresponding components for fields.
