[SDP OP]使用 java script在浏览器的console页签批量协调资产

[SDP OP]使用 java script在浏览器的console页签批量协调资产

Idea
有些用户的域迁移了(域名修改了)导致新域里资产扫描后由于某些型号的设备的服务标签获取不到,而域名又不一致,因此产生了大量重复的资产,想要批量合并这些资产,可以使用浏览器使用java script进行合并
前提条件:MSP需要在14950以上版本,SDP需要在15250以上版本可执行
步骤:
1. 用查询语句查询系统中又多少这样的重复资产,输出为csv文件

SELECT 
    base_name AS "Asset Name",

    /* Resource IDs */
    CONCAT(
        STRING_AGG(CASE WHEN r.resourcename LIKE '%.s' THEN r.resourceid::text END, ','),
        CASE 
            WHEN COUNT(CASE WHEN r.resourcename LIKE '%.s' THEN 1 END) > 0 
             AND COUNT(CASE WHEN r.resourcename LIKE '%.t' THEN 1 END) > 0
            THEN ','
            ELSE ''
        END,
        STRING_AGG(CASE WHEN r.resourcename LIKE '%.t' THEN r.resourceid::text END, ',')
    ) AS "Resource IDs",

    /* Resource Names */
    CONCAT(
        STRING_AGG(CASE WHEN r.resourcename LIKE '%.s' THEN r.resourcename END, ','),
        CASE 
            WHEN COUNT(CASE WHEN r.resourcename LIKE '%.s' THEN 1 END) > 0 
             AND COUNT(CASE WHEN r.resourcename LIKE '%.t' THEN 1 END) > 0
            THEN ','
            ELSE ''
        END,
        STRING_AGG(CASE WHEN r.resourcename LIKE '%.t' THEN r.resourcename END, ',')
    ) AS "Resource Names"

FROM (
    SELECT 
        resourceid,
        resourcename,
        CASE 
            WHEN POSITION('.' IN resourcename) > 0
            THEN LEFT(resourcename, POSITION('.' IN resourcename) - 1)
            ELSE resourcename
        END AS base_name
    FROM resources
) r

GROUP BY base_name
HAVING COUNT(*) > 1;

2. 导出的文件内容格式如下,然后将 IDs里的IP分割为两个IP对,格式如下

重复资产的序列对(资产的ciid)格式如下:
const reconcileInfo = [
    [8434081, 161923],
    [8432051, 162262],
    [8455581, 161921],
    [10885191, 161909],
    [5241361, 162210],
    [5983461, 162513],
    [331, 162240]
];

3. 然后到系统中找到两个同类型的资产进行协调操作,同时在浏览器空白处右键选择Inspect(开发者工具)点击到network页签,执行完毕搜索ajax


4. 在上图的AJaxServlet上右键,然后选择 Copy中的Copy as fetch

5. 再在下面的代码中,用复制的代码替换红色的部分,并将“body" 的绿色部分照搬里面只写body,再将第二步得到的完整序列对替换下面蓝色字体的部分
// Step 1: Define an array where each element contains two numbers (resource1 and resource2)
const reconcileInfo = [
    [100000002,100000006]// Add more pairs as needed
];
const assetType='custom_asset_computer';
// Step 2: Define an async function to send fetch requests with a delay after every 75 requests
async function sendRequests() {
for (let i = 0; i < reconcileInfo.length; i++) {
    const [resource1, resource2] = reconcileInfo[i];
    // Prepare request body with dynamic values
    const body = `action=reconcile&resource1=${resource1}&resource2=${resource2}&assetType=${assetType}`;    
    try {
        // Invoke fetch request
        const response = await fetch("https://demo.servicedeskplus.com/servlet/AJaxServlet", {
  "headers": {
    "accept": "*/*",
    "accept-language": "en,zh-CN;q=0.9,zh;q=0.8",
    "content-type": "application/x-www-form-urlencoded;charset=UTF-8",
    "portalid": "301",
    "sec-ch-ua": "\"Not:A-Brand\";v=\"99\", \"Google Chrome\";v=\"145\", \"Chromium\";v=\"145\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\"",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "same-origin",
    "x-zcsrf-token": "sdpcsrfparam=622e7a82b50f622ebe76122ea8690a54c94806834263be9d3e5d6950c0d9273ab491c69fad362fc973f904ef5cd13d99329f4277a5fdf196c2ca503cbcbc447c"
  },
  "body": body,
  "method": "POST",
  "mode": "cors",
  "credentials": "include"
});
        console.log(`Request ${i + 1} completed for resource1=${resource1}, resource2=${resource2}`);
        } catch (error) {
            console.error(`Error in request ${i + 1}:`, error);
        }
 
        // Step 3: After every 75 requests, pause for 1 minute (60000ms)
        if ((i + 1) % 75 === 0) {
            console.log("Pausing for 1 minute after 75 requests...");
            await new Promise(resolve => setTimeout(resolve, 60000));
            console.log("Resuming requests...");
        }
    }
}

6. 打开sdp管理员登录页到资产页签,浏览器开发者工具的console页签,光标处黏贴入编辑好的代码,回车后返回执行结果,完成后可以在系统查看是否重复的资产已经协调完毕