Drunk as I like
Signed-off-by: Aoi K <koizumi.aoi@chaotic.ninja> git-svn-id: file:///srv/svn/repo/suika/trunk@804 f0ae65fe-ee39-954e-97ec-027ff2717ef4
This commit is contained in:
parent
6de8b9c247
commit
cd99ccc1de
2
Makefile
2
Makefile
@ -6,7 +6,7 @@ PREFIX ?= /usr/local
|
|||||||
BINDIR ?= bin
|
BINDIR ?= bin
|
||||||
MANDIR ?= share/man
|
MANDIR ?= share/man
|
||||||
|
|
||||||
all: suika suikactl doc/suika.1
|
all: suika suikactl suika-znc-import doc/suika.1
|
||||||
|
|
||||||
suika:
|
suika:
|
||||||
$(GO) build $(GOFLAGS) ./cmd/suika
|
$(GO) build $(GOFLAGS) ./cmd/suika
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto"
|
"crypto"
|
||||||
@ -57,7 +57,7 @@ func generateCertFP(keyType string, bits int) (privKeyBytes, certBytes []byte, e
|
|||||||
}
|
}
|
||||||
cert := &x509.Certificate{
|
cert := &x509.Certificate{
|
||||||
SerialNumber: serialNumber,
|
SerialNumber: serialNumber,
|
||||||
Subject: pkix.Name{CommonName: "soju auto-generated certificate"},
|
Subject: pkix.Name{CommonName: "suika auto-generated certificate"},
|
||||||
NotBefore: notBefore,
|
NotBefore: notBefore,
|
||||||
NotAfter: notAfter,
|
NotAfter: notAfter,
|
||||||
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
|
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
|
||||||
|
@ -16,16 +16,16 @@ import (
|
|||||||
"git.chaotic.ninja/koizumi.aoi/suika/config"
|
"git.chaotic.ninja/koizumi.aoi/suika/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
const usage = `usage: soju-znc-import [options...] <znc config path>
|
const usage = `usage: suika-znc-import [options...] <znc config path>
|
||||||
|
|
||||||
Imports configuration from a ZNC file. Users and networks are merged if they
|
Imports configuration from a ZNC file. Users and networks are merged if they
|
||||||
already exist in the soju database. ZNC settings overwrite existing soju
|
already exist in the suika database. ZNC settings overwrite existing suika
|
||||||
settings.
|
settings.
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
|
|
||||||
-help Show this help message
|
-help Show this help message
|
||||||
-config <path> Path to soju config file
|
-config <path> Path to suika config file
|
||||||
-user <username> Limit import to username (may be specified multiple times)
|
-user <username> Limit import to username (may be specified multiple times)
|
||||||
-network <name> Limit import to network (may be specified multiple times)
|
-network <name> Limit import to network (may be specified multiple times)
|
||||||
`
|
`
|
||||||
@ -64,7 +64,7 @@ func main() {
|
|||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
db, err := soju.OpenDB(cfg.SQLDriver, cfg.SQLSource)
|
db, err := suika.OpenDB(cfg.SQLDriver, cfg.SQLSource)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("failed to open database: %v", err)
|
log.Fatalf("failed to open database: %v", err)
|
||||||
}
|
}
|
||||||
@ -86,7 +86,7 @@ func main() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("failed to list users in DB: %v", err)
|
log.Fatalf("failed to list users in DB: %v", err)
|
||||||
}
|
}
|
||||||
existingUsers := make(map[string]*soju.User, len(l))
|
existingUsers := make(map[string]*suika.User, len(l))
|
||||||
for i, u := range l {
|
for i, u := range l {
|
||||||
existingUsers[u.Username] = &l[i]
|
existingUsers[u.Username] = &l[i]
|
||||||
}
|
}
|
||||||
@ -107,7 +107,7 @@ func main() {
|
|||||||
log.Printf("user %q: updating existing user", username)
|
log.Printf("user %q: updating existing user", username)
|
||||||
} else {
|
} else {
|
||||||
// "!!" is an invalid crypt format, thus disables password auth
|
// "!!" is an invalid crypt format, thus disables password auth
|
||||||
u = &soju.User{Username: username, Password: "!!"}
|
u = &suika.User{Username: username, Password: "!!"}
|
||||||
usersCreated++
|
usersCreated++
|
||||||
log.Printf("user %q: creating new user", username)
|
log.Printf("user %q: creating new user", username)
|
||||||
}
|
}
|
||||||
@ -123,7 +123,7 @@ func main() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("failed to list networks for user %q: %v", username, err)
|
log.Fatalf("failed to list networks for user %q: %v", username, err)
|
||||||
}
|
}
|
||||||
existingNetworks := make(map[string]*soju.Network, len(l))
|
existingNetworks := make(map[string]*suika.Network, len(l))
|
||||||
for i, n := range l {
|
for i, n := range l {
|
||||||
existingNetworks[n.GetName()] = &l[i]
|
existingNetworks[n.GetName()] = &l[i]
|
||||||
}
|
}
|
||||||
@ -175,7 +175,7 @@ func main() {
|
|||||||
if ok {
|
if ok {
|
||||||
logger.Printf("updating existing network")
|
logger.Printf("updating existing network")
|
||||||
} else {
|
} else {
|
||||||
n = &soju.Network{Name: netName}
|
n = &suika.Network{Name: netName}
|
||||||
logger.Printf("creating new network")
|
logger.Printf("creating new network")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,7 +194,7 @@ func main() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Fatalf("failed to list channels: %v", err)
|
logger.Fatalf("failed to list channels: %v", err)
|
||||||
}
|
}
|
||||||
existingChannels := make(map[string]*soju.Channel, len(l))
|
existingChannels := make(map[string]*suika.Channel, len(l))
|
||||||
for i, ch := range l {
|
for i, ch := range l {
|
||||||
existingChannels[ch.Name] = &l[i]
|
existingChannels[ch.Name] = &l[i]
|
||||||
}
|
}
|
||||||
@ -213,7 +213,7 @@ func main() {
|
|||||||
if ok {
|
if ok {
|
||||||
logger.Printf("channel %q: updating existing channel", chName)
|
logger.Printf("channel %q: updating existing channel", chName)
|
||||||
} else {
|
} else {
|
||||||
ch = &soju.Channel{Name: chName}
|
ch = &suika.Channel{Name: chName}
|
||||||
logger.Printf("channel %q: creating new channel", chName)
|
logger.Printf("channel %q: creating new channel", chName)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -232,7 +232,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if usersCreated > 0 {
|
if usersCreated > 0 {
|
||||||
log.Printf("warning: user passwords haven't been imported, please set them with `sojuctl change-password <username>`")
|
log.Printf("warning: user passwords haven't been imported, please set them with `suikactl change-password <username>`")
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("imported %v users, %v networks and %v channels", usersImported, networksImported, channelsImported)
|
log.Printf("imported %v users, %v networks and %v channels", usersImported, networksImported, channelsImported)
|
||||||
|
@ -59,7 +59,7 @@ var (
|
|||||||
tlsCert atomic.Value // *tls.Certificate
|
tlsCert atomic.Value // *tls.Certificate
|
||||||
)
|
)
|
||||||
|
|
||||||
func loadConfig() (*config.Server, *soju.Config, error) {
|
func loadConfig() (*config.Server, *suika.Config, error) {
|
||||||
var raw *config.Server
|
var raw *config.Server
|
||||||
if configPath != "" {
|
if configPath != "" {
|
||||||
var err error
|
var err error
|
||||||
@ -88,7 +88,7 @@ func loadConfig() (*config.Server, *soju.Config, error) {
|
|||||||
tlsCert.Store(&cert)
|
tlsCert.Store(&cert)
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg := &soju.Config{
|
cfg := &suika.Config{
|
||||||
Hostname: raw.Hostname,
|
Hostname: raw.Hostname,
|
||||||
Title: raw.Title,
|
Title: raw.Title,
|
||||||
LogPath: raw.LogPath,
|
LogPath: raw.LogPath,
|
||||||
@ -123,7 +123,7 @@ func main() {
|
|||||||
log.Printf("failed to bump max number of opened files: %v", err)
|
log.Printf("failed to bump max number of opened files: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
db, err := soju.OpenDB(cfg.SQLDriver, cfg.SQLSource)
|
db, err := suika.OpenDB(cfg.SQLDriver, cfg.SQLSource)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("failed to open database: %v", err)
|
log.Fatalf("failed to open database: %v", err)
|
||||||
}
|
}
|
||||||
@ -137,9 +137,9 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
srv := soju.NewServer(db)
|
srv := suika.NewServer(db)
|
||||||
srv.SetConfig(serverCfg)
|
srv.SetConfig(serverCfg)
|
||||||
srv.Logger = soju.NewLogger(log.Writer(), debug)
|
srv.Logger = suika.NewLogger(log.Writer(), debug)
|
||||||
|
|
||||||
for _, listen := range cfg.Listen {
|
for _, listen := range cfg.Listen {
|
||||||
listen := listen // copy
|
listen := listen // copy
|
||||||
@ -241,7 +241,7 @@ func main() {
|
|||||||
}()
|
}()
|
||||||
case "ident":
|
case "ident":
|
||||||
if srv.Identd == nil {
|
if srv.Identd == nil {
|
||||||
srv.Identd = soju.NewIdentd()
|
srv.Identd = suika.NewIdentd()
|
||||||
}
|
}
|
||||||
|
|
||||||
host := u.Host
|
host := u.Host
|
||||||
@ -315,7 +315,7 @@ func main() {
|
|||||||
log.Printf("server listening on %q", listen)
|
log.Printf("server listening on %q", listen)
|
||||||
}
|
}
|
||||||
|
|
||||||
if db, ok := db.(soju.MetricsCollectorDatabase); ok && srv.MetricsRegistry != nil {
|
if db, ok := db.(suika.MetricsCollectorDatabase); ok && srv.MetricsRegistry != nil {
|
||||||
srv.MetricsRegistry.MustRegister(db.MetricsCollector())
|
srv.MetricsRegistry.MustRegister(db.MetricsCollector())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -344,7 +344,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func proxyProtoListener(ln net.Listener, srv *soju.Server) net.Listener {
|
func proxyProtoListener(ln net.Listener, srv *suika.Server) net.Listener {
|
||||||
return &proxyproto.Listener{
|
return &proxyproto.Listener{
|
||||||
Listener: ln,
|
Listener: ln,
|
||||||
Policy: func(upstream net.Addr) (proxyproto.Policy, error) {
|
Policy: func(upstream net.Addr) (proxyproto.Policy, error) {
|
||||||
|
@ -15,7 +15,7 @@ import (
|
|||||||
"golang.org/x/crypto/ssh/terminal"
|
"golang.org/x/crypto/ssh/terminal"
|
||||||
)
|
)
|
||||||
|
|
||||||
const usage = `usage: sojuctl [-config path] <action> [options...]
|
const usage = `usage: suikactl [-config path] <action> [options...]
|
||||||
|
|
||||||
create-user <username> [-admin] Create a new user
|
create-user <username> [-admin] Create a new user
|
||||||
change-password <username> Change password for a user
|
change-password <username> Change password for a user
|
||||||
@ -44,7 +44,7 @@ func main() {
|
|||||||
cfg = config.Defaults()
|
cfg = config.Defaults()
|
||||||
}
|
}
|
||||||
|
|
||||||
db, err := soju.OpenDB(cfg.SQLDriver, cfg.SQLSource)
|
db, err := suika.OpenDB(cfg.SQLDriver, cfg.SQLSource)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("failed to open database: %v", err)
|
log.Fatalf("failed to open database: %v", err)
|
||||||
}
|
}
|
||||||
@ -73,7 +73,7 @@ func main() {
|
|||||||
log.Fatalf("failed to hash password: %v", err)
|
log.Fatalf("failed to hash password: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
user := soju.User{
|
user := suika.User{
|
||||||
Username: username,
|
Username: username,
|
||||||
Password: string(hashed),
|
Password: string(hashed),
|
||||||
Admin: *admin,
|
Admin: *admin,
|
||||||
|
@ -63,7 +63,7 @@ func Defaults() *Server {
|
|||||||
return &Server{
|
return &Server{
|
||||||
Hostname: hostname,
|
Hostname: hostname,
|
||||||
SQLDriver: "sqlite3",
|
SQLDriver: "sqlite3",
|
||||||
SQLSource: "soju.db",
|
SQLSource: "suika.db",
|
||||||
MaxUserNetworks: -1,
|
MaxUserNetworks: -1,
|
||||||
MultiUpstream: true,
|
MultiUpstream: true,
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -148,7 +148,7 @@ func (db *PostgresDB) upgrade() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if version > len(postgresMigrations) {
|
if version > len(postgresMigrations) {
|
||||||
return fmt.Errorf("soju (version %d) older than schema (version %d)", len(postgresMigrations), version)
|
return fmt.Errorf("suika (version %d) older than schema (version %d)", len(postgresMigrations), version)
|
||||||
}
|
}
|
||||||
|
|
||||||
if version == 0 {
|
if version == 0 {
|
||||||
@ -343,7 +343,7 @@ func (db *PostgresDB) StoreNetwork(ctx context.Context, userID int64, network *N
|
|||||||
case "EXTERNAL":
|
case "EXTERNAL":
|
||||||
// keep saslPlain* nil
|
// keep saslPlain* nil
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("soju: cannot store network: unsupported SASL mechanism %q", network.SASL.Mechanism)
|
return fmt.Errorf("suika: cannot store network: unsupported SASL mechanism %q", network.SASL.Mechanism)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -229,7 +229,7 @@ func (db *SqliteDB) upgrade() error {
|
|||||||
if version == len(sqliteMigrations) {
|
if version == len(sqliteMigrations) {
|
||||||
return nil
|
return nil
|
||||||
} else if version > len(sqliteMigrations) {
|
} else if version > len(sqliteMigrations) {
|
||||||
return fmt.Errorf("soju (version %d) older than schema (version %d)", len(sqliteMigrations), version)
|
return fmt.Errorf("suika (version %d) older than schema (version %d)", len(sqliteMigrations), version)
|
||||||
}
|
}
|
||||||
|
|
||||||
tx, err := db.db.Begin()
|
tx, err := db.db.Begin()
|
||||||
@ -506,7 +506,7 @@ func (db *SqliteDB) StoreNetwork(ctx context.Context, userID int64, network *Net
|
|||||||
case "EXTERNAL":
|
case "EXTERNAL":
|
||||||
// keep saslPlain* nil
|
// keep saslPlain* nil
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("soju: cannot store network: unsupported SASL mechanism %q", network.SASL.Mechanism)
|
return fmt.Errorf("suika: cannot store network: unsupported SASL mechanism %q", network.SASL.Mechanism)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
@ -409,7 +409,7 @@ func (dc *downstreamConn) marshalEntity(net *network, name string) string {
|
|||||||
name = partialCasemap(net.casemap, name)
|
name = partialCasemap(net.casemap, name)
|
||||||
if dc.network != nil {
|
if dc.network != nil {
|
||||||
if dc.network != net {
|
if dc.network != net {
|
||||||
panic("soju: tried to marshal an entity for another network")
|
panic("suika: tried to marshal an entity for another network")
|
||||||
}
|
}
|
||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
@ -423,7 +423,7 @@ func (dc *downstreamConn) marshalUserPrefix(net *network, prefix *irc.Prefix) *i
|
|||||||
prefix.Name = partialCasemap(net.casemap, prefix.Name)
|
prefix.Name = partialCasemap(net.casemap, prefix.Name)
|
||||||
if dc.network != nil {
|
if dc.network != nil {
|
||||||
if dc.network != net {
|
if dc.network != net {
|
||||||
panic("soju: tried to marshal a user prefix for another network")
|
panic("suika: tried to marshal a user prefix for another network")
|
||||||
}
|
}
|
||||||
return prefix
|
return prefix
|
||||||
}
|
}
|
||||||
@ -631,7 +631,7 @@ func (dc *downstreamConn) ackMsgID(id string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (dc *downstreamConn) sendPing(msgID string) {
|
func (dc *downstreamConn) sendPing(msgID string) {
|
||||||
token := "soju-msgid-" + msgID
|
token := "suika-msgid-" + msgID
|
||||||
dc.SendMessage(&irc.Message{
|
dc.SendMessage(&irc.Message{
|
||||||
Command: "PING",
|
Command: "PING",
|
||||||
Params: []string{token},
|
Params: []string{token},
|
||||||
@ -639,11 +639,11 @@ func (dc *downstreamConn) sendPing(msgID string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (dc *downstreamConn) handlePong(token string) {
|
func (dc *downstreamConn) handlePong(token string) {
|
||||||
if !strings.HasPrefix(token, "soju-msgid-") {
|
if !strings.HasPrefix(token, "suika-msgid-") {
|
||||||
dc.logger.Printf("received unrecognized PONG token %q", token)
|
dc.logger.Printf("received unrecognized PONG token %q", token)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
msgID := strings.TrimPrefix(token, "soju-msgid-")
|
msgID := strings.TrimPrefix(token, "suika-msgid-")
|
||||||
dc.ackMsgID(msgID)
|
dc.ackMsgID(msgID)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1411,7 +1411,7 @@ func (dc *downstreamConn) welcome(ctx context.Context) error {
|
|||||||
dc.SendMessage(&irc.Message{
|
dc.SendMessage(&irc.Message{
|
||||||
Prefix: dc.srv.prefix(),
|
Prefix: dc.srv.prefix(),
|
||||||
Command: irc.RPL_WELCOME,
|
Command: irc.RPL_WELCOME,
|
||||||
Params: []string{dc.nick, "Welcome to soju, " + dc.nick},
|
Params: []string{dc.nick, "Welcome to suika, " + dc.nick},
|
||||||
})
|
})
|
||||||
dc.SendMessage(&irc.Message{
|
dc.SendMessage(&irc.Message{
|
||||||
Prefix: dc.srv.prefix(),
|
Prefix: dc.srv.prefix(),
|
||||||
@ -1421,7 +1421,7 @@ func (dc *downstreamConn) welcome(ctx context.Context) error {
|
|||||||
dc.SendMessage(&irc.Message{
|
dc.SendMessage(&irc.Message{
|
||||||
Prefix: dc.srv.prefix(),
|
Prefix: dc.srv.prefix(),
|
||||||
Command: irc.RPL_MYINFO,
|
Command: irc.RPL_MYINFO,
|
||||||
Params: []string{dc.nick, dc.srv.Config().Hostname, "soju", "aiwroO", "OovaimnqpsrtklbeI"},
|
Params: []string{dc.nick, dc.srv.Config().Hostname, "suika", "aiwroO", "OovaimnqpsrtklbeI"},
|
||||||
})
|
})
|
||||||
for _, msg := range generateIsupport(dc.srv.prefix(), dc.nick, isupport) {
|
for _, msg := range generateIsupport(dc.srv.prefix(), dc.nick, isupport) {
|
||||||
dc.SendMessage(msg)
|
dc.SendMessage(msg)
|
||||||
@ -2257,7 +2257,7 @@ func (dc *downstreamConn) handleMessageRegistered(ctx context.Context, msg *irc.
|
|||||||
dc.SendMessage(&irc.Message{
|
dc.SendMessage(&irc.Message{
|
||||||
Prefix: dc.srv.prefix(),
|
Prefix: dc.srv.prefix(),
|
||||||
Command: irc.RPL_WHOISSERVER,
|
Command: irc.RPL_WHOISSERVER,
|
||||||
Params: []string{dc.nick, dc.nick, dc.srv.Config().Hostname, "soju"},
|
Params: []string{dc.nick, dc.nick, dc.srv.Config().Hostname, "suika"},
|
||||||
})
|
})
|
||||||
if dc.user.Admin {
|
if dc.user.Admin {
|
||||||
dc.SendMessage(&irc.Message{
|
dc.SendMessage(&irc.Message{
|
||||||
@ -2287,7 +2287,7 @@ func (dc *downstreamConn) handleMessageRegistered(ctx context.Context, msg *irc.
|
|||||||
dc.SendMessage(&irc.Message{
|
dc.SendMessage(&irc.Message{
|
||||||
Prefix: dc.srv.prefix(),
|
Prefix: dc.srv.prefix(),
|
||||||
Command: irc.RPL_WHOISSERVER,
|
Command: irc.RPL_WHOISSERVER,
|
||||||
Params: []string{dc.nick, serviceNick, dc.srv.Config().Hostname, "soju"},
|
Params: []string{dc.nick, serviceNick, dc.srv.Config().Hostname, "suika"},
|
||||||
})
|
})
|
||||||
dc.SendMessage(&irc.Message{
|
dc.SendMessage(&irc.Message{
|
||||||
Prefix: dc.srv.prefix(),
|
Prefix: dc.srv.prefix(),
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
//go:build !go1.16
|
//go:build !go1.16
|
||||||
// +build !go1.16
|
// +build !go1.16
|
||||||
|
|
||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
//go:build go1.16
|
//go:build go1.16
|
||||||
// +build go1.16
|
// +build go1.16
|
||||||
|
|
||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
2
rate.go
2
rate.go
@ -1,4 +1,4 @@
|
|||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
18
server.go
18
server.go
@ -1,4 +1,4 @@
|
|||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -209,7 +209,7 @@ func (s *Server) registerMetrics() {
|
|||||||
factory := promauto.With(s.MetricsRegistry)
|
factory := promauto.With(s.MetricsRegistry)
|
||||||
|
|
||||||
factory.NewGaugeFunc(prometheus.GaugeOpts{
|
factory.NewGaugeFunc(prometheus.GaugeOpts{
|
||||||
Name: "soju_users_active",
|
Name: "suika_users_active",
|
||||||
Help: "Current number of active users",
|
Help: "Current number of active users",
|
||||||
}, func() float64 {
|
}, func() float64 {
|
||||||
s.lock.Lock()
|
s.lock.Lock()
|
||||||
@ -219,37 +219,37 @@ func (s *Server) registerMetrics() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
factory.NewGaugeFunc(prometheus.GaugeOpts{
|
factory.NewGaugeFunc(prometheus.GaugeOpts{
|
||||||
Name: "soju_downstreams_active",
|
Name: "suika_downstreams_active",
|
||||||
Help: "Current number of downstream connections",
|
Help: "Current number of downstream connections",
|
||||||
}, s.metrics.downstreams.Float64)
|
}, s.metrics.downstreams.Float64)
|
||||||
|
|
||||||
factory.NewGaugeFunc(prometheus.GaugeOpts{
|
factory.NewGaugeFunc(prometheus.GaugeOpts{
|
||||||
Name: "soju_upstreams_active",
|
Name: "suika_upstreams_active",
|
||||||
Help: "Current number of upstream connections",
|
Help: "Current number of upstream connections",
|
||||||
}, s.metrics.upstreams.Float64)
|
}, s.metrics.upstreams.Float64)
|
||||||
|
|
||||||
s.metrics.upstreamOutMessagesTotal = factory.NewCounter(prometheus.CounterOpts{
|
s.metrics.upstreamOutMessagesTotal = factory.NewCounter(prometheus.CounterOpts{
|
||||||
Name: "soju_upstream_out_messages_total",
|
Name: "suika_upstream_out_messages_total",
|
||||||
Help: "Total number of outgoing messages sent to upstream servers",
|
Help: "Total number of outgoing messages sent to upstream servers",
|
||||||
})
|
})
|
||||||
|
|
||||||
s.metrics.upstreamInMessagesTotal = factory.NewCounter(prometheus.CounterOpts{
|
s.metrics.upstreamInMessagesTotal = factory.NewCounter(prometheus.CounterOpts{
|
||||||
Name: "soju_upstream_in_messages_total",
|
Name: "suika_upstream_in_messages_total",
|
||||||
Help: "Total number of incoming messages received from upstream servers",
|
Help: "Total number of incoming messages received from upstream servers",
|
||||||
})
|
})
|
||||||
|
|
||||||
s.metrics.downstreamOutMessagesTotal = factory.NewCounter(prometheus.CounterOpts{
|
s.metrics.downstreamOutMessagesTotal = factory.NewCounter(prometheus.CounterOpts{
|
||||||
Name: "soju_downstream_out_messages_total",
|
Name: "suika_downstream_out_messages_total",
|
||||||
Help: "Total number of outgoing messages sent to downstream clients",
|
Help: "Total number of outgoing messages sent to downstream clients",
|
||||||
})
|
})
|
||||||
|
|
||||||
s.metrics.downstreamInMessagesTotal = factory.NewCounter(prometheus.CounterOpts{
|
s.metrics.downstreamInMessagesTotal = factory.NewCounter(prometheus.CounterOpts{
|
||||||
Name: "soju_downstream_in_messages_total",
|
Name: "suika_downstream_in_messages_total",
|
||||||
Help: "Total number of incoming messages received from downstream clients",
|
Help: "Total number of incoming messages received from downstream clients",
|
||||||
})
|
})
|
||||||
|
|
||||||
s.metrics.upstreamConnectErrorsTotal = factory.NewCounter(prometheus.CounterOpts{
|
s.metrics.upstreamConnectErrorsTotal = factory.NewCounter(prometheus.CounterOpts{
|
||||||
Name: "soju_upstream_connect_errors_total",
|
Name: "suika_upstream_connect_errors_total",
|
||||||
Help: "Total number of upstream connection errors",
|
Help: "Total number of upstream connection errors",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -9,10 +9,10 @@ import (
|
|||||||
"gopkg.in/irc.v3"
|
"gopkg.in/irc.v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
var testServerPrefix = &irc.Prefix{Name: "soju-test-server"}
|
var testServerPrefix = &irc.Prefix{Name: "suika-test-server"}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
testUsername = "soju-test-user"
|
testUsername = "suika-test-user"
|
||||||
testPassword = testUsername
|
testPassword = testUsername
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -132,7 +132,7 @@ func registerUpstreamConn(t *testing.T, c ircConn) {
|
|||||||
c.WriteMessage(&irc.Message{
|
c.WriteMessage(&irc.Message{
|
||||||
Prefix: testServerPrefix,
|
Prefix: testServerPrefix,
|
||||||
Command: irc.RPL_YOURHOST,
|
Command: irc.RPL_YOURHOST,
|
||||||
Params: []string{nick, "Your host is soju-test-server"},
|
Params: []string{nick, "Your host is suika-test-server"},
|
||||||
})
|
})
|
||||||
c.WriteMessage(&irc.Message{
|
c.WriteMessage(&irc.Message{
|
||||||
Prefix: testServerPrefix,
|
Prefix: testServerPrefix,
|
||||||
@ -142,7 +142,7 @@ func registerUpstreamConn(t *testing.T, c ircConn) {
|
|||||||
c.WriteMessage(&irc.Message{
|
c.WriteMessage(&irc.Message{
|
||||||
Prefix: testServerPrefix,
|
Prefix: testServerPrefix,
|
||||||
Command: irc.RPL_MYINFO,
|
Command: irc.RPL_MYINFO,
|
||||||
Params: []string{nick, testServerPrefix.Name, "soju", "aiwroO", "OovaimnqpsrtklbeI"},
|
Params: []string{nick, testServerPrefix.Name, "suika", "aiwroO", "OovaimnqpsrtklbeI"},
|
||||||
})
|
})
|
||||||
c.WriteMessage(&irc.Message{
|
c.WriteMessage(&irc.Message{
|
||||||
Prefix: testServerPrefix,
|
Prefix: testServerPrefix,
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -21,7 +21,7 @@ import (
|
|||||||
|
|
||||||
const serviceNick = "BouncerServ"
|
const serviceNick = "BouncerServ"
|
||||||
const serviceNickCM = "bouncerserv"
|
const serviceNickCM = "bouncerserv"
|
||||||
const serviceRealname = "soju bouncer service"
|
const serviceRealname = "suika bouncer service"
|
||||||
|
|
||||||
// maxRSABits is the maximum number of RSA key bits used when generating a new
|
// maxRSABits is the maximum number of RSA key bits used when generating a new
|
||||||
// private key.
|
// private key.
|
||||||
@ -261,7 +261,7 @@ func init() {
|
|||||||
children: serviceCommandSet{
|
children: serviceCommandSet{
|
||||||
"create": {
|
"create": {
|
||||||
usage: "-username <username> -password <password> [-realname <realname>] [-admin]",
|
usage: "-username <username> -password <password> [-realname <realname>] [-admin]",
|
||||||
desc: "create a new soju user",
|
desc: "create a new suika user",
|
||||||
handle: handleUserCreate,
|
handle: handleUserCreate,
|
||||||
admin: true,
|
admin: true,
|
||||||
},
|
},
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
@ -22,10 +22,10 @@ func assertSplit(t *testing.T, input string, expected []string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestSplit(t *testing.T) {
|
func TestSplit(t *testing.T) {
|
||||||
assertSplit(t, " ch 'up' #soju 'relay'-det\"ache\"d message ", []string{
|
assertSplit(t, " ch 'up' #suika 'relay'-det\"ache\"d message ", []string{
|
||||||
"ch",
|
"ch",
|
||||||
"up",
|
"up",
|
||||||
"#soju",
|
"#suika",
|
||||||
"relay-detached",
|
"relay-detached",
|
||||||
"message",
|
"message",
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package soju
|
package suika
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -199,8 +199,7 @@ func connectToUpstream(ctx context.Context, network *network) (*upstreamConn, er
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Don't do the TLS handshake immediately, because we need to register
|
// Don't do the TLS handshake immediately, because we need to register
|
||||||
// the new connection with identd ASAP. See:
|
// the new connection with identd ASAP.
|
||||||
// https://todo.sr.ht/~emersion/soju/69#event-41859
|
|
||||||
netConn = tls.Client(netConn, tlsConfig)
|
netConn = tls.Client(netConn, tlsConfig)
|
||||||
case "irc+insecure":
|
case "irc+insecure":
|
||||||
addr := u.Host
|
addr := u.Host
|
||||||
@ -472,11 +471,11 @@ func (uc *upstreamConn) handleMessage(ctx context.Context, msg *irc.Message) err
|
|||||||
}
|
}
|
||||||
|
|
||||||
if msg.Prefix.Name == serviceNick {
|
if msg.Prefix.Name == serviceNick {
|
||||||
uc.logger.Printf("skipping %v from soju's service: %v", msg.Command, msg)
|
uc.logger.Printf("skipping %v from suika's service: %v", msg.Command, msg)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if entity == serviceNick {
|
if entity == serviceNick {
|
||||||
uc.logger.Printf("skipping %v to soju's service: %v", msg.Command, msg)
|
uc.logger.Printf("skipping %v to suika's service: %v", msg.Command, msg)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user