renamed
This commit is contained in:
parent
3aec504aa1
commit
052600663c
|
@ -1,2 +1,2 @@
|
|||
fediverse-archive
|
||||
feta
|
||||
output/
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
FROM golang:1.13 as builder
|
||||
|
||||
WORKDIR /go/src/github.com/sneak/fediverse-archive
|
||||
WORKDIR /go/src/github.com/sneak/feta
|
||||
COPY . .
|
||||
|
||||
RUN go get -v && make build
|
||||
|
@ -13,11 +13,11 @@ RUN tar cvfz go-src.tgz src && du -sh *
|
|||
|
||||
FROM alpine
|
||||
|
||||
COPY --from=builder /go/src/github.com/sneak/fediverse-archive/fediverse-archive /bin/fediverse-archive
|
||||
COPY --from=builder /go/src/github.com/sneak/feta/feta /bin/feta
|
||||
|
||||
# put the source in there too for safekeeping
|
||||
COPY --from=builder /go/go-src.tgz /usr/local/src/go-src.tgz
|
||||
|
||||
CMD /bin/fediverse-archive
|
||||
CMD /bin/feta
|
||||
|
||||
# FIXME add testing
|
||||
|
|
2
Makefile
2
Makefile
|
@ -6,7 +6,7 @@ BUILDUSER := $(shell whoami)
|
|||
BUILDHOST := $(shell hostname -s)
|
||||
BUILDARCH := $(shell uname -m)
|
||||
|
||||
FN := fediverse-archive
|
||||
FN := feta
|
||||
IMAGENAME := sneak/$(FN)
|
||||
|
||||
UNAME_S := $(shell uname -s)
|
||||
|
|
74
instance.go
74
instance.go
|
@ -4,6 +4,7 @@ import "encoding/json"
|
|||
import "fmt"
|
||||
import "net/http"
|
||||
import "strings"
|
||||
import "sync"
|
||||
import "time"
|
||||
|
||||
import "github.com/rs/zerolog/log"
|
||||
|
@ -11,6 +12,8 @@ import "github.com/rs/zerolog/log"
|
|||
const NodeInfoSchemaVersionTwoName = "http://nodeinfo.diaspora.software/ns/schema/2.0"
|
||||
|
||||
const NODE_TIMEOUT = time.Second * 10
|
||||
const ONE_HOUR = time.Second * 60 * 60
|
||||
const ONE_DAY = time.Second * 60 * 60 * 24
|
||||
|
||||
type ServerImplementation int
|
||||
|
||||
|
@ -21,26 +24,23 @@ const (
|
|||
)
|
||||
|
||||
type Instance struct {
|
||||
sync.Mutex
|
||||
errorCount uint
|
||||
highestId int
|
||||
hostName string
|
||||
impl ServerImplementation
|
||||
lastFailure *time.Time
|
||||
lastError *time.Time
|
||||
lastSuccess *time.Time
|
||||
nextCheck *time.Time
|
||||
nodeInfoUrl string
|
||||
serverVersion string
|
||||
identified bool
|
||||
up bool
|
||||
shouldSkip bool
|
||||
}
|
||||
|
||||
func NewInstance(hostname string) *Instance {
|
||||
foreverago := time.Now().Add((-1 * 86400 * 365 * 100) * time.Second)
|
||||
i := new(Instance)
|
||||
i.hostName = hostname
|
||||
foreverago := time.Now().Add((-1 * 86400 * 365 * 100) * time.Second)
|
||||
i.lastSuccess = &foreverago
|
||||
i.lastFailure = &foreverago
|
||||
i.identified = false
|
||||
i.nextCheck = &foreverago
|
||||
i.up = false
|
||||
go func() {
|
||||
i.detectNodeType()
|
||||
|
@ -48,10 +48,28 @@ func NewInstance(hostname string) *Instance {
|
|||
return i
|
||||
}
|
||||
|
||||
func (i *Instance) setNextCheck(d *time.Duration) {
|
||||
i.Lock()
|
||||
defer i.Unlock()
|
||||
i.nextCheck = d
|
||||
}
|
||||
|
||||
func (i *Instance) dueForCheck() bool {
|
||||
i.Lock()
|
||||
defer i.Unlock()
|
||||
if i.nextCheck <= time.Now() {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (i *Instance) detectNodeType() {
|
||||
i.Lock()
|
||||
if i.impl > ServerUnknown {
|
||||
i.Unlock()
|
||||
return
|
||||
}
|
||||
i.Unlock()
|
||||
i.fetchNodeInfo()
|
||||
}
|
||||
|
||||
|
@ -81,12 +99,16 @@ type NodeInfoVersionTwoSchema struct {
|
|||
}
|
||||
|
||||
func (i *Instance) registerError() {
|
||||
i.Lock()
|
||||
defer i.Unlock()
|
||||
i.errorCount = i.errorCount + 1
|
||||
t := time.Now()
|
||||
i.lastFailure = &t
|
||||
i.lastError = &t
|
||||
}
|
||||
|
||||
func (i *Instance) registerSuccess() {
|
||||
i.Lock()
|
||||
defer i.Unlock()
|
||||
t := time.Now()
|
||||
i.lastSuccess = &t
|
||||
}
|
||||
|
@ -125,7 +147,10 @@ func (i *Instance) fetchNodeInfoURL() {
|
|||
Str("hostname", i.hostName).
|
||||
Str("nodeinfourl", item.Href).
|
||||
Msg("success fetching url for nodeinfo")
|
||||
|
||||
i.Lock()
|
||||
i.nodeInfoUrl = item.Href
|
||||
i.Unlock()
|
||||
i.registerSuccess()
|
||||
return
|
||||
}
|
||||
|
@ -140,10 +165,18 @@ func (i *Instance) fetchNodeInfoURL() {
|
|||
|
||||
func (i *Instance) fetchNodeInfo() {
|
||||
i.fetchNodeInfoURL()
|
||||
|
||||
i.Lock()
|
||||
failure := false
|
||||
if i.nodeInfoUrl == "" {
|
||||
log.Error().
|
||||
Str("hostname", i.hostName).
|
||||
Msg("unable to fetch nodeinfo as nodeinfo URL cannot be determined")
|
||||
failure = true
|
||||
}
|
||||
i.Unlock()
|
||||
|
||||
if failure == true {
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -153,7 +186,11 @@ func (i *Instance) fetchNodeInfo() {
|
|||
|
||||
//FIXME make sure the nodeinfourl is on the same domain as the instance
|
||||
//hostname
|
||||
resp, err := c.Get(i.nodeInfoUrl)
|
||||
i.Lock()
|
||||
url := i.nodeInfoUrl
|
||||
i.Unlock()
|
||||
|
||||
resp, err := c.Get(url)
|
||||
|
||||
if err != nil {
|
||||
log.Error().
|
||||
|
@ -178,6 +215,8 @@ func (i *Instance) fetchNodeInfo() {
|
|||
Str("nodeInfoUrl", i.nodeInfoUrl).
|
||||
Msg("received nodeinfo from instance")
|
||||
|
||||
i.Lock()
|
||||
defer i.Unlock()
|
||||
i.serverVersion = ni.Software.Version
|
||||
|
||||
ni.Software.Name = strings.ToLower(ni.Software.Name)
|
||||
|
@ -210,12 +249,16 @@ func (i *Instance) fetchNodeInfo() {
|
|||
}
|
||||
|
||||
func (i *Instance) fetchRecentToots() ([]byte, error) {
|
||||
if i.impl == ServerMastodon {
|
||||
i.Lock()
|
||||
impl := i.impl
|
||||
i.Unlock()
|
||||
|
||||
if impl == ServerMastodon {
|
||||
return i.fetchRecentTootsJsonFromMastodon()
|
||||
} else if i.impl == ServerPleroma {
|
||||
} else if impl == ServerPleroma {
|
||||
return i.fetchRecentTootsJsonFromPleroma()
|
||||
} else {
|
||||
panic("nope")
|
||||
panic("unimplemented")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -228,8 +271,3 @@ func (i *Instance) fetchRecentTootsJsonFromMastodon() ([]byte, error) {
|
|||
//url := fmt.Sprintf("https://%s/api/v1/timelines/public?limit=40&local=true", i.hostName)
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func fetchLatestToots(lastId int) {
|
||||
log.Debug().Msg("This message appears only when log level set to Debug")
|
||||
log.Info().Msg("This message appears when log level set to Debug or Info")
|
||||
}
|
||||
|
|
25
locator.go
25
locator.go
|
@ -93,12 +93,12 @@ func NewInstanceLocator() *InstanceLocator {
|
|||
}
|
||||
|
||||
func (i *InstanceLocator) addInstance(hostname string) {
|
||||
i.Lock()
|
||||
defer i.Unlock()
|
||||
// only add it if we haven't seen the hostname before
|
||||
if i.instances[hostname] == nil {
|
||||
log.Debug().Str("hostname", hostname).Msgf("adding discovered instance")
|
||||
i.Lock()
|
||||
i.instances[hostname] = NewInstance(hostname)
|
||||
i.Unlock()
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -118,7 +118,14 @@ func (i *InstanceLocator) Locate() {
|
|||
|
||||
time.Sleep(120 * time.Second)
|
||||
|
||||
i.instanceReport()
|
||||
r := i.instanceReport()
|
||||
|
||||
log.Debug().
|
||||
Uint("up", r.up).
|
||||
Uint("total", r.total).
|
||||
Uint("identified", r.identified).
|
||||
Msg("instance report")
|
||||
|
||||
}
|
||||
|
||||
type InstanceLocatorReport struct {
|
||||
|
@ -136,6 +143,8 @@ func (i *InstanceLocator) NumInstances() uint {
|
|||
}
|
||||
|
||||
func (i *InstanceLocator) instanceReport() *InstanceLocatorReport {
|
||||
i.Lock()
|
||||
defer i.Unlock()
|
||||
r := new(InstanceLocatorReport)
|
||||
|
||||
r.total = uint(len(i.instances))
|
||||
|
@ -150,12 +159,6 @@ func (i *InstanceLocator) instanceReport() *InstanceLocatorReport {
|
|||
}
|
||||
}
|
||||
|
||||
log.Debug().
|
||||
Uint("up", r.up).
|
||||
Uint("total", r.total).
|
||||
Uint("identified", r.identified).
|
||||
Msg("instance report")
|
||||
|
||||
return r
|
||||
}
|
||||
|
||||
|
@ -179,8 +182,8 @@ func (i *InstanceLocator) locateMastodon() {
|
|||
i.addInstance(instance.Name)
|
||||
}
|
||||
|
||||
i.Lock()
|
||||
t := time.Now()
|
||||
i.Lock()
|
||||
i.mastodonIndexLastRefresh = &t
|
||||
i.Unlock()
|
||||
}
|
||||
|
@ -204,8 +207,8 @@ func (i *InstanceLocator) locatePleroma() {
|
|||
for _, instance := range *pi {
|
||||
i.addInstance(instance.Domain)
|
||||
}
|
||||
i.Lock()
|
||||
t := time.Now()
|
||||
i.Lock()
|
||||
i.pleromaIndexLastRefresh = &t
|
||||
i.Unlock()
|
||||
}
|
||||
|
|
10
webserver.go
10
webserver.go
|
@ -49,14 +49,18 @@ func (a *TootArchiverAPIServer) getRouter() *gin.Engine {
|
|||
|
||||
r.GET("/", func(c *gin.Context) {
|
||||
c.JSON(200, gin.H{
|
||||
// FIXME add more stuff here
|
||||
// FIXME(sneak) add more stuff here
|
||||
"status": "ok",
|
||||
"now": time.Now().UTC().Format(time.RFC3339),
|
||||
"uptime": a.archiver.Uptime().String(),
|
||||
"instances": a.archiver.locator.NumInstances(),
|
||||
"instances": gin.H{
|
||||
"total": a.archiver.locator.instanceReport().total,
|
||||
"up": a.archiver.locator.instanceReport().up,
|
||||
"identified": a.archiver.locator.instanceReport().identified,
|
||||
},
|
||||
})
|
||||
})
|
||||
// FIXME add more status routes here
|
||||
// FIXME(sneak) add more status routes here
|
||||
|
||||
return r
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue