Я подумал пару минут, чтобы ответить на этот вопрос. Причина этого в том, что вы, очевидно, ожидаете, что мы прочитаем код этих модулей для вас и придумаем решение. Что, честно говоря, является чем-то вроде того, что у вас есть «требования», связанные с бизнесом.
Однако другие могут извлечь из этого уроки, и вам придется приложить достаточно усилий, чтобы достаточно надежный код (IPv6, кто-нибудь?).
По сути, у вас есть два вопроса: «Как получить запись SPF для домена и вернуть ее, когда она есть?» и «Как правильно обрабатывать отправку кода на github (или на хостах с кодом git в целом)?»
Как получить запись SPF для домена, если она есть?
В конце концов, SPF - это соглашение, использующее существующие технологии. Запись SPF - это не что иное, как специально отформатированная запись ресурса TXT в домене.
Следовательно, вам не нужен пакет, чтобы определить, есть ли у домена запись SPF:
package main
import (
"flag"
"log"
"net"
"os"
"regexp"
)
var domain string
var spfPattern *regexp.Regexp
var verbose bool
func init() {
// some flags to make the problem more usable.
flag.StringVar(&domain, "domain", "", "the domain to check for SPF records")
flag.BoolVar(&verbose, "verbose", false, "print moar!")
// Obviously, this is a very, very simple pattern.
// It lacks any true validation whether the TXT record
// is in fact a valid SPF. Expanding the regex should
// not be too hard and I leave it up to you.
spfPattern = regexp.MustCompile(`\s*v=spf1.*`)
}
func main() {
flag.Parse()
// Lookup ALL resource records rs of type TXT for domain.
rs, err := net.LookupTXT(domain)
// If there was an error accessing the TXT records...
if err != nil {
// ...we inform the user and...
log.Printf("accessing TXT records for %s", err)
// ...inform the caller that something went wrong.
os.Exit(1)
}
// Now we have all TXT records for the domain we iterate through them...
for _, rr := range rs {
// ... and if one of them matches the pattern of an SPF record...
if spfPattern.MatchString(rr) {
// ...we inform the user if the user requested it...
if verbose {
log.Printf("%s has a valid SPFv1 record: %s", domain, rr)
}
// ...or simply inform the caller, as per the UNIX convention
// "No news is good news!"
os.Exit(0)
}
}
// We have iterated through all TXT records and did not find matching
// the pattern of an SPF record, so we need to inform both the user...
log.Println("No valid SPF record found.")
// ...and the caller.
os.Exit(2)
}
Как правильно обрабатывать вклады в код
Если вы видите код, который, по вашему мнению, нуждается в расширениях, или вы нашли ошибку и хотите ее исправить, первое, что вам нужно сделать, - это форкнуть оригинальный репозиторий. - по сути, вы делаете его копию с преимуществом сохранения истории коммитов.
Далее вы клонируете свой форк и выполняете работу, которую хотите сделать на этой вилке. Вы должны использовать одну или несколько ветвей для ваших изменений. Каждый коммит должен быть как можно более атомным c. В идеале библиотека компилируется, и тесты выполняются до и после любого коммита.
Когда вы закончите и думаете, что ваш код готов к выпуску, вы создаете запрос на извлечение . В основном запрос на извлечение говорит: «Эй, владелец исходного репозитория, я внес некоторые изменения и улучшил код, вы можете рассмотреть возможность объединения моих изменений в исходный код!»
Многие проекты в настоящее время используют модель ветвления, называемую «gitflow» , и я сильно предлагает вам запомнить ее, пока вы не сможете петь ее в обратном направлении даже при сильно высоком уровне BA C.