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:
koizumi.aoi 2023-03-21 04:45:19 +00:00
parent 6de8b9c247
commit cd99ccc1de
29 changed files with 81 additions and 82 deletions

View File

@ -6,7 +6,7 @@ PREFIX ?= /usr/local
BINDIR ?= bin
MANDIR ?= share/man
all: suika suikactl doc/suika.1
all: suika suikactl suika-znc-import doc/suika.1
suika:
$(GO) build $(GOFLAGS) ./cmd/suika

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"context"

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"crypto"
@ -57,7 +57,7 @@ func generateCertFP(keyType string, bits int) (privKeyBytes, certBytes []byte, e
}
cert := &x509.Certificate{
SerialNumber: serialNumber,
Subject: pkix.Name{CommonName: "soju auto-generated certificate"},
Subject: pkix.Name{CommonName: "suika auto-generated certificate"},
NotBefore: notBefore,
NotAfter: notAfter,
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,

View File

@ -16,16 +16,16 @@ import (
"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
already exist in the soju database. ZNC settings overwrite existing soju
already exist in the suika database. ZNC settings overwrite existing suika
settings.
Options:
-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)
-network <name> Limit import to network (may be specified multiple times)
`
@ -64,7 +64,7 @@ func main() {
ctx := context.Background()
db, err := soju.OpenDB(cfg.SQLDriver, cfg.SQLSource)
db, err := suika.OpenDB(cfg.SQLDriver, cfg.SQLSource)
if err != nil {
log.Fatalf("failed to open database: %v", err)
}
@ -86,7 +86,7 @@ func main() {
if err != nil {
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 {
existingUsers[u.Username] = &l[i]
}
@ -107,7 +107,7 @@ func main() {
log.Printf("user %q: updating existing user", username)
} else {
// "!!" is an invalid crypt format, thus disables password auth
u = &soju.User{Username: username, Password: "!!"}
u = &suika.User{Username: username, Password: "!!"}
usersCreated++
log.Printf("user %q: creating new user", username)
}
@ -123,7 +123,7 @@ func main() {
if err != nil {
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 {
existingNetworks[n.GetName()] = &l[i]
}
@ -175,7 +175,7 @@ func main() {
if ok {
logger.Printf("updating existing network")
} else {
n = &soju.Network{Name: netName}
n = &suika.Network{Name: netName}
logger.Printf("creating new network")
}
@ -194,7 +194,7 @@ func main() {
if err != nil {
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 {
existingChannels[ch.Name] = &l[i]
}
@ -213,7 +213,7 @@ func main() {
if ok {
logger.Printf("channel %q: updating existing channel", chName)
} else {
ch = &soju.Channel{Name: chName}
ch = &suika.Channel{Name: chName}
logger.Printf("channel %q: creating new channel", chName)
}
@ -232,7 +232,7 @@ func main() {
}
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)

View File

@ -59,7 +59,7 @@ var (
tlsCert atomic.Value // *tls.Certificate
)
func loadConfig() (*config.Server, *soju.Config, error) {
func loadConfig() (*config.Server, *suika.Config, error) {
var raw *config.Server
if configPath != "" {
var err error
@ -88,7 +88,7 @@ func loadConfig() (*config.Server, *soju.Config, error) {
tlsCert.Store(&cert)
}
cfg := &soju.Config{
cfg := &suika.Config{
Hostname: raw.Hostname,
Title: raw.Title,
LogPath: raw.LogPath,
@ -123,7 +123,7 @@ func main() {
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 {
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.Logger = soju.NewLogger(log.Writer(), debug)
srv.Logger = suika.NewLogger(log.Writer(), debug)
for _, listen := range cfg.Listen {
listen := listen // copy
@ -241,7 +241,7 @@ func main() {
}()
case "ident":
if srv.Identd == nil {
srv.Identd = soju.NewIdentd()
srv.Identd = suika.NewIdentd()
}
host := u.Host
@ -315,7 +315,7 @@ func main() {
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())
}
@ -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{
Listener: ln,
Policy: func(upstream net.Addr) (proxyproto.Policy, error) {

View File

@ -15,7 +15,7 @@ import (
"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
change-password <username> Change password for a user
@ -44,7 +44,7 @@ func main() {
cfg = config.Defaults()
}
db, err := soju.OpenDB(cfg.SQLDriver, cfg.SQLSource)
db, err := suika.OpenDB(cfg.SQLDriver, cfg.SQLSource)
if err != nil {
log.Fatalf("failed to open database: %v", err)
}
@ -73,7 +73,7 @@ func main() {
log.Fatalf("failed to hash password: %v", err)
}
user := soju.User{
user := suika.User{
Username: username,
Password: string(hashed),
Admin: *admin,

View File

@ -63,7 +63,7 @@ func Defaults() *Server {
return &Server{
Hostname: hostname,
SQLDriver: "sqlite3",
SQLSource: "soju.db",
SQLSource: "suika.db",
MaxUserNetworks: -1,
MultiUpstream: true,
}

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"context"

2
db.go
View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"context"

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"context"
@ -148,7 +148,7 @@ func (db *PostgresDB) upgrade() error {
return nil
}
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 {
@ -343,7 +343,7 @@ func (db *PostgresDB) StoreNetwork(ctx context.Context, userID int64, network *N
case "EXTERNAL":
// keep saslPlain* nil
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)
}
}

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"database/sql"

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"context"
@ -229,7 +229,7 @@ func (db *SqliteDB) upgrade() error {
if version == len(sqliteMigrations) {
return nil
} 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()
@ -506,7 +506,7 @@ func (db *SqliteDB) StoreNetwork(ctx context.Context, userID int64, network *Net
case "EXTERNAL":
// keep saslPlain* nil
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)
}
}

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"database/sql"

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"bytes"
@ -409,7 +409,7 @@ func (dc *downstreamConn) marshalEntity(net *network, name string) string {
name = partialCasemap(net.casemap, name)
if dc.network != nil {
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
}
@ -423,7 +423,7 @@ func (dc *downstreamConn) marshalUserPrefix(net *network, prefix *irc.Prefix) *i
prefix.Name = partialCasemap(net.casemap, prefix.Name)
if dc.network != nil {
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
}
@ -631,7 +631,7 @@ func (dc *downstreamConn) ackMsgID(id string) {
}
func (dc *downstreamConn) sendPing(msgID string) {
token := "soju-msgid-" + msgID
token := "suika-msgid-" + msgID
dc.SendMessage(&irc.Message{
Command: "PING",
Params: []string{token},
@ -639,11 +639,11 @@ func (dc *downstreamConn) sendPing(msgID 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)
return
}
msgID := strings.TrimPrefix(token, "soju-msgid-")
msgID := strings.TrimPrefix(token, "suika-msgid-")
dc.ackMsgID(msgID)
}
@ -1411,7 +1411,7 @@ func (dc *downstreamConn) welcome(ctx context.Context) error {
dc.SendMessage(&irc.Message{
Prefix: dc.srv.prefix(),
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{
Prefix: dc.srv.prefix(),
@ -1421,7 +1421,7 @@ func (dc *downstreamConn) welcome(ctx context.Context) error {
dc.SendMessage(&irc.Message{
Prefix: dc.srv.prefix(),
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) {
dc.SendMessage(msg)
@ -2257,7 +2257,7 @@ func (dc *downstreamConn) handleMessageRegistered(ctx context.Context, msg *irc.
dc.SendMessage(&irc.Message{
Prefix: dc.srv.prefix(),
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 {
dc.SendMessage(&irc.Message{
@ -2287,7 +2287,7 @@ func (dc *downstreamConn) handleMessageRegistered(ctx context.Context, msg *irc.
dc.SendMessage(&irc.Message{
Prefix: dc.srv.prefix(),
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{
Prefix: dc.srv.prefix(),

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"bufio"

2
irc.go
View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"fmt"

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"testing"

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"bytes"

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"bufio"

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"context"

View File

@ -1,7 +1,7 @@
//go:build !go1.16
// +build !go1.16
package soju
package suika
import (
"strings"

View File

@ -1,7 +1,7 @@
//go:build go1.16
// +build go1.16
package soju
package suika
import (
"errors"

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"math/rand"

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"context"
@ -209,7 +209,7 @@ func (s *Server) registerMetrics() {
factory := promauto.With(s.MetricsRegistry)
factory.NewGaugeFunc(prometheus.GaugeOpts{
Name: "soju_users_active",
Name: "suika_users_active",
Help: "Current number of active users",
}, func() float64 {
s.lock.Lock()
@ -219,37 +219,37 @@ func (s *Server) registerMetrics() {
})
factory.NewGaugeFunc(prometheus.GaugeOpts{
Name: "soju_downstreams_active",
Name: "suika_downstreams_active",
Help: "Current number of downstream connections",
}, s.metrics.downstreams.Float64)
factory.NewGaugeFunc(prometheus.GaugeOpts{
Name: "soju_upstreams_active",
Name: "suika_upstreams_active",
Help: "Current number of upstream connections",
}, s.metrics.upstreams.Float64)
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",
})
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",
})
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",
})
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",
})
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",
})
}

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"context"
@ -9,10 +9,10 @@ import (
"gopkg.in/irc.v3"
)
var testServerPrefix = &irc.Prefix{Name: "soju-test-server"}
var testServerPrefix = &irc.Prefix{Name: "suika-test-server"}
const (
testUsername = "soju-test-user"
testUsername = "suika-test-user"
testPassword = testUsername
)
@ -132,7 +132,7 @@ func registerUpstreamConn(t *testing.T, c ircConn) {
c.WriteMessage(&irc.Message{
Prefix: testServerPrefix,
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{
Prefix: testServerPrefix,
@ -142,7 +142,7 @@ func registerUpstreamConn(t *testing.T, c ircConn) {
c.WriteMessage(&irc.Message{
Prefix: testServerPrefix,
Command: irc.RPL_MYINFO,
Params: []string{nick, testServerPrefix.Name, "soju", "aiwroO", "OovaimnqpsrtklbeI"},
Params: []string{nick, testServerPrefix.Name, "suika", "aiwroO", "OovaimnqpsrtklbeI"},
})
c.WriteMessage(&irc.Message{
Prefix: testServerPrefix,

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"context"
@ -21,7 +21,7 @@ import (
const serviceNick = "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
// private key.
@ -261,7 +261,7 @@ func init() {
children: serviceCommandSet{
"create": {
usage: "-username <username> -password <password> [-realname <realname>] [-admin]",
desc: "create a new soju user",
desc: "create a new suika user",
handle: handleUserCreate,
admin: true,
},

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"testing"
@ -22,10 +22,10 @@ func assertSplit(t *testing.T, input string, expected []string) {
}
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",
"up",
"#soju",
"#suika",
"relay-detached",
"message",
})

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"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
// the new connection with identd ASAP. See:
// https://todo.sr.ht/~emersion/soju/69#event-41859
// the new connection with identd ASAP.
netConn = tls.Client(netConn, tlsConfig)
case "irc+insecure":
addr := u.Host
@ -472,11 +471,11 @@ func (uc *upstreamConn) handleMessage(ctx context.Context, msg *irc.Message) err
}
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
}
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
}

View File

@ -1,4 +1,4 @@
package soju
package suika
import (
"context"