split checker from token-validator
This commit is contained in:
parent
685dc0b0ea
commit
0c661f36f6
20 changed files with 634 additions and 748 deletions
119
checker/checker.go
Normal file
119
checker/checker.go
Normal file
|
@ -0,0 +1,119 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/miekg/dns"
|
||||
"github.com/sparrc/go-ping"
|
||||
|
||||
"git.nemunai.re/lectures/adlin/libadlin"
|
||||
)
|
||||
|
||||
// ICMP
|
||||
|
||||
func check_ping(ip string, cb func(pkt *ping.Packet)) (err error) {
|
||||
var pinger *ping.Pinger
|
||||
pinger, err = ping.NewPinger(ip)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
pinger.Timeout = time.Second * 5
|
||||
pinger.Count = 1
|
||||
pinger.OnRecv = cb
|
||||
pinger.SetPrivileged(true)
|
||||
pinger.Run()
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// PORT 53
|
||||
|
||||
func check_dns(domain, ip string) (err error) {
|
||||
client := dns.Client{Timeout: time.Second * 5}
|
||||
|
||||
m := new(dns.Msg)
|
||||
m.SetQuestion(domain, dns.TypeSOA)
|
||||
|
||||
_, _, err = client.Exchange(m, fmt.Sprintf("[%s]:53", ip))
|
||||
return
|
||||
}
|
||||
|
||||
// PORT 80
|
||||
|
||||
func check_http(ip string) (err error) {
|
||||
var resp *http.Response
|
||||
resp, err = http.Get(fmt.Sprintf("http://[%s]/", ip))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
_, err = ioutil.ReadAll(resp.Body)
|
||||
return
|
||||
}
|
||||
|
||||
// PORT 443
|
||||
|
||||
func check_https(domain, ip string) (err error) {
|
||||
var resp *http.Response
|
||||
resp, err = http.Get(fmt.Sprintf("https://%s/", domain))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
_, err = ioutil.ReadAll(resp.Body)
|
||||
return
|
||||
}
|
||||
|
||||
// Main
|
||||
|
||||
func studentsChecker() {
|
||||
students, err := adlin.GetStudents()
|
||||
if err != nil {
|
||||
log.Println("Unable to check students:", err)
|
||||
return
|
||||
}
|
||||
|
||||
for _, s := range students {
|
||||
time.Sleep(250 * time.Millisecond)
|
||||
// Check ping
|
||||
std := s
|
||||
stdIP := adlin.StudentIP(std.Id).String() + "1"
|
||||
go check_ping(stdIP, func(pkt *ping.Packet) {
|
||||
std.OnPong(true)
|
||||
|
||||
// Check HTTP
|
||||
if err := check_http(stdIP); err == nil {
|
||||
if _, err := std.UnlockNewChallenge(100, ""); err != nil {
|
||||
if _, err := std.UpdateUnlockedChallenge(100, ""); err != nil {
|
||||
log.Printf("Unable to register challenge for %s: %s\n", std.Login, err.Error())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check HTTPs
|
||||
if err := check_https(std.MyAssociatedDomain(), stdIP); err == nil {
|
||||
if _, err := std.UnlockNewChallenge(101, ""); err != nil {
|
||||
if _, err := std.UpdateUnlockedChallenge(101, ""); err != nil {
|
||||
log.Printf("Unable to register challenge for %s: %s\n", std.Login, err.Error())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check DNS
|
||||
if err := check_dns(std.MyDelegatedDomain(), stdIP); err == nil {
|
||||
if _, err := std.UnlockNewChallenge(102, ""); err != nil {
|
||||
if _, err := std.UpdateUnlockedChallenge(102, ""); err != nil {
|
||||
log.Printf("Unable to register challenge for %s: %s\n", std.Login, err.Error())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
})
|
||||
}
|
||||
}
|
Reference in a new issue