func (rg *RecordGenerator) taskRecord(task state.Task, f state.Framework, domain string, spec labels.Func, ipSources []string, enumFW *EnumerableFramework) { newTask := &EnumerableTask{ID: task.ID, Name: task.Name} enumFW.Tasks = append(enumFW.Tasks, newTask) // define context ctx := context{ spec(task.Name), hashString(task.ID), slaveIDTail(task.SlaveID), task.IP(ipSources...), task.SlaveIP, } // use DiscoveryInfo name if defined instead of task name if task.HasDiscoveryInfo() { // LEGACY TODO: REMOVE ctx.taskName = task.DiscoveryInfo.Name rg.taskContextRecord(ctx, task, f, domain, spec, newTask) // LEGACY, TODO: REMOVE ctx.taskName = spec(task.DiscoveryInfo.Name) rg.taskContextRecord(ctx, task, f, domain, spec, newTask) } else { rg.taskContextRecord(ctx, task, f, domain, spec, newTask) } }
func (rg *RecordGenerator) taskContextRecord(ctx context, task state.Task, f state.Framework, domain string, spec labels.Func, enumTask *EnumerableTask) { fname := labels.DomainFrag(f.Name, labels.Sep, spec) tail := "." + domain + "." // insert canonical A records canonical := ctx.taskName + "-" + ctx.taskID + "-" + ctx.slaveID + "." + fname arec := ctx.taskName + "." + fname rg.insertTaskRR(arec+tail, ctx.taskIP, A, enumTask) rg.insertTaskRR(canonical+tail, ctx.taskIP, A, enumTask) rg.insertTaskRR(arec+".slave"+tail, ctx.slaveIP, A, enumTask) rg.insertTaskRR(canonical+".slave"+tail, ctx.slaveIP, A, enumTask) // recordName generates records for ctx.taskName, given some generation chain recordName := func(gen chain) { gen("_" + ctx.taskName) } // asSRV is always the last link in a chain, it must insert RR's asSRV := func(target string) chain { return func(records ...string) { for i := range records { name := records[i] + tail rg.insertTaskRR(name, target, SRV, enumTask) } } } // Add RFC 2782 SRV records var subdomains []string if task.HasDiscoveryInfo() { subdomains = []string{"slave"} } else { subdomains = []string{"slave", domainNone} } slaveHost := canonical + ".slave" + tail for _, port := range task.Ports() { slaveTarget := slaveHost + ":" + port recordName(withProtocol(protocolNone, fname, spec, withSubdomains(subdomains, asSRV(slaveTarget)))) } if !task.HasDiscoveryInfo() { return } for _, port := range task.DiscoveryInfo.Ports.DiscoveryPorts { target := canonical + tail + ":" + strconv.Itoa(port.Number) recordName(withProtocol(port.Protocol, fname, spec, withNamedPort(port.Name, spec, asSRV(target)))) } }