mirror of
https://github.com/jeremyd/ergo.git
synced 2026-07-02 06:48:55 -07:00
Rip out REST API and web interface.
It's not really used and I'd rather not have it here unless I'm able to actively maintain it properly and build out the web interface. I might re-add it later but for now I'd rather not have it unless anyone's actively using it.
This commit is contained in:
+1
-8
@@ -108,12 +108,6 @@ func (conf *OperConfig) PasswordBytes() []byte {
|
||||
return bytes
|
||||
}
|
||||
|
||||
// RestAPIConfig controls the integrated REST API.
|
||||
type RestAPIConfig struct {
|
||||
Enabled bool
|
||||
Listen string
|
||||
}
|
||||
|
||||
// ConnectionLimitsConfig controls the automated connection limits.
|
||||
type ConnectionLimitsConfig struct {
|
||||
Enabled bool
|
||||
@@ -198,8 +192,7 @@ type Config struct {
|
||||
Listen []string
|
||||
TLSListeners map[string]*TLSListenConfig `yaml:"tls-listeners"`
|
||||
STS STSConfig
|
||||
RestAPI RestAPIConfig `yaml:"rest-api"`
|
||||
CheckIdent bool `yaml:"check-ident"`
|
||||
CheckIdent bool `yaml:"check-ident"`
|
||||
MOTD string
|
||||
ProxyAllowedFrom []string `yaml:"proxy-allowed-from"`
|
||||
MaxSendQString string `yaml:"max-sendq"`
|
||||
|
||||
-200
@@ -1,200 +0,0 @@
|
||||
// Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net>
|
||||
// released under the MIT license
|
||||
|
||||
// viewing and modifying accounts, registered channels, dlines, rehashing, etc
|
||||
|
||||
package irc
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"fmt"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/tidwall/buntdb"
|
||||
)
|
||||
|
||||
const restErr = "{\"error\":\"An unknown error occurred\"}"
|
||||
|
||||
// ircServer is used to keep a link to the current running server since this is the best
|
||||
// way to do it, given how HTTP handlers dispatch and work.
|
||||
var ircServer *Server
|
||||
|
||||
type restInfoResp struct {
|
||||
ServerName string `json:"server-name"`
|
||||
NetworkName string `json:"network-name"`
|
||||
|
||||
Version string `json:"version"`
|
||||
}
|
||||
|
||||
type restStatusResp struct {
|
||||
Clients int `json:"clients"`
|
||||
Opers int `json:"opers"`
|
||||
Channels int `json:"channels"`
|
||||
}
|
||||
|
||||
type restXLinesResp struct {
|
||||
DLines map[string]IPBanInfo `json:"dlines"`
|
||||
KLines map[string]IPBanInfo `json:"klines"`
|
||||
}
|
||||
|
||||
type restAcct struct {
|
||||
Name string `json:"name"`
|
||||
RegisteredAt time.Time `json:"registered-at"`
|
||||
Clients int `json:"clients"`
|
||||
}
|
||||
|
||||
type restAccountsResp struct {
|
||||
Verified map[string]restAcct `json:"verified"`
|
||||
}
|
||||
|
||||
type restRehashResp struct {
|
||||
Successful bool `json:"successful"`
|
||||
Error string `json:"error"`
|
||||
Time time.Time `json:"time"`
|
||||
}
|
||||
|
||||
func restInfo(w http.ResponseWriter, r *http.Request) {
|
||||
rs := restInfoResp{
|
||||
Version: SemVer,
|
||||
ServerName: ircServer.name,
|
||||
NetworkName: ircServer.networkName,
|
||||
}
|
||||
b, err := json.Marshal(rs)
|
||||
if err != nil {
|
||||
fmt.Fprintln(w, restErr)
|
||||
} else {
|
||||
fmt.Fprintln(w, string(b))
|
||||
}
|
||||
}
|
||||
|
||||
func restStatus(w http.ResponseWriter, r *http.Request) {
|
||||
rs := restStatusResp{
|
||||
Clients: ircServer.clients.Count(),
|
||||
Opers: len(ircServer.operators),
|
||||
Channels: ircServer.channels.Len(),
|
||||
}
|
||||
b, err := json.Marshal(rs)
|
||||
if err != nil {
|
||||
fmt.Fprintln(w, restErr)
|
||||
} else {
|
||||
fmt.Fprintln(w, string(b))
|
||||
}
|
||||
}
|
||||
|
||||
func restGetXLines(w http.ResponseWriter, r *http.Request) {
|
||||
rs := restXLinesResp{
|
||||
DLines: ircServer.dlines.AllBans(),
|
||||
KLines: ircServer.klines.AllBans(),
|
||||
}
|
||||
b, err := json.Marshal(rs)
|
||||
if err != nil {
|
||||
fmt.Fprintln(w, restErr)
|
||||
} else {
|
||||
fmt.Fprintln(w, string(b))
|
||||
}
|
||||
}
|
||||
|
||||
func restGetAccounts(w http.ResponseWriter, r *http.Request) {
|
||||
rs := restAccountsResp{
|
||||
Verified: make(map[string]restAcct),
|
||||
}
|
||||
|
||||
// get accounts
|
||||
err := ircServer.store.View(func(tx *buntdb.Tx) error {
|
||||
tx.AscendKeys("account.exists *", func(key, value string) bool {
|
||||
key = key[len("account.exists "):]
|
||||
_, err := tx.Get(fmt.Sprintf(keyAccountVerified, key))
|
||||
verified := err == nil
|
||||
fmt.Println(fmt.Sprintf(keyAccountVerified, key))
|
||||
|
||||
// get other details
|
||||
name, _ := tx.Get(fmt.Sprintf(keyAccountName, key))
|
||||
regTimeStr, _ := tx.Get(fmt.Sprintf(keyAccountRegTime, key))
|
||||
regTimeInt, _ := strconv.ParseInt(regTimeStr, 10, 64)
|
||||
regTime := time.Unix(regTimeInt, 0)
|
||||
|
||||
var clients int
|
||||
acct := ircServer.accounts[key]
|
||||
if acct != nil {
|
||||
clients = len(acct.Clients)
|
||||
}
|
||||
|
||||
if verified {
|
||||
rs.Verified[key] = restAcct{
|
||||
Name: name,
|
||||
RegisteredAt: regTime,
|
||||
Clients: clients,
|
||||
}
|
||||
} else {
|
||||
//TODO(dan): Add to unverified list
|
||||
}
|
||||
|
||||
return true // true to continue I guess?
|
||||
})
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
b, err := json.Marshal(rs)
|
||||
if err != nil {
|
||||
fmt.Fprintln(w, restErr)
|
||||
} else {
|
||||
fmt.Fprintln(w, string(b))
|
||||
}
|
||||
}
|
||||
|
||||
func restRehash(w http.ResponseWriter, r *http.Request) {
|
||||
err := ircServer.rehash()
|
||||
|
||||
rs := restRehashResp{
|
||||
Successful: err == nil,
|
||||
Time: time.Now(),
|
||||
}
|
||||
if err != nil {
|
||||
rs.Error = err.Error()
|
||||
}
|
||||
|
||||
b, err := json.Marshal(rs)
|
||||
if err != nil {
|
||||
fmt.Fprintln(w, restErr)
|
||||
} else {
|
||||
fmt.Fprintln(w, string(b))
|
||||
}
|
||||
}
|
||||
|
||||
func StartRestAPI(s *Server, listenAddr string) (*http.Server, error) {
|
||||
// so handlers can ref it later
|
||||
ircServer = s
|
||||
|
||||
// start router
|
||||
r := mux.NewRouter()
|
||||
|
||||
// GET methods
|
||||
rg := r.Methods("GET").Subrouter()
|
||||
rg.HandleFunc("/info", restInfo)
|
||||
rg.HandleFunc("/status", restStatus)
|
||||
rg.HandleFunc("/xlines", restGetXLines)
|
||||
rg.HandleFunc("/accounts", restGetAccounts)
|
||||
|
||||
// PUT methods
|
||||
rp := r.Methods("POST").Subrouter()
|
||||
rp.HandleFunc("/rehash", restRehash)
|
||||
|
||||
// start api
|
||||
httpserver := http.Server{
|
||||
Addr: listenAddr,
|
||||
Handler: r,
|
||||
}
|
||||
|
||||
go func() {
|
||||
if err := httpserver.ListenAndServe(); err != nil {
|
||||
s.logger.Error("listeners", fmt.Sprintf("Rest API listenAndServe error: %s", err))
|
||||
}
|
||||
}()
|
||||
|
||||
return &httpserver, nil
|
||||
}
|
||||
@@ -7,14 +7,12 @@ package irc
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"log"
|
||||
"math/rand"
|
||||
"net"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strconv"
|
||||
@@ -39,14 +37,6 @@ var (
|
||||
couldNotParseIPMsg, _ = (&[]ircmsg.IrcMessage{ircmsg.MakeMessage(nil, "", "ERROR", "Unable to parse your IP address")}[0]).Line()
|
||||
)
|
||||
|
||||
const (
|
||||
// when shutting down the REST server, wait this long
|
||||
// before killing active connections. TODO: this might not be
|
||||
// necessary at all? but it seems prudent to avoid potential resource
|
||||
// leaks
|
||||
httpShutdownTimeout = time.Second
|
||||
)
|
||||
|
||||
// Limits holds the maximum limits for various things such as topic lengths.
|
||||
type Limits struct {
|
||||
AwayLen int
|
||||
@@ -116,8 +106,6 @@ type Server struct {
|
||||
registeredChannelsMutex sync.RWMutex
|
||||
rehashMutex sync.Mutex
|
||||
rehashSignal chan os.Signal
|
||||
restAPI RestAPIConfig
|
||||
restAPIServer *http.Server
|
||||
proxyAllowedFrom []string
|
||||
signals chan os.Signal
|
||||
snomasks *SnoManager
|
||||
@@ -1445,7 +1433,6 @@ func (server *Server) applyConfig(config *Config, initial bool) error {
|
||||
|
||||
// we are now open for business
|
||||
server.setupListeners(config)
|
||||
server.setupRestAPI(config)
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -1583,32 +1570,6 @@ func (server *Server) setupListeners(config *Config) {
|
||||
}
|
||||
}
|
||||
|
||||
func (server *Server) setupRestAPI(config *Config) {
|
||||
restAPIEnabled := config.Server.RestAPI.Enabled
|
||||
restAPIStarted := server.restAPIServer != nil
|
||||
restAPIListenAddrChanged := server.restAPI.Listen != config.Server.RestAPI.Listen
|
||||
|
||||
// stop an existing REST server if it's been disabled or the addr changed
|
||||
if restAPIStarted && (!restAPIEnabled || restAPIListenAddrChanged) {
|
||||
ctx, _ := context.WithTimeout(context.Background(), httpShutdownTimeout)
|
||||
server.restAPIServer.Shutdown(ctx)
|
||||
server.restAPIServer.Close()
|
||||
server.logger.Info("rehash", "server", fmt.Sprintf("%s rest API stopped on %s.", server.name, server.restAPI.Listen))
|
||||
server.restAPIServer = nil
|
||||
}
|
||||
|
||||
// start a new one if it's enabled or the addr changed
|
||||
if restAPIEnabled && (!restAPIStarted || restAPIListenAddrChanged) {
|
||||
server.restAPIServer, _ = StartRestAPI(server, config.Server.RestAPI.Listen)
|
||||
server.logger.Info(
|
||||
"rehash", "server",
|
||||
fmt.Sprintf("%s rest API started on %s.", server.name, config.Server.RestAPI.Listen))
|
||||
}
|
||||
|
||||
// save the config information
|
||||
server.restAPI = config.Server.RestAPI
|
||||
}
|
||||
|
||||
func (server *Server) GetDefaultChannelModes() Modes {
|
||||
server.configurableStateMutex.RLock()
|
||||
defer server.configurableStateMutex.RUnlock()
|
||||
|
||||
Reference in New Issue
Block a user