/* Description: Tool to check alive URLs. Auth0r: sml@lacashita.com Use it only as educational purpose. */ package main import ( "bufio" "flag" "fmt" "net/http" "os" "sync" "time" ) // Func to check if URL works. func checkUrl(page string, client http.Client, wg *sync.WaitGroup) { defer wg.Done() request, err := http.NewRequest("GET", page, nil) if err != nil { fmt.Printf("Error requesting url.\n") } response, err := client.Do(request) if err != nil { // Shows the errors in requests. fmt.Printf("Error in the URL: %v with the error %v\n", page, err) } else { if response.StatusCode == 200 { // Uncomment the following line to check what pages are OK (Status 200). // fmt.Printf("Page %v OK\n",page) defer response.Body.Close() } else { // Shows URLs with errors (Status != 200). fmt.Printf("Page %v with errors.\n",page) } } } var wg sync.WaitGroup func lanomalie() { fmt.Println(` __ _ _ / _| | | | | |_| |__ _ __ ___ | | _____ _ __ | _| '_ \| '__/ _ \| |/ / _ \ '_ \ | | | |_) | | | (_) | < __/ | | | |_| |_.__/|_| \___/|_|\_\___|_| |_| ===================================== [-] Checking alive URLs... `) } func main() { var page string fichero := flag.String("f", "", "File with urls") web := flag.String("u", "", "Only one url") flag.Parse() client := http.Client{Timeout: 10 * time.Second} // Check there are at least 2 args. if len(os.Args) < 2 { fmt.Println(` Parameters: -f File with URLs to check. -u URL to check. Examples to check file with URLs: fbroken -f urls.txt Example to check URL: fbroken -u https://domain.xxx `) os.Exit(1) } switch os.Args[1] { case "-f": lanomalie() // Open file and check URLs file, err := os.Open(*fichero) if err != nil { fmt.Print("Error opening the file") } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { page = scanner.Text() go checkUrl(page, client, &wg) wg.Add(1) } case "-u": lanomalie() // Check directly the URL. go checkUrl(*web, client, &wg) wg.Add(1) default: fmt.Println("-f or -u expected") os.Exit(1) } wg.Wait() }