in tcpdumpw/main.go [361:489]
func createTasks(
ctx context.Context,
ifacePrefix, timezone, directory, extension, filter *string,
filters []pcap.PcapFilterProvider,
compatFilters pcap.PcapFilters,
snaplen, interval *int,
compat, debug, tcpdump, jsondump, jsonlog, ordered, conntrack, gcpGAE *bool,
ephemerals *pcap.PcapEphemeralPorts,
verbosity pcap.PcapVerbosity,
) []*pcapTask {
tasks := []*pcapTask{}
iface := *ifacePrefix
if iface == "" {
iface = ifacePrefixEnvVar
}
isGAE, err := strconv.ParseBool(gaeEnvVar)
isGAE = (err == nil && isGAE) || *gcpGAE
var devices []*pcap.PcapDevice = nil
if strings.EqualFold(iface, anyIfaceName) {
devices = []*pcap.PcapDevice{
{
NetInterface: &net.Interface{
Name: anyIfaceName,
Index: anyIfaceIndex,
},
},
}
} else {
ifaceRegexp := regexp.MustCompile(fmt.Sprintf(devicesRegexTemplate, iface))
devices, _ = pcap.FindDevicesByRegex(ifaceRegexp)
}
for _, device := range devices {
netIface := device.NetInterface
iface := netIface.Name
ifaceAndIndex := fmt.Sprintf("%d/%s", netIface.Index, iface)
jlog(INFO, &emptyTcpdumpJob, fmt.Sprintf("configuring PCAP for iface: %s", ifaceAndIndex))
output := fmt.Sprintf(runFileOutput, *directory, netIface.Index, netIface.Name)
tcpdumpCfg := newPcapConfig(iface, "pcap", output, *extension, *filter, filters, compatFilters, *snaplen, *interval, *compat, *debug, *ordered, *conntrack, ephemerals, verbosity)
jsondumpCfg := newPcapConfig(iface, "json", output, "json", *filter, filters, compatFilters, *snaplen, *interval, *compat, *debug, *ordered, *conntrack, ephemerals, verbosity)
// premature optimization is the root of all evil
var engineErr, writerErr error = nil, nil
var tcpdumpEngine, jsondumpEngine pcap.PcapEngine = nil, nil
var jsondumpWriter, jsonlogWriter, gaejsonWriter pcap.PcapWriter = nil, nil, nil // `tcpdump` does not use custom writers
if *tcpdump {
tcpdumpEngine, engineErr = pcap.NewTcpdump(tcpdumpCfg)
} else {
engineErr = errTcpdumpDisabled
}
if engineErr == nil {
tasks = append(tasks, &pcapTask{engine: tcpdumpEngine, writers: nil, iface: iface})
jlog(INFO, &emptyTcpdumpJob, fmt.Sprintf("configured 'tcpdump' for iface: %s", ifaceAndIndex))
} else if *tcpdump {
jlog(ERROR, &emptyTcpdumpJob, fmt.Sprintf("tcpdump GCS writer creation failed: %s (%s)", ifaceAndIndex, engineErr))
}
// skip JSON setup if JSON pcap is disabled
if !*jsondump && !*jsonlog {
continue
}
engineErr = nil
jsondumpCfg.Ordered = *ordered
// some form of JSON packet capturing is enabled
jsondumpEngine, engineErr = pcap.NewPcap(jsondumpCfg)
if engineErr != nil {
jlog(ERROR, &emptyTcpdumpJob, fmt.Sprintf("jsondump task creation failed: %s (%s)", ifaceAndIndex, engineErr))
continue // abort all JSON setup for this device
}
pcapWriters := []pcap.PcapWriter{}
if *jsondump {
// writing JSON PCAP file is only enabled if `jsondump` is enabled
jsondumpWriter, writerErr = pcap.NewPcapWriter(ctx, &ifaceAndIndex, &output, &jsondumpCfg.Extension, timezone, *interval)
} else {
jsondumpWriter, writerErr = nil, errJSONLogDisabled
}
if writerErr == nil {
pcapWriters = append(pcapWriters, jsondumpWriter)
jlog(INFO, &emptyTcpdumpJob, fmt.Sprintf("configured JSON '%s' writer for iface: %s", output, ifaceAndIndex))
} else if *jsondump {
jlog(ERROR, &emptyTcpdumpJob, fmt.Sprintf("jsondump GCS writer creation failed: %s (%s)", ifaceAndIndex, writerErr))
}
// add `/dev/stdout` as an additional PCAP writer
if *jsonlog {
jsonlogWriter, writerErr = pcap.NewStdoutPcapWriter(ctx, &ifaceAndIndex)
} else {
jsonlogWriter, writerErr = nil, errJSONLogDisabled
}
if writerErr == nil {
pcapWriters = append(pcapWriters, jsonlogWriter)
jlog(INFO, &emptyTcpdumpJob, fmt.Sprintf("configured JSON 'stdout' writer for iface: %s", ifaceAndIndex))
} else if *jsonlog {
jlog(ERROR, &emptyTcpdumpJob, fmt.Sprintf("jsondump stdout writer creation failed: %s (%s)", ifaceAndIndex, writerErr))
}
// handle GAE JSON logger
gaeOutput := ""
if isGAE {
gaeOutput = fmt.Sprintf(gaeFileOutput, netIface.Index, netIface.Name)
gaejsonWriter, writerErr = pcap.NewPcapWriter(ctx, &ifaceAndIndex, &gaeOutput, &jsondumpCfg.Extension, timezone, *interval)
} else {
gaejsonWriter, writerErr = nil, errGaeDisabled
}
if writerErr == nil {
pcapWriters = append(pcapWriters, gaejsonWriter)
jlog(INFO, &emptyTcpdumpJob, fmt.Sprintf("configured GAE JSON '%s' writer for iface: %s", gaeOutput, ifaceAndIndex))
} else if isGAE {
jlog(ERROR, &emptyTcpdumpJob, fmt.Sprintf("jsondump GAE json writer creation failed: %s (%s)", ifaceAndIndex, errGaeDisabled))
}
jlog(INFO, &emptyTcpdumpJob, fmt.Sprintf("configured 'jsondump' for iface: %s", ifaceAndIndex))
tasks = append(tasks, &pcapTask{engine: jsondumpEngine, writers: pcapWriters, iface: iface})
}
return tasks
}