100 lines
2.3 KiB
Go
100 lines
2.3 KiB
Go
// SPDX-FileCopyrightText: 2021 Amolith <amolith@secluded.site>
|
|
//
|
|
// SPDX-License-Identifier: BSD-2-Clause
|
|
|
|
package main
|
|
|
|
import (
|
|
"html"
|
|
"html/template"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"net/url"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
// Link returns an HTML, HTTPS link of a given URI
|
|
func link(l string) string {
|
|
l = html.EscapeString(l)
|
|
return "<a href='" + l + "'>" + l + "</a>"
|
|
}
|
|
|
|
// parseIndex parses the index template and returns a template struct.
|
|
func (m *Ring) parseIndex() {
|
|
m.index = nil
|
|
tmpl, err := template.ParseFiles(*flagIndex)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
m.index = tmpl
|
|
tmplStat, err := os.Stat(*flagIndex)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
m.indexModTime = tmplStat.ModTime().Unix()
|
|
}
|
|
|
|
// List parses the list of members, appends the data to a slice of type list,
|
|
// then returns the slice
|
|
func (m *Ring) parseList() {
|
|
m.ring = nil
|
|
file, err := os.ReadFile(*flagMembers)
|
|
if err != nil {
|
|
log.Fatal("Error while loading list of webring members: ", err)
|
|
}
|
|
lines := strings.Split(string(file), "\n")
|
|
for _, line := range lines[:len(lines)-1] {
|
|
fields := strings.Fields(line)
|
|
m.ring = append(m.ring, RingMember{id: fields[0], url: fields[1]})
|
|
}
|
|
fileStat, err := os.Stat(*flagMembers)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
m.ringModTime = fileStat.ModTime().Unix()
|
|
}
|
|
|
|
// Modify takes arguments "index" or "ring" and returns true if either have been
|
|
// modified since last read
|
|
func (m *Ring) modify(a string) bool {
|
|
if a == "ring" {
|
|
ringStat, err := os.Stat(*flagMembers)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
curRingModTime := ringStat.ModTime().Unix()
|
|
return m.ringModTime < curRingModTime
|
|
} else if a == "index" {
|
|
indexStat, err := os.Stat(*flagIndex)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
curIndexModTime := indexStat.ModTime().Unix()
|
|
return m.indexModTime < curIndexModTime
|
|
} else {
|
|
log.Fatalln("Please call modify() with argument of either \"index\" or \"ring\"")
|
|
}
|
|
return true
|
|
}
|
|
|
|
func isTargetValid(my_url *url.URL, site string) bool {
|
|
resp, err := http.Get(site)
|
|
if err != nil {
|
|
log.Println(err)
|
|
return false
|
|
}
|
|
if !(200 <= resp.StatusCode && resp.StatusCode < 300) {
|
|
return false
|
|
}
|
|
|
|
bodyb, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
log.Printf("error while reading target http body: %v", err)
|
|
return false
|
|
}
|
|
body := string(bodyb)
|
|
return strings.Contains(body, my_url.Host)
|
|
}
|