func (c Crawler) Start() { go func() { for { select { case <-c.quit: log.Info("Quit crawler.") return default: domainList, err := domains.GetAllLimitOffset(WINDOW, c.offset).List() if err != nil { log.Error("Crawler. Unable to get domains: %s", err) // shutdown c.Stop() return } for _, d := range domainList { whoisDispatcher.AddDomain(d) digDispatcher.AddDomain(d) time.Sleep(c.delay) } } c.offset += WINDOW } }() }
/* Search is used for retrieving records for a domain. It accepts the following GET params: + duuid - uuid of domain + domain - string of domain + name - string of name */ func Search(w http.ResponseWriter, r *http.Request, params url.Values, limit, offset int) { query := db.SELECT var where []string var args []interface{} i := 1 for k, _ := range params { switch k { case "name": where = append(where, fmt.Sprintf(k+" = $%d", i)) args = append(args, params.Get(k)) i++ case "duuid", "domain": where = append(where, fmt.Sprintf("domain = $%d", i)) args = append(args, params.Get(k)) v := params.Get(k) params.Del("duuid") params.Del("domain") params.Set("domain", v) i++ } } if len(where) > 0 { query += "WHERE " + strings.Join(where, " AND ") + " " } query += fmt.Sprintf("ORDER BY added DESC LIMIT $%d OFFSET $%d", len(args)+1, len(args)+2) args = append(args, limit, offset) log.Info("Query: " + query) log.Info("Args: %+v", args) recordList, err := db.GetList(query, args...) if err != nil { util.Error(err, w) return } // check for none sql errors // if we have no results dispatch a worker to get one if len(recordList) == 0 { // no domain lets grab one using what we assume is a duuid log.Info("no records") if duuid := params.Get("domain"); duuid != "" { log.Info("duuid: " + duuid) domain, err := domains.GetByUUID(duuid).One() if err != nil { log.Info("herererere") util.Error(err, w) return } results := <-dispatcher.AddDomain(domain) log.Info("%v", results) for _, result := range results { recordList = append(recordList, result) } } } util.ToJSON(cleanParserFromRecords(recordList), err, w) }