From cad81a5f6566d2e3000c5667873cda9a4044ce5c Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 23 Oct 2025 10:22:50 -0700 Subject: [PATCH 1/2] Broken Link Checker Action --- b812ceb69337a210633378917cba10bc/README.md | 2 +- ...ition_736c0f0183787210fb2a7fc6feaad34e.xml | 2191 +++++++++++++++++ 2 files changed, 2192 insertions(+), 1 deletion(-) create mode 100644 b812ceb69337a210633378917cba10bc/update/sys_hub_action_type_definition_736c0f0183787210fb2a7fc6feaad34e.xml diff --git a/b812ceb69337a210633378917cba10bc/README.md b/b812ceb69337a210633378917cba10bc/README.md index 1aa7e3e..05cd6fa 100644 --- a/b812ceb69337a210633378917cba10bc/README.md +++ b/b812ceb69337a210633378917cba10bc/README.md @@ -24,4 +24,4 @@ If you find yourself unable to import your repository due to the presence of fil 2.2 Activate/install all required dependencies 2.3 Re-import the application from source control Currently listed dependencies: - * ServiceNow IntegrationHub Enterprise Pack Installer + * diff --git a/b812ceb69337a210633378917cba10bc/update/sys_hub_action_type_definition_736c0f0183787210fb2a7fc6feaad34e.xml b/b812ceb69337a210633378917cba10bc/update/sys_hub_action_type_definition_736c0f0183787210fb2a7fc6feaad34e.xml new file mode 100644 index 0000000..3b985b3 --- /dev/null +++ b/b812ceb69337a210633378917cba10bc/update/sys_hub_action_type_definition_736c0f0183787210fb2a7fc6feaad34e.xml @@ -0,0 +1,2191 @@ + + + public + + + + true + + {labelCacheCleanUpExecuted=true} + 28100 + false + + + + Checks any published article with broken links + + false + broken_kb_link_checker + [{"name":"{{action.kb_query}}","label":"action➛kb_query","type":"action","ref":"","reference_display":"","base_type":"string","parent_table_name":"","column_name":"","choices":null,"attributes":{}},{"name":"{{action.max_count}}","label":"action➛max_count","type":"action","ref":"","reference_display":"","base_type":"string","parent_table_name":"","column_name":"","choices":null,"attributes":{}},{"name":"{{action.max_articles}}","label":"action➛max_articles","type":"action","ref":"","reference_display":"","base_type":"integer","parent_table_name":"","column_name":"","choices":null,"attributes":{}},{"name":"{{action.timeout_seconds}}","label":"action➛timeout_seconds","type":"action","ref":"","reference_display":"","base_type":"integer","parent_table_name":"","column_name":"","choices":null,"attributes":{}}] + bdfd0b4183b87210fb2a7fc6feaad374 + + Broken KB Link Checker + + + false + published + sys_hub_action_type_definition + admin + 2025-10-23 17:15:20 + global + / + 736c0f0183787210fb2a7fc6feaad34e + 6 + Broken KB Link Checker + + b812ceb69337a210633378917cba10bc + + b812ceb69337a210633378917cba10bc + sys_hub_action_type_definition_736c0f0183787210fb2a7fc6feaad34e + admin + 2025-10-23 17:22:03 + false + + + + + + sys_hub_action_type_definition + 736c0f0183787210fb2a7fc6feaad34e + 1 + sys_variable_value + admin + 2025-10-23 17:16:45 + 1ccccfcd83787210fb2a7fc6feaad303 + 0 + admin + 2025-10-23 17:16:45 + {"version":"1.0","complexObject":{"code":{"$cv":{"$c":"java.lang.String","$v":""}},"message":{"$cv":{"$c":"java.lang.String","$v":""}}},"complexObjectSchema":{"FlowDesigner:FDACTIONSTATUS":{"code":"Integer","code.$field_facets":{"SimpleMapFacet":"{\"uiTypeLabel\":\"Integer\",\"read_only\":\"false\",\"hint\":\"\",\"uiType\":\"integer\",\"default_value\":\"\",\"label\":\"Code\",\"action_error_output\":\"true\",\"mandatory\":\"false\",\"order\":\"1\",\"max_length\":\"40\"}"},"message":"String","message.$field_facets":{"SimpleMapFacet":"{\"uiTypeLabel\":\"String\",\"read_only\":\"false\",\"hint\":\"\",\"uiType\":\"string\",\"default_value\":\"\",\"label\":\"Message\",\"action_error_output\":\"true\",\"mandatory\":\"false\",\"order\":\"2\",\"max_length\":\"4000\"}"}},"FlowDesigner:FDACTIONSTATUS.$type_facets":{"SimpleMapFacet":"{\"default_value\":\"\",\"label\":\"Action Status\",\"action_error_output\":\"true\",\"mandatory\":\"false\",\"uiUniqueId\":\"4adfb7bc-9d67-498d-88d0-8d6c3d584fed\",\"uiTypeLabel\":\"Object\",\"co_type_name\":\"FDACTIONSTATUS\",\"element_mapping_provider\":\"com.glide.flow_design.action.data.FlowDesignVariableMapper\",\"read_only\":\"false\",\"hint\":null,\"uiType\":\"object\",\"order\":\"1\",\"max_length\":\"65000\"}"}},"serializationFormat":"JSON"} + d0cc8fcd83787210fb2a7fc6feaad3da + + + sys_hub_action_type_definition + 736c0f0183787210fb2a7fc6feaad34e + 2 + sys_variable_value + admin + 2025-10-23 17:16:45 + d0cccfcd83787210fb2a7fc6feaad303 + 0 + admin + 2025-10-23 17:16:45 + 0 + 98cc8fcd83787210fb2a7fc6feaad3df + + + + + 736c0f0183787210fb2a7fc6feaad34e + 810d2a65-21d0-4d9f-87c8-c5488959cfa7 + 1 + + + + + + + 1 + +
+ 106afb6647032200b4fad7527c9a71e7 + admin + 2025-10-23 17:22:01 + 6dfdc74183b87210fb2a7fc6feaad3cb + 1 + b812ceb69337a210633378917cba10bc + admin + 2025-10-23 17:22:01 + + + + sys_hub_step_instance + 6dfdc74183b87210fb2a7fc6feaad3cb + 400 + sys_variable_value + admin + 2025-10-23 17:22:01 + 29fdc74183b87210fb2a7fc6feaad3fa + 0 + admin + 2025-10-23 17:22:01 + 35aa573fd7802200bdbaee5b5e610375 + f5e56d79b3101300176b051a16a8dce4 + + + sys_hub_step_instance + 6dfdc74183b87210fb2a7fc6feaad3cb + 200 + sys_variable_value + admin + 2025-10-23 17:22:01 + 61fdc74183b87210fb2a7fc6feaad3fc + 0 + admin + 2025-10-23 17:22:01 + + e5fdc74183b87210fb2a7fc6feaad3d7 + + + sys_hub_step_instance + 6dfdc74183b87210fb2a7fc6feaad3cb + 100 + sys_variable_value + admin + 2025-10-23 17:22:01 + adfdc74183b87210fb2a7fc6feaad3fb + 0 + admin + 2025-10-23 17:22:01 + + 61fdc74183b87210fb2a7fc6feaad3d5 + + + sys_hub_step_instance + 6dfdc74183b87210fb2a7fc6feaad3cb + 600 + sys_variable_value + admin + 2025-10-23 17:22:01 + e9fdc74183b87210fb2a7fc6feaad3fa + 0 + admin + 2025-10-23 17:22:01 + (function execute(inputs, outputs) { + var kbQuery = inputs.kb_query || "active=true^published=true"; + var maxArticles = parseInt(inputs.max_articles || 100, 10); + var timeout = parseInt(inputs.timeout_seconds || 5, 10); + + var brokenLinks = []; + var urlRegex = /(https?:\/\/[^\s"']+)/g; + + var kb = new GlideRecord('kb_knowledge'); + kb.addEncodedQuery(kbQuery); + kb.setLimit(maxArticles); + kb.query(); + + while (kb.next()) { + var content = kb.getValue('text') || ""; + var urls = content.match(urlRegex); + if (!urls) continue; + + for (var i = 0; i < urls.length; i++) { + var url = urls[i]; + + // Skip internal links (if needed) + if (url.indexOf(gs.getProperty('instance_name')) > -1) continue; + + try { + var r = new sn_ws.RESTMessageV2(); + r.setHttpMethod("HEAD"); + r.setEndpoint(url); + r.setRequestHeader("User-Agent", "ServiceNow-LinkChecker"); + r.setRequestHeader("Accept", "*/*"); + r.setHttpTimeout(timeout * 1000); + + var response = r.execute(); + var status = response.getStatusCode(); + + if (status >= 400) { + brokenLinks.push({ + article_sys_id: kb.getUniqueValue(), + article_number: kb.getValue('number'), + article_title: kb.getValue('short_description'), + bad_url: url, + http_status: status + }); + } + } catch (ex) { + brokenLinks.push({ + article_sys_id: kb.getUniqueValue(), + article_number: kb.getValue('number'), + article_title: kb.getValue('short_description'), + bad_url: url, + http_status: "Error: " + ex.message + }); + } + } + } + + outputs.broken_links = brokenLinks; + outputs.count_broken = brokenLinks.length; + +})(inputs, outputs); + + 71aa7f6647032200b4fad7527c9a719b + + + + application + 6dfdc74183b87210fb2a7fc6feaad3cb + admin + 2025-10-23 17:22:01 + e1fdc74183b87210fb2a7fc6feaad3fa + 0 + admin + 2025-10-23 17:22:01 + var__m_sys_flow_step_definition_input_106afb6647032200b4fad7527c9a71e7
+ +
+ + kb_query + 6dfdc74183b87210fb2a7fc6feaad3cb + admin + 2025-10-23 17:22:01 + a5fdc74183b87210fb2a7fc6feaad3fb + 0 + admin + 2025-10-23 17:22:01 + var__m_sys_hub_step_ext_input_6dfdc74183b87210fb2a7fc6feaad3cb
+ {{action.kb_query}} +
+ + max_articles + 6dfdc74183b87210fb2a7fc6feaad3cb + admin + 2025-10-23 17:22:01 + 2dfdc74183b87210fb2a7fc6feaad3fb + 0 + admin + 2025-10-23 17:22:01 + var__m_sys_hub_step_ext_input_6dfdc74183b87210fb2a7fc6feaad3cb
+ {{action.max_articles}} +
+ + script + 6dfdc74183b87210fb2a7fc6feaad3cb + admin + 2025-10-23 17:22:01 + a5fdc74183b87210fb2a7fc6feaad3fa + 0 + admin + 2025-10-23 17:22:01 + var__m_sys_flow_step_definition_input_106afb6647032200b4fad7527c9a71e7
+ +
+ + timeout_seconds + 6dfdc74183b87210fb2a7fc6feaad3cb + admin + 2025-10-23 17:22:01 + 69fdc74183b87210fb2a7fc6feaad3fb + 0 + admin + 2025-10-23 17:22:01 + var__m_sys_hub_step_ext_input_6dfdc74183b87210fb2a7fc6feaad3cb
+ {{action.timeout_seconds}} +
+ + + + + true + false + false + element_mapping_provider=com.glide.flow_design.action.data.FlowDesignVariableMapper,uiType=integer,uiTypeLabel=Integer + false + + + + + + + + + + + + + false + false + + + + max_articles + false + + + + false + + + integer + + + true + false + false + element_mapping_provider=com.glide.flow_design.action.data.FlowDesignVariableMapper,uiType=string,uiTypeLabel=String + false + + + + + + + + + + + + + false + false + + + + kb_query + false + + + + false + + + string + + + true + false + false + element_mapping_provider=com.glide.flow_design.action.data.FlowDesignVariableMapper,uiType=integer,uiTypeLabel=Integer + false + + + + + + + + + + + + + false + false + + + + timeout_seconds + false + + + + false + + + integer + + + + + + true + false + false + element_mapping_provider=com.glide.flow_design.action.data.FlowDesignVariableMapper,uiType=integer,uiTypeLabel=Integer,uiUniqueId=2f82ea7b-3ce8-43d8-98b5-32b751a248be + false + + + + + + + + + + + + + false + false + + + + max_articles + false + + + + false + + + integer + + false + 40 + 736c0f0183787210fb2a7fc6feaad34e + 736c0f0183787210fb2a7fc6feaad34e + sys_hub_action_type_definition + var__m_sys_hub_action_input_736c0f0183787210fb2a7fc6feaad34e + + 2 + false + false + + + + false + + + + + + false + false + sys_hub_action_input + admin + 2025-10-23 17:16:44 + 14cc8fcd83787210fb2a7fc6feaad3bf + 0 + + + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:16:44 + false + false + false + false + false + simple + false + script + + + false + + + + true + false + false + element_mapping_provider=com.glide.flow_design.action.data.FlowDesignVariableMapper,uiType=integer,uiTypeLabel=Integer,uiUniqueId=f3c7034d-c893-4664-ae33-69f615dfd531 + false + + + + + + + + + + + + + false + false + + + + timeout_seconds + false + + + + false + + + integer + + false + 40 + 736c0f0183787210fb2a7fc6feaad34e + 736c0f0183787210fb2a7fc6feaad34e + sys_hub_action_type_definition + var__m_sys_hub_action_input_736c0f0183787210fb2a7fc6feaad34e + + 3 + false + false + + + + false + + + + + + false + false + sys_hub_action_input + admin + 2025-10-23 17:16:44 + 58cc8fcd83787210fb2a7fc6feaad3c3 + 0 + + + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:16:44 + false + false + false + false + false + simple + false + script + + + false + + + + true + false + false + element_mapping_provider=com.glide.flow_design.action.data.FlowDesignVariableMapper,uiType=string,uiTypeLabel=String,uiUniqueId=f81db4be-b5c9-43a8-98d6-261784706d82 + false + + + + + + + + + + + + + false + false + + + + kb_query + false + + + + false + + + string + + false + 8000 + 736c0f0183787210fb2a7fc6feaad34e + 736c0f0183787210fb2a7fc6feaad34e + sys_hub_action_type_definition + var__m_sys_hub_action_input_736c0f0183787210fb2a7fc6feaad34e + + 1 + false + false + + + + false + + + + + + false + false + sys_hub_action_input + admin + 2025-10-23 17:16:44 + 9ccc0bcd83787210fb2a7fc6feaad31c + 0 + + + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:16:44 + false + false + false + false + false + simple + false + script + + + false + + + + + true + false + false + action_error_output=true,element_mapping_provider=com.glide.flow_design.action.data.FlowDesignVariableMapper,uiType=boolean,uiTypeLabel=True/False,uiUniqueId=cc1fa392-f7ab-4a6b-8e04-04b64fbb774e,visible_in_ui=false + false + + + + + + + + true + + + + + false + false + + + + __dont_treat_as_error__ + + false + + + + false + + + + boolean + + false + 40 + 736c0f0183787210fb2a7fc6feaad34e + 736c0f0183787210fb2a7fc6feaad34e + sys_hub_action_type_definition + var__m_sys_hub_action_output_736c0f0183787210fb2a7fc6feaad34e + + 2 + false + false + + + + false + + + + + + false + false + sys_hub_action_output + admin + 2025-10-23 17:16:45 + 98cc8fcd83787210fb2a7fc6feaad3df + 5 + + + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:22:01 + false + false + false + false + false + simple + false + script + + + false + + + + + true + false + false + action_error_output=true,co_type_name=FDACTIONSTATUS,element_mapping_provider=com.glide.flow_design.action.data.FlowDesignVariableMapper,uiType=object,uiTypeLabel=Object,uiUniqueId=2af4f7de-c139-4f56-b649-def81e4e63fe + false + + + + + + + + + + + + + false + false + + + + __action_status__ + + false + + + + false + + + + string + + false + 65000 + 736c0f0183787210fb2a7fc6feaad34e + 736c0f0183787210fb2a7fc6feaad34e + sys_hub_action_type_definition + var__m_sys_hub_action_output_736c0f0183787210fb2a7fc6feaad34e + + 1 + false + false + + + + false + + + + + + false + false + sys_hub_action_output + admin + 2025-10-23 17:16:44 + d0cc8fcd83787210fb2a7fc6feaad3da + 2 + + + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:22:01 + false + false + false + false + false + simple + false + script + + + false + + + + + + + 736c0f0183787210fb2a7fc6feaad34e + admin + 2025-10-23 17:16:45 + 50cccfcd83787210fb2a7fc6feaad305 + 0 + admin + 2025-10-23 17:16:45 + + + + max_articles + + + + en + var__m_sys_hub_action_input_736c0f0183787210fb2a7fc6feaad34e + + sys_documentation + admin + 2025-10-23 17:16:44 + 18cc8fcd83787210fb2a7fc6feaad3c2 + 0 + + b812ceb69337a210633378917cba10bc + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:16:44 + + + + + timeout_seconds + + + + en + var__m_sys_hub_action_input_736c0f0183787210fb2a7fc6feaad34e + + sys_documentation + admin + 2025-10-23 17:16:44 + 5ccc8fcd83787210fb2a7fc6feaad3c6 + 0 + + b812ceb69337a210633378917cba10bc + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:16:44 + + + + + kb_query + + + + en + var__m_sys_hub_action_input_736c0f0183787210fb2a7fc6feaad34e + + sys_documentation + admin + 2025-10-23 17:16:44 + d0cc8fcd83787210fb2a7fc6feaad3be + 0 + + b812ceb69337a210633378917cba10bc + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:16:44 + + + + + + __action_status__ + + + + en + var__m_sys_hub_action_output_736c0f0183787210fb2a7fc6feaad34e + + sys_documentation + admin + 2025-10-23 17:16:45 + 58cc8fcd83787210fb2a7fc6feaad3de + 0 + + b812ceb69337a210633378917cba10bc + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:16:45 + + + + + __dont_treat_as_error__ + + + + en + var__m_sys_hub_action_output_736c0f0183787210fb2a7fc6feaad34e + + sys_documentation + admin + 2025-10-23 17:16:45 + d4cc8fcd83787210fb2a7fc6feaad3fe + 0 + + b812ceb69337a210633378917cba10bc + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:16:45 + + + + + + + 736c0f0183787210fb2a7fc6feaad34e + {"type":"PlanProxy","persistor":{"@class":".ChunkingPlanPersistor","table":"sys_hub_action_plan","id":"4efd0b4183b87210fb2a7fc6feaad3fc","name":"plan","plan_signature":null}} + c6fd0b4183b87210fb2a7fc6feaad3cc + admin + 2025-10-23 17:22:03 + global + / + 4efd0b4183b87210fb2a7fc6feaad3fc + 0 + + + admin + 2025-10-23 17:22:03 + + + public + + + + + {labelCacheCleanUpExecuted=true} + 28100 + false + + + + Checks any published article with broken links + + broken_kb_link_checker + [{"name":"{{action.kb_query}}","label":"action➛kb_query","type":"action","ref":"","reference_display":"","base_type":"string","parent_table_name":"","column_name":"","choices":null,"attributes":{}},{"name":"{{action.max_count}}","label":"action➛max_count","type":"action","ref":"","reference_display":"","base_type":"string","parent_table_name":"","column_name":"","choices":null,"attributes":{}},{"name":"{{action.max_articles}}","label":"action➛max_articles","type":"action","ref":"","reference_display":"","base_type":"integer","parent_table_name":"","column_name":"","choices":null,"attributes":{}},{"name":"{{action.timeout_seconds}}","label":"action➛timeout_seconds","type":"action","ref":"","reference_display":"","base_type":"integer","parent_table_name":"","column_name":"","choices":null,"attributes":{}}] + true + Broken KB Link Checker + + + 736c0f0183787210fb2a7fc6feaad34e + sys_hub_action_type_snapshot + admin + 2025-10-23 17:22:02 + global + / + bdfd0b4183b87210fb2a7fc6feaad374 + 0 + + + + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:22:02 + false + + + + + + sys_hub_action_type_snapshot + bdfd0b4183b87210fb2a7fc6feaad374 + 2 + sys_variable_value + admin + 2025-10-23 17:22:03 + 0efd0b4183b87210fb2a7fc6feaad3ca + 0 + admin + 2025-10-23 17:22:03 + 0 + c2fd0b4183b87210fb2a7fc6feaad3b4 + + + sys_hub_action_type_snapshot + bdfd0b4183b87210fb2a7fc6feaad374 + 1 + sys_variable_value + admin + 2025-10-23 17:22:03 + cefd0b4183b87210fb2a7fc6feaad3ca + 0 + admin + 2025-10-23 17:22:03 + {"version":"1.0","complexObject":{"code":{"$cv":{"$c":"java.lang.String","$v":""}},"message":{"$cv":{"$c":"java.lang.String","$v":""}}},"complexObjectSchema":{"FlowDesigner:FDACTIONSTATUS":{"code":"Integer","code.$field_facets":{"SimpleMapFacet":"{\"uiTypeLabel\":\"Integer\",\"read_only\":\"false\",\"hint\":\"\",\"uiType\":\"integer\",\"default_value\":\"\",\"label\":\"Code\",\"action_error_output\":\"true\",\"mandatory\":\"false\",\"order\":\"1\",\"max_length\":\"40\"}"},"message":"String","message.$field_facets":{"SimpleMapFacet":"{\"uiTypeLabel\":\"String\",\"read_only\":\"false\",\"hint\":\"\",\"uiType\":\"string\",\"default_value\":\"\",\"label\":\"Message\",\"action_error_output\":\"true\",\"mandatory\":\"false\",\"order\":\"2\",\"max_length\":\"4000\"}"}},"FlowDesigner:FDACTIONSTATUS.$type_facets":{"SimpleMapFacet":"{\"default_value\":\"\",\"label\":\"Action Status\",\"action_error_output\":\"true\",\"mandatory\":\"false\",\"uiUniqueId\":\"4adfb7bc-9d67-498d-88d0-8d6c3d584fed\",\"uiTypeLabel\":\"Object\",\"co_type_name\":\"FDACTIONSTATUS\",\"element_mapping_provider\":\"com.glide.flow_design.action.data.FlowDesignVariableMapper\",\"read_only\":\"false\",\"hint\":null,\"uiType\":\"object\",\"order\":\"1\",\"max_length\":\"65000\"}"}},"serializationFormat":"JSON"} + 46fd0b4183b87210fb2a7fc6feaad3af + + + + + bdfd0b4183b87210fb2a7fc6feaad374 + 810d2a65-21d0-4d9f-87c8-c5488959cfa7 + 1 + + + + + + + 1 + +
+ 106afb6647032200b4fad7527c9a71e7 + admin + 2025-10-23 17:22:02 + 75fd0b4183b87210fb2a7fc6feaad389 + 1 + b812ceb69337a210633378917cba10bc + admin + 2025-10-23 17:22:02 + + + + sys_hub_step_instance + 75fd0b4183b87210fb2a7fc6feaad389 + 600 + sys_variable_value + admin + 2025-10-23 17:22:02 + 0afd0b4183b87210fb2a7fc6feaad3ab + 0 + admin + 2025-10-23 17:22:02 + (function execute(inputs, outputs) { + var kbQuery = inputs.kb_query || "active=true^published=true"; + var maxArticles = parseInt(inputs.max_articles || 100, 10); + var timeout = parseInt(inputs.timeout_seconds || 5, 10); + + var brokenLinks = []; + var urlRegex = /(https?:\/\/[^\s"']+)/g; + + var kb = new GlideRecord('kb_knowledge'); + kb.addEncodedQuery(kbQuery); + kb.setLimit(maxArticles); + kb.query(); + + while (kb.next()) { + var content = kb.getValue('text') || ""; + var urls = content.match(urlRegex); + if (!urls) continue; + + for (var i = 0; i < urls.length; i++) { + var url = urls[i]; + + // Skip internal links (if needed) + if (url.indexOf(gs.getProperty('instance_name')) > -1) continue; + + try { + var r = new sn_ws.RESTMessageV2(); + r.setHttpMethod("HEAD"); + r.setEndpoint(url); + r.setRequestHeader("User-Agent", "ServiceNow-LinkChecker"); + r.setRequestHeader("Accept", "*/*"); + r.setHttpTimeout(timeout * 1000); + + var response = r.execute(); + var status = response.getStatusCode(); + + if (status >= 400) { + brokenLinks.push({ + article_sys_id: kb.getUniqueValue(), + article_number: kb.getValue('number'), + article_title: kb.getValue('short_description'), + bad_url: url, + http_status: status + }); + } + } catch (ex) { + brokenLinks.push({ + article_sys_id: kb.getUniqueValue(), + article_number: kb.getValue('number'), + article_title: kb.getValue('short_description'), + bad_url: url, + http_status: "Error: " + ex.message + }); + } + } + } + + outputs.broken_links = brokenLinks; + outputs.count_broken = brokenLinks.length; + +})(inputs, outputs); + + 71aa7f6647032200b4fad7527c9a719b + + + sys_hub_step_instance + 75fd0b4183b87210fb2a7fc6feaad389 + 200 + sys_variable_value + admin + 2025-10-23 17:22:02 + 0efd0b4183b87210fb2a7fc6feaad3ac + 0 + admin + 2025-10-23 17:22:02 + + fdfd0b4183b87210fb2a7fc6feaad394 + + + sys_hub_step_instance + 75fd0b4183b87210fb2a7fc6feaad389 + 400 + sys_variable_value + admin + 2025-10-23 17:22:02 + 46fd0b4183b87210fb2a7fc6feaad3ab + 0 + admin + 2025-10-23 17:22:02 + 35aa573fd7802200bdbaee5b5e610375 + f5e56d79b3101300176b051a16a8dce4 + + + sys_hub_step_instance + 75fd0b4183b87210fb2a7fc6feaad389 + 100 + sys_variable_value + admin + 2025-10-23 17:22:02 + 4afd0b4183b87210fb2a7fc6feaad3ac + 0 + admin + 2025-10-23 17:22:02 + + b5fd0b4183b87210fb2a7fc6feaad391 + + + + application + 75fd0b4183b87210fb2a7fc6feaad389 + admin + 2025-10-23 17:22:02 + 31fd0b4183b87210fb2a7fc6feaad3ab + 0 + admin + 2025-10-23 17:22:02 + var__m_sys_flow_step_definition_input_106afb6647032200b4fad7527c9a71e7
+ +
+ + kb_query + 75fd0b4183b87210fb2a7fc6feaad389 + admin + 2025-10-23 17:22:02 + 42fd0b4183b87210fb2a7fc6feaad3ac + 0 + admin + 2025-10-23 17:22:02 + var__m_sys_hub_step_ext_input_75fd0b4183b87210fb2a7fc6feaad389
+ {{action.kb_query}} +
+ + max_articles + 75fd0b4183b87210fb2a7fc6feaad389 + admin + 2025-10-23 17:22:02 + c6fd0b4183b87210fb2a7fc6feaad3ac + 0 + admin + 2025-10-23 17:22:02 + var__m_sys_hub_step_ext_input_75fd0b4183b87210fb2a7fc6feaad389
+ {{action.max_articles}} +
+ + script + 75fd0b4183b87210fb2a7fc6feaad389 + admin + 2025-10-23 17:22:02 + c2fd0b4183b87210fb2a7fc6feaad3ab + 0 + admin + 2025-10-23 17:22:02 + var__m_sys_flow_step_definition_input_106afb6647032200b4fad7527c9a71e7
+ +
+ + timeout_seconds + 75fd0b4183b87210fb2a7fc6feaad389 + admin + 2025-10-23 17:22:02 + 06fd0b4183b87210fb2a7fc6feaad3ac + 0 + admin + 2025-10-23 17:22:02 + var__m_sys_hub_step_ext_input_75fd0b4183b87210fb2a7fc6feaad389
+ {{action.timeout_seconds}} +
+ + + + + true + false + false + element_mapping_provider=com.glide.flow_design.action.data.FlowDesignVariableMapper,uiType=string,uiTypeLabel=String + false + + + + + + + + + + + + + false + false + + + + kb_query + false + + + + false + + + string + + true + 8000 + 75fd0b4183b87210fb2a7fc6feaad389 + 75fd0b4183b87210fb2a7fc6feaad389 + sys_hub_step_instance + var__m_sys_hub_step_ext_input_75fd0b4183b87210fb2a7fc6feaad389 + + 0 + false + false + + + + false + + + + + + false + false + sys_hub_step_ext_input + admin + 2025-10-23 17:22:02 + b1fd0b4183b87210fb2a7fc6feaad38d + 0 + + + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:22:02 + false + false + false + false + false + simple + false + script + + + false + + + true + false + false + element_mapping_provider=com.glide.flow_design.action.data.FlowDesignVariableMapper,uiType=integer,uiTypeLabel=Integer + false + + + + + + + + + + + + + false + false + + + + max_articles + false + + + + false + + + integer + + true + 40 + 75fd0b4183b87210fb2a7fc6feaad389 + 75fd0b4183b87210fb2a7fc6feaad389 + sys_hub_step_instance + var__m_sys_hub_step_ext_input_75fd0b4183b87210fb2a7fc6feaad389 + + 100 + false + false + + + + false + + + + + + false + false + sys_hub_step_ext_input + admin + 2025-10-23 17:22:02 + b5fd0b4183b87210fb2a7fc6feaad391 + 0 + + + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:22:02 + false + false + false + false + false + simple + false + script + + + false + + + true + false + false + element_mapping_provider=com.glide.flow_design.action.data.FlowDesignVariableMapper,uiType=integer,uiTypeLabel=Integer + false + + + + + + + + + + + + + false + false + + + + timeout_seconds + false + + + + false + + + integer + + true + 40 + 75fd0b4183b87210fb2a7fc6feaad389 + 75fd0b4183b87210fb2a7fc6feaad389 + sys_hub_step_instance + var__m_sys_hub_step_ext_input_75fd0b4183b87210fb2a7fc6feaad389 + + 200 + false + false + + + + false + + + + + + false + false + sys_hub_step_ext_input + admin + 2025-10-23 17:22:02 + fdfd0b4183b87210fb2a7fc6feaad394 + 0 + + + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:22:02 + false + false + false + false + false + simple + false + script + + + false + + + + + + true + false + false + element_mapping_provider=com.glide.flow_design.action.data.FlowDesignVariableMapper,uiType=integer,uiTypeLabel=Integer,uiUniqueId=f3c7034d-c893-4664-ae33-69f615dfd531 + false + + + + + + + + + + + + + false + false + + + + timeout_seconds + false + + + + false + + + integer + + false + 40 + bdfd0b4183b87210fb2a7fc6feaad374 + bdfd0b4183b87210fb2a7fc6feaad374 + sys_hub_action_type_snapshot + var__m_sys_hub_action_input_bdfd0b4183b87210fb2a7fc6feaad374 + + 3 + false + false + + + + false + + + + + + false + false + sys_hub_action_input + admin + 2025-10-23 17:22:02 + b1fd0b4183b87210fb2a7fc6feaad381 + 0 + + + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:22:02 + false + false + false + false + false + simple + false + script + + + false + + + + true + false + false + element_mapping_provider=com.glide.flow_design.action.data.FlowDesignVariableMapper,uiType=integer,uiTypeLabel=Integer,uiUniqueId=2f82ea7b-3ce8-43d8-98b5-32b751a248be + false + + + + + + + + + + + + + false + false + + + + max_articles + false + + + + false + + + integer + + false + 40 + bdfd0b4183b87210fb2a7fc6feaad374 + bdfd0b4183b87210fb2a7fc6feaad374 + sys_hub_action_type_snapshot + var__m_sys_hub_action_input_bdfd0b4183b87210fb2a7fc6feaad374 + + 2 + false + false + + + + false + + + + + + false + false + sys_hub_action_input + admin + 2025-10-23 17:22:02 + bdfd0b4183b87210fb2a7fc6feaad37c + 0 + + + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:22:02 + false + false + false + false + false + simple + false + script + + + false + + + + true + false + false + element_mapping_provider=com.glide.flow_design.action.data.FlowDesignVariableMapper,uiType=string,uiTypeLabel=String,uiUniqueId=f81db4be-b5c9-43a8-98d6-261784706d82 + false + + + + + + + + + + + + + false + false + + + + kb_query + false + + + + false + + + string + + false + 8000 + bdfd0b4183b87210fb2a7fc6feaad374 + bdfd0b4183b87210fb2a7fc6feaad374 + sys_hub_action_type_snapshot + var__m_sys_hub_action_input_bdfd0b4183b87210fb2a7fc6feaad374 + + 1 + false + false + + + + false + + + + + + false + false + sys_hub_action_input + admin + 2025-10-23 17:22:02 + fdfd0b4183b87210fb2a7fc6feaad377 + 0 + + + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:22:02 + false + false + false + false + false + simple + false + script + + + false + + + + + true + false + false + action_error_output=true,co_type_name=FDACTIONSTATUS,element_mapping_provider=com.glide.flow_design.action.data.FlowDesignVariableMapper,uiType=object,uiTypeLabel=Object,uiUniqueId=2af4f7de-c139-4f56-b649-def81e4e63fe + false + + + + + + + + + + + + + false + false + + + + __action_status__ + + false + + + + false + + + + string + + false + 65000 + bdfd0b4183b87210fb2a7fc6feaad374 + bdfd0b4183b87210fb2a7fc6feaad374 + sys_hub_action_type_snapshot + var__m_sys_hub_action_output_bdfd0b4183b87210fb2a7fc6feaad374 + + 1 + false + false + + + + false + + + + + + false + false + sys_hub_action_output + admin + 2025-10-23 17:22:02 + 46fd0b4183b87210fb2a7fc6feaad3af + 0 + + + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:22:02 + false + false + false + false + false + simple + false + script + + + false + + + + + true + false + false + action_error_output=true,element_mapping_provider=com.glide.flow_design.action.data.FlowDesignVariableMapper,uiType=boolean,uiTypeLabel=True/False,uiUniqueId=cc1fa392-f7ab-4a6b-8e04-04b64fbb774e,visible_in_ui=false + false + + + + + + + + true + + + + + false + false + + + + __dont_treat_as_error__ + + false + + + + false + + + + boolean + + false + 40 + bdfd0b4183b87210fb2a7fc6feaad374 + bdfd0b4183b87210fb2a7fc6feaad374 + sys_hub_action_type_snapshot + var__m_sys_hub_action_output_bdfd0b4183b87210fb2a7fc6feaad374 + + 2 + false + false + + + + false + + + + + + false + false + sys_hub_action_output + admin + 2025-10-23 17:22:03 + c2fd0b4183b87210fb2a7fc6feaad3b4 + 1 + + + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:22:03 + false + false + false + false + false + simple + false + script + + + false + + + + + + + bdfd0b4183b87210fb2a7fc6feaad374 + admin + 2025-10-23 17:22:03 + 06fd0b4183b87210fb2a7fc6feaad3cc + 0 + admin + 2025-10-23 17:22:03 + + + + max_articles + + + + en + var__m_sys_hub_action_input_bdfd0b4183b87210fb2a7fc6feaad374 + + sys_documentation + admin + 2025-10-23 17:22:02 + 71fd0b4183b87210fb2a7fc6feaad380 + 0 + + b812ceb69337a210633378917cba10bc + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:22:02 + + + + + timeout_seconds + + + + en + var__m_sys_hub_action_input_bdfd0b4183b87210fb2a7fc6feaad374 + + sys_documentation + admin + 2025-10-23 17:22:02 + 75fd0b4183b87210fb2a7fc6feaad384 + 0 + + b812ceb69337a210633378917cba10bc + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:22:02 + + + + + kb_query + + + + en + var__m_sys_hub_action_input_bdfd0b4183b87210fb2a7fc6feaad374 + + sys_documentation + admin + 2025-10-23 17:22:02 + 7dfd0b4183b87210fb2a7fc6feaad37b + 0 + + b812ceb69337a210633378917cba10bc + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:22:02 + + + + + + __action_status__ + + + + en + var__m_sys_hub_action_output_bdfd0b4183b87210fb2a7fc6feaad374 + + sys_documentation + admin + 2025-10-23 17:22:03 + 82fd0b4183b87210fb2a7fc6feaad3b3 + 0 + + b812ceb69337a210633378917cba10bc + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:22:03 + + + + + __dont_treat_as_error__ + + + + en + var__m_sys_hub_action_output_bdfd0b4183b87210fb2a7fc6feaad374 + + sys_documentation + admin + 2025-10-23 17:22:03 + c6fd0b4183b87210fb2a7fc6feaad3b9 + 0 + + b812ceb69337a210633378917cba10bc + + b812ceb69337a210633378917cba10bc + + admin + 2025-10-23 17:22:03 + + + + + + 736c0f0183787210fb2a7fc6feaad34e + bdfd0b4183b87210fb2a7fc6feaad374 + glide-zurich-07-01-2025__patch1-08-20-2025_09-08-2025_1328.zip + + From 6c542210a29f523e6561cf6f02acc7a55615118b Mon Sep 17 00:00:00 2001 From: Deepak Negi <120473057+dvn-lazywinner@users.noreply.github.com> Date: Thu, 23 Oct 2025 22:55:58 +0530 Subject: [PATCH 2/2] Add Readme for KB Broken Link Checker Added documentation for the KB Broken Link Checker, detailing its functionality, inputs, outputs, usage, and test scenarios. --- b812ceb69337a210633378917cba10bc/Readme.md | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 b812ceb69337a210633378917cba10bc/Readme.md diff --git a/b812ceb69337a210633378917cba10bc/Readme.md b/b812ceb69337a210633378917cba10bc/Readme.md new file mode 100644 index 0000000..f7650dc --- /dev/null +++ b/b812ceb69337a210633378917cba10bc/Readme.md @@ -0,0 +1,35 @@ +# KB Broken Link Checker + +### Summary +Detects **broken HTTP/HTTPS links** inside ServiceNow Knowledge Base articles. +Returns a list of affected KBs and their problematic URLs. + +### Inputs +| Name | Type | Description | Default | +|------|------|-------------|----------| +| `kb_query` | String | Encoded query for filtering KB articles | `active=true^published=true` | +| `max_articles` | Integer | Number of articles to scan | 100 | +| `timeout_seconds` | Integer | Timeout per request | 5 | + +### Outputs +| Name | Type | Description | +|------|------|-------------| +| `broken_links` | Array | Array of `{article_sys_id, article_number, article_title, bad_url, http_status}` | +| `count_broken` | Integer | Total broken links found | + +### Example Flow Usage +1. Drag the **KB Broken Link Checker** action into your flow. +2. Set `kb_query = active=true^published=true^category=IT`. +3. Run it — outputs will show all invalid links with HTTP status codes. +4. You can chain it with an email notification or table insert to track issues. + +### Test Scenario +1. Create a KB article with a bad link like `http://example.invalid/test`. +2. Run the action with `max_articles=10`. +3. Verify output contains: + ```json + { + "article_number": "KB0010001", + "bad_url": "http://example.invalid/test", + "http_status": "Error: ..." + }