Squashed commit of the following:
commita394259f0a
Author: Sense T <me@sense-t.eu.org> Date: Fri Apr 19 15:10:08 2024 +0800 done commitaf9d966376
Author: Sense T <me@sense-t.eu.org> Date: Fri Apr 19 13:52:33 2024 +0800 debug done. commit47335ca5e9
Author: Sense T <me@sense-t.eu.org> Date: Fri Apr 19 12:47:00 2024 +0800 swagger done commit34fb2a478b
Author: Sense T <me@sense-t.eu.org> Date: Fri Apr 19 10:05:19 2024 +0800 stage 2, not completed commit88b2255f8b
Author: Sense T <me@sense-t.eu.org> Date: Fri Apr 19 09:44:37 2024 +0800 test stage 1 commitb583720223
Author: Sense T <me@sense-t.eu.org> Date: Mon Apr 15 21:53:09 2024 +0800 Squashed commit of the following: commit 1e92328a0fc570fe9419ad5dbaaef77f7dc9ad2e Author: Sense T <me@sense-t.eu.org> Date: Mon Apr 15 21:52:44 2024 +0800 yes, react it! commit 09fffff6139b4cecb81cb1444139f225e95e8917 Author: Sense T <me@sense-t.eu.org> Date: Mon Apr 15 17:33:26 2024 +0800 actions to be done commit 1611b0b338cfd965d15f43fb10308bc56015895f Author: Sense T <me@sense-t.eu.org> Date: Mon Apr 15 15:22:08 2024 +0800 modal needed. commit 88453e7382618fb6774ff1cc4c0f7045d4dfcf46 Author: Sense T <me@sense-t.eu.org> Date: Mon Apr 15 10:52:13 2024 +0800 Domain View done commit 8cedca27c79ca2ba69c8777dfcb6019799875e31 Author: Sense T <me@sense-t.eu.org> Date: Sun Apr 14 21:24:14 2024 +0800 domain delete modal done commit 60cd00c0cad0774bae5b57bcfc4723a29d28d221 Author: Sense T <me@sense-t.eu.org> Date: Sun Apr 14 07:55:11 2024 +0800 1 commit 285853e988db6e6a6371135869da0129fd73afd7 Author: Sense T <me@sense-t.eu.org> Date: Sat Apr 13 17:29:43 2024 +0800 eslint commit 8f0ffbf744fd85a612daacd7bd6cbc45d58907d3 Author: Sense T <me@sense-t.eu.org> Date: Sat Apr 13 17:20:50 2024 +0800 f commit 9762b632225f185d83388e58d93ed49f62fe6b3f Author: Sense T <me@sense-t.eu.org> Date: Sat Apr 13 17:08:37 2024 +0800 views, components to be done commit 321e5255f2b1e705844179dd910d5f5a1ae58298 Author: Sense T <me@sense-t.eu.org> Date: Sat Apr 13 14:29:04 2024 +0800 prepare for react commit3305d8d618
Author: Sense T <me@sense-t.eu.org> Date: Sat Apr 13 10:30:02 2024 +0800 swagger to be done commit2c754e7eec
Author: Sense T <me@sense-t.eu.org> Date: Sat Apr 13 10:14:45 2024 +0800 validate 'em ! commit7b529ad8f6
Author: Sense T <me@sense-t.eu.org> Date: Sat Apr 13 09:22:27 2024 +0800 try to avoid nil point panic commit0012a697cb
Author: Sense T <me@sense-t.eu.org> Date: Fri Apr 12 22:26:35 2024 +0800 fix some bug commita098d3056c
Author: Sense T <me@sense-t.eu.org> Date: Fri Apr 12 20:03:34 2024 +0800 web debug done commit01765c4e7f
Author: Sense T <me@sense-t.eu.org> Date: Fri Apr 12 15:16:52 2024 +0800 all tsx used, no vue SFC commit731504ae82
Author: Sense T <me@sense-t.eu.org> Date: Thu Apr 11 22:05:58 2024 +0800 tsx used - stage 2 commitb669a3e68e
Author: Sense T <me@sense-t.eu.org> Date: Thu Apr 11 16:18:11 2024 +0800 use tsx for compoents stage 1 commit2ab1b0bf1b
Author: Sense T <me@sense-t.eu.org> Date: Thu Apr 11 12:10:57 2024 +0800 rr validation commit58c66fc3a8
Author: Sense T <me@sense-t.eu.org> Date: Thu Apr 11 11:41:33 2024 +0800 stage 1 commit7a5fcf1972
Author: Sense T <me@sense-t.eu.org> Date: Thu Apr 11 10:51:50 2024 +0800 long options supported commitc3b80093d2
Author: Sense T <me@sense-t.eu.org> Date: Thu Apr 11 10:51:33 2024 +0800 for develop use commit7f52707323
Author: Sense T <me@sense-t.eu.org> Date: Thu Apr 11 10:51:24 2024 +0800 fix typo commit9cc2696bbe
Author: Sense T <me@sense-t.eu.org> Date: Wed Apr 10 16:53:03 2024 +0800 record data validate done commit5e2ae637a0
Author: Sense T <me@sense-t.eu.org> Date: Wed Apr 10 14:56:15 2024 +0800 end with dot. commited4fee935d
Author: Sense T <me@sense-t.eu.org> Date: Wed Apr 10 13:41:32 2024 +0800 content safety commit29f75938bb
Author: Sense T <me@sense-t.eu.org> Date: Wed Apr 10 13:24:01 2024 +0800 cmd is ok commit9465bb885d
Author: Sense T <me@sense-t.eu.org> Date: Wed Apr 10 11:00:47 2024 +0800 web done commit65bf461d44
Author: Sense T <me@sense-t.eu.org> Date: Wed Apr 10 11:00:38 2024 +0800 use tokei for stat commit61395ab61b
Author: Sense T <me@sense-t.eu.org> Date: Tue Apr 9 21:53:12 2024 +0800 errors handler commit9752e7d9ae
Author: Sense T <me@sense-t.eu.org> Date: Tue Apr 9 21:16:19 2024 +0800 model with generics done commit7dd3af3707
Author: Sense T <me@sense-t.eu.org> Date: Tue Apr 9 16:28:18 2024 +0800 use DAO commit2369734230
Author: Sense T <me@sense-t.eu.org> Date: Tue Apr 9 13:06:31 2024 +0800 dao for future commite18781ba25
Author: Sense T <me@sense-t.eu.org> Date: Tue Apr 9 11:36:34 2024 +0800 DotEnd commit613ef7fdd9
Author: Sense T <me@sense-t.eu.org> Date: Tue Apr 9 10:16:06 2024 +0800 record should endwith . commitc93e8107dc
Author: Sense T <me@sense-t.eu.org> Date: Tue Apr 9 10:06:47 2024 +0800 update regexp commit84e9961f4b
Author: Sense T <me@sense-t.eu.org> Date: Tue Apr 9 08:30:32 2024 +0800 error log commitdb77b0fdb2
Author: Sense T <me@sense-t.eu.org> Date: Tue Apr 9 08:25:25 2024 +0800 no console log commit0c197820a0
Author: Sense T <me@sense-t.eu.org> Date: Tue Apr 9 08:25:01 2024 +0800 use flags for validate commit33c9050653
Author: Sense T <me@sense-t.eu.org> Date: Tue Apr 9 07:58:27 2024 +0800 SOA Email Format commitfb9c78efed
Author: Sense T <me@sense-t.eu.org> Date: Tue Apr 9 00:19:03 2024 +0800 no debug commit1a7bf83cb9
Author: Sense T <me@sense-t.eu.org> Date: Tue Apr 9 00:18:18 2024 +0800 1 commite72de14797
Author: Sense T <me@sense-t.eu.org> Date: Mon Apr 8 17:30:25 2024 +0800 last modal commite884840b7d
Author: Sense T <me@sense-t.eu.org> Date: Mon Apr 8 15:56:03 2024 +0800 add commit36b0384319
Author: Sense T <me@sense-t.eu.org> Date: Mon Apr 8 15:02:55 2024 +0800 delete domain modal done commit753e950fae
Author: Sense T <me@sense-t.eu.org> Date: Mon Apr 8 13:49:11 2024 +0800 add domainRemovemodal commit69613f9b6e
Author: Sense T <me@sense-t.eu.org> Date: Mon Apr 8 13:32:01 2024 +0800 modal needed for edit commit8c0b79066f
Author: Sense T <me@sense-t.eu.org> Date: Mon Apr 8 09:37:32 2024 +0800 base UI commita67b2d7724
Author: Sense T <me@sense-t.eu.org> Date: Sun Apr 7 21:07:20 2024 +0800 route update commit5a266e9e6c
Author: Sense T <me@sense-t.eu.org> Date: Sun Apr 7 14:36:55 2024 +0800 ui base data struct commit3449df913c
Author: Sense T <me@sense-t.eu.org> Date: Sun Apr 7 13:08:45 2024 +0800 web store for dev commit156bf651dd
Author: Sense T <me@sense-t.eu.org> Date: Sun Apr 7 13:08:30 2024 +0800 store friendly commitd90e949472
Author: Sense T <me@sense-t.eu.org> Date: Sun Apr 7 10:08:02 2024 +0800 base code update commit0a20b5a670
Author: Sense T <me@sense-t.eu.org> Date: Sun Apr 7 10:07:26 2024 +0800 metrics commitbdd4866c10
Author: Sense T <me@sense-t.eu.org> Date: Wed Apr 3 22:37:15 2024 +0800 all api done commit8a8ea59b71
Author: Sense T <me@sense-t.eu.org> Date: Wed Apr 3 17:05:12 2024 +0800 1
This commit is contained in:
156
controllers/domain.go
Normal file
156
controllers/domain.go
Normal file
@@ -0,0 +1,156 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reCoreD-UI/database"
|
||||
"reCoreD-UI/models"
|
||||
"strconv"
|
||||
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
type domainsDAO struct {
|
||||
database.BaseDAO[models.IDomain]
|
||||
}
|
||||
|
||||
func CreateDomain(d *models.Domain) (*models.Domain, error) {
|
||||
nss, err := GetDNS()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
tx := database.Client.Begin()
|
||||
if _, err := (domainsDAO{}).Create(tx, d); err != nil {
|
||||
tx.Rollback()
|
||||
return nil, err
|
||||
}
|
||||
|
||||
r := &models.Record[models.SOARecord]{}
|
||||
r.Zone = d.WithDotEnd()
|
||||
r.Name = "@"
|
||||
r.RecordType = models.RecordTypeSOA
|
||||
r.Content = d.GenerateSOA()
|
||||
logrus.Debug(r)
|
||||
if err := r.CheckZone(); err != nil {
|
||||
tx.Rollback()
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if _, err := (recordsDAO{}).Create(tx, r); err != nil {
|
||||
tx.Rollback()
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for i, ns := range nss {
|
||||
record := &models.Record[models.NSRecord]{
|
||||
Zone: d.WithDotEnd(),
|
||||
RecordType: models.RecordTypeNS,
|
||||
Name: fmt.Sprintf("ns%d", i+1),
|
||||
}
|
||||
record.Content.Host = ns
|
||||
|
||||
if _, err := (recordsDAO{}).Create(tx, record); err != nil {
|
||||
tx.Rollback()
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return d, tx.Commit().Error
|
||||
}
|
||||
|
||||
func GetDomains(domain string) ([]models.Domain, error) {
|
||||
if domain != "" {
|
||||
r, err := (domainsDAO{}).GetAll(database.Client, &models.Domain{DomainName: domain})
|
||||
n := make([]models.Domain, 0)
|
||||
for _, e := range r {
|
||||
i, ok := e.(*models.Domain)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
n = append(n, *i)
|
||||
}
|
||||
return n, err
|
||||
} else {
|
||||
r, err := (domainsDAO{}).GetAll(database.Client, &models.Domain{})
|
||||
n := make([]models.Domain, 0)
|
||||
for _, e := range r {
|
||||
i, ok := e.(*models.Domain)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
n = append(n, *i)
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
|
||||
func UpdateDomain(d *models.Domain) error {
|
||||
tx := database.Client.Begin()
|
||||
logrus.Debug(d)
|
||||
if _, err := (domainsDAO{}).Update(tx, d); err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
soa, err := (recordsDAO{}).GetOne(tx, &models.Record[models.RecordContentDefault]{
|
||||
RecordType: models.RecordTypeSOA, Zone: d.WithDotEnd(),
|
||||
})
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
r := &models.Record[models.SOARecord]{}
|
||||
if err := r.FromEntity(soa); err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
r.Content = d.GenerateSOA()
|
||||
if err := r.CheckZone(); err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err := (recordsDAO{}).Update(tx, r); err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
return tx.Commit().Error
|
||||
}
|
||||
|
||||
func DeleteDomain(id string) error {
|
||||
ID, err := strconv.Atoi(id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
tx := database.Client.Begin()
|
||||
domain, err := (domainsDAO{}).GetOne(tx, &models.Domain{ID: uint(ID)})
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
if err := (domainsDAO{}).Delete(tx, &models.Domain{ID: uint(ID)}); err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
if err := (recordsDAO{}).Delete(tx, &models.Record[models.RecordContentDefault]{}, &models.Record[models.RecordContentDefault]{Zone: domain.WithDotEnd()}); err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
return tx.Commit().Error
|
||||
}
|
||||
|
||||
// for metrics
|
||||
func getDomainCounts() (float64, error) {
|
||||
c, err := (domainsDAO{}).GetAll(database.Client, &models.Domain{})
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return float64(len(c)), nil
|
||||
}
|
61
controllers/metrics.go
Normal file
61
controllers/metrics.go
Normal file
@@ -0,0 +1,61 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
ginprometheus "github.com/zsais/go-gin-prometheus"
|
||||
ormMetric "gorm.io/plugin/prometheus"
|
||||
)
|
||||
|
||||
var (
|
||||
GaugeDomainCounts = prometheus.NewGauge(prometheus.GaugeOpts{
|
||||
Namespace: "recoredui",
|
||||
Subsystem: "domains",
|
||||
Name: "count",
|
||||
Help: "domains managed in reCoreD-UI",
|
||||
})
|
||||
|
||||
GaugeRecordCounts = prometheus.NewGaugeVec(prometheus.GaugeOpts{
|
||||
Namespace: "recoredui",
|
||||
Subsystem: "records",
|
||||
Name: "count",
|
||||
Help: "records managed in reCoreD-UI, by domain",
|
||||
}, []string{"domain"})
|
||||
)
|
||||
|
||||
func RegisterMetrics() {
|
||||
prometheus.MustRegister(GaugeDomainCounts, GaugeRecordCounts)
|
||||
|
||||
GormMetrics := ormMetric.New(ormMetric.Config{
|
||||
DBName: "recored-ui",
|
||||
MetricsCollector: []ormMetric.MetricsCollector{
|
||||
&ormMetric.MySQL{
|
||||
VariableNames: []string{"Threads_running"},
|
||||
},
|
||||
},
|
||||
}).Collectors
|
||||
prometheus.MustRegister(GormMetrics...)
|
||||
|
||||
GinMetrics := ginprometheus.NewPrometheus("recoredui")
|
||||
for _, v := range GinMetrics.MetricsList {
|
||||
prometheus.Register(v.MetricCollector)
|
||||
}
|
||||
}
|
||||
|
||||
func RefreshMetrics() error {
|
||||
domainCounts, err := getDomainCounts()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
GaugeDomainCounts.Set(domainCounts)
|
||||
|
||||
recordCounts, err := getRecordCounts()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for domain, counts := range recordCounts {
|
||||
GaugeRecordCounts.WithLabelValues(domain).Set(counts)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
22
controllers/migrate.go
Normal file
22
controllers/migrate.go
Normal file
@@ -0,0 +1,22 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"reCoreD-UI/database"
|
||||
"reCoreD-UI/models"
|
||||
)
|
||||
|
||||
func Migrate() error {
|
||||
if err := (domainsDAO{}).Migrate(database.Client, &models.Domain{}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := (recordsDAO{}).Migrate(database.Client, &models.Record[models.RecordContentDefault]{Content: make(models.RecordContentDefault)}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := (settingsDAO{}).Migrate(database.Client, &models.Settings{}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
106
controllers/record.go
Normal file
106
controllers/record.go
Normal file
@@ -0,0 +1,106 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reCoreD-UI/database"
|
||||
"reCoreD-UI/models"
|
||||
"strconv"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type recordsDAO struct {
|
||||
database.BaseDAO[models.IRecord]
|
||||
}
|
||||
|
||||
func CreateRecord(r models.IRecord) (models.IRecord, error) {
|
||||
if r.GetType() != models.RecordTypeSOA {
|
||||
_, err := GetDomains(r.WithOutDotTail())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if err := r.CheckZone(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
res, err := (recordsDAO{}).Create(database.Client, r)
|
||||
return res, err
|
||||
}
|
||||
|
||||
func CreateRecords(rs []models.IRecord) error {
|
||||
tx := database.Client.Begin()
|
||||
for _, r := range rs {
|
||||
if err := r.CheckZone(); err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err := (recordsDAO{}).Create(tx, r); err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return tx.Commit().Error
|
||||
}
|
||||
|
||||
func GetRecords(cond models.IRecord) ([]models.IRecord, error) {
|
||||
return (recordsDAO{}).GetAll(database.Client, cond)
|
||||
}
|
||||
|
||||
func UpdateRecord(r models.IRecord) error {
|
||||
if err := r.CheckZone(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err := (recordsDAO{}).Update(database.Client, r); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func DeleteRecord(domain, id string) error {
|
||||
ID, err := strconv.Atoi(id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
tx := database.Client.Begin()
|
||||
record, err := (recordsDAO{}).GetOne(tx, &models.Record[models.RecordContentDefault]{ID: uint(ID), Zone: fmt.Sprintf("%s.", domain)})
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
if record.GetType() == models.RecordTypeSOA {
|
||||
tx.Rollback()
|
||||
return gorm.ErrRecordNotFound
|
||||
}
|
||||
|
||||
if err := (recordsDAO{}).Delete(tx, record); err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
return tx.Commit().Error
|
||||
}
|
||||
|
||||
// for metrics
|
||||
func getRecordCounts() (map[string]float64, error) {
|
||||
rows, err := (recordsDAO{}).GetAll(database.Client, &models.Record[models.RecordContentDefault]{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result := make(map[string]float64)
|
||||
for _, row := range rows {
|
||||
record := &models.Record[models.RecordContentDefault]{}
|
||||
if err := record.FromEntity(row); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
result[record.Zone] += 1
|
||||
}
|
||||
return result, nil
|
||||
}
|
89
controllers/settings.go
Normal file
89
controllers/settings.go
Normal file
@@ -0,0 +1,89 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"reCoreD-UI/database"
|
||||
"reCoreD-UI/models"
|
||||
"strings"
|
||||
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
const dnsSep = ","
|
||||
|
||||
type settingsDAO struct {
|
||||
database.BaseDAO[models.ISettings]
|
||||
}
|
||||
|
||||
func SetupDNS(dns ...string) error {
|
||||
settings := models.Settings{Key: models.SettingsKeyDNSServer, Value: strings.Join(dns, dnsSep)}
|
||||
|
||||
if _, err := (settingsDAO{}).UpdateOrCreate(database.Client, &settings, &models.Settings{Key: models.SettingsKeyDNSServer}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetDNS() ([]string, error) {
|
||||
settings, err := (settingsDAO{}).GetOne(database.Client, &models.Settings{Key: models.SettingsKeyDNSServer})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
d, ok := settings.(*models.Settings)
|
||||
if !ok {
|
||||
return nil, errors.New("cannot get dns config")
|
||||
}
|
||||
|
||||
return strings.Split(d.Value, dnsSep), nil
|
||||
}
|
||||
|
||||
func SetupAdmin(username, password string) error {
|
||||
logrus.Debugf("got %s: %s", username, password)
|
||||
|
||||
settingUsername := models.Settings{
|
||||
Key: models.SettingsKeyAdminUsername,
|
||||
Value: username,
|
||||
}
|
||||
settingPassword := models.Settings{
|
||||
Key: models.SettingsKeyAdminPassword,
|
||||
Value: password,
|
||||
}
|
||||
|
||||
tx := database.Client.Begin()
|
||||
if _, err := (settingsDAO{}).UpdateOrCreate(tx, &settingUsername, &models.Settings{Key: models.SettingsKeyAdminUsername}); err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err := (settingsDAO{}).UpdateOrCreate(tx, &settingPassword, &models.Settings{Key: models.SettingsKeyAdminPassword}); err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
return tx.Commit().Error
|
||||
}
|
||||
|
||||
func GetAdmin() (string, string, error) {
|
||||
settings, err := (settingsDAO{}).GetOne(database.Client, &models.Settings{Key: models.SettingsKeyAdminUsername})
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
u, ok := settings.(*models.Settings)
|
||||
if !ok {
|
||||
return "", "", errors.New("cannot get admin username")
|
||||
}
|
||||
username := u.Value
|
||||
|
||||
settings, err = (settingsDAO{}).GetOne(database.Client, &models.Settings{Key: models.SettingsKeyAdminPassword})
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
p, ok := settings.(*models.Settings)
|
||||
password := p.Value
|
||||
|
||||
if !ok {
|
||||
return "", "", errors.New("cannot get admin password")
|
||||
}
|
||||
return username, password, nil
|
||||
}
|
Reference in New Issue
Block a user