ScuttleBot
| c369cd5… | lmata | 1 | package ergo |
| c369cd5… | lmata | 2 | |
| c369cd5… | lmata | 3 | import ( |
| c369cd5… | lmata | 4 | "bytes" |
| c369cd5… | lmata | 5 | "text/template" |
| c369cd5… | lmata | 6 | |
| c369cd5… | lmata | 7 | "github.com/conflicthq/scuttlebot/internal/config" |
| 4e1758e… | lmata | 8 | "golang.org/x/crypto/bcrypt" |
| c369cd5… | lmata | 9 | ) |
| c369cd5… | lmata | 10 | |
| c369cd5… | lmata | 11 | var ircdTemplate = template.Must(template.New("ircd").Parse(`# Generated by scuttlebot — do not edit manually. |
| c369cd5… | lmata | 12 | network: |
| c369cd5… | lmata | 13 | name: {{.NetworkName}} |
| c369cd5… | lmata | 14 | |
| c369cd5… | lmata | 15 | server: |
| c369cd5… | lmata | 16 | name: {{.ServerName}} |
| c369cd5… | lmata | 17 | listeners: |
| c369cd5… | lmata | 18 | "{{.IRCAddr}}": {} |
| 18e8fef… | lmata | 19 | {{- if .TLSDomain}} |
| 18e8fef… | lmata | 20 | "{{.TLSAddr}}": |
| 18e8fef… | lmata | 21 | tls: |
| 18e8fef… | lmata | 22 | autocert: true |
| 18e8fef… | lmata | 23 | min-tls-version: 1.2 |
| 18e8fef… | lmata | 24 | {{- end}} |
| c369cd5… | lmata | 25 | casemapping: ascii |
| c369cd5… | lmata | 26 | enforce-utf8: true |
| c8d9310… | lmata | 27 | max-sendq: 96k |
| c369cd5… | lmata | 28 | relaymsg: |
| c3c693d… | noreply | 29 | enabled: true |
| c3c693d… | noreply | 30 | separators: / |
| c3c693d… | noreply | 31 | available-to-chanops: false |
| c369cd5… | lmata | 32 | ip-cloaking: |
| c369cd5… | lmata | 33 | enabled: false |
| c369cd5… | lmata | 34 | lookup-hostnames: false |
| c369cd5… | lmata | 35 | |
| c369cd5… | lmata | 36 | datastore: |
| c8d9310… | lmata | 37 | path: ./ircd.db |
| c369cd5… | lmata | 38 | autoupgrade: true |
| c369cd5… | lmata | 39 | {{- if .HistoryEnabled}} |
| c369cd5… | lmata | 40 | {{- if .PostgresDSN}} |
| c369cd5… | lmata | 41 | postgresql: |
| c369cd5… | lmata | 42 | enabled: true |
| c369cd5… | lmata | 43 | dsn: "{{.PostgresDSN}}" |
| c369cd5… | lmata | 44 | {{- else if .MySQLEnabled}} |
| c369cd5… | lmata | 45 | mysql: |
| c369cd5… | lmata | 46 | enabled: true |
| c369cd5… | lmata | 47 | host: "{{.MySQL.Host}}" |
| c369cd5… | lmata | 48 | port: {{.MySQL.Port}} |
| c369cd5… | lmata | 49 | user: "{{.MySQL.User}}" |
| c369cd5… | lmata | 50 | password: "{{.MySQL.Password}}" |
| c369cd5… | lmata | 51 | history-database: "{{.MySQL.Database}}" |
| c369cd5… | lmata | 52 | {{- end}} |
| c369cd5… | lmata | 53 | {{- end}} |
| c369cd5… | lmata | 54 | |
| c369cd5… | lmata | 55 | accounts: |
| c369cd5… | lmata | 56 | registration: |
| c369cd5… | lmata | 57 | enabled: true |
| c369cd5… | lmata | 58 | allow-before-connect: true |
| c369cd5… | lmata | 59 | throttling: |
| c369cd5… | lmata | 60 | enabled: false |
| c369cd5… | lmata | 61 | authentication-enabled: true |
| c369cd5… | lmata | 62 | require-sasl: |
| c669cc3… | lmata | 63 | enabled: {{.RequireSASL}} |
| c369cd5… | lmata | 64 | |
| c369cd5… | lmata | 65 | channels: |
| c369cd5… | lmata | 66 | registration: |
| c369cd5… | lmata | 67 | enabled: true |
| c669cc3… | lmata | 68 | default-modes: "{{.DefaultChannelModes}}" |
| c369cd5… | lmata | 69 | |
| c369cd5… | lmata | 70 | history: |
| c369cd5… | lmata | 71 | enabled: {{.HistoryEnabled}} |
| c369cd5… | lmata | 72 | {{- if .HistoryEnabled}} |
| c369cd5… | lmata | 73 | channel-length: 2048 |
| c369cd5… | lmata | 74 | client-length: 256 |
| c369cd5… | lmata | 75 | autoresize-window: 3d |
| c369cd5… | lmata | 76 | autoreplay-on-join: 0 |
| c369cd5… | lmata | 77 | chathistory-maxmessages: 1000 |
| c369cd5… | lmata | 78 | znc-maxmessages: 2048 |
| c369cd5… | lmata | 79 | restrictions: |
| c369cd5… | lmata | 80 | expire-time: 7d |
| c369cd5… | lmata | 81 | query-cutoff: none |
| c369cd5… | lmata | 82 | persistent: |
| c369cd5… | lmata | 83 | enabled: {{.HistoryEnabled}} |
| c369cd5… | lmata | 84 | unregistered-channels: false |
| c369cd5… | lmata | 85 | registered-channels: opt-in |
| c369cd5… | lmata | 86 | direct-messages: opt-in |
| c369cd5… | lmata | 87 | {{- end}} |
| c669cc3… | lmata | 88 | |
| a408eee… | lmata | 89 | opers: |
| a408eee… | lmata | 90 | scuttlebot: |
| a408eee… | lmata | 91 | class: server-admin |
| a408eee… | lmata | 92 | whois-line: is a scuttlebot system operator |
| 4e1758e… | lmata | 93 | password: "{{.OperPassHash}}" |
| a408eee… | lmata | 94 | |
| a408eee… | lmata | 95 | oper-classes: |
| a408eee… | lmata | 96 | server-admin: |
| a408eee… | lmata | 97 | title: Server Admin |
| a408eee… | lmata | 98 | capabilities: |
| a408eee… | lmata | 99 | - samode |
| a408eee… | lmata | 100 | - chanreg |
| a408eee… | lmata | 101 | |
| c369cd5… | lmata | 102 | api: |
| c369cd5… | lmata | 103 | enabled: true |
| c369cd5… | lmata | 104 | listener: "{{.APIAddr}}" |
| c369cd5… | lmata | 105 | bearer-tokens: |
| c369cd5… | lmata | 106 | - "{{.APIToken}}" |
| c369cd5… | lmata | 107 | |
| c369cd5… | lmata | 108 | logging: |
| c369cd5… | lmata | 109 | - method: stderr |
| c369cd5… | lmata | 110 | type: "* -userinput -useroutput" |
| c369cd5… | lmata | 111 | level: warn |
| c369cd5… | lmata | 112 | |
| c369cd5… | lmata | 113 | limits: |
| c369cd5… | lmata | 114 | nicklen: 32 |
| c369cd5… | lmata | 115 | channellen: 64 |
| c369cd5… | lmata | 116 | awaylen: 200 |
| c369cd5… | lmata | 117 | kicklen: 255 |
| c369cd5… | lmata | 118 | topiclen: 512 |
| c369cd5… | lmata | 119 | |
| c369cd5… | lmata | 120 | `)) |
| c369cd5… | lmata | 121 | |
| c369cd5… | lmata | 122 | type ircdTemplateData struct { |
| c669cc3… | lmata | 123 | NetworkName string |
| c669cc3… | lmata | 124 | ServerName string |
| c669cc3… | lmata | 125 | IRCAddr string |
| 18e8fef… | lmata | 126 | TLSDomain string |
| 18e8fef… | lmata | 127 | TLSAddr string |
| c669cc3… | lmata | 128 | DataDir string |
| c669cc3… | lmata | 129 | APIAddr string |
| c669cc3… | lmata | 130 | APIToken string |
| 4e1758e… | lmata | 131 | OperPassHash string // bcrypt hash of APIToken for oper password |
| c669cc3… | lmata | 132 | HistoryEnabled bool |
| c669cc3… | lmata | 133 | PostgresDSN string |
| c669cc3… | lmata | 134 | MySQLEnabled bool |
| c669cc3… | lmata | 135 | MySQL config.MySQLConfig |
| c669cc3… | lmata | 136 | RequireSASL bool |
| c669cc3… | lmata | 137 | DefaultChannelModes string |
| c369cd5… | lmata | 138 | } |
| c369cd5… | lmata | 139 | |
| c369cd5… | lmata | 140 | // GenerateConfig renders an ircd.yaml from the given ErgoConfig. |
| c369cd5… | lmata | 141 | func GenerateConfig(cfg config.ErgoConfig) ([]byte, error) { |
| 4e1758e… | lmata | 142 | operHash, _ := bcrypt.GenerateFromPassword([]byte(cfg.APIToken), bcrypt.MinCost) |
| c369cd5… | lmata | 143 | data := ircdTemplateData{ |
| c669cc3… | lmata | 144 | NetworkName: cfg.NetworkName, |
| c669cc3… | lmata | 145 | ServerName: cfg.ServerName, |
| c669cc3… | lmata | 146 | IRCAddr: cfg.IRCAddr, |
| 18e8fef… | lmata | 147 | TLSDomain: cfg.TLSDomain, |
| 18e8fef… | lmata | 148 | TLSAddr: cfg.TLSAddr, |
| c669cc3… | lmata | 149 | DataDir: cfg.DataDir, |
| c669cc3… | lmata | 150 | APIAddr: cfg.APIAddr, |
| c669cc3… | lmata | 151 | APIToken: cfg.APIToken, |
| 4e1758e… | lmata | 152 | OperPassHash: string(operHash), |
| c669cc3… | lmata | 153 | HistoryEnabled: cfg.History.Enabled, |
| c669cc3… | lmata | 154 | PostgresDSN: cfg.History.PostgresDSN, |
| c669cc3… | lmata | 155 | MySQLEnabled: cfg.History.MySQL.Host != "" && cfg.History.PostgresDSN == "", |
| c669cc3… | lmata | 156 | MySQL: cfg.History.MySQL, |
| c669cc3… | lmata | 157 | RequireSASL: cfg.RequireSASL, |
| c669cc3… | lmata | 158 | DefaultChannelModes: cfg.DefaultChannelModes, |
| c369cd5… | lmata | 159 | } |
| c369cd5… | lmata | 160 | |
| c369cd5… | lmata | 161 | var buf bytes.Buffer |
| c369cd5… | lmata | 162 | if err := ircdTemplate.Execute(&buf, data); err != nil { |
| c369cd5… | lmata | 163 | return nil, err |
| c369cd5… | lmata | 164 | } |
| c369cd5… | lmata | 165 | return buf.Bytes(), nil |
| c369cd5… | lmata | 166 | } |