package com.example.fuzzControll.service.impl;

import com.example.fuzzControll.exception.testException.CmdException;
import com.example.fuzzControll.service.AgentOfKittyService;
import com.example.fuzzControll.tools.file.FileTools;
import com.example.fuzzControll.tools.test.TestCmdTools;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@Service
@Slf4j
public class AgentOfKittyServiceImpl implements AgentOfKittyService {
    @Override
    public Boolean startNetworkAgent(String networkCard, String monitorName) {
        try {
            String finalCmd = "python /usr/fuzzenv/fuzzenv/fuzz_50/katnip/katnip/monitors/network.py " + networkCard + " " + monitorName;
            TestCmdTools cmdTools = new TestCmdTools();
            List<String> result = cmdTools.runCmd(finalCmd, "startNetworkAgent");
            List<String> filter = result.stream().filter(s -> s.contains("calling mon.teardown")).collect(Collectors.toList());
            log.info("Network Agent:{}", (Object) StringUtils.toStringArray(result));
            return filter.size() > 0;
        } catch (CmdException e) {
            log.error("startNetworkAgent run error:{}", e.getMessage());
            throw new RuntimeException(e);
        }
    }

    @Override
    public Boolean startSshAgent(String monitorName, String sshUserName, String sshPassword, String sshIp, String sshPort, String command) {
        try {
            String finalCmd = "python /usr/fuzzenv/fuzzenv/fuzz_50/katnip/katnip/monitors/ssh.py " + monitorName
                    + " " + sshUserName + " " + sshPassword + " " + sshIp + " " + sshPort + " " + command;
            TestCmdTools cmdTools = new TestCmdTools();
            List<String> result = cmdTools.runCmd(finalCmd, "startSshAgent");
            List<String> filter = result.stream().filter(s -> s.contains("Failed to stop thread")).collect(Collectors.toList());
            return !(filter.size() > 0);
        } catch (CmdException e) {
            log.error("startNetworkAgent run error:{}", e.getMessage());
            throw new RuntimeException(e);
        }
    }

    @Override
    public byte[] readPcapToByte() {
        byte[] fileByts = new byte[0];
        try {
            FileTools fileTools = new FileTools();
            fileByts = fileTools.fileReadAndTranstoBytes("/tmp/","test_1.pcap");
        } catch (Exception e) {
            log.error("readPcapToByte error:{}", e.getMessage());
            throw new RuntimeException(e);
        }
        return fileByts;
    }
}