72 lines
1.6 KiB
Go
72 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/gob"
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"sync"
|
|
)
|
|
|
|
var mu sync.Mutex
|
|
var bindAddr string
|
|
var me string
|
|
var initialPeer string
|
|
var dataDir string
|
|
|
|
func main() {
|
|
flag.StringVar(&bindAddr, "b", ":4200", "bind address")
|
|
flag.StringVar(&me, "u", "http://localhost:4200", "public URL")
|
|
flag.StringVar(&initialPeer, "i", "", "initial peer")
|
|
flag.StringVar(&dataDir, "d", ".", "data directory")
|
|
flag.Parse()
|
|
log.Printf("Starting %s %s %s %s", bindAddr, me, initialPeer, dataDir)
|
|
|
|
// Record myself
|
|
myHash = sha256sum(me)
|
|
myPos = 0
|
|
peerHashes = append(peerHashes, sha256sum(me))
|
|
hashToDomain = map[string]string{peerHashes[0]: me}
|
|
|
|
// Start background functions
|
|
if initialPeer != "" {
|
|
go addPeer(initialPeer)
|
|
}
|
|
go cleanPeers()
|
|
go cleanKVStore()
|
|
go redistributeKeys()
|
|
|
|
// Load user data from disk
|
|
err := os.Mkdir(dataDir, 0755)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
entries, err := os.ReadDir(dataDir)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
for _, entry := range entries {
|
|
id := entry.Name()
|
|
reader, err := os.Open(dataDir + "/" + id + "/gob")
|
|
if err != nil {
|
|
continue
|
|
}
|
|
var user user
|
|
dec := gob.NewDecoder(reader)
|
|
dec.Decode(&user)
|
|
users[id] = user
|
|
}
|
|
|
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
|
fmt.Fprintf(w, "Hello! This is a Kela server.")
|
|
})
|
|
http.HandleFunc("/peer", peerHandler)
|
|
http.HandleFunc("/user", userHandler)
|
|
http.HandleFunc("/dht", dhtHandler)
|
|
http.HandleFunc("/storage", storageHandler)
|
|
http.HandleFunc("/message", messageHandler)
|
|
log.Fatal(http.ListenAndServe(bindAddr, nil))
|
|
}
|