@oneuptime/common 11.7.2 → 11.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (414) hide show
  1. package/Models/AnalyticsModels/KubernetesCostAllocation.ts +103 -0
  2. package/Models/DatabaseModels/AlertEpisodeStateTimeline.ts +1 -0
  3. package/Models/DatabaseModels/AlertStateTimeline.ts +1 -0
  4. package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
  5. package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
  6. package/Models/DatabaseModels/Index.ts +5 -0
  7. package/Models/DatabaseModels/LogDropFilter.ts +89 -0
  8. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +13 -3
  9. package/Models/DatabaseModels/RecommendationDismissal.ts +463 -0
  10. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
  11. package/Models/DatabaseModels/StatusPageGroup.ts +95 -0
  12. package/Models/DatabaseModels/TableView.ts +40 -0
  13. package/Models/DatabaseModels/TraceDropFilter.ts +89 -0
  14. package/Models/DatabaseModels/WorkflowVariable.ts +5 -1
  15. package/Server/API/AlertAPI.ts +32 -17
  16. package/Server/API/BaseAPI.ts +31 -2
  17. package/Server/API/BaseAnalyticsAPI.ts +36 -2
  18. package/Server/API/CommonAPI.ts +57 -0
  19. package/Server/API/IncidentAPI.ts +60 -33
  20. package/Server/API/IncidentEpisodeAPI.ts +31 -16
  21. package/Server/API/MonitorAPI.ts +30 -0
  22. package/Server/API/MonitorTemplateAPI.ts +8 -0
  23. package/Server/API/ProbeAPI.ts +196 -15
  24. package/Server/API/ProjectAPI.ts +79 -1
  25. package/Server/API/ScheduledMaintenanceAPI.ts +33 -18
  26. package/Server/API/StatusPageAPI.ts +74 -37
  27. package/Server/API/WorkspaceNotificationRuleAPI.ts +34 -4
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.ts +13 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.ts +527 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.ts +31 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.ts +55 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.ts +53 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  34. package/Server/Services/AlertEpisodeService.ts +47 -0
  35. package/Server/Services/AlertService.ts +125 -0
  36. package/Server/Services/BillingService.ts +98 -0
  37. package/Server/Services/DatabaseService.ts +184 -20
  38. package/Server/Services/IncidentEpisodeService.ts +47 -0
  39. package/Server/Services/IncidentService.ts +123 -0
  40. package/Server/Services/IncidentTemplateService.ts +123 -1
  41. package/Server/Services/Index.ts +2 -0
  42. package/Server/Services/LogDropFilterService.ts +133 -0
  43. package/Server/Services/MonitorProbeService.ts +94 -4
  44. package/Server/Services/MonitorService.ts +48 -43
  45. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +70 -0
  46. package/Server/Services/ProbeService.ts +66 -0
  47. package/Server/Services/ProjectService.ts +131 -7
  48. package/Server/Services/RecommendationDismissalService.ts +52 -0
  49. package/Server/Services/RunbookAgentJobService.ts +68 -7
  50. package/Server/Services/ScheduledMaintenanceService.ts +103 -0
  51. package/Server/Services/ScheduledMaintenanceTemplateService.ts +90 -0
  52. package/Server/Services/StatusPageGroupService.ts +186 -0
  53. package/Server/Services/TraceDropFilterService.ts +133 -0
  54. package/Server/Types/Workflow/Components/API/Delete.ts +12 -0
  55. package/Server/Types/Workflow/Components/API/Get.ts +12 -0
  56. package/Server/Types/Workflow/Components/API/Patch.ts +12 -0
  57. package/Server/Types/Workflow/Components/API/Post.ts +12 -0
  58. package/Server/Types/Workflow/Components/API/Put.ts +13 -0
  59. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +212 -0
  60. package/Server/Utils/DropFilterValidation.ts +127 -0
  61. package/Server/Utils/Errors.ts +5 -0
  62. package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
  63. package/Server/Utils/Monitor/MonitorIncident.ts +31 -2
  64. package/Server/Utils/Telemetry/AppMetrics.ts +31 -0
  65. package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +16 -0
  66. package/Tests/Models/DatabaseModels/MonitorProbeColumnAccessControl.test.ts +196 -0
  67. package/Tests/Models/RecommendationDismissalModel.test.ts +269 -0
  68. package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +320 -0
  69. package/Tests/Server/API/BaseAnalyticsAPIUpdatePayloadValidation.test.ts +293 -0
  70. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +164 -0
  71. package/Tests/Server/API/ProbeAPI.test.ts +422 -53
  72. package/Tests/Server/API/ProjectAPI.test.ts +180 -0
  73. package/Tests/Server/API/ProjectAPIExtendTrialBillingDisabled.test.ts +138 -0
  74. package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +458 -0
  75. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +359 -0
  76. package/Tests/Server/Infrastructure/ProcessSignalDelivery.test.ts +427 -0
  77. package/Tests/Server/Services/BillingServiceExtendTrial.test.ts +439 -0
  78. package/Tests/Server/Services/CrossProjectReferenceWriteGuard.test.ts +810 -0
  79. package/Tests/Server/Services/DatabaseServiceAtomicAddToColumns.test.ts +269 -0
  80. package/Tests/Server/Services/DatabaseServiceEmptyUpdate.test.ts +277 -0
  81. package/Tests/Server/Services/DatabaseServiceSortColumnSelect.test.ts +201 -0
  82. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +81 -23
  83. package/Tests/Server/Services/DropFilterSaveValidation.test.ts +398 -0
  84. package/Tests/Server/Services/MonitorProbeDeleteHooks.test.ts +280 -0
  85. package/Tests/Server/Services/MonitorProbeServiceProbeTenancy.test.ts +304 -0
  86. package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +262 -0
  87. package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +614 -0
  88. package/Tests/Server/Services/RecommendationDismissalService.test.ts +306 -0
  89. package/Tests/Server/Services/RepairCrossProjectIncidentReferencesMigration.test.ts +528 -0
  90. package/Tests/Server/Services/StatusPageGroupNesting.test.ts +395 -0
  91. package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +26 -21
  92. package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +227 -0
  93. package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +285 -0
  94. package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +463 -0
  95. package/Tests/Server/Utils/DropFilterValidation.test.ts +269 -0
  96. package/Tests/Server/Utils/Telemetry/SpanUtil.test.ts +94 -0
  97. package/Tests/Types/DateUserTimezone.test.ts +52 -0
  98. package/Tests/Types/JSONFunctions.test.ts +103 -1
  99. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +177 -9
  100. package/Tests/Types/Monitor/MonitorStepDnsMonitor.test.ts +105 -0
  101. package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +131 -0
  102. package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +60 -0
  103. package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +82 -0
  104. package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +268 -0
  105. package/Tests/Types/Monitor/MonitorStepMetricMonitor.test.ts +386 -0
  106. package/Tests/Types/Monitor/MonitorStepProfileMonitor.test.ts +185 -0
  107. package/Tests/Types/Monitor/MonitorStepSnmpMonitor.test.ts +156 -0
  108. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +371 -0
  109. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +901 -0
  110. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +607 -0
  111. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +754 -0
  112. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +960 -0
  113. package/Tests/Types/RollingTime/RollingTimeUtil.test.ts +186 -0
  114. package/Tests/Types/Runbook/RunbookStepTimeout.test.ts +410 -0
  115. package/Tests/Types/Telemetry/DropFilterSampling.test.ts +241 -0
  116. package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +353 -0
  117. package/Tests/Types/Workspace/NotificationRuleUtil.test.ts +566 -0
  118. package/Tests/UI/Components/CodeEditor.test.tsx +174 -0
  119. package/Tests/UI/Components/ErrorBoundary.test.tsx +555 -24
  120. package/Tests/UI/Components/InfoCard.test.tsx +358 -0
  121. package/Tests/UI/Components/LogTimeRangePicker.test.tsx +138 -0
  122. package/Tests/UI/Components/Modal.test.tsx +43 -5
  123. package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +679 -0
  124. package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +397 -0
  125. package/Tests/UI/Components/ModelTable/ColumnCustomizationModal.test.tsx +999 -0
  126. package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +1678 -0
  127. package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +1094 -0
  128. package/Tests/UI/Components/Runbook/StepTimeoutInput.test.tsx +386 -0
  129. package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +671 -0
  130. package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +404 -0
  131. package/Tests/UI/Utils/DropdownAlignment.test.ts +306 -0
  132. package/Tests/UI/Utils/TableFilterUrlState.test.ts +292 -0
  133. package/Tests/Utils/Monitor/MonitorSummaryProbeUtil.test.ts +263 -0
  134. package/Tests/Utils/NetworkDiscovery/ScanTargetUtil.test.ts +583 -0
  135. package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +1072 -0
  136. package/Tests/Utils/StatusPage/GroupTree.test.ts +583 -0
  137. package/Tests/Utils/StatusPage/ResourceUptime.test.ts +411 -0
  138. package/Tests/Utils/UserPreferences.test.ts +563 -0
  139. package/Types/Date.ts +15 -6
  140. package/Types/JSONFunctions.ts +7 -2
  141. package/Types/Kubernetes/KubernetesCostIngest.ts +37 -1
  142. package/Types/Monitor/KubernetesAlertTemplates.ts +205 -0
  143. package/Types/Monitor/MonitorStep.ts +10 -1
  144. package/Types/Monitor/MonitorStepMetricMonitor.ts +46 -1
  145. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +413 -0
  146. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +168 -0
  147. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +175 -0
  148. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +743 -0
  149. package/Types/Permission.ts +45 -0
  150. package/Types/Recommendation/RecommendationType.ts +20 -0
  151. package/Types/Runbook/RunbookExecutionDeadline.ts +129 -0
  152. package/Types/Runbook/RunbookStepTimeout.ts +202 -0
  153. package/Types/Telemetry/DropFilterSampling.ts +92 -0
  154. package/UI/Components/AI/GenerateFromAIModal.tsx +0 -2
  155. package/UI/Components/Accordion/Accordion.tsx +10 -2
  156. package/UI/Components/BulkUpdate/BulkLabelActions.tsx +0 -1
  157. package/UI/Components/CodeEditor/CodeEditor.tsx +34 -20
  158. package/UI/Components/Date/RangeStartAndEndDateView.tsx +0 -1
  159. package/UI/Components/EditionLabel/EditionLabel.tsx +1 -27
  160. package/UI/Components/Error/PageError.tsx +0 -4
  161. package/UI/Components/ErrorBoundary.tsx +252 -15
  162. package/UI/Components/InfoCard/InfoCard.tsx +58 -1
  163. package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +34 -1
  164. package/UI/Components/MasterPage/MasterPage.tsx +65 -0
  165. package/UI/Components/Modal/Modal.tsx +16 -60
  166. package/UI/Components/ModelFormModal/ModelFormModal.tsx +0 -8
  167. package/UI/Components/ModelTable/BaseModelTable.tsx +503 -71
  168. package/UI/Components/ModelTable/Column.ts +17 -0
  169. package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +523 -0
  170. package/UI/Components/ModelTable/ColumnPreference.ts +482 -0
  171. package/UI/Components/ModelTable/CustomFieldColumns.tsx +326 -0
  172. package/UI/Components/ModelTable/TableView.tsx +24 -2
  173. package/UI/Components/ModelTable/useCustomFieldColumns.ts +150 -0
  174. package/UI/Components/Runbook/StepTimeoutInput.tsx +173 -0
  175. package/UI/Components/SideMenu/SideMenu.tsx +24 -4
  176. package/UI/Components/StatusPage/ResourceGroupSection.tsx +231 -0
  177. package/UI/Components/Table/Table.tsx +14 -1
  178. package/UI/Components/Table/TableRow.tsx +180 -175
  179. package/UI/Components/Table/Types/Column.ts +2 -0
  180. package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +34 -1
  181. package/UI/Utils/DropdownAlignment.ts +162 -0
  182. package/UI/Utils/TableFilterUrlState.ts +59 -20
  183. package/Utils/API.ts +106 -2
  184. package/Utils/Monitor/MonitorSummaryProbeUtil.ts +130 -0
  185. package/Utils/NetworkDiscovery/ScanTargetUtil.ts +434 -0
  186. package/Utils/StatusPage/GroupNestingLayout.ts +343 -0
  187. package/Utils/StatusPage/GroupTree.ts +307 -0
  188. package/Utils/StatusPage/ResourceUptime.ts +90 -17
  189. package/Utils/UserPreferences.ts +53 -0
  190. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +86 -0
  191. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -1
  192. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js +1 -0
  193. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js.map +1 -1
  194. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +1 -0
  195. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
  196. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
  197. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
  198. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
  199. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  200. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  201. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  202. package/build/dist/Models/DatabaseModels/LogDropFilter.js +91 -0
  203. package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
  204. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +14 -4
  205. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  206. package/build/dist/Models/DatabaseModels/RecommendationDismissal.js +484 -0
  207. package/build/dist/Models/DatabaseModels/RecommendationDismissal.js.map +1 -0
  208. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
  209. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/StatusPageGroup.js +94 -0
  211. package/build/dist/Models/DatabaseModels/StatusPageGroup.js.map +1 -1
  212. package/build/dist/Models/DatabaseModels/TableView.js +40 -0
  213. package/build/dist/Models/DatabaseModels/TableView.js.map +1 -1
  214. package/build/dist/Models/DatabaseModels/TraceDropFilter.js +91 -0
  215. package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
  216. package/build/dist/Models/DatabaseModels/WorkflowVariable.js +5 -1
  217. package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
  218. package/build/dist/Server/API/AlertAPI.js +22 -13
  219. package/build/dist/Server/API/AlertAPI.js.map +1 -1
  220. package/build/dist/Server/API/BaseAPI.js +22 -1
  221. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  222. package/build/dist/Server/API/BaseAnalyticsAPI.js +24 -1
  223. package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
  224. package/build/dist/Server/API/CommonAPI.js +42 -0
  225. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  226. package/build/dist/Server/API/IncidentAPI.js +43 -26
  227. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  228. package/build/dist/Server/API/IncidentEpisodeAPI.js +21 -12
  229. package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
  230. package/build/dist/Server/API/MonitorAPI.js +23 -0
  231. package/build/dist/Server/API/MonitorAPI.js.map +1 -1
  232. package/build/dist/Server/API/MonitorTemplateAPI.js +4 -0
  233. package/build/dist/Server/API/MonitorTemplateAPI.js.map +1 -1
  234. package/build/dist/Server/API/ProbeAPI.js +131 -15
  235. package/build/dist/Server/API/ProbeAPI.js.map +1 -1
  236. package/build/dist/Server/API/ProjectAPI.js +62 -3
  237. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  238. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +23 -14
  239. package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
  240. package/build/dist/Server/API/StatusPageAPI.js +61 -33
  241. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  242. package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js +26 -2
  243. package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js.map +1 -1
  244. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.js +12 -0
  245. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.js.map +1 -0
  246. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js +397 -0
  247. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js.map +1 -0
  248. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js +16 -0
  249. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js.map +1 -0
  250. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js +30 -0
  251. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js.map +1 -0
  252. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js +34 -0
  253. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js.map +1 -0
  254. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  255. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  256. package/build/dist/Server/Services/AlertEpisodeService.js +39 -0
  257. package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
  258. package/build/dist/Server/Services/AlertService.js +95 -0
  259. package/build/dist/Server/Services/AlertService.js.map +1 -1
  260. package/build/dist/Server/Services/BillingService.js +71 -0
  261. package/build/dist/Server/Services/BillingService.js.map +1 -1
  262. package/build/dist/Server/Services/DatabaseService.js +140 -17
  263. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  264. package/build/dist/Server/Services/IncidentEpisodeService.js +39 -0
  265. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  266. package/build/dist/Server/Services/IncidentService.js +100 -0
  267. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  268. package/build/dist/Server/Services/IncidentTemplateService.js +97 -0
  269. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  270. package/build/dist/Server/Services/Index.js +2 -0
  271. package/build/dist/Server/Services/Index.js.map +1 -1
  272. package/build/dist/Server/Services/LogDropFilterService.js +93 -0
  273. package/build/dist/Server/Services/LogDropFilterService.js.map +1 -1
  274. package/build/dist/Server/Services/MonitorProbeService.js +73 -5
  275. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  276. package/build/dist/Server/Services/MonitorService.js +34 -39
  277. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  278. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +71 -0
  279. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
  280. package/build/dist/Server/Services/ProbeService.js +64 -0
  281. package/build/dist/Server/Services/ProbeService.js.map +1 -1
  282. package/build/dist/Server/Services/ProjectService.js +103 -7
  283. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  284. package/build/dist/Server/Services/RecommendationDismissalService.js +50 -0
  285. package/build/dist/Server/Services/RecommendationDismissalService.js.map +1 -0
  286. package/build/dist/Server/Services/RunbookAgentJobService.js +63 -5
  287. package/build/dist/Server/Services/RunbookAgentJobService.js.map +1 -1
  288. package/build/dist/Server/Services/ScheduledMaintenanceService.js +83 -0
  289. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  290. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +65 -0
  291. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
  292. package/build/dist/Server/Services/StatusPageGroupService.js +136 -0
  293. package/build/dist/Server/Services/StatusPageGroupService.js.map +1 -1
  294. package/build/dist/Server/Services/TraceDropFilterService.js +93 -0
  295. package/build/dist/Server/Services/TraceDropFilterService.js.map +1 -1
  296. package/build/dist/Server/Types/Workflow/Components/API/Delete.js +11 -0
  297. package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
  298. package/build/dist/Server/Types/Workflow/Components/API/Get.js +11 -0
  299. package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
  300. package/build/dist/Server/Types/Workflow/Components/API/Patch.js +11 -0
  301. package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
  302. package/build/dist/Server/Types/Workflow/Components/API/Post.js +11 -0
  303. package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
  304. package/build/dist/Server/Types/Workflow/Components/API/Put.js +12 -0
  305. package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
  306. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +132 -0
  307. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -0
  308. package/build/dist/Server/Utils/DropFilterValidation.js +80 -0
  309. package/build/dist/Server/Utils/DropFilterValidation.js.map +1 -0
  310. package/build/dist/Server/Utils/Errors.js +3 -0
  311. package/build/dist/Server/Utils/Errors.js.map +1 -1
  312. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +30 -12
  313. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  314. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +38 -18
  315. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  316. package/build/dist/Server/Utils/Telemetry/AppMetrics.js +26 -0
  317. package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
  318. package/build/dist/Types/Date.js +14 -4
  319. package/build/dist/Types/Date.js.map +1 -1
  320. package/build/dist/Types/JSONFunctions.js +8 -3
  321. package/build/dist/Types/JSONFunctions.js.map +1 -1
  322. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -1
  323. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +192 -0
  324. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  325. package/build/dist/Types/Monitor/MonitorStep.js +6 -1
  326. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  327. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js +32 -1
  328. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js.map +1 -1
  329. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +294 -0
  330. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -0
  331. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +110 -0
  332. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -0
  333. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +58 -0
  334. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -0
  335. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +451 -0
  336. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -0
  337. package/build/dist/Types/Permission.js +40 -0
  338. package/build/dist/Types/Permission.js.map +1 -1
  339. package/build/dist/Types/Recommendation/RecommendationType.js +21 -0
  340. package/build/dist/Types/Recommendation/RecommendationType.js.map +1 -0
  341. package/build/dist/Types/Runbook/RunbookExecutionDeadline.js +93 -0
  342. package/build/dist/Types/Runbook/RunbookExecutionDeadline.js.map +1 -0
  343. package/build/dist/Types/Runbook/RunbookStepTimeout.js +142 -0
  344. package/build/dist/Types/Runbook/RunbookStepTimeout.js.map +1 -0
  345. package/build/dist/Types/Telemetry/DropFilterSampling.js +75 -0
  346. package/build/dist/Types/Telemetry/DropFilterSampling.js.map +1 -0
  347. package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -2
  348. package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
  349. package/build/dist/UI/Components/Accordion/Accordion.js +9 -2
  350. package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
  351. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +1 -1
  352. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
  353. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +27 -14
  354. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  355. package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js +1 -1
  356. package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js.map +1 -1
  357. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +2 -20
  358. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  359. package/build/dist/UI/Components/Error/PageError.js +1 -3
  360. package/build/dist/UI/Components/Error/PageError.js.map +1 -1
  361. package/build/dist/UI/Components/ErrorBoundary.js +145 -11
  362. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  363. package/build/dist/UI/Components/InfoCard/InfoCard.js +28 -1
  364. package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
  365. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +13 -2
  366. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
  367. package/build/dist/UI/Components/MasterPage/MasterPage.js +50 -1
  368. package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
  369. package/build/dist/UI/Components/Modal/Modal.js +4 -32
  370. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  371. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  372. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +308 -40
  373. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  374. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +230 -0
  375. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -0
  376. package/build/dist/UI/Components/ModelTable/ColumnPreference.js +258 -0
  377. package/build/dist/UI/Components/ModelTable/ColumnPreference.js.map +1 -0
  378. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +168 -0
  379. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -0
  380. package/build/dist/UI/Components/ModelTable/TableView.js +13 -2
  381. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
  382. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +84 -0
  383. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -0
  384. package/build/dist/UI/Components/Runbook/StepTimeoutInput.js +101 -0
  385. package/build/dist/UI/Components/Runbook/StepTimeoutInput.js.map +1 -0
  386. package/build/dist/UI/Components/SideMenu/SideMenu.js +15 -5
  387. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  388. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +73 -0
  389. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -0
  390. package/build/dist/UI/Components/Table/Table.js +15 -2
  391. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  392. package/build/dist/UI/Components/Table/TableRow.js +11 -6
  393. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  394. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +13 -2
  395. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
  396. package/build/dist/UI/Utils/DropdownAlignment.js +98 -0
  397. package/build/dist/UI/Utils/DropdownAlignment.js.map +1 -0
  398. package/build/dist/UI/Utils/TableFilterUrlState.js +48 -15
  399. package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
  400. package/build/dist/Utils/API.js +39 -2
  401. package/build/dist/Utils/API.js.map +1 -1
  402. package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js +97 -0
  403. package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js.map +1 -0
  404. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +330 -0
  405. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -0
  406. package/build/dist/Utils/StatusPage/GroupNestingLayout.js +280 -0
  407. package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -0
  408. package/build/dist/Utils/StatusPage/GroupTree.js +214 -0
  409. package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -0
  410. package/build/dist/Utils/StatusPage/ResourceUptime.js +60 -16
  411. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  412. package/build/dist/Utils/UserPreferences.js +33 -0
  413. package/build/dist/Utils/UserPreferences.js.map +1 -1
  414. package/package.json +1 -1
@@ -0,0 +1,434 @@
1
+ /*
2
+ * Scan-target parsing for network device discovery.
3
+ *
4
+ * A discovery scan's target is the IPv4 address space a probe sweeps. Two
5
+ * notations are accepted:
6
+ *
7
+ * CIDR 192.168.1.0/24
8
+ * Octet range 10.16-22.0-255.51-66
9
+ *
10
+ * Octet-range notation exists because real networks are not shaped like CIDR
11
+ * blocks. "The .51-.66 management addresses in every /24 of 10.16-22.x" is a
12
+ * single target here; expressed in CIDR it is 1,792 separate scans, and the
13
+ * only CIDR that covers it in one go (10.16.0.0/13) is 512k addresses, of
14
+ * which 98% are not worth probing.
15
+ *
16
+ * This lives in Common rather than in the Probe's SubnetScanner so the server
17
+ * can validate a target at write time with exactly the parser the probe will
18
+ * later expand it with. A target that saves is a target that scans.
19
+ *
20
+ * IPv4-only by design, same as the sweep itself: IPv6 space is far too sparse
21
+ * to enumerate, and IPv6 discovery will be neighbour-discovery based.
22
+ */
23
+
24
+ // Which of the two notations a target string is written in.
25
+ export enum ScanTargetNotation {
26
+ Cidr = "CIDR",
27
+ OctetRange = "OctetRange",
28
+ }
29
+
30
+ // One octet's accepted values: `start` through `end`, both inclusive.
31
+ export interface OctetRange {
32
+ start: number;
33
+ end: number;
34
+ }
35
+
36
+ export interface ScanTarget {
37
+ notation: ScanTargetNotation;
38
+ /*
39
+ * How many addresses the target expands to. Always derived arithmetically
40
+ * (prefix length / range widths) and never by building the address list, so
41
+ * an absurd target can be rejected before anything is allocated.
42
+ */
43
+ hostCount: number;
44
+ // Populated for ScanTargetNotation.OctetRange. Always exactly 4 entries.
45
+ octetRanges?: Array<OctetRange> | undefined;
46
+ // Populated for ScanTargetNotation.Cidr.
47
+ networkLong?: number | undefined;
48
+ blockSize?: number | undefined;
49
+ }
50
+
51
+ interface ParseOutcome {
52
+ target?: ScanTarget | undefined;
53
+ /*
54
+ * Human-readable, shown to the operator who typed the target. Never null when
55
+ * `target` is absent.
56
+ */
57
+ error?: string | undefined;
58
+ }
59
+
60
+ export class ScanTargetUtil {
61
+ /*
62
+ * Hard ceiling on how many addresses one scan may sweep.
63
+ *
64
+ * The number is a wall-clock budget, not a memory one. SubnetScanner runs 32
65
+ * workers; a dead host costs ~1s (the ICMP pre-sweep timeout), or ~2s when
66
+ * the pre-sweep is unavailable and every host is SNMP-probed directly. At
67
+ * this ceiling that is ~17 minutes with the pre-sweep and ~34 minutes
68
+ * without — both comfortably inside the 2-hour window after which the server
69
+ * declares an In Progress scan abandoned (Workers/Jobs/
70
+ * NetworkDeviceDiscovery/RequeueRecurringScans.ts) and safely above the
71
+ * 15-minute minimum rescan interval for recurring scans.
72
+ *
73
+ * It is also still a real abuse guard: a /17 in CIDR terms. Anything larger
74
+ * (a /16 sweep, an unbounded 10.*.*.* octet range) is rejected at write time
75
+ * with a message telling the operator to narrow the target.
76
+ */
77
+ public static readonly MAX_SCAN_HOSTS: number = 32768;
78
+
79
+ /*
80
+ * Longest string we will even attempt to parse. The widest well-formed
81
+ * target is "255-255.255-255.255-255.255-255" at 31 characters, so this is
82
+ * ~2x headroom and still far below the 100-character column. It exists to
83
+ * bound the error messages, which quote the target back — see the gate in
84
+ * parseWithError().
85
+ */
86
+ public static readonly MAX_TARGET_LENGTH: number = 64;
87
+
88
+ /*
89
+ * Hoisted so the literals are not the object of a member expression, which
90
+ * `wrap-regex` and Prettier cannot agree on. Same reason as CidrMatchUtil.
91
+ */
92
+ private static readonly CIDR_PATTERN: RegExp =
93
+ /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\/(\d{1,3})$/;
94
+
95
+ // A single octet term: `42` or `16-22`. Bounds are validated after parsing.
96
+ private static readonly OCTET_TERM_PATTERN: RegExp =
97
+ /^(\d{1,3})(?:-(\d{1,3}))?$/;
98
+
99
+ private static readonly EXAMPLE_CIDR: string = "192.168.1.0/24";
100
+
101
+ private static readonly EXAMPLE_OCTET_RANGE: string = "10.16-22.0-255.51-66";
102
+
103
+ /*
104
+ * Parses a target into the shape needed to count and expand it. Returns null
105
+ * for anything malformed; use getValidationError() when you need to tell the
106
+ * operator WHY. Size is deliberately not checked here — parse() answers "is
107
+ * this well-formed", the caller decides what it can afford to sweep.
108
+ */
109
+ public static parse(target: string): ScanTarget | null {
110
+ return ScanTargetUtil.parseWithError(target).target || null;
111
+ }
112
+
113
+ // True when `target` is well-formed in either notation. Ignores size.
114
+ public static isValid(target: string): boolean {
115
+ return ScanTargetUtil.parse(target) !== null;
116
+ }
117
+
118
+ /*
119
+ * The notation `target` is written in, or null when it is not a valid target
120
+ * at all. A string containing '/' is always read as CIDR — a malformed CIDR
121
+ * is never silently retried as an octet range, because "10.0.0.0/99" is a
122
+ * typo'd prefix and deserves to say so.
123
+ */
124
+ public static getNotation(target: string): ScanTargetNotation | null {
125
+ return ScanTargetUtil.parse(target)?.notation || null;
126
+ }
127
+
128
+ /*
129
+ * How many addresses `target` sweeps, or 0 when it is malformed. Computed
130
+ * from the prefix length / range widths alone, with no allocation: expand()
131
+ * materializes one string per address, so a size check that ran after
132
+ * expansion would let a /8 allocate ~16M strings before the limit it exists
133
+ * to enforce was ever consulted.
134
+ */
135
+ public static countHosts(target: string): number {
136
+ return ScanTargetUtil.parse(target)?.hostCount || 0;
137
+ }
138
+
139
+ /*
140
+ * The single validation entry point for a scan target: syntax first, then
141
+ * the size ceiling. Returns null when the target is good to scan, otherwise
142
+ * a message written for the operator who typed it.
143
+ */
144
+ public static getValidationError(target: string): string | null {
145
+ const outcome: ParseOutcome = ScanTargetUtil.parseWithError(target);
146
+
147
+ if (!outcome.target) {
148
+ return outcome.error || ScanTargetUtil.getMalformedTargetMessage(target);
149
+ }
150
+
151
+ if (outcome.target.hostCount > ScanTargetUtil.MAX_SCAN_HOSTS) {
152
+ return (
153
+ `"${String(target).trim()}" expands to ` +
154
+ `${outcome.target.hostCount.toLocaleString("en-US")} addresses, ` +
155
+ `exceeding the ${ScanTargetUtil.MAX_SCAN_HOSTS.toLocaleString("en-US")}-address scan limit. ` +
156
+ `Narrow the target (a smaller subnet, or tighter octet ranges) or split it into several scans.`
157
+ );
158
+ }
159
+
160
+ return null;
161
+ }
162
+
163
+ /*
164
+ * Expands a target into the addresses to probe, in ascending address order.
165
+ *
166
+ * Returns an empty array for a malformed target — there is nothing to sweep.
167
+ * THROWS for a well-formed target above MAX_SCAN_HOSTS: that is a caller
168
+ * that skipped its size check, and quietly returning a truncated or empty
169
+ * list would turn it into a silently wrong scan. Callers should gate on
170
+ * getValidationError() (or countHosts()) first and never see this.
171
+ */
172
+ public static expand(target: string): Array<string> {
173
+ const parsed: ScanTarget | null = ScanTargetUtil.parse(target);
174
+
175
+ if (!parsed) {
176
+ return [];
177
+ }
178
+
179
+ if (parsed.hostCount > ScanTargetUtil.MAX_SCAN_HOSTS) {
180
+ throw new Error(
181
+ ScanTargetUtil.getValidationError(target) ||
182
+ `Scan target "${String(target).trim()}" is too large to expand.`,
183
+ );
184
+ }
185
+
186
+ if (parsed.notation === ScanTargetNotation.Cidr) {
187
+ return ScanTargetUtil.expandCidrTarget(parsed);
188
+ }
189
+
190
+ return ScanTargetUtil.expandOctetRangeTarget(parsed);
191
+ }
192
+
193
+ /*
194
+ * Both notations in one sentence, for form hints and error messages. Kept
195
+ * here so the UI, the server-side validator and the probe all describe the
196
+ * accepted syntax identically.
197
+ */
198
+ public static getSyntaxHint(): string {
199
+ return (
200
+ `Use CIDR notation (e.g. ${ScanTargetUtil.EXAMPLE_CIDR}) or octet-range notation, ` +
201
+ `where any octet may be an inclusive low-high range (e.g. ${ScanTargetUtil.EXAMPLE_OCTET_RANGE}).`
202
+ );
203
+ }
204
+
205
+ private static parseWithError(target: string): ParseOutcome {
206
+ if (typeof target !== "string" || target.trim().length === 0) {
207
+ return {
208
+ error: `A scan target is required. ${ScanTargetUtil.getSyntaxHint()}`,
209
+ };
210
+ }
211
+
212
+ const trimmed: string = target.trim();
213
+
214
+ /*
215
+ * Length gate BEFORE anything builds a message. Every rejection below
216
+ * quotes the offending target back (parseOctetRange quotes both the bad
217
+ * term AND the whole target, doubling it), and the server-side create
218
+ * hook runs ahead of the column's 100-character cap — so without this,
219
+ * a 50 MB request body would be reflected into a ~100 MB exception that
220
+ * is both logged and serialized into the response. This message is a
221
+ * constant and echoes nothing.
222
+ */
223
+ if (trimmed.length > ScanTargetUtil.MAX_TARGET_LENGTH) {
224
+ return {
225
+ error:
226
+ `A scan target cannot be longer than ${ScanTargetUtil.MAX_TARGET_LENGTH} characters. ` +
227
+ ScanTargetUtil.getSyntaxHint(),
228
+ };
229
+ }
230
+
231
+ /*
232
+ * The '/' is the discriminator, checked before either parser runs. A
233
+ * string carrying a prefix is a CIDR attempt by intent, so "10.0.0.0/99"
234
+ * must report a bad prefix rather than fall through to the octet-range
235
+ * parser and report the far more confusing "not a valid scan target".
236
+ */
237
+ if (trimmed.includes("/")) {
238
+ return ScanTargetUtil.parseCidr(trimmed);
239
+ }
240
+
241
+ return ScanTargetUtil.parseOctetRange(trimmed);
242
+ }
243
+
244
+ private static parseCidr(trimmed: string): ParseOutcome {
245
+ const match: RegExpMatchArray | null = trimmed.match(
246
+ ScanTargetUtil.CIDR_PATTERN,
247
+ );
248
+
249
+ if (!match) {
250
+ return {
251
+ error:
252
+ `"${trimmed}" is not a valid IPv4 CIDR. ` +
253
+ `Expected four octets and a prefix length, e.g. ${ScanTargetUtil.EXAMPLE_CIDR}.`,
254
+ };
255
+ }
256
+
257
+ let baseLong: number = 0;
258
+ for (let i: number = 1; i <= 4; i++) {
259
+ const octet: number = parseInt(match[i]!, 10);
260
+ if (octet > 255) {
261
+ return {
262
+ error:
263
+ `Octet "${match[i]}" in "${trimmed}" is out of range. ` +
264
+ `Each octet must be between 0 and 255.`,
265
+ };
266
+ }
267
+ baseLong = baseLong * 256 + octet;
268
+ }
269
+
270
+ const prefix: number = parseInt(match[5]!, 10);
271
+ if (prefix > 32) {
272
+ return {
273
+ error:
274
+ `Prefix length "/${match[5]}" in "${trimmed}" is out of range. ` +
275
+ `An IPv4 prefix must be between /0 and /32.`,
276
+ };
277
+ }
278
+
279
+ const hostBits: number = 32 - prefix;
280
+ const blockSize: number = Math.pow(2, hostBits);
281
+
282
+ /*
283
+ * Shifting by 32 is a no-op in JS (the shift count is taken mod 32), so a
284
+ * /0 would mask with 0xffffffff and "expand" from the address as typed
285
+ * rather than from 0.0.0.0. Special-cased rather than relied upon.
286
+ */
287
+ const mask: number = hostBits >= 32 ? 0 : (0xffffffff << hostBits) >>> 0;
288
+ const networkLong: number = (baseLong & mask) >>> 0;
289
+
290
+ return {
291
+ target: {
292
+ notation: ScanTargetNotation.Cidr,
293
+ /*
294
+ * /31 and /32 have no network/broadcast addresses to exclude (RFC
295
+ * 3021), so every address in them is a host. Larger blocks drop the
296
+ * first and last.
297
+ */
298
+ hostCount: blockSize <= 2 ? blockSize : blockSize - 2,
299
+ networkLong: networkLong,
300
+ blockSize: blockSize,
301
+ },
302
+ };
303
+ }
304
+
305
+ private static parseOctetRange(trimmed: string): ParseOutcome {
306
+ const terms: Array<string> = trimmed.split(".");
307
+
308
+ if (terms.length !== 4) {
309
+ return { error: ScanTargetUtil.getMalformedTargetMessage(trimmed) };
310
+ }
311
+
312
+ const octetRanges: Array<OctetRange> = [];
313
+ let hostCount: number = 1;
314
+
315
+ for (const term of terms) {
316
+ const match: RegExpMatchArray | null = term.match(
317
+ ScanTargetUtil.OCTET_TERM_PATTERN,
318
+ );
319
+
320
+ if (!match) {
321
+ return {
322
+ error:
323
+ `"${term}" in "${trimmed}" is not a valid octet. ` +
324
+ `Each octet must be a number (42) or an inclusive range (16-22).`,
325
+ };
326
+ }
327
+
328
+ const start: number = parseInt(match[1]!, 10);
329
+ // No '-' in the term means a single value: a zero-width range.
330
+ const end: number =
331
+ match[2] === undefined ? start : parseInt(match[2], 10);
332
+
333
+ if (start > 255 || end > 255) {
334
+ return {
335
+ error:
336
+ `Octet "${term}" in "${trimmed}" is out of range. ` +
337
+ `Each octet must be between 0 and 255.`,
338
+ };
339
+ }
340
+
341
+ /*
342
+ * Reversed bounds are a typo, not an empty set. Silently accepting
343
+ * "22-16" as zero addresses would produce a scan that sweeps nothing
344
+ * and reports success — the least debuggable outcome available.
345
+ */
346
+ if (start > end) {
347
+ return {
348
+ error:
349
+ `Octet range "${term}" in "${trimmed}" is reversed. ` +
350
+ `Write the lower bound first, e.g. ${end}-${start}.`,
351
+ };
352
+ }
353
+
354
+ octetRanges.push({ start: start, end: end });
355
+ hostCount = hostCount * (end - start + 1);
356
+ }
357
+
358
+ return {
359
+ target: {
360
+ notation: ScanTargetNotation.OctetRange,
361
+ /*
362
+ * Every address in the product is swept, with no network/broadcast
363
+ * exclusion. An octet range is an explicit enumeration, not a subnet:
364
+ * whoever wrote "10.0.0.0-255" asked for .0 and .255 by name, and
365
+ * there is no prefix length here from which a broadcast address could
366
+ * even be derived.
367
+ */
368
+ hostCount: hostCount,
369
+ octetRanges: octetRanges,
370
+ },
371
+ };
372
+ }
373
+
374
+ private static expandCidrTarget(parsed: ScanTarget): Array<string> {
375
+ const networkLong: number = parsed.networkLong!;
376
+ const blockSize: number = parsed.blockSize!;
377
+ const hosts: Array<string> = [];
378
+
379
+ if (blockSize <= 2) {
380
+ // /31 and /32: every address is usable.
381
+ for (let i: number = 0; i < blockSize; i++) {
382
+ hosts.push(ScanTargetUtil.longToIp(networkLong + i));
383
+ }
384
+ return hosts;
385
+ }
386
+
387
+ // Skip network (first) and broadcast (last).
388
+ for (let i: number = 1; i < blockSize - 1; i++) {
389
+ hosts.push(ScanTargetUtil.longToIp(networkLong + i));
390
+ }
391
+ return hosts;
392
+ }
393
+
394
+ private static expandOctetRangeTarget(parsed: ScanTarget): Array<string> {
395
+ const ranges: Array<OctetRange> = parsed.octetRanges!;
396
+ const hosts: Array<string> = [];
397
+
398
+ // Outer-to-inner octet order, so the result comes out address-ascending.
399
+ for (let a: number = ranges[0]!.start; a <= ranges[0]!.end; a++) {
400
+ for (let b: number = ranges[1]!.start; b <= ranges[1]!.end; b++) {
401
+ for (let c: number = ranges[2]!.start; c <= ranges[2]!.end; c++) {
402
+ for (let d: number = ranges[3]!.start; d <= ranges[3]!.end; d++) {
403
+ hosts.push(`${a}.${b}.${c}.${d}`);
404
+ }
405
+ }
406
+ }
407
+ }
408
+
409
+ return hosts;
410
+ }
411
+
412
+ private static getMalformedTargetMessage(target: string): string {
413
+ const shown: string =
414
+ typeof target === "string" ? target.trim() : String(target);
415
+
416
+ return (
417
+ `"${shown}" is not a valid scan target. ` + ScanTargetUtil.getSyntaxHint()
418
+ );
419
+ }
420
+
421
+ private static longToIp(long: number): string {
422
+ return (
423
+ ((long >>> 24) & 0xff) +
424
+ "." +
425
+ ((long >>> 16) & 0xff) +
426
+ "." +
427
+ ((long >>> 8) & 0xff) +
428
+ "." +
429
+ (long & 0xff)
430
+ );
431
+ }
432
+ }
433
+
434
+ export default ScanTargetUtil;