working commit
This commit is contained in:
+2
-2
@@ -2,7 +2,7 @@ FROM alpine:3.20 as builder
|
|||||||
|
|
||||||
RUN apk --no-cache add make binutils gcc libc-dev automake autoconf curl
|
RUN apk --no-cache add make binutils gcc libc-dev automake autoconf curl
|
||||||
RUN curl -o /usr/local/lib/go.tar.gz https://dl.google.com/go/go1.24.4.linux-amd64.tar.gz
|
RUN curl -o /usr/local/lib/go.tar.gz https://dl.google.com/go/go1.24.4.linux-amd64.tar.gz
|
||||||
RUN cd /usr/local/lib && tar xzf go.tar.gz
|
RUN cd /usr/local/lib && tar xzf go.tar.gz && rm -f go.tar.gz
|
||||||
RUN cd /usr/local/bin && ln -sf ../lib/go/bin/* .
|
RUN cd /usr/local/bin && ln -sf ../lib/go/bin/* .
|
||||||
|
|
||||||
WORKDIR /app/src/
|
WORKDIR /app/src/
|
||||||
@@ -19,4 +19,4 @@ RUN chmod 1777 /var
|
|||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
#USER daemon:daemon
|
#USER daemon:daemon
|
||||||
ENTRYPOINT ["/app/sbin/certmanagerd"]
|
ENTRYPOINT ["/app/sbin/mbased"]
|
||||||
|
|||||||
+32
-7
@@ -13,25 +13,50 @@ mbased$(EXEEXT): $(mbased_SOURCES) $(EXTRA_mbased_SOURCES)
|
|||||||
env CGO_ENABLED=1 $(GO) build $(GOFLAGS) -o mbased$(EXEEXT) $(mbased_SOURCES)
|
env CGO_ENABLED=1 $(GO) build $(GOFLAGS) -o mbased$(EXEEXT) $(mbased_SOURCES)
|
||||||
|
|
||||||
mbasedump_SOURCES = \
|
mbasedump_SOURCES = \
|
||||||
|
cmd/mbasedump/rest.go \
|
||||||
cmd/mbasedump/printr.go \
|
cmd/mbasedump/printr.go \
|
||||||
cmd/mbasedump/main.go \
|
cmd/mbasedump/main.go \
|
||||||
|
cmd/mbasedump/dump.go \
|
||||||
cmd/mbasedump/util.go
|
cmd/mbasedump/util.go
|
||||||
|
|
||||||
mbasedump$(EXEEXT): $(mbasedump_SOURCES) $(EXTRA_mbased_SOURCES)
|
mbasedump$(EXEEXT): $(mbasedump_SOURCES) $(EXTRA_mbased_SOURCES)
|
||||||
env CGO_ENABLED=1 $(GO) build $(GOFLAGS) -o mbasedump$(EXEEXT) $(mbasedump_SOURCES)
|
env CGO_ENABLED=1 $(GO) build $(GOFLAGS) -o mbasedump$(EXEEXT) $(mbasedump_SOURCES)
|
||||||
|
|
||||||
mbasectl_SOURCES = cmd/mbasectl/main.go \
|
mbasectl_SOURCES = \
|
||||||
cmd/mbasectl/account.go \
|
cmd/mbasectl/main.go \
|
||||||
cmd/mbasectl/grant.go \
|
cmd/mbasectl/util.go
|
||||||
cmd/mbasectl/dump.go
|
|
||||||
|
|
||||||
|
EXTRA_mbasectl_SOURCES = \
|
||||||
|
cmd/mbasectl/account/create.go \
|
||||||
|
cmd/mbasectl/account/delete.go \
|
||||||
|
cmd/mbasectl/account/list.go \
|
||||||
|
cmd/mbasectl/account/printr.go \
|
||||||
|
cmd/mbasectl/account/update.go \
|
||||||
|
cmd/mbasectl/account/util.go \
|
||||||
|
cmd/mbasectl/grant/create.go \
|
||||||
|
cmd/mbasectl/grant/delete.go \
|
||||||
|
cmd/mbasectl/grant/printr.go \
|
||||||
|
cmd/mbasectl/grant/util.go
|
||||||
|
|
||||||
mbasectl$(EXEEXT): $(mbasectl_SOURCES) $(EXTRA_mbased_SOURCES)
|
mbasectl$(EXEEXT): $(mbasectl_SOURCES) $(EXTRA_mbased_SOURCES)
|
||||||
env CGO_ENABLED=0 $(GO) build $(GOFLAGS) -o mbasectl$(EXEEXT) $(mbasectl_SOURCES)
|
env CGO_ENABLED=0 $(GO) build $(GOFLAGS) -o mbasectl$(EXEEXT) $(mbasectl_SOURCES)
|
||||||
|
|
||||||
mbaseadmin_SOURCES = cmd/mbaseadmin/main.go \
|
mbaseadmin_SOURCES = \
|
||||||
cmd/mbaseadmin/account.go \
|
cmd/mbaseadmin/main.go \
|
||||||
cmd/mbaseadmin/grant.go
|
cmd/mbaseadmin/util.go
|
||||||
|
|
||||||
|
EXTRA_mbaseadmin_SOURCES = \
|
||||||
|
cmd/mbaseadmin/account/create.go \
|
||||||
|
cmd/mbaseadmin/account/delete.go \
|
||||||
|
cmd/mbaseadmin/account/list.go \
|
||||||
|
cmd/mbaseadmin/account/printr.go \
|
||||||
|
cmd/mbaseadmin/account/update.go \
|
||||||
|
cmd/mbaseadmin/account/util.go \
|
||||||
|
cmd/mbaseadmin/grant/create.go \
|
||||||
|
cmd/mbaseadmin/grant/delete.go \
|
||||||
|
cmd/mbaseadmin/grant/printr.go \
|
||||||
|
cmd/mbaseadmin/grant/util.go
|
||||||
|
|
||||||
|
|
||||||
mbaseadmin$(EXEEXT): $(mbaseadmin_SOURCES) $(EXTRA_mbased_SOURCES)
|
mbaseadmin$(EXEEXT): $(mbaseadmin_SOURCES) $(EXTRA_mbased_SOURCES)
|
||||||
env CGO_ENABLED=1 $(GO) build $(GOFLAGS) -o mbaseadmin$(EXEEXT) $(mbaseadmin_SOURCES)
|
env CGO_ENABLED=1 $(GO) build $(GOFLAGS) -o mbaseadmin$(EXEEXT) $(mbaseadmin_SOURCES)
|
||||||
|
|||||||
+37
-10
@@ -146,9 +146,11 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
|
|||||||
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
||||||
am__v_CCLD_0 = @echo " CCLD " $@;
|
am__v_CCLD_0 = @echo " CCLD " $@;
|
||||||
am__v_CCLD_1 =
|
am__v_CCLD_1 =
|
||||||
SOURCES = $(mbaseadmin_SOURCES) $(mbasectl_SOURCES) $(mbased_SOURCES) \
|
SOURCES = $(mbaseadmin_SOURCES) $(EXTRA_mbaseadmin_SOURCES) \
|
||||||
$(EXTRA_mbased_SOURCES) $(mbasedump_SOURCES)
|
$(mbasectl_SOURCES) $(EXTRA_mbasectl_SOURCES) \
|
||||||
DIST_SOURCES = $(mbaseadmin_SOURCES) $(mbasectl_SOURCES) \
|
$(mbased_SOURCES) $(EXTRA_mbased_SOURCES) $(mbasedump_SOURCES)
|
||||||
|
DIST_SOURCES = $(mbaseadmin_SOURCES) $(EXTRA_mbaseadmin_SOURCES) \
|
||||||
|
$(mbasectl_SOURCES) $(EXTRA_mbasectl_SOURCES) \
|
||||||
$(mbased_SOURCES) $(EXTRA_mbased_SOURCES) $(mbasedump_SOURCES)
|
$(mbased_SOURCES) $(EXTRA_mbased_SOURCES) $(mbasedump_SOURCES)
|
||||||
am__can_run_installinfo = \
|
am__can_run_installinfo = \
|
||||||
case $$AM_UPDATE_INFO_DIR in \
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
@@ -322,18 +324,43 @@ AUTOMAKE_OPTIONS = foreign no-dependencies no-installinfo
|
|||||||
SUFFIXES = .go
|
SUFFIXES = .go
|
||||||
mbased_SOURCES = cmd/mbased/main.go
|
mbased_SOURCES = cmd/mbased/main.go
|
||||||
mbasedump_SOURCES = \
|
mbasedump_SOURCES = \
|
||||||
|
cmd/mbasedump/rest.go \
|
||||||
cmd/mbasedump/printr.go \
|
cmd/mbasedump/printr.go \
|
||||||
cmd/mbasedump/main.go \
|
cmd/mbasedump/main.go \
|
||||||
|
cmd/mbasedump/dump.go \
|
||||||
cmd/mbasedump/util.go
|
cmd/mbasedump/util.go
|
||||||
|
|
||||||
mbasectl_SOURCES = cmd/mbasectl/main.go \
|
mbasectl_SOURCES = \
|
||||||
cmd/mbasectl/account.go \
|
cmd/mbasectl/main.go \
|
||||||
cmd/mbasectl/grant.go \
|
cmd/mbasectl/util.go
|
||||||
cmd/mbasectl/dump.go
|
|
||||||
|
|
||||||
mbaseadmin_SOURCES = cmd/mbaseadmin/main.go \
|
EXTRA_mbasectl_SOURCES = \
|
||||||
cmd/mbaseadmin/account.go \
|
cmd/mbasectl/account/create.go \
|
||||||
cmd/mbaseadmin/grant.go
|
cmd/mbasectl/account/delete.go \
|
||||||
|
cmd/mbasectl/account/list.go \
|
||||||
|
cmd/mbasectl/account/printr.go \
|
||||||
|
cmd/mbasectl/account/update.go \
|
||||||
|
cmd/mbasectl/account/util.go \
|
||||||
|
cmd/mbasectl/grant/create.go \
|
||||||
|
cmd/mbasectl/grant/delete.go \
|
||||||
|
cmd/mbasectl/grant/printr.go \
|
||||||
|
cmd/mbasectl/grant/util.go
|
||||||
|
|
||||||
|
mbaseadmin_SOURCES = \
|
||||||
|
cmd/mbaseadmin/main.go \
|
||||||
|
cmd/mbaseadmin/util.go
|
||||||
|
|
||||||
|
EXTRA_mbaseadmin_SOURCES = \
|
||||||
|
cmd/mbaseadmin/account/create.go \
|
||||||
|
cmd/mbaseadmin/account/delete.go \
|
||||||
|
cmd/mbaseadmin/account/list.go \
|
||||||
|
cmd/mbaseadmin/account/printr.go \
|
||||||
|
cmd/mbaseadmin/account/update.go \
|
||||||
|
cmd/mbaseadmin/account/util.go \
|
||||||
|
cmd/mbaseadmin/grant/create.go \
|
||||||
|
cmd/mbaseadmin/grant/delete.go \
|
||||||
|
cmd/mbaseadmin/grant/printr.go \
|
||||||
|
cmd/mbaseadmin/grant/util.go
|
||||||
|
|
||||||
EXTRA_mbased_SOURCES =
|
EXTRA_mbased_SOURCES =
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ import (
|
|||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (hand *Handler) Authentificate(ctx context.Context) (int64, error) {
|
func (hand *Handler) Authentificate(ctx context.Context) (string, error) {
|
||||||
var err error
|
var err error
|
||||||
var accountID int64
|
var accountID string
|
||||||
|
|
||||||
meta, _ := metadata.FromIncomingContext(ctx)
|
meta, _ := metadata.FromIncomingContext(ctx)
|
||||||
usernameArr := meta["username"]
|
usernameArr := meta["username"]
|
||||||
|
|||||||
+11
-11
@@ -5,15 +5,15 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"mbase/app/descr"
|
"mbase/pkg/descr"
|
||||||
"mbase/pkg/auxid"
|
"mbase/pkg/auxuuid"
|
||||||
"mbase/pkg/auxpwd"
|
"mbase/pkg/auxpwd"
|
||||||
"mbase/pkg/mbctl"
|
"mbase/pkg/mbctl"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (lg *Logic) ValidateAcount(ctx context.Context, username, password string) (bool, int64, error) {
|
func (lg *Logic) ValidateAcount(ctx context.Context, username, password string) (bool, string, error) {
|
||||||
var err error
|
var err error
|
||||||
var accountID int64
|
var accountID string
|
||||||
var valid bool
|
var valid bool
|
||||||
|
|
||||||
lg.WaitRestoring()
|
lg.WaitRestoring()
|
||||||
@@ -32,7 +32,7 @@ func (lg *Logic) ValidateAcount(ctx context.Context, username, password string)
|
|||||||
return valid, accountID, err
|
return valid, accountID, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lg *Logic) CreateAccount(ctx context.Context, accountID int64, params *mbctl.CreateAccountParams) (*mbctl.CreateAccountResult, error) {
|
func (lg *Logic) CreateAccount(ctx context.Context, accountID string, params *mbctl.CreateAccountParams) (*mbctl.CreateAccountResult, error) {
|
||||||
var err error
|
var err error
|
||||||
res := &mbctl.CreateAccountResult{}
|
res := &mbctl.CreateAccountResult{}
|
||||||
|
|
||||||
@@ -68,7 +68,7 @@ func (lg *Logic) CreateAccount(ctx context.Context, accountID int64, params *mbc
|
|||||||
now := time.Now().Format(time.RFC3339)
|
now := time.Now().Format(time.RFC3339)
|
||||||
passhash := auxpwd.MakeSHA256Hash([]byte(params.Password))
|
passhash := auxpwd.MakeSHA256Hash([]byte(params.Password))
|
||||||
accountDescr := &descr.Account{
|
accountDescr := &descr.Account{
|
||||||
ID: auxid.GenID(),
|
ID: auxuuid.NewUUID(),
|
||||||
Username: params.Username,
|
Username: params.Username,
|
||||||
Passhash: passhash,
|
Passhash: passhash,
|
||||||
Disabled: false,
|
Disabled: false,
|
||||||
@@ -83,7 +83,7 @@ func (lg *Logic) CreateAccount(ctx context.Context, accountID int64, params *mbc
|
|||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lg *Logic) UpdateAccount(ctx context.Context, accountID int64, params *mbctl.UpdateAccountParams) (*mbctl.UpdateAccountResult, error) {
|
func (lg *Logic) UpdateAccount(ctx context.Context, accountID string, params *mbctl.UpdateAccountParams) (*mbctl.UpdateAccountResult, error) {
|
||||||
var err error
|
var err error
|
||||||
res := &mbctl.UpdateAccountResult{}
|
res := &mbctl.UpdateAccountResult{}
|
||||||
|
|
||||||
@@ -102,7 +102,7 @@ func (lg *Logic) UpdateAccount(ctx context.Context, accountID int64, params *mbc
|
|||||||
var accountDescr *descr.Account
|
var accountDescr *descr.Account
|
||||||
var accountExists bool
|
var accountExists bool
|
||||||
switch {
|
switch {
|
||||||
case params.AccountID != 0:
|
case params.AccountID != "":
|
||||||
accountExists, accountDescr, err = lg.db.GetAccountByID(ctx, params.AccountID)
|
accountExists, accountDescr, err = lg.db.GetAccountByID(ctx, params.AccountID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return res, err
|
return res, err
|
||||||
@@ -140,7 +140,7 @@ func (lg *Logic) UpdateAccount(ctx context.Context, accountID int64, params *mbc
|
|||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lg *Logic) DeleteAccount(ctx context.Context, accountID int64, params *mbctl.DeleteAccountParams) (*mbctl.DeleteAccountResult, error) {
|
func (lg *Logic) DeleteAccount(ctx context.Context, accountID string, params *mbctl.DeleteAccountParams) (*mbctl.DeleteAccountResult, error) {
|
||||||
var err error
|
var err error
|
||||||
res := &mbctl.DeleteAccountResult{}
|
res := &mbctl.DeleteAccountResult{}
|
||||||
|
|
||||||
@@ -159,7 +159,7 @@ func (lg *Logic) DeleteAccount(ctx context.Context, accountID int64, params *mbc
|
|||||||
var accountDescr *descr.Account
|
var accountDescr *descr.Account
|
||||||
var accountExists bool
|
var accountExists bool
|
||||||
switch {
|
switch {
|
||||||
case params.AccountID != 0:
|
case params.AccountID != "":
|
||||||
accountExists, accountDescr, err = lg.db.GetAccountByID(ctx, params.AccountID)
|
accountExists, accountDescr, err = lg.db.GetAccountByID(ctx, params.AccountID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return res, err
|
return res, err
|
||||||
@@ -186,7 +186,7 @@ func (lg *Logic) DeleteAccount(ctx context.Context, accountID int64, params *mbc
|
|||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lg *Logic) ListAccounts(ctx context.Context, accountID int64, params *mbctl.ListAccountsParams) (*mbctl.ListAccountsResult, error) {
|
func (lg *Logic) ListAccounts(ctx context.Context, accountID string, params *mbctl.ListAccountsParams) (*mbctl.ListAccountsResult, error) {
|
||||||
var err error
|
var err error
|
||||||
res := &mbctl.ListAccountsResult{
|
res := &mbctl.ListAccountsResult{
|
||||||
Accounts: make([]*mbctl.AccountShortDescr, 0),
|
Accounts: make([]*mbctl.AccountShortDescr, 0),
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"mbase/app/descr"
|
"mbase/pkg/descr"
|
||||||
"mbase/pkg/auxid"
|
"mbase/pkg/auxuuid"
|
||||||
"mbase/pkg/auxpwd"
|
"mbase/pkg/auxpwd"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -23,9 +23,9 @@ func (lg *Logic) CleanDatabase(ctx context.Context) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lg *Logic) SeedAccount(ctx context.Context) (int64, error) {
|
func (lg *Logic) SeedAccount(ctx context.Context) (string, error) {
|
||||||
var err error
|
var err error
|
||||||
var accountID int64
|
var accountID string
|
||||||
accountDescrs, err := lg.db.ReducedListAccounts(ctx)
|
accountDescrs, err := lg.db.ReducedListAccounts(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return accountID, err
|
return accountID, err
|
||||||
@@ -35,7 +35,7 @@ func (lg *Logic) SeedAccount(ctx context.Context) (int64, error) {
|
|||||||
now := time.Now().Format(time.RFC3339)
|
now := time.Now().Format(time.RFC3339)
|
||||||
passhash := auxpwd.MakeSHA256Hash([]byte(defaultSeedPassword))
|
passhash := auxpwd.MakeSHA256Hash([]byte(defaultSeedPassword))
|
||||||
accountDescr := &descr.Account{
|
accountDescr := &descr.Account{
|
||||||
ID: auxid.GenID(),
|
ID: auxuuid.NewUUID(),
|
||||||
Username: defaultSeedUsername,
|
Username: defaultSeedUsername,
|
||||||
Passhash: passhash,
|
Passhash: passhash,
|
||||||
Disabled: false,
|
Disabled: false,
|
||||||
@@ -63,9 +63,7 @@ func (lg *Logic) SeedAccount(ctx context.Context) (int64, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return accountID, err
|
return accountID, err
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -5,13 +5,13 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"mbase/app/descr"
|
"mbase/pkg/descr"
|
||||||
"mbase/pkg/mbctl"
|
"mbase/pkg/mbctl"
|
||||||
|
|
||||||
"go.yaml.in/yaml/v4"
|
"go.yaml.in/yaml/v4"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (lg *Logic) GetDump(ctx context.Context, accountID int64, params *mbctl.GetDumpParams) (*mbctl.GetDumpResult, error) {
|
func (lg *Logic) GetDump(ctx context.Context, accountID string, params *mbctl.GetDumpParams) (*mbctl.GetDumpResult, error) {
|
||||||
var err error
|
var err error
|
||||||
res := &mbctl.GetDumpResult{}
|
res := &mbctl.GetDumpResult{}
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ func (lg *Logic) GetDump(ctx context.Context, accountID int64, params *mbctl.Get
|
|||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lg *Logic) RestoreDump(ctx context.Context, accountID int64, params *mbctl.RestoreDumpParams) (*mbctl.RestoreDumpResult, error) {
|
func (lg *Logic) RestoreDump(ctx context.Context, accountID string, params *mbctl.RestoreDumpParams) (*mbctl.RestoreDumpResult, error) {
|
||||||
var err error
|
var err error
|
||||||
res := &mbctl.RestoreDumpResult{}
|
res := &mbctl.RestoreDumpResult{}
|
||||||
|
|
||||||
|
|||||||
+7
-7
@@ -5,12 +5,12 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"mbase/app/descr"
|
"mbase/pkg/descr"
|
||||||
"mbase/pkg/auxid"
|
"mbase/pkg/auxuuid"
|
||||||
"mbase/pkg/mbctl"
|
"mbase/pkg/mbctl"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (lg *Logic) SetGrant(ctx context.Context, accountID int64, params *mbctl.SetGrantParams) (*mbctl.SetGrantResult, error) {
|
func (lg *Logic) SetGrant(ctx context.Context, accountID string, params *mbctl.SetGrantParams) (*mbctl.SetGrantResult, error) {
|
||||||
var err error
|
var err error
|
||||||
res := &mbctl.SetGrantResult{}
|
res := &mbctl.SetGrantResult{}
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ func (lg *Logic) SetGrant(ctx context.Context, accountID int64, params *mbctl.Se
|
|||||||
var accountDescr *descr.Account
|
var accountDescr *descr.Account
|
||||||
var accountExists bool
|
var accountExists bool
|
||||||
switch {
|
switch {
|
||||||
case params.AccountID != 0:
|
case params.AccountID != "":
|
||||||
accountExists, accountDescr, err = lg.db.GetAccountByID(ctx, params.AccountID)
|
accountExists, accountDescr, err = lg.db.GetAccountByID(ctx, params.AccountID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return res, err
|
return res, err
|
||||||
@@ -70,7 +70,7 @@ func (lg *Logic) SetGrant(ctx context.Context, accountID int64, params *mbctl.Se
|
|||||||
}
|
}
|
||||||
now := time.Now().Format(time.RFC3339)
|
now := time.Now().Format(time.RFC3339)
|
||||||
grantDescr := &descr.Grant{
|
grantDescr := &descr.Grant{
|
||||||
ID: auxid.GenID(),
|
ID: auxuuid.NewUUID(),
|
||||||
AccountID: accountDescr.ID,
|
AccountID: accountDescr.ID,
|
||||||
CreatedAt: now,
|
CreatedAt: now,
|
||||||
Operation: params.Operation,
|
Operation: params.Operation,
|
||||||
@@ -82,7 +82,7 @@ func (lg *Logic) SetGrant(ctx context.Context, accountID int64, params *mbctl.Se
|
|||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lg *Logic) DeleteGrant(ctx context.Context, accountID int64, params *mbctl.DeleteGrantParams) (*mbctl.DeleteGrantResult, error) {
|
func (lg *Logic) DeleteGrant(ctx context.Context, accountID string, params *mbctl.DeleteGrantParams) (*mbctl.DeleteGrantResult, error) {
|
||||||
var err error
|
var err error
|
||||||
res := &mbctl.DeleteGrantResult{}
|
res := &mbctl.DeleteGrantResult{}
|
||||||
|
|
||||||
@@ -116,7 +116,7 @@ func (lg *Logic) DeleteGrant(ctx context.Context, accountID int64, params *mbctl
|
|||||||
var accountDescr *descr.Account
|
var accountDescr *descr.Account
|
||||||
var accountExists bool
|
var accountExists bool
|
||||||
switch {
|
switch {
|
||||||
case params.AccountID != 0:
|
case params.AccountID != "":
|
||||||
accountExists, accountDescr, err = lg.db.GetAccountByID(ctx, params.AccountID)
|
accountExists, accountDescr, err = lg.db.GetAccountByID(ctx, params.AccountID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return res, err
|
return res, err
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package maindb
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"mbase/app/descr"
|
"mbase/pkg/descr"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (db *Database) InsertAccount(ctx context.Context, account *descr.Account) error {
|
func (db *Database) InsertAccount(ctx context.Context, account *descr.Account) error {
|
||||||
@@ -19,7 +19,7 @@ func (db *Database) InsertAccount(ctx context.Context, account *descr.Account) e
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *Database) UpdateAccountByID(ctx context.Context, accountID int64, account *descr.Account) error {
|
func (db *Database) UpdateAccountByID(ctx context.Context, accountID string, account *descr.Account) error {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
request := `UPDATE account SET username = $1, passhash = $2, disabled = $3, updated_at = $4 WHERE id = $5`
|
request := `UPDATE account SET username = $1, passhash = $2, disabled = $3, updated_at = $4 WHERE id = $5`
|
||||||
@@ -52,7 +52,7 @@ func (db *Database) CompletedListAccounts(ctx context.Context) ([]descr.Account,
|
|||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *Database) GetAccountByID(ctx context.Context, accountID int64) (bool, *descr.Account, error) {
|
func (db *Database) GetAccountByID(ctx context.Context, accountID string) (bool, *descr.Account, error) {
|
||||||
var err error
|
var err error
|
||||||
var res *descr.Account
|
var res *descr.Account
|
||||||
var exists bool
|
var exists bool
|
||||||
@@ -91,7 +91,7 @@ func (db *Database) GetAccountByUsername(ctx context.Context, username string) (
|
|||||||
return exists, res, err
|
return exists, res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *Database) DeleteAccountByID(ctx context.Context, accountID int64) error {
|
func (db *Database) DeleteAccountByID(ctx context.Context, accountID string) error {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
request := `DELETE FROM account WHERE id = $1`
|
request := `DELETE FROM account WHERE id = $1`
|
||||||
|
|||||||
+3
-34
@@ -11,39 +11,9 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const schema = `
|
const schema = `
|
||||||
--- DROP TABLE IF EXISTS issuer;
|
|
||||||
CREATE TABLE IF NOT EXISTS issuer (
|
|
||||||
id INT NOT NULL,
|
|
||||||
name TEXT NOT NULL,
|
|
||||||
cert TEXT NOT NULL,
|
|
||||||
key TEXT,
|
|
||||||
signer_id INT NOT NULL,
|
|
||||||
signer_name TEXT NOT NULL,
|
|
||||||
revoked BOOL
|
|
||||||
);
|
|
||||||
CREATE UNIQUE INDEX IF NOT EXISTS issuer_index01
|
|
||||||
ON issuer(id);
|
|
||||||
CREATE UNIQUE INDEX IF NOT EXISTS issuer_index02
|
|
||||||
ON issuer(name);
|
|
||||||
|
|
||||||
--- DROP TABLE IF EXISTS service;
|
|
||||||
CREATE TABLE IF NOT EXISTS service (
|
|
||||||
id INT NOT NULL,
|
|
||||||
issuer_id INT NOT NULL,
|
|
||||||
issuer_name TEXT NOT NULL,
|
|
||||||
name TEXT NOT NULL,
|
|
||||||
cert TEXT NOT NULL,
|
|
||||||
key TEXT NOT NULL,
|
|
||||||
revoked BOOL
|
|
||||||
);
|
|
||||||
CREATE UNIQUE INDEX IF NOT EXISTS service_index01
|
|
||||||
ON service(id);
|
|
||||||
CREATE UNIQUE INDEX IF NOT EXISTS service_index02
|
|
||||||
ON service(name);
|
|
||||||
|
|
||||||
--- DROP TABLE IF EXISTS account;
|
--- DROP TABLE IF EXISTS account;
|
||||||
CREATE TABLE IF NOT EXISTS account (
|
CREATE TABLE IF NOT EXISTS account (
|
||||||
id INT NOT NULL,
|
id TEXT NOT NULL,
|
||||||
username TEXT NOT NULL,
|
username TEXT NOT NULL,
|
||||||
passhash TEXT NOT NULL,
|
passhash TEXT NOT NULL,
|
||||||
created_at TEXT NOT NULL,
|
created_at TEXT NOT NULL,
|
||||||
@@ -55,11 +25,10 @@ const schema = `
|
|||||||
CREATE UNIQUE INDEX IF NOT EXISTS account_index02
|
CREATE UNIQUE INDEX IF NOT EXISTS account_index02
|
||||||
ON account(username);
|
ON account(username);
|
||||||
|
|
||||||
|
|
||||||
--- DROP TABLE IF EXISTS grant;
|
--- DROP TABLE IF EXISTS grant;
|
||||||
CREATE TABLE IF NOT EXISTS grant (
|
CREATE TABLE IF NOT EXISTS grant (
|
||||||
id INT NOT NULL,
|
id TEXT NOT NULL,
|
||||||
account_id INT NOT NULL,
|
account_id TEXT NOT NULL,
|
||||||
operation TEXT NOT NULL,
|
operation TEXT NOT NULL,
|
||||||
created_at TEXT NOT NULL
|
created_at TEXT NOT NULL
|
||||||
);
|
);
|
||||||
|
|||||||
+5
-5
@@ -3,7 +3,7 @@ package maindb
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"mbase/app/descr"
|
"mbase/pkg/descr"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (db *Database) InsertGrant(ctx context.Context, grant *descr.Grant) error {
|
func (db *Database) InsertGrant(ctx context.Context, grant *descr.Grant) error {
|
||||||
@@ -17,7 +17,7 @@ func (db *Database) InsertGrant(ctx context.Context, grant *descr.Grant) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *Database) ListGrantsByAccountID(ctx context.Context, accountID int64) ([]descr.Grant, error) {
|
func (db *Database) ListGrantsByAccountID(ctx context.Context, accountID string) ([]descr.Grant, error) {
|
||||||
var err error
|
var err error
|
||||||
request := `SELECT * FROM grant WHERE account_id = $1`
|
request := `SELECT * FROM grant WHERE account_id = $1`
|
||||||
res := make([]descr.Grant, 0)
|
res := make([]descr.Grant, 0)
|
||||||
@@ -39,7 +39,7 @@ func (db *Database) ListGrants(ctx context.Context) ([]descr.Grant, error) {
|
|||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *Database) GetGrant(ctx context.Context, accountID int64, operation string) (bool, *descr.Grant, error) {
|
func (db *Database) GetGrant(ctx context.Context, accountID, operation string) (bool, *descr.Grant, error) {
|
||||||
var err error
|
var err error
|
||||||
res := &descr.Grant{}
|
res := &descr.Grant{}
|
||||||
request := `SELECT * FROM grant WHERE account_id = $1 AND operation = $2 LIMIT 1`
|
request := `SELECT * FROM grant WHERE account_id = $1 AND operation = $2 LIMIT 1`
|
||||||
@@ -56,7 +56,7 @@ func (db *Database) GetGrant(ctx context.Context, accountID int64, operation str
|
|||||||
return true, res, err
|
return true, res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *Database) DeleteGrantByAccountID(ctx context.Context, grantID int64, operation string) error {
|
func (db *Database) DeleteGrantByAccountID(ctx context.Context, grantID, operation string) error {
|
||||||
var err error
|
var err error
|
||||||
request := `DELETE FROM grant WHERE account_id = $1 AND operation = $2`
|
request := `DELETE FROM grant WHERE account_id = $1 AND operation = $2`
|
||||||
_, err = db.db.Exec(request, grantID, operation)
|
_, err = db.db.Exec(request, grantID, operation)
|
||||||
@@ -66,7 +66,7 @@ func (db *Database) DeleteGrantByAccountID(ctx context.Context, grantID int64, o
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *Database) DeleteAllGrantsForAccountID(ctx context.Context, grantID int64) error {
|
func (db *Database) DeleteAllGrantsForAccountID(ctx context.Context, grantID string) error {
|
||||||
var err error
|
var err error
|
||||||
request := `DELETE FROM grant WHERE account_id = $1`
|
request := `DELETE FROM grant WHERE account_id = $1`
|
||||||
_, err = db.db.Exec(request, grantID)
|
_, err = db.db.Exec(request, grantID)
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import (
|
|||||||
|
|
||||||
"mbase/app/config"
|
"mbase/app/config"
|
||||||
"mbase/app/maindb"
|
"mbase/app/maindb"
|
||||||
"mbase/app/descr"
|
"mbase/pkg/descr"
|
||||||
"mbase/app/logic"
|
"mbase/app/logic"
|
||||||
"mbase/pkg/aux509"
|
"mbase/pkg/aux509"
|
||||||
"mbase/pkg/logger"
|
"mbase/pkg/logger"
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"mbase/pkg/mbctl"
|
"mbase/pkg/mbctl"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (util *Util) CreateAccount(ctx context.Context, operID int64) (*mbctl.CreateAccountResult, error) {
|
func (util *Util) CreateAccount(ctx context.Context, operID string) (*mbctl.CreateAccountResult, error) {
|
||||||
var err error
|
var err error
|
||||||
res := &mbctl.CreateAccountResult{}
|
res := &mbctl.CreateAccountResult{}
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@ func (util *Util) CreateAccount(ctx context.Context, operID int64) (*mbctl.Creat
|
|||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (util *Util) DeleteAccount(ctx context.Context, operID int64) (*mbctl.DeleteAccountResult, error) {
|
func (util *Util) DeleteAccount(ctx context.Context, operID string) (*mbctl.DeleteAccountResult, error) {
|
||||||
var err error
|
var err error
|
||||||
res := &mbctl.DeleteAccountResult{}
|
res := &mbctl.DeleteAccountResult{}
|
||||||
params := &mbctl.DeleteAccountParams{
|
params := &mbctl.DeleteAccountParams{
|
||||||
@@ -35,7 +35,7 @@ func (util *Util) DeleteAccount(ctx context.Context, operID int64) (*mbctl.Delet
|
|||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (util *Util) ListAccounts(ctx context.Context, operID int64) (*mbctl.ListAccountsResult, error) {
|
func (util *Util) ListAccounts(ctx context.Context, operID string) (*mbctl.ListAccountsResult, error) {
|
||||||
var err error
|
var err error
|
||||||
res := &mbctl.ListAccountsResult{}
|
res := &mbctl.ListAccountsResult{}
|
||||||
params := &mbctl.ListAccountsParams{}
|
params := &mbctl.ListAccountsParams{}
|
||||||
@@ -46,7 +46,7 @@ func (util *Util) ListAccounts(ctx context.Context, operID int64) (*mbctl.ListAc
|
|||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (util *Util) UpdateAccount(ctx context.Context, operID int64) (*mbctl.UpdateAccountResult, error) {
|
func (util *Util) UpdateAccount(ctx context.Context, operID string) (*mbctl.UpdateAccountResult, error) {
|
||||||
var err error
|
var err error
|
||||||
res := &mbctl.UpdateAccountResult{}
|
res := &mbctl.UpdateAccountResult{}
|
||||||
params := &mbctl.UpdateAccountParams{
|
params := &mbctl.UpdateAccountParams{
|
||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"mbase/pkg/mbctl"
|
"mbase/pkg/mbctl"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (util *Util) SetGrant(ctx context.Context, operID int64) (*mbctl.SetGrantResult, error) {
|
func (util *Util) SetGrant(ctx context.Context, operID string) (*mbctl.SetGrantResult, error) {
|
||||||
var err error
|
var err error
|
||||||
res := &mbctl.SetGrantResult{}
|
res := &mbctl.SetGrantResult{}
|
||||||
params := &mbctl.SetGrantParams{
|
params := &mbctl.SetGrantParams{
|
||||||
@@ -24,7 +24,7 @@ func (util *Util) SetGrant(ctx context.Context, operID int64) (*mbctl.SetGrantRe
|
|||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (util *Util) DeleteGrant(ctx context.Context, operID int64) (*mbctl.DeleteGrantResult, error) {
|
func (util *Util) DeleteGrant(ctx context.Context, operID string) (*mbctl.DeleteGrantResult, error) {
|
||||||
var err error
|
var err error
|
||||||
res := &mbctl.DeleteGrantResult{}
|
res := &mbctl.DeleteGrantResult{}
|
||||||
params := &mbctl.DeleteGrantParams{
|
params := &mbctl.DeleteGrantParams{
|
||||||
@@ -0,0 +1,467 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2024 Oleg Borodin <borodin@unix7.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"mbase/app/config"
|
||||||
|
"mbase/app/maindb"
|
||||||
|
"mbase/pkg/descr"
|
||||||
|
"mbase/app/logic"
|
||||||
|
|
||||||
|
"sigs.k8s.io/yaml"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
rcFilename = ".certmanager.yaml"
|
||||||
|
|
||||||
|
helpCmd = "help"
|
||||||
|
|
||||||
|
createAccountCmd = "createAccount"
|
||||||
|
updateAccountCmd = "updateAccount"
|
||||||
|
deleteAccountCmd = "deleteAccount"
|
||||||
|
listAccountsCmd = "listAccounts"
|
||||||
|
|
||||||
|
setGrantCmd = "setGrant"
|
||||||
|
deleteGrantCmd = "deleteGrant"
|
||||||
|
|
||||||
|
initDatabaseCmd = "initDatabase"
|
||||||
|
seedAccountCmd = "seedAccount"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var err error
|
||||||
|
util := NewUtil()
|
||||||
|
err = util.Build()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Build error: %v\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
err = util.Exec()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Exec error: %v\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Util struct {
|
||||||
|
subCmd string
|
||||||
|
cmdTimeout int64
|
||||||
|
|
||||||
|
conf *config.Config
|
||||||
|
lg *logic.Logic
|
||||||
|
db *maindb.Database
|
||||||
|
state descr.Server
|
||||||
|
sfile string
|
||||||
|
|
||||||
|
accessUsername string
|
||||||
|
accessPassword string
|
||||||
|
accountID int64
|
||||||
|
username string
|
||||||
|
password string
|
||||||
|
disable bool
|
||||||
|
newUsername string
|
||||||
|
newPassword string
|
||||||
|
operation string
|
||||||
|
quiet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUtil() *Util {
|
||||||
|
var util Util
|
||||||
|
util.cmdTimeout = 120
|
||||||
|
return &util
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) GetOpt() error {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
exeName := filepath.Base(os.Args[0])
|
||||||
|
|
||||||
|
flag.Int64Var(&util.cmdTimeout, "timeout", util.cmdTimeout, "command execution timeout")
|
||||||
|
flag.StringVar(&util.accessUsername, "user", util.accessUsername, "access login")
|
||||||
|
flag.StringVar(&util.accessPassword, "pass", util.accessPassword, "access password")
|
||||||
|
flag.BoolVar(&util.quiet, "quiet", util.quiet, "don't print result")
|
||||||
|
|
||||||
|
help := func() {
|
||||||
|
fmt.Println("")
|
||||||
|
fmt.Printf("Usage: %s [option] command [command option]\n", exeName)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf(" %s, %s, %s, %s,\n",
|
||||||
|
createAccountCmd,
|
||||||
|
deleteAccountCmd,
|
||||||
|
listAccountsCmd,
|
||||||
|
updateAccountCmd)
|
||||||
|
fmt.Printf(" %s, %s\n",
|
||||||
|
setGrantCmd,
|
||||||
|
deleteGrantCmd)
|
||||||
|
fmt.Printf(" %s, %s\n",
|
||||||
|
initDatabaseCmd,
|
||||||
|
seedAccountCmd)
|
||||||
|
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Global options:\n")
|
||||||
|
flag.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flag.Usage = help
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
args := flag.Args()
|
||||||
|
|
||||||
|
var subCmd string
|
||||||
|
var subArgs []string
|
||||||
|
if len(args) > 0 {
|
||||||
|
subCmd = args[0]
|
||||||
|
subArgs = args[1:]
|
||||||
|
}
|
||||||
|
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
switch subCmd {
|
||||||
|
case helpCmd:
|
||||||
|
help()
|
||||||
|
return errors.New("Unknown command")
|
||||||
|
|
||||||
|
case createAccountCmd:
|
||||||
|
flagSet := flag.NewFlagSet(createAccountCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
||||||
|
flagSet.StringVar(&util.password, "password", util.password, "user password")
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case deleteAccountCmd:
|
||||||
|
flagSet := flag.NewFlagSet(deleteAccountCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
||||||
|
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case listAccountsCmd:
|
||||||
|
flagSet := flag.NewFlagSet(listAccountsCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case updateAccountCmd:
|
||||||
|
flagSet := flag.NewFlagSet(updateAccountCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
||||||
|
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.newUsername, "newUsername", util.newUsername, "new user name")
|
||||||
|
flagSet.StringVar(&util.newPassword, "newPassword", util.newPassword, "new user password")
|
||||||
|
flagSet.BoolVar(&util.disable, "disable", util.disable, "disable account")
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case setGrantCmd:
|
||||||
|
flagSet := flag.NewFlagSet(setGrantCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
||||||
|
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
||||||
|
flagSet.StringVar(&util.operation, "operation", util.operation, "grant type")
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case deleteGrantCmd:
|
||||||
|
flagSet := flag.NewFlagSet(deleteGrantCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
||||||
|
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
||||||
|
flagSet.StringVar(&util.operation, "operation", util.operation, "grant type")
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case initDatabaseCmd:
|
||||||
|
flagSet := flag.NewFlagSet(initDatabaseCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
case seedAccountCmd:
|
||||||
|
flagSet := flag.NewFlagSet(seedAccountCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
default:
|
||||||
|
help()
|
||||||
|
return errors.New("Unknown command")
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) Build() error {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
util.conf = config.NewConfig()
|
||||||
|
err = util.conf.ReadFile()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = util.conf.ReadEnv()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
util.sfile = filepath.Join(util.conf.DataDir, "certmanager.yaml")
|
||||||
|
|
||||||
|
db, err := maindb.NewDatabase(util.conf.DataDir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = db.OpenDatabase()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
util.db = db
|
||||||
|
logicConfig := &logic.LogicConfig{
|
||||||
|
Database: util.db,
|
||||||
|
}
|
||||||
|
util.lg, err = logic.NewLogic(logicConfig)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
type Response struct {
|
||||||
|
Command string `json:"command" yaml:"command"`
|
||||||
|
Args []string `json:"args" yaml:"args"`
|
||||||
|
Error bool `json:"error" yaml:"error"`
|
||||||
|
Message string `json:"message,omitempty" yaml:"message,omitempty"`
|
||||||
|
Result any `json:"result,omitempty" yaml:"result,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) Exec() error {
|
||||||
|
var err error
|
||||||
|
err = util.GetOpt()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var timeout = time.Duration(util.cmdTimeout) * time.Second
|
||||||
|
ctx, close := context.WithTimeout(context.Background(), timeout)
|
||||||
|
defer close()
|
||||||
|
|
||||||
|
var res any
|
||||||
|
|
||||||
|
switch util.subCmd {
|
||||||
|
case initDatabaseCmd:
|
||||||
|
res, err = util.InitDatabase(ctx)
|
||||||
|
case seedAccountCmd:
|
||||||
|
res, err = util.SeedAccount(ctx)
|
||||||
|
default:
|
||||||
|
authOk, operID, localErr := util.lg.ValidateAcount(ctx, util.accessUsername, util.accessPassword)
|
||||||
|
if err != nil {
|
||||||
|
err = localErr
|
||||||
|
goto exit
|
||||||
|
}
|
||||||
|
if !authOk {
|
||||||
|
err = fmt.Errorf("Incorrect username or password")
|
||||||
|
goto exit
|
||||||
|
}
|
||||||
|
switch util.subCmd {
|
||||||
|
case createAccountCmd:
|
||||||
|
res, err = util.CreateAccount(ctx, operID)
|
||||||
|
case updateAccountCmd:
|
||||||
|
res, err = util.UpdateAccount(ctx, operID)
|
||||||
|
case listAccountsCmd:
|
||||||
|
res, err = util.ListAccounts(ctx, operID)
|
||||||
|
case deleteAccountCmd:
|
||||||
|
res, err = util.DeleteAccount(ctx, operID)
|
||||||
|
case setGrantCmd:
|
||||||
|
res, err = util.SetGrant(ctx, operID)
|
||||||
|
case deleteGrantCmd:
|
||||||
|
res, err = util.DeleteGrant(ctx, operID)
|
||||||
|
default:
|
||||||
|
err = errors.New("Unknown cli command")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
var resp Response
|
||||||
|
resp.Command = util.subCmd
|
||||||
|
resp.Args = os.Args
|
||||||
|
if err != nil {
|
||||||
|
resp.Error = true
|
||||||
|
resp.Message = fmt.Sprintf("%v", err)
|
||||||
|
} else {
|
||||||
|
resp.Result = res
|
||||||
|
}
|
||||||
|
|
||||||
|
if !resp.Error && !util.quiet {
|
||||||
|
respBytes, _ := yaml.Marshal(resp)
|
||||||
|
fmt.Println(string(respBytes))
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
type InitDatabaseRes struct{}
|
||||||
|
|
||||||
|
func (util *Util) InitDatabase(ctx context.Context) (InitDatabaseRes, error) {
|
||||||
|
res := InitDatabaseRes{}
|
||||||
|
// Initialize database
|
||||||
|
|
||||||
|
// Load state
|
||||||
|
err := util.LoadState()
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
if !util.state.DatabaseInitialized {
|
||||||
|
if util.db == nil {
|
||||||
|
err = fmt.Errorf("Nil db object")
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
err := util.db.InitDatabase()
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
util.state.DatabaseInitialized = true
|
||||||
|
err = util.SaveState()
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type SeedAccountRes struct{}
|
||||||
|
|
||||||
|
func (util *Util) SeedAccount(ctx context.Context) (SeedAccountRes, error) {
|
||||||
|
// Seed accounts
|
||||||
|
res := SeedAccountRes{}
|
||||||
|
_, err := util.lg.SeedAccount(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) LoadState() error {
|
||||||
|
var err error
|
||||||
|
_, err = os.Stat(util.sfile)
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
err = nil
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
file, err := os.Open(util.sfile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
stateBytes, err := ioutil.ReadAll(file)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = yaml.Unmarshal(stateBytes, &util.state)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) SaveState() error {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
file, err := os.OpenFile(util.sfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0640)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
util.state.UpdatedAt = time.Now().Format(time.RFC3339)
|
||||||
|
if util.state.CreatedAt == "" {
|
||||||
|
util.state.CreatedAt = util.state.UpdatedAt
|
||||||
|
}
|
||||||
|
stateBytes, err := yaml.Marshal(util.state)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = file.Write(stateBytes)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (util *Util) CreateAccount(cmd *cobra.Command, args []string) {
|
||||||
|
//util.createAccountParams.Filename = args[0]
|
||||||
|
res, err := util.createAccount(util.createAccountParams)
|
||||||
|
printResponse(res, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type createAccountParams struct{}
|
||||||
|
type createAccountResult struct{}
|
||||||
|
|
||||||
|
func (util *Util) createAccount(params createAccountParams) (createAccountResult, error) {
|
||||||
|
var err error
|
||||||
|
res := createAccountResult{}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (util *Util) DeleteAccount(cmd *cobra.Command, args []string) {
|
||||||
|
//util.deleteAccountParams.Filename = args[0]
|
||||||
|
res, err := util.deleteAccount(util.deleteAccountParams)
|
||||||
|
printResponse(res, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type deleteAccountParams struct{}
|
||||||
|
type deleteAccountResult struct{}
|
||||||
|
|
||||||
|
func (util *Util) deleteAccount(params deleteAccountParams) (deleteAccountResult, error) {
|
||||||
|
var err error
|
||||||
|
res := deleteAccountResult{}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (util *Util) ListAccounts(cmd *cobra.Command, args []string) {
|
||||||
|
//util.listAccountsParams.Filename = args[0]
|
||||||
|
res, err := util.listAccounts(util.listAccountsParams)
|
||||||
|
printResponse(res, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type listAccountsParams struct{}
|
||||||
|
type listAccountsResult struct{}
|
||||||
|
|
||||||
|
func (util *Util) listAccounts(params listAccountsParams) (listAccountsResult, error) {
|
||||||
|
var err error
|
||||||
|
res := listAccountsResult{}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"sigs.k8s.io/yaml"
|
||||||
|
)
|
||||||
|
|
||||||
|
func printResponse(res any, err error) {
|
||||||
|
type Response struct {
|
||||||
|
Error bool `json:"error" yaml:"error"`
|
||||||
|
Message string `json:"message,omitempty" yaml:"message,omitempty"`
|
||||||
|
Result any `json:"result,omitempty" yaml:"result,omitempty"`
|
||||||
|
}
|
||||||
|
resp := Response{}
|
||||||
|
if err != nil {
|
||||||
|
resp.Error = true
|
||||||
|
resp.Message = err.Error()
|
||||||
|
} else {
|
||||||
|
resp.Result = res
|
||||||
|
}
|
||||||
|
respBytes, _ := yaml.Marshal(resp)
|
||||||
|
fmt.Printf("---\n%s\n", string(respBytes))
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (util *Util) UpdateAccount(cmd *cobra.Command, args []string) {
|
||||||
|
//util.updateAccountParams.Filename = args[0]
|
||||||
|
res, err := util.updateAccount(util.updateAccountParams)
|
||||||
|
printResponse(res, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type updateAccountParams struct{}
|
||||||
|
type updateAccountResult struct{}
|
||||||
|
|
||||||
|
func (util *Util) updateAccount(params updateAccountParams) (updateAccountResult, error) {
|
||||||
|
var err error
|
||||||
|
res := updateAccountResult{}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Util struct {
|
||||||
|
rootCmd *cobra.Command
|
||||||
|
createAccountParams createAccountParams
|
||||||
|
listAccountsParams listAccountsParams
|
||||||
|
updateAccountParams updateAccountParams
|
||||||
|
deleteAccountParams deleteAccountParams
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUtil() *Util {
|
||||||
|
return &Util{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) GetRooCmd() *cobra.Command {
|
||||||
|
return util.rootCmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) BuildCmds() *cobra.Command {
|
||||||
|
rootCmd := &cobra.Command{
|
||||||
|
Use: "account",
|
||||||
|
Short: "\nAccount operations",
|
||||||
|
SilenceUsage: true,
|
||||||
|
}
|
||||||
|
rootCmd.CompletionOptions.DisableDefaultCmd = true
|
||||||
|
|
||||||
|
var createAccountCmd = &cobra.Command{
|
||||||
|
Use: "create name password ",
|
||||||
|
Short: "Create account",
|
||||||
|
Args: cobra.ExactArgs(2),
|
||||||
|
Run: util.CreateAccount,
|
||||||
|
}
|
||||||
|
rootCmd.AddCommand(createAccountCmd)
|
||||||
|
|
||||||
|
var listAccountsCmd = &cobra.Command{
|
||||||
|
Use: "list",
|
||||||
|
Short: "List accounts",
|
||||||
|
Run: util.ListAccounts,
|
||||||
|
}
|
||||||
|
rootCmd.AddCommand(listAccountsCmd)
|
||||||
|
|
||||||
|
var updateAccountsCmd = &cobra.Command{
|
||||||
|
Use: "update name|id",
|
||||||
|
Short: "Update account",
|
||||||
|
Args: cobra.ExactArgs(1),
|
||||||
|
Run: util.UpdateAccount,
|
||||||
|
}
|
||||||
|
rootCmd.AddCommand(updateAccountsCmd)
|
||||||
|
|
||||||
|
var deleteAccountCmd = &cobra.Command{
|
||||||
|
Use: "delete name|id",
|
||||||
|
Short: "Delete account",
|
||||||
|
Args: cobra.ExactArgs(1),
|
||||||
|
Run: util.DeleteAccount,
|
||||||
|
}
|
||||||
|
rootCmd.AddCommand(deleteAccountCmd)
|
||||||
|
|
||||||
|
util.rootCmd = rootCmd
|
||||||
|
return util.rootCmd
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"mbase/pkg/mbctl"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (util *Util) CreateAccount(ctx context.Context, operID string) (*mbctl.CreateAccountResult, error) {
|
||||||
|
var err error
|
||||||
|
res := &mbctl.CreateAccountResult{}
|
||||||
|
|
||||||
|
params := &mbctl.CreateAccountParams{
|
||||||
|
Username: util.username,
|
||||||
|
Password: util.password,
|
||||||
|
}
|
||||||
|
res, err = util.lg.CreateAccount(ctx, operID, params)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) DeleteAccount(ctx context.Context, operID string) (*mbctl.DeleteAccountResult, error) {
|
||||||
|
var err error
|
||||||
|
res := &mbctl.DeleteAccountResult{}
|
||||||
|
params := &mbctl.DeleteAccountParams{
|
||||||
|
Username: util.username,
|
||||||
|
AccountID: util.accountID,
|
||||||
|
}
|
||||||
|
res, err = util.lg.DeleteAccount(ctx, operID, params)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) ListAccounts(ctx context.Context, operID string) (*mbctl.ListAccountsResult, error) {
|
||||||
|
var err error
|
||||||
|
res := &mbctl.ListAccountsResult{}
|
||||||
|
params := &mbctl.ListAccountsParams{}
|
||||||
|
res, err = util.lg.ListAccounts(ctx, operID, params)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) UpdateAccount(ctx context.Context, operID string) (*mbctl.UpdateAccountResult, error) {
|
||||||
|
var err error
|
||||||
|
res := &mbctl.UpdateAccountResult{}
|
||||||
|
params := &mbctl.UpdateAccountParams{
|
||||||
|
Username: util.username,
|
||||||
|
AccountID: util.accountID,
|
||||||
|
NewUsername: util.newUsername,
|
||||||
|
NewPassword: util.newPassword,
|
||||||
|
}
|
||||||
|
res, err = util.lg.UpdateAccount(ctx, operID, params)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"mbase/pkg/mbctl"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (util *Util) SetGrant(ctx context.Context, operID string) (*mbctl.SetGrantResult, error) {
|
||||||
|
var err error
|
||||||
|
res := &mbctl.SetGrantResult{}
|
||||||
|
params := &mbctl.SetGrantParams{
|
||||||
|
Username: util.username,
|
||||||
|
AccountID: util.accountID,
|
||||||
|
Operation: util.operation,
|
||||||
|
}
|
||||||
|
res, err = util.lg.SetGrant(ctx, operID, params)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) DeleteGrant(ctx context.Context, operID string) (*mbctl.DeleteGrantResult, error) {
|
||||||
|
var err error
|
||||||
|
res := &mbctl.DeleteGrantResult{}
|
||||||
|
params := &mbctl.DeleteGrantParams{
|
||||||
|
Username: util.username,
|
||||||
|
AccountID: util.accountID,
|
||||||
|
Operation: util.operation,
|
||||||
|
}
|
||||||
|
res, err = util.lg.DeleteGrant(ctx, operID, params)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -0,0 +1,467 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2024 Oleg Borodin <borodin@unix7.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"mbase/app/config"
|
||||||
|
"mbase/app/maindb"
|
||||||
|
"mbase/pkg/descr"
|
||||||
|
"mbase/app/logic"
|
||||||
|
|
||||||
|
"sigs.k8s.io/yaml"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
rcFilename = ".certmanager.yaml"
|
||||||
|
|
||||||
|
helpCmd = "help"
|
||||||
|
|
||||||
|
createAccountCmd = "createAccount"
|
||||||
|
updateAccountCmd = "updateAccount"
|
||||||
|
deleteAccountCmd = "deleteAccount"
|
||||||
|
listAccountsCmd = "listAccounts"
|
||||||
|
|
||||||
|
setGrantCmd = "setGrant"
|
||||||
|
deleteGrantCmd = "deleteGrant"
|
||||||
|
|
||||||
|
initDatabaseCmd = "initDatabase"
|
||||||
|
seedAccountCmd = "seedAccount"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var err error
|
||||||
|
util := NewUtil()
|
||||||
|
err = util.Build()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Build error: %v\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
err = util.Exec()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Exec error: %v\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Util struct {
|
||||||
|
subCmd string
|
||||||
|
cmdTimeout int64
|
||||||
|
|
||||||
|
conf *config.Config
|
||||||
|
lg *logic.Logic
|
||||||
|
db *maindb.Database
|
||||||
|
state descr.Server
|
||||||
|
sfile string
|
||||||
|
|
||||||
|
accessUsername string
|
||||||
|
accessPassword string
|
||||||
|
accountID int64
|
||||||
|
username string
|
||||||
|
password string
|
||||||
|
disable bool
|
||||||
|
newUsername string
|
||||||
|
newPassword string
|
||||||
|
operation string
|
||||||
|
quiet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUtil() *Util {
|
||||||
|
var util Util
|
||||||
|
util.cmdTimeout = 120
|
||||||
|
return &util
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) GetOpt() error {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
exeName := filepath.Base(os.Args[0])
|
||||||
|
|
||||||
|
flag.Int64Var(&util.cmdTimeout, "timeout", util.cmdTimeout, "command execution timeout")
|
||||||
|
flag.StringVar(&util.accessUsername, "user", util.accessUsername, "access login")
|
||||||
|
flag.StringVar(&util.accessPassword, "pass", util.accessPassword, "access password")
|
||||||
|
flag.BoolVar(&util.quiet, "quiet", util.quiet, "don't print result")
|
||||||
|
|
||||||
|
help := func() {
|
||||||
|
fmt.Println("")
|
||||||
|
fmt.Printf("Usage: %s [option] command [command option]\n", exeName)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf(" %s, %s, %s, %s,\n",
|
||||||
|
createAccountCmd,
|
||||||
|
deleteAccountCmd,
|
||||||
|
listAccountsCmd,
|
||||||
|
updateAccountCmd)
|
||||||
|
fmt.Printf(" %s, %s\n",
|
||||||
|
setGrantCmd,
|
||||||
|
deleteGrantCmd)
|
||||||
|
fmt.Printf(" %s, %s\n",
|
||||||
|
initDatabaseCmd,
|
||||||
|
seedAccountCmd)
|
||||||
|
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Global options:\n")
|
||||||
|
flag.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flag.Usage = help
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
args := flag.Args()
|
||||||
|
|
||||||
|
var subCmd string
|
||||||
|
var subArgs []string
|
||||||
|
if len(args) > 0 {
|
||||||
|
subCmd = args[0]
|
||||||
|
subArgs = args[1:]
|
||||||
|
}
|
||||||
|
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
switch subCmd {
|
||||||
|
case helpCmd:
|
||||||
|
help()
|
||||||
|
return errors.New("Unknown command")
|
||||||
|
|
||||||
|
case createAccountCmd:
|
||||||
|
flagSet := flag.NewFlagSet(createAccountCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
||||||
|
flagSet.StringVar(&util.password, "password", util.password, "user password")
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case deleteAccountCmd:
|
||||||
|
flagSet := flag.NewFlagSet(deleteAccountCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
||||||
|
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case listAccountsCmd:
|
||||||
|
flagSet := flag.NewFlagSet(listAccountsCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case updateAccountCmd:
|
||||||
|
flagSet := flag.NewFlagSet(updateAccountCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
||||||
|
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.newUsername, "newUsername", util.newUsername, "new user name")
|
||||||
|
flagSet.StringVar(&util.newPassword, "newPassword", util.newPassword, "new user password")
|
||||||
|
flagSet.BoolVar(&util.disable, "disable", util.disable, "disable account")
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case setGrantCmd:
|
||||||
|
flagSet := flag.NewFlagSet(setGrantCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
||||||
|
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
||||||
|
flagSet.StringVar(&util.operation, "operation", util.operation, "grant type")
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case deleteGrantCmd:
|
||||||
|
flagSet := flag.NewFlagSet(deleteGrantCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
||||||
|
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
||||||
|
flagSet.StringVar(&util.operation, "operation", util.operation, "grant type")
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case initDatabaseCmd:
|
||||||
|
flagSet := flag.NewFlagSet(initDatabaseCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
case seedAccountCmd:
|
||||||
|
flagSet := flag.NewFlagSet(seedAccountCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
default:
|
||||||
|
help()
|
||||||
|
return errors.New("Unknown command")
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) Build() error {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
util.conf = config.NewConfig()
|
||||||
|
err = util.conf.ReadFile()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = util.conf.ReadEnv()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
util.sfile = filepath.Join(util.conf.DataDir, "certmanager.yaml")
|
||||||
|
|
||||||
|
db, err := maindb.NewDatabase(util.conf.DataDir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = db.OpenDatabase()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
util.db = db
|
||||||
|
logicConfig := &logic.LogicConfig{
|
||||||
|
Database: util.db,
|
||||||
|
}
|
||||||
|
util.lg, err = logic.NewLogic(logicConfig)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
type Response struct {
|
||||||
|
Command string `json:"command" yaml:"command"`
|
||||||
|
Args []string `json:"args" yaml:"args"`
|
||||||
|
Error bool `json:"error" yaml:"error"`
|
||||||
|
Message string `json:"message,omitempty" yaml:"message,omitempty"`
|
||||||
|
Result any `json:"result,omitempty" yaml:"result,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) Exec() error {
|
||||||
|
var err error
|
||||||
|
err = util.GetOpt()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var timeout = time.Duration(util.cmdTimeout) * time.Second
|
||||||
|
ctx, close := context.WithTimeout(context.Background(), timeout)
|
||||||
|
defer close()
|
||||||
|
|
||||||
|
var res any
|
||||||
|
|
||||||
|
switch util.subCmd {
|
||||||
|
case initDatabaseCmd:
|
||||||
|
res, err = util.InitDatabase(ctx)
|
||||||
|
case seedAccountCmd:
|
||||||
|
res, err = util.SeedAccount(ctx)
|
||||||
|
default:
|
||||||
|
authOk, operID, localErr := util.lg.ValidateAcount(ctx, util.accessUsername, util.accessPassword)
|
||||||
|
if err != nil {
|
||||||
|
err = localErr
|
||||||
|
goto exit
|
||||||
|
}
|
||||||
|
if !authOk {
|
||||||
|
err = fmt.Errorf("Incorrect username or password")
|
||||||
|
goto exit
|
||||||
|
}
|
||||||
|
switch util.subCmd {
|
||||||
|
case createAccountCmd:
|
||||||
|
res, err = util.CreateAccount(ctx, operID)
|
||||||
|
case updateAccountCmd:
|
||||||
|
res, err = util.UpdateAccount(ctx, operID)
|
||||||
|
case listAccountsCmd:
|
||||||
|
res, err = util.ListAccounts(ctx, operID)
|
||||||
|
case deleteAccountCmd:
|
||||||
|
res, err = util.DeleteAccount(ctx, operID)
|
||||||
|
case setGrantCmd:
|
||||||
|
res, err = util.SetGrant(ctx, operID)
|
||||||
|
case deleteGrantCmd:
|
||||||
|
res, err = util.DeleteGrant(ctx, operID)
|
||||||
|
default:
|
||||||
|
err = errors.New("Unknown cli command")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
var resp Response
|
||||||
|
resp.Command = util.subCmd
|
||||||
|
resp.Args = os.Args
|
||||||
|
if err != nil {
|
||||||
|
resp.Error = true
|
||||||
|
resp.Message = fmt.Sprintf("%v", err)
|
||||||
|
} else {
|
||||||
|
resp.Result = res
|
||||||
|
}
|
||||||
|
|
||||||
|
if !resp.Error && !util.quiet {
|
||||||
|
respBytes, _ := yaml.Marshal(resp)
|
||||||
|
fmt.Println(string(respBytes))
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
type InitDatabaseRes struct{}
|
||||||
|
|
||||||
|
func (util *Util) InitDatabase(ctx context.Context) (InitDatabaseRes, error) {
|
||||||
|
res := InitDatabaseRes{}
|
||||||
|
// Initialize database
|
||||||
|
|
||||||
|
// Load state
|
||||||
|
err := util.LoadState()
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
if !util.state.DatabaseInitialized {
|
||||||
|
if util.db == nil {
|
||||||
|
err = fmt.Errorf("Nil db object")
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
err := util.db.InitDatabase()
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
util.state.DatabaseInitialized = true
|
||||||
|
err = util.SaveState()
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type SeedAccountRes struct{}
|
||||||
|
|
||||||
|
func (util *Util) SeedAccount(ctx context.Context) (SeedAccountRes, error) {
|
||||||
|
// Seed accounts
|
||||||
|
res := SeedAccountRes{}
|
||||||
|
_, err := util.lg.SeedAccount(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) LoadState() error {
|
||||||
|
var err error
|
||||||
|
_, err = os.Stat(util.sfile)
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
err = nil
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
file, err := os.Open(util.sfile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
stateBytes, err := ioutil.ReadAll(file)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = yaml.Unmarshal(stateBytes, &util.state)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) SaveState() error {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
file, err := os.OpenFile(util.sfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0640)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
util.state.UpdatedAt = time.Now().Format(time.RFC3339)
|
||||||
|
if util.state.CreatedAt == "" {
|
||||||
|
util.state.CreatedAt = util.state.UpdatedAt
|
||||||
|
}
|
||||||
|
stateBytes, err := yaml.Marshal(util.state)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = file.Write(stateBytes)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (util *Util) CreateGrant(cmd *cobra.Command, args []string) {
|
||||||
|
//util.createGrantParams.Filename = args[0]
|
||||||
|
res, err := util.createGrant(util.createGrantParams)
|
||||||
|
printResponse(res, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type createGrantParams struct{}
|
||||||
|
type createGrantResult struct{}
|
||||||
|
|
||||||
|
func (util *Util) createGrant(params createGrantParams) (createGrantResult, error) {
|
||||||
|
var err error
|
||||||
|
res := createGrantResult{}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (util *Util) DeleteGrant(cmd *cobra.Command, args []string) {
|
||||||
|
//util.deleteGrantParams.Filename = args[0]
|
||||||
|
res, err := util.deleteGrant(util.deleteGrantParams)
|
||||||
|
printResponse(res, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type deleteGrantParams struct{}
|
||||||
|
type deleteGrantResult struct{}
|
||||||
|
|
||||||
|
func (util *Util) deleteGrant(params deleteGrantParams) (deleteGrantResult, error) {
|
||||||
|
var err error
|
||||||
|
res := deleteGrantResult{}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"sigs.k8s.io/yaml"
|
||||||
|
)
|
||||||
|
|
||||||
|
func printResponse(res any, err error) {
|
||||||
|
type Response struct {
|
||||||
|
Error bool `json:"error" yaml:"error"`
|
||||||
|
Message string `json:"message,omitempty" yaml:"message,omitempty"`
|
||||||
|
Result any `json:"result,omitempty" yaml:"result,omitempty"`
|
||||||
|
}
|
||||||
|
resp := Response{}
|
||||||
|
if err != nil {
|
||||||
|
resp.Error = true
|
||||||
|
resp.Message = err.Error()
|
||||||
|
} else {
|
||||||
|
resp.Result = res
|
||||||
|
}
|
||||||
|
respBytes, _ := yaml.Marshal(resp)
|
||||||
|
fmt.Printf("---\n%s\n", string(respBytes))
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package grant
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Util struct {
|
||||||
|
rootCmd *cobra.Command
|
||||||
|
createGrantParams createGrantParams
|
||||||
|
deleteGrantParams deleteGrantParams
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUtil() *Util {
|
||||||
|
return &Util{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) GetRooCmd() *cobra.Command {
|
||||||
|
return util.rootCmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) BuildCmds() *cobra.Command {
|
||||||
|
rootCmd := &cobra.Command{
|
||||||
|
Use: "grant",
|
||||||
|
Short: "\nGrant operations",
|
||||||
|
SilenceUsage: true,
|
||||||
|
}
|
||||||
|
rootCmd.CompletionOptions.DisableDefaultCmd = true
|
||||||
|
|
||||||
|
var createGrantCmd = &cobra.Command{
|
||||||
|
Use: "create name|id password",
|
||||||
|
Short: "Create grant",
|
||||||
|
Args: cobra.ExactArgs(2),
|
||||||
|
Run: util.CreateGrant,
|
||||||
|
}
|
||||||
|
rootCmd.AddCommand(createGrantCmd)
|
||||||
|
|
||||||
|
var deleteGrantCmd = &cobra.Command{
|
||||||
|
Use: "delete name|id grant",
|
||||||
|
Short: "Delete grant",
|
||||||
|
Args: cobra.ExactArgs(1),
|
||||||
|
Run: util.DeleteGrant,
|
||||||
|
}
|
||||||
|
rootCmd.AddCommand(deleteGrantCmd)
|
||||||
|
|
||||||
|
util.rootCmd = rootCmd
|
||||||
|
return util.rootCmd
|
||||||
|
}
|
||||||
|
|
||||||
+2
-448
@@ -1,42 +1,10 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2024 Oleg Borodin <borodin@unix7.org>
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"mbase/app/config"
|
|
||||||
"mbase/app/maindb"
|
|
||||||
"mbase/app/descr"
|
|
||||||
"mbase/app/logic"
|
|
||||||
|
|
||||||
"sigs.k8s.io/yaml"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
rcFilename = ".certmanager.yaml"
|
|
||||||
|
|
||||||
helpCmd = "help"
|
|
||||||
|
|
||||||
createAccountCmd = "createAccount"
|
|
||||||
updateAccountCmd = "updateAccount"
|
|
||||||
deleteAccountCmd = "deleteAccount"
|
|
||||||
listAccountsCmd = "listAccounts"
|
|
||||||
|
|
||||||
setGrantCmd = "setGrant"
|
|
||||||
deleteGrantCmd = "deleteGrant"
|
|
||||||
|
|
||||||
initDatabaseCmd = "initDatabase"
|
|
||||||
seedAccountCmd = "seedAccount"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -44,424 +12,10 @@ func main() {
|
|||||||
util := NewUtil()
|
util := NewUtil()
|
||||||
err = util.Build()
|
err = util.Build()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Build error: %v\n", err)
|
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
err = util.Exec()
|
err = util.Exec(os.Args[1:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Exec error: %v\n", err)
|
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
os.Exit(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
type Util struct {
|
|
||||||
subCmd string
|
|
||||||
cmdTimeout int64
|
|
||||||
|
|
||||||
conf *config.Config
|
|
||||||
lg *logic.Logic
|
|
||||||
db *maindb.Database
|
|
||||||
state descr.Server
|
|
||||||
sfile string
|
|
||||||
|
|
||||||
accessUsername string
|
|
||||||
accessPassword string
|
|
||||||
accountID int64
|
|
||||||
username string
|
|
||||||
password string
|
|
||||||
disable bool
|
|
||||||
newUsername string
|
|
||||||
newPassword string
|
|
||||||
operation string
|
|
||||||
quiet bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUtil() *Util {
|
|
||||||
var util Util
|
|
||||||
util.cmdTimeout = 120
|
|
||||||
return &util
|
|
||||||
}
|
|
||||||
|
|
||||||
func (util *Util) GetOpt() error {
|
|
||||||
var err error
|
|
||||||
|
|
||||||
exeName := filepath.Base(os.Args[0])
|
|
||||||
|
|
||||||
flag.Int64Var(&util.cmdTimeout, "timeout", util.cmdTimeout, "command execution timeout")
|
|
||||||
flag.StringVar(&util.accessUsername, "user", util.accessUsername, "access login")
|
|
||||||
flag.StringVar(&util.accessPassword, "pass", util.accessPassword, "access password")
|
|
||||||
flag.BoolVar(&util.quiet, "quiet", util.quiet, "don't print result")
|
|
||||||
|
|
||||||
help := func() {
|
|
||||||
fmt.Println("")
|
|
||||||
fmt.Printf("Usage: %s [option] command [command option]\n", exeName)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf(" %s, %s, %s, %s,\n",
|
|
||||||
createAccountCmd,
|
|
||||||
deleteAccountCmd,
|
|
||||||
listAccountsCmd,
|
|
||||||
updateAccountCmd)
|
|
||||||
fmt.Printf(" %s, %s\n",
|
|
||||||
setGrantCmd,
|
|
||||||
deleteGrantCmd)
|
|
||||||
fmt.Printf(" %s, %s\n",
|
|
||||||
initDatabaseCmd,
|
|
||||||
seedAccountCmd)
|
|
||||||
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Global options:\n")
|
|
||||||
flag.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flag.Usage = help
|
|
||||||
flag.Parse()
|
|
||||||
|
|
||||||
args := flag.Args()
|
|
||||||
|
|
||||||
var subCmd string
|
|
||||||
var subArgs []string
|
|
||||||
if len(args) > 0 {
|
|
||||||
subCmd = args[0]
|
|
||||||
subArgs = args[1:]
|
|
||||||
}
|
|
||||||
|
|
||||||
util.subCmd = subCmd
|
|
||||||
|
|
||||||
switch subCmd {
|
|
||||||
case helpCmd:
|
|
||||||
help()
|
|
||||||
return errors.New("Unknown command")
|
|
||||||
|
|
||||||
case createAccountCmd:
|
|
||||||
flagSet := flag.NewFlagSet(createAccountCmd, flag.ExitOnError)
|
|
||||||
|
|
||||||
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
|
||||||
flagSet.StringVar(&util.password, "password", util.password, "user password")
|
|
||||||
|
|
||||||
flagSet.Usage = func() {
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("The command options: none\n")
|
|
||||||
flagSet.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
util.subCmd = subCmd
|
|
||||||
|
|
||||||
case deleteAccountCmd:
|
|
||||||
flagSet := flag.NewFlagSet(deleteAccountCmd, flag.ExitOnError)
|
|
||||||
|
|
||||||
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
|
||||||
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
|
||||||
|
|
||||||
flagSet.Usage = func() {
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("The command options: none\n")
|
|
||||||
flagSet.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
util.subCmd = subCmd
|
|
||||||
|
|
||||||
case listAccountsCmd:
|
|
||||||
flagSet := flag.NewFlagSet(listAccountsCmd, flag.ExitOnError)
|
|
||||||
|
|
||||||
flagSet.Usage = func() {
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("The command options: none\n")
|
|
||||||
flagSet.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
util.subCmd = subCmd
|
|
||||||
|
|
||||||
case updateAccountCmd:
|
|
||||||
flagSet := flag.NewFlagSet(updateAccountCmd, flag.ExitOnError)
|
|
||||||
|
|
||||||
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
|
||||||
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
|
||||||
|
|
||||||
flagSet.StringVar(&util.newUsername, "newUsername", util.newUsername, "new user name")
|
|
||||||
flagSet.StringVar(&util.newPassword, "newPassword", util.newPassword, "new user password")
|
|
||||||
flagSet.BoolVar(&util.disable, "disable", util.disable, "disable account")
|
|
||||||
|
|
||||||
flagSet.Usage = func() {
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("The command options: none\n")
|
|
||||||
flagSet.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
util.subCmd = subCmd
|
|
||||||
|
|
||||||
case setGrantCmd:
|
|
||||||
flagSet := flag.NewFlagSet(setGrantCmd, flag.ExitOnError)
|
|
||||||
|
|
||||||
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
|
||||||
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
|
||||||
flagSet.StringVar(&util.operation, "operation", util.operation, "grant type")
|
|
||||||
|
|
||||||
flagSet.Usage = func() {
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("The command options: none\n")
|
|
||||||
flagSet.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
util.subCmd = subCmd
|
|
||||||
|
|
||||||
case deleteGrantCmd:
|
|
||||||
flagSet := flag.NewFlagSet(deleteGrantCmd, flag.ExitOnError)
|
|
||||||
|
|
||||||
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
|
||||||
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
|
||||||
flagSet.StringVar(&util.operation, "operation", util.operation, "grant type")
|
|
||||||
|
|
||||||
flagSet.Usage = func() {
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("The command options: none\n")
|
|
||||||
flagSet.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
util.subCmd = subCmd
|
|
||||||
|
|
||||||
case initDatabaseCmd:
|
|
||||||
flagSet := flag.NewFlagSet(initDatabaseCmd, flag.ExitOnError)
|
|
||||||
|
|
||||||
flagSet.Usage = func() {
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("The command options: none\n")
|
|
||||||
flagSet.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
util.subCmd = subCmd
|
|
||||||
case seedAccountCmd:
|
|
||||||
flagSet := flag.NewFlagSet(seedAccountCmd, flag.ExitOnError)
|
|
||||||
|
|
||||||
flagSet.Usage = func() {
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("The command options: none\n")
|
|
||||||
flagSet.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
util.subCmd = subCmd
|
|
||||||
|
|
||||||
default:
|
|
||||||
help()
|
|
||||||
return errors.New("Unknown command")
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (util *Util) Build() error {
|
|
||||||
var err error
|
|
||||||
|
|
||||||
util.conf = config.NewConfig()
|
|
||||||
err = util.conf.ReadFile()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = util.conf.ReadEnv()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
util.sfile = filepath.Join(util.conf.DataDir, "certmanager.yaml")
|
|
||||||
|
|
||||||
db, err := maindb.NewDatabase(util.conf.DataDir)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = db.OpenDatabase()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
util.db = db
|
|
||||||
logicConfig := &logic.LogicConfig{
|
|
||||||
Database: util.db,
|
|
||||||
}
|
|
||||||
util.lg, err = logic.NewLogic(logicConfig)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
type Response struct {
|
|
||||||
Command string `json:"command" yaml:"command"`
|
|
||||||
Args []string `json:"args" yaml:"args"`
|
|
||||||
Error bool `json:"error" yaml:"error"`
|
|
||||||
Message string `json:"message,omitempty" yaml:"message,omitempty"`
|
|
||||||
Result any `json:"result,omitempty" yaml:"result,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (util *Util) Exec() error {
|
|
||||||
var err error
|
|
||||||
err = util.GetOpt()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
var timeout = time.Duration(util.cmdTimeout) * time.Second
|
|
||||||
ctx, close := context.WithTimeout(context.Background(), timeout)
|
|
||||||
defer close()
|
|
||||||
|
|
||||||
var res any
|
|
||||||
|
|
||||||
switch util.subCmd {
|
|
||||||
case initDatabaseCmd:
|
|
||||||
res, err = util.InitDatabase(ctx)
|
|
||||||
case seedAccountCmd:
|
|
||||||
res, err = util.SeedAccount(ctx)
|
|
||||||
default:
|
|
||||||
authOk, operID, localErr := util.lg.ValidateAcount(ctx, util.accessUsername, util.accessPassword)
|
|
||||||
if err != nil {
|
|
||||||
err = localErr
|
|
||||||
goto exit
|
|
||||||
}
|
|
||||||
if !authOk {
|
|
||||||
err = fmt.Errorf("Incorrect username or password")
|
|
||||||
goto exit
|
|
||||||
}
|
|
||||||
switch util.subCmd {
|
|
||||||
case createAccountCmd:
|
|
||||||
res, err = util.CreateAccount(ctx, operID)
|
|
||||||
case updateAccountCmd:
|
|
||||||
res, err = util.UpdateAccount(ctx, operID)
|
|
||||||
case listAccountsCmd:
|
|
||||||
res, err = util.ListAccounts(ctx, operID)
|
|
||||||
case deleteAccountCmd:
|
|
||||||
res, err = util.DeleteAccount(ctx, operID)
|
|
||||||
case setGrantCmd:
|
|
||||||
res, err = util.SetGrant(ctx, operID)
|
|
||||||
case deleteGrantCmd:
|
|
||||||
res, err = util.DeleteGrant(ctx, operID)
|
|
||||||
default:
|
|
||||||
err = errors.New("Unknown cli command")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
exit:
|
|
||||||
var resp Response
|
|
||||||
resp.Command = util.subCmd
|
|
||||||
resp.Args = os.Args
|
|
||||||
if err != nil {
|
|
||||||
resp.Error = true
|
|
||||||
resp.Message = fmt.Sprintf("%v", err)
|
|
||||||
} else {
|
|
||||||
resp.Result = res
|
|
||||||
}
|
|
||||||
|
|
||||||
if !resp.Error && !util.quiet {
|
|
||||||
respBytes, _ := yaml.Marshal(resp)
|
|
||||||
fmt.Println(string(respBytes))
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
type InitDatabaseRes struct{}
|
|
||||||
|
|
||||||
func (util *Util) InitDatabase(ctx context.Context) (InitDatabaseRes, error) {
|
|
||||||
res := InitDatabaseRes{}
|
|
||||||
// Initialize database
|
|
||||||
|
|
||||||
// Load state
|
|
||||||
err := util.LoadState()
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
if !util.state.DatabaseInitialized {
|
|
||||||
if util.db == nil {
|
|
||||||
err = fmt.Errorf("Nil db object")
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
err := util.db.InitDatabase()
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
util.state.DatabaseInitialized = true
|
|
||||||
err = util.SaveState()
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
|
|
||||||
type SeedAccountRes struct{}
|
|
||||||
|
|
||||||
func (util *Util) SeedAccount(ctx context.Context) (SeedAccountRes, error) {
|
|
||||||
// Seed accounts
|
|
||||||
res := SeedAccountRes{}
|
|
||||||
_, err := util.lg.SeedAccount(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (util *Util) LoadState() error {
|
|
||||||
var err error
|
|
||||||
_, err = os.Stat(util.sfile)
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
err = nil
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
file, err := os.Open(util.sfile)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
stateBytes, err := ioutil.ReadAll(file)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = yaml.Unmarshal(stateBytes, &util.state)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (util *Util) SaveState() error {
|
|
||||||
var err error
|
|
||||||
|
|
||||||
file, err := os.OpenFile(util.sfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0640)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
util.state.UpdatedAt = time.Now().Format(time.RFC3339)
|
|
||||||
if util.state.CreatedAt == "" {
|
|
||||||
util.state.CreatedAt = util.state.UpdatedAt
|
|
||||||
}
|
|
||||||
stateBytes, err := yaml.Marshal(util.state)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = file.Write(stateBytes)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"mbase/cmd/mbaseadmin/account"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Util struct {
|
||||||
|
rootCmd *cobra.Command
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUtil() *Util {
|
||||||
|
return &Util{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) GetRooCmd() *cobra.Command {
|
||||||
|
return util.rootCmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) Build() error {
|
||||||
|
var err error
|
||||||
|
execName := filepath.Base(os.Args[0])
|
||||||
|
rootCmd := &cobra.Command{
|
||||||
|
Use: execName,
|
||||||
|
Short: "\nAccount operations",
|
||||||
|
SilenceUsage: true,
|
||||||
|
}
|
||||||
|
rootCmd.CompletionOptions.DisableDefaultCmd = true
|
||||||
|
|
||||||
|
accountUtil := account.NewUtil()
|
||||||
|
rootCmd.AddCommand(accountUtil.BuildCmds())
|
||||||
|
|
||||||
|
util.rootCmd = rootCmd
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) Exec(args []string) error {
|
||||||
|
var err error
|
||||||
|
util.rootCmd.SetArgs(args)
|
||||||
|
err = util.rootCmd.Execute()
|
||||||
|
return err
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (util *Util) CreateAccount(cmd *cobra.Command, args []string) {
|
||||||
|
//util.createAccountParams.Filename = args[0]
|
||||||
|
res, err := util.createAccount(util.createAccountParams)
|
||||||
|
printResponse(res, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type createAccountParams struct{}
|
||||||
|
type createAccountResult struct{}
|
||||||
|
|
||||||
|
func (util *Util) createAccount(params createAccountParams) (createAccountResult, error) {
|
||||||
|
var err error
|
||||||
|
res := createAccountResult{}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (util *Util) DeleteAccount(cmd *cobra.Command, args []string) {
|
||||||
|
//util.deleteAccountParams.Filename = args[0]
|
||||||
|
res, err := util.deleteAccount(util.deleteAccountParams)
|
||||||
|
printResponse(res, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type deleteAccountParams struct{}
|
||||||
|
type deleteAccountResult struct{}
|
||||||
|
|
||||||
|
func (util *Util) deleteAccount(params deleteAccountParams) (deleteAccountResult, error) {
|
||||||
|
var err error
|
||||||
|
res := deleteAccountResult{}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (util *Util) ListAccounts(cmd *cobra.Command, args []string) {
|
||||||
|
//util.listAccountsParams.Filename = args[0]
|
||||||
|
res, err := util.listAccounts(util.listAccountsParams)
|
||||||
|
printResponse(res, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type listAccountsParams struct{}
|
||||||
|
type listAccountsResult struct{}
|
||||||
|
|
||||||
|
func (util *Util) listAccounts(params listAccountsParams) (listAccountsResult, error) {
|
||||||
|
var err error
|
||||||
|
res := listAccountsResult{}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"sigs.k8s.io/yaml"
|
||||||
|
)
|
||||||
|
|
||||||
|
func printResponse(res any, err error) {
|
||||||
|
type Response struct {
|
||||||
|
Error bool `json:"error" yaml:"error"`
|
||||||
|
Message string `json:"message,omitempty" yaml:"message,omitempty"`
|
||||||
|
Result any `json:"result,omitempty" yaml:"result,omitempty"`
|
||||||
|
}
|
||||||
|
resp := Response{}
|
||||||
|
if err != nil {
|
||||||
|
resp.Error = true
|
||||||
|
resp.Message = err.Error()
|
||||||
|
} else {
|
||||||
|
resp.Result = res
|
||||||
|
}
|
||||||
|
respBytes, _ := yaml.Marshal(resp)
|
||||||
|
fmt.Printf("---\n%s\n", string(respBytes))
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (util *Util) UpdateAccount(cmd *cobra.Command, args []string) {
|
||||||
|
//util.updateAccountParams.Filename = args[0]
|
||||||
|
res, err := util.updateAccount(util.updateAccountParams)
|
||||||
|
printResponse(res, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type updateAccountParams struct{}
|
||||||
|
type updateAccountResult struct{}
|
||||||
|
|
||||||
|
func (util *Util) updateAccount(params updateAccountParams) (updateAccountResult, error) {
|
||||||
|
var err error
|
||||||
|
res := updateAccountResult{}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Util struct {
|
||||||
|
rootCmd *cobra.Command
|
||||||
|
createAccountParams createAccountParams
|
||||||
|
listAccountsParams listAccountsParams
|
||||||
|
updateAccountParams updateAccountParams
|
||||||
|
deleteAccountParams deleteAccountParams
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUtil() *Util {
|
||||||
|
return &Util{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) GetRooCmd() *cobra.Command {
|
||||||
|
return util.rootCmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) BuildCmds() *cobra.Command {
|
||||||
|
rootCmd := &cobra.Command{
|
||||||
|
Use: "account",
|
||||||
|
Short: "\nAccount operations",
|
||||||
|
SilenceUsage: true,
|
||||||
|
}
|
||||||
|
rootCmd.CompletionOptions.DisableDefaultCmd = true
|
||||||
|
|
||||||
|
var createAccountCmd = &cobra.Command{
|
||||||
|
Use: "create name password ",
|
||||||
|
Short: "Create account",
|
||||||
|
Args: cobra.ExactArgs(2),
|
||||||
|
Run: util.CreateAccount,
|
||||||
|
}
|
||||||
|
rootCmd.AddCommand(createAccountCmd)
|
||||||
|
|
||||||
|
var listAccountsCmd = &cobra.Command{
|
||||||
|
Use: "list",
|
||||||
|
Short: "List accounts",
|
||||||
|
Run: util.ListAccounts,
|
||||||
|
}
|
||||||
|
rootCmd.AddCommand(listAccountsCmd)
|
||||||
|
|
||||||
|
var updateAccountsCmd = &cobra.Command{
|
||||||
|
Use: "update name|id",
|
||||||
|
Short: "Update account",
|
||||||
|
Args: cobra.ExactArgs(1),
|
||||||
|
Run: util.UpdateAccount,
|
||||||
|
}
|
||||||
|
rootCmd.AddCommand(updateAccountsCmd)
|
||||||
|
|
||||||
|
var deleteAccountCmd = &cobra.Command{
|
||||||
|
Use: "delete name|id",
|
||||||
|
Short: "Delete account",
|
||||||
|
Args: cobra.ExactArgs(1),
|
||||||
|
Run: util.DeleteAccount,
|
||||||
|
}
|
||||||
|
rootCmd.AddCommand(deleteAccountCmd)
|
||||||
|
|
||||||
|
util.rootCmd = rootCmd
|
||||||
|
return util.rootCmd
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,398 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2024 Oleg Borodin <borodin@unix7.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/user"
|
||||||
|
"path/filepath"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"mbase/pkg/client"
|
||||||
|
"mbase/pkg/mbctl"
|
||||||
|
|
||||||
|
"sigs.k8s.io/yaml"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
defaultHostname = "localhost"
|
||||||
|
rcFilename = ".certmanager.yaml"
|
||||||
|
defaultPort uint32 = client.DefaultPort
|
||||||
|
|
||||||
|
getHelloCmd = "getHello"
|
||||||
|
helpCmd = "help"
|
||||||
|
|
||||||
|
createAccountCmd = "createAccount"
|
||||||
|
updateAccountCmd = "updateAccount"
|
||||||
|
deleteAccountCmd = "deleteAccount"
|
||||||
|
listAccountsCmd = "listAccounts"
|
||||||
|
|
||||||
|
setGrantCmd = "setGrant"
|
||||||
|
deleteGrantCmd = "deleteGrant"
|
||||||
|
|
||||||
|
getDumpCmd = "getDump"
|
||||||
|
restoreDumpCmd = "restoreDump"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var err error
|
||||||
|
util := NewUtil()
|
||||||
|
err = util.Exec()
|
||||||
|
if err != nil {
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Util struct {
|
||||||
|
subCmd string
|
||||||
|
cmdTimeout int64
|
||||||
|
access client.Access
|
||||||
|
cont *mbctl.ControlClient
|
||||||
|
|
||||||
|
caFilenamesList string
|
||||||
|
certFilename string
|
||||||
|
keyFilename string
|
||||||
|
issuerOrganizationName string
|
||||||
|
issuerOrganizationalUnitName string
|
||||||
|
issuerCommonName string
|
||||||
|
issuerID int64
|
||||||
|
issuerName string
|
||||||
|
signerID int64
|
||||||
|
signerName string
|
||||||
|
serviceOrganizationName string
|
||||||
|
serviceOrganizationalUnitName string
|
||||||
|
serviceCommonName string
|
||||||
|
hostnameList string
|
||||||
|
ipAdressesList string
|
||||||
|
serviceID int64
|
||||||
|
serviceName string
|
||||||
|
encodingKey string
|
||||||
|
|
||||||
|
accountID int64
|
||||||
|
username string
|
||||||
|
password string
|
||||||
|
disable bool
|
||||||
|
newUsername string
|
||||||
|
newPassword string
|
||||||
|
operation string
|
||||||
|
filename string
|
||||||
|
deleteAllRecords bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUtil() *Util {
|
||||||
|
var util Util
|
||||||
|
util.cmdTimeout = 120
|
||||||
|
util.access = client.Access{
|
||||||
|
Hostname: defaultHostname,
|
||||||
|
Port: defaultPort,
|
||||||
|
Username: "certmanager",
|
||||||
|
Password: "certmanager",
|
||||||
|
}
|
||||||
|
return &util
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) GetOpt() error {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
homeDir := os.Getenv("HOME")
|
||||||
|
if homeDir == "" {
|
||||||
|
currUsr, err := user.Current()
|
||||||
|
if err == nil {
|
||||||
|
homeDir = currUsr.HomeDir
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if homeDir != "" {
|
||||||
|
confPath := filepath.Join(homeDir, rcFilename)
|
||||||
|
confData, err := os.ReadFile(confPath)
|
||||||
|
if err == nil && len(confData) > 0 {
|
||||||
|
yaml.Unmarshal(confData, &util.access)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exeName := filepath.Base(os.Args[0])
|
||||||
|
|
||||||
|
servicePort := int64(defaultPort)
|
||||||
|
flag.Int64Var(&util.cmdTimeout, "timeout", util.cmdTimeout, "command execution timeout")
|
||||||
|
flag.StringVar(&util.access.Hostname, "host", util.access.Hostname, "service hostname")
|
||||||
|
flag.Int64Var(&servicePort, "port", servicePort, "service port")
|
||||||
|
flag.StringVar(&util.access.Username, "user", util.access.Username, "access login")
|
||||||
|
flag.StringVar(&util.access.Password, "pass", util.access.Password, "access password")
|
||||||
|
|
||||||
|
util.access.Port = uint32(servicePort)
|
||||||
|
|
||||||
|
help := func() {
|
||||||
|
fmt.Println("")
|
||||||
|
fmt.Printf("Usage: %s [option] command [command option]\n", exeName)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Command list: help, %s\n", getHelloCmd)
|
||||||
|
fmt.Printf(" %s, %s, %s, %s,\n",
|
||||||
|
createAccountCmd,
|
||||||
|
deleteAccountCmd,
|
||||||
|
listAccountsCmd,
|
||||||
|
updateAccountCmd)
|
||||||
|
fmt.Printf(" %s, %s\n",
|
||||||
|
setGrantCmd,
|
||||||
|
deleteGrantCmd)
|
||||||
|
fmt.Printf(" %s, %s\n",
|
||||||
|
getDumpCmd,
|
||||||
|
restoreDumpCmd)
|
||||||
|
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Global options:\n")
|
||||||
|
flag.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flag.Usage = help
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
args := flag.Args()
|
||||||
|
|
||||||
|
var subCmd string
|
||||||
|
var subArgs []string
|
||||||
|
if len(args) > 0 {
|
||||||
|
subCmd = args[0]
|
||||||
|
subArgs = args[1:]
|
||||||
|
}
|
||||||
|
|
||||||
|
switch subCmd {
|
||||||
|
case helpCmd:
|
||||||
|
help()
|
||||||
|
return errors.New("Unknown command")
|
||||||
|
case getHelloCmd:
|
||||||
|
flagSet := flag.NewFlagSet(getHelloCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
|
||||||
|
case createAccountCmd:
|
||||||
|
flagSet := flag.NewFlagSet(createAccountCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
||||||
|
flagSet.StringVar(&util.password, "password", util.password, "user password")
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case deleteAccountCmd:
|
||||||
|
flagSet := flag.NewFlagSet(deleteAccountCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
||||||
|
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case listAccountsCmd:
|
||||||
|
flagSet := flag.NewFlagSet(listAccountsCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case updateAccountCmd:
|
||||||
|
flagSet := flag.NewFlagSet(updateAccountCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
||||||
|
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.newUsername, "newUsername", util.newUsername, "new user name")
|
||||||
|
flagSet.StringVar(&util.newPassword, "newPassword", util.newPassword, "new user password")
|
||||||
|
flagSet.BoolVar(&util.disable, "disable", util.disable, "disable account")
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case setGrantCmd:
|
||||||
|
flagSet := flag.NewFlagSet(setGrantCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
||||||
|
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
||||||
|
flagSet.StringVar(&util.operation, "operation", util.operation, "grant type")
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case deleteGrantCmd:
|
||||||
|
flagSet := flag.NewFlagSet(deleteGrantCmd, flag.ExitOnError)
|
||||||
|
|
||||||
|
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
||||||
|
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
||||||
|
flagSet.StringVar(&util.operation, "operation", util.operation, "grant type")
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case getDumpCmd:
|
||||||
|
flagSet := flag.NewFlagSet(getDumpCmd, flag.ExitOnError)
|
||||||
|
flagSet.StringVar(&util.filename, "file", util.filename, "dump file name")
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
case restoreDumpCmd:
|
||||||
|
flagSet := flag.NewFlagSet(restoreDumpCmd, flag.ExitOnError)
|
||||||
|
flagSet.StringVar(&util.filename, "file", util.filename, "dump file name")
|
||||||
|
|
||||||
|
flagSet.Usage = func() {
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
||||||
|
fmt.Printf("\n")
|
||||||
|
fmt.Printf("The command options: none\n")
|
||||||
|
flagSet.PrintDefaults()
|
||||||
|
fmt.Printf("\n")
|
||||||
|
}
|
||||||
|
flagSet.Parse(subArgs)
|
||||||
|
util.subCmd = subCmd
|
||||||
|
|
||||||
|
default:
|
||||||
|
help()
|
||||||
|
return errors.New("Unknown command")
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
type Response struct {
|
||||||
|
Error bool `json:"error" yaml:"error"`
|
||||||
|
Message string `json:"message,omitempty" yaml:"message,omitempty"`
|
||||||
|
Result any `json:"result,omitempty" yaml:"result,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) Exec() error {
|
||||||
|
var err error
|
||||||
|
err = util.GetOpt()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var timeout = time.Duration(util.cmdTimeout) * time.Second
|
||||||
|
ctx, close := context.WithTimeout(context.Background(), timeout)
|
||||||
|
defer close()
|
||||||
|
|
||||||
|
var res any
|
||||||
|
switch util.subCmd {
|
||||||
|
case getHelloCmd:
|
||||||
|
res, err = util.GetHello(ctx)
|
||||||
|
|
||||||
|
case createAccountCmd:
|
||||||
|
res, err = util.CreateAccount(ctx)
|
||||||
|
case updateAccountCmd:
|
||||||
|
res, err = util.UpdateAccount(ctx)
|
||||||
|
case listAccountsCmd:
|
||||||
|
res, err = util.ListAccounts(ctx)
|
||||||
|
case deleteAccountCmd:
|
||||||
|
res, err = util.DeleteAccount(ctx)
|
||||||
|
|
||||||
|
case setGrantCmd:
|
||||||
|
res, err = util.SetGrant(ctx)
|
||||||
|
case deleteGrantCmd:
|
||||||
|
res, err = util.DeleteGrant(ctx)
|
||||||
|
|
||||||
|
case getDumpCmd:
|
||||||
|
res, err = util.GetDump(ctx)
|
||||||
|
case restoreDumpCmd:
|
||||||
|
res, err = util.RestoreDump(ctx)
|
||||||
|
|
||||||
|
default:
|
||||||
|
err = errors.New("Unknown cli command")
|
||||||
|
}
|
||||||
|
|
||||||
|
var resp Response
|
||||||
|
if err != nil {
|
||||||
|
resp.Error = true
|
||||||
|
resp.Message = fmt.Sprintf("%v", err)
|
||||||
|
} else {
|
||||||
|
resp.Result = res
|
||||||
|
}
|
||||||
|
respBytes, _ := yaml.Marshal(resp)
|
||||||
|
fmt.Println(string(respBytes))
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) GetHello(ctx context.Context) (*mbctl.GetHelloResult, error) {
|
||||||
|
var err error
|
||||||
|
res := &mbctl.GetHelloResult{}
|
||||||
|
grpcConn, cont, err := client.NewClient(&util.access)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
defer grpcConn.Close()
|
||||||
|
|
||||||
|
params := &mbctl.GetHelloParams{}
|
||||||
|
res, err = cont.GetHello(ctx, params)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (util *Util) CreateGrant(cmd *cobra.Command, args []string) {
|
||||||
|
//util.createGrantParams.Filename = args[0]
|
||||||
|
res, err := util.createGrant(util.createGrantParams)
|
||||||
|
printResponse(res, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type createGrantParams struct{}
|
||||||
|
type createGrantResult struct{}
|
||||||
|
|
||||||
|
func (util *Util) createGrant(params createGrantParams) (createGrantResult, error) {
|
||||||
|
var err error
|
||||||
|
res := createGrantResult{}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (util *Util) DeleteGrant(cmd *cobra.Command, args []string) {
|
||||||
|
//util.deleteGrantParams.Filename = args[0]
|
||||||
|
res, err := util.deleteGrant(util.deleteGrantParams)
|
||||||
|
printResponse(res, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type deleteGrantParams struct{}
|
||||||
|
type deleteGrantResult struct{}
|
||||||
|
|
||||||
|
func (util *Util) deleteGrant(params deleteGrantParams) (deleteGrantResult, error) {
|
||||||
|
var err error
|
||||||
|
res := deleteGrantResult{}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"sigs.k8s.io/yaml"
|
||||||
|
)
|
||||||
|
|
||||||
|
func printResponse(res any, err error) {
|
||||||
|
type Response struct {
|
||||||
|
Error bool `json:"error" yaml:"error"`
|
||||||
|
Message string `json:"message,omitempty" yaml:"message,omitempty"`
|
||||||
|
Result any `json:"result,omitempty" yaml:"result,omitempty"`
|
||||||
|
}
|
||||||
|
resp := Response{}
|
||||||
|
if err != nil {
|
||||||
|
resp.Error = true
|
||||||
|
resp.Message = err.Error()
|
||||||
|
} else {
|
||||||
|
resp.Result = res
|
||||||
|
}
|
||||||
|
respBytes, _ := yaml.Marshal(resp)
|
||||||
|
fmt.Printf("---\n%s\n", string(respBytes))
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package grant
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Util struct {
|
||||||
|
rootCmd *cobra.Command
|
||||||
|
createGrantParams createGrantParams
|
||||||
|
deleteGrantParams deleteGrantParams
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUtil() *Util {
|
||||||
|
return &Util{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) GetRooCmd() *cobra.Command {
|
||||||
|
return util.rootCmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) BuildCmds() *cobra.Command {
|
||||||
|
rootCmd := &cobra.Command{
|
||||||
|
Use: "grant",
|
||||||
|
Short: "\nGrant operations",
|
||||||
|
SilenceUsage: true,
|
||||||
|
}
|
||||||
|
rootCmd.CompletionOptions.DisableDefaultCmd = true
|
||||||
|
|
||||||
|
var createGrantCmd = &cobra.Command{
|
||||||
|
Use: "create name|id password",
|
||||||
|
Short: "Create grant",
|
||||||
|
Args: cobra.ExactArgs(2),
|
||||||
|
Run: util.CreateGrant,
|
||||||
|
}
|
||||||
|
rootCmd.AddCommand(createGrantCmd)
|
||||||
|
|
||||||
|
var deleteGrantCmd = &cobra.Command{
|
||||||
|
Use: "delete name|id grant",
|
||||||
|
Short: "Delete grant",
|
||||||
|
Args: cobra.ExactArgs(1),
|
||||||
|
Run: util.DeleteGrant,
|
||||||
|
}
|
||||||
|
rootCmd.AddCommand(deleteGrantCmd)
|
||||||
|
|
||||||
|
util.rootCmd = rootCmd
|
||||||
|
return util.rootCmd
|
||||||
|
}
|
||||||
|
|
||||||
+4
-381
@@ -1,398 +1,21 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2024 Oleg Borodin <borodin@unix7.org>
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
"os"
|
||||||
"os/user"
|
|
||||||
"path/filepath"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"mbase/pkg/client"
|
|
||||||
"mbase/pkg/mbctl"
|
|
||||||
|
|
||||||
"sigs.k8s.io/yaml"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
defaultHostname = "localhost"
|
|
||||||
rcFilename = ".certmanager.yaml"
|
|
||||||
defaultPort uint32 = client.DefaultPort
|
|
||||||
|
|
||||||
getHelloCmd = "getHello"
|
|
||||||
helpCmd = "help"
|
|
||||||
|
|
||||||
createAccountCmd = "createAccount"
|
|
||||||
updateAccountCmd = "updateAccount"
|
|
||||||
deleteAccountCmd = "deleteAccount"
|
|
||||||
listAccountsCmd = "listAccounts"
|
|
||||||
|
|
||||||
setGrantCmd = "setGrant"
|
|
||||||
deleteGrantCmd = "deleteGrant"
|
|
||||||
|
|
||||||
getDumpCmd = "getDump"
|
|
||||||
restoreDumpCmd = "restoreDump"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var err error
|
var err error
|
||||||
util := NewUtil()
|
util := NewUtil()
|
||||||
err = util.Exec()
|
err = util.Build()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
os.Exit(0)
|
err = util.Exec(os.Args[1:])
|
||||||
}
|
|
||||||
|
|
||||||
type Util struct {
|
|
||||||
subCmd string
|
|
||||||
cmdTimeout int64
|
|
||||||
access client.Access
|
|
||||||
cont *mbctl.ControlClient
|
|
||||||
|
|
||||||
caFilenamesList string
|
|
||||||
certFilename string
|
|
||||||
keyFilename string
|
|
||||||
issuerOrganizationName string
|
|
||||||
issuerOrganizationalUnitName string
|
|
||||||
issuerCommonName string
|
|
||||||
issuerID int64
|
|
||||||
issuerName string
|
|
||||||
signerID int64
|
|
||||||
signerName string
|
|
||||||
serviceOrganizationName string
|
|
||||||
serviceOrganizationalUnitName string
|
|
||||||
serviceCommonName string
|
|
||||||
hostnameList string
|
|
||||||
ipAdressesList string
|
|
||||||
serviceID int64
|
|
||||||
serviceName string
|
|
||||||
encodingKey string
|
|
||||||
|
|
||||||
accountID int64
|
|
||||||
username string
|
|
||||||
password string
|
|
||||||
disable bool
|
|
||||||
newUsername string
|
|
||||||
newPassword string
|
|
||||||
operation string
|
|
||||||
filename string
|
|
||||||
deleteAllRecords bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUtil() *Util {
|
|
||||||
var util Util
|
|
||||||
util.cmdTimeout = 120
|
|
||||||
util.access = client.Access{
|
|
||||||
Hostname: defaultHostname,
|
|
||||||
Port: defaultPort,
|
|
||||||
Username: "certmanager",
|
|
||||||
Password: "certmanager",
|
|
||||||
}
|
|
||||||
return &util
|
|
||||||
}
|
|
||||||
|
|
||||||
func (util *Util) GetOpt() error {
|
|
||||||
var err error
|
|
||||||
|
|
||||||
homeDir := os.Getenv("HOME")
|
|
||||||
if homeDir == "" {
|
|
||||||
currUsr, err := user.Current()
|
|
||||||
if err == nil {
|
|
||||||
homeDir = currUsr.HomeDir
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if homeDir != "" {
|
|
||||||
confPath := filepath.Join(homeDir, rcFilename)
|
|
||||||
confData, err := os.ReadFile(confPath)
|
|
||||||
if err == nil && len(confData) > 0 {
|
|
||||||
yaml.Unmarshal(confData, &util.access)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exeName := filepath.Base(os.Args[0])
|
|
||||||
|
|
||||||
servicePort := int64(defaultPort)
|
|
||||||
flag.Int64Var(&util.cmdTimeout, "timeout", util.cmdTimeout, "command execution timeout")
|
|
||||||
flag.StringVar(&util.access.Hostname, "host", util.access.Hostname, "service hostname")
|
|
||||||
flag.Int64Var(&servicePort, "port", servicePort, "service port")
|
|
||||||
flag.StringVar(&util.access.Username, "user", util.access.Username, "access login")
|
|
||||||
flag.StringVar(&util.access.Password, "pass", util.access.Password, "access password")
|
|
||||||
|
|
||||||
util.access.Port = uint32(servicePort)
|
|
||||||
|
|
||||||
help := func() {
|
|
||||||
fmt.Println("")
|
|
||||||
fmt.Printf("Usage: %s [option] command [command option]\n", exeName)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Command list: help, %s\n", getHelloCmd)
|
|
||||||
fmt.Printf(" %s, %s, %s, %s,\n",
|
|
||||||
createAccountCmd,
|
|
||||||
deleteAccountCmd,
|
|
||||||
listAccountsCmd,
|
|
||||||
updateAccountCmd)
|
|
||||||
fmt.Printf(" %s, %s\n",
|
|
||||||
setGrantCmd,
|
|
||||||
deleteGrantCmd)
|
|
||||||
fmt.Printf(" %s, %s\n",
|
|
||||||
getDumpCmd,
|
|
||||||
restoreDumpCmd)
|
|
||||||
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Global options:\n")
|
|
||||||
flag.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flag.Usage = help
|
|
||||||
flag.Parse()
|
|
||||||
|
|
||||||
args := flag.Args()
|
|
||||||
|
|
||||||
var subCmd string
|
|
||||||
var subArgs []string
|
|
||||||
if len(args) > 0 {
|
|
||||||
subCmd = args[0]
|
|
||||||
subArgs = args[1:]
|
|
||||||
}
|
|
||||||
|
|
||||||
switch subCmd {
|
|
||||||
case helpCmd:
|
|
||||||
help()
|
|
||||||
return errors.New("Unknown command")
|
|
||||||
case getHelloCmd:
|
|
||||||
flagSet := flag.NewFlagSet(getHelloCmd, flag.ExitOnError)
|
|
||||||
|
|
||||||
flagSet.Usage = func() {
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("The command options: none\n")
|
|
||||||
flagSet.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
util.subCmd = subCmd
|
|
||||||
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
|
|
||||||
case createAccountCmd:
|
|
||||||
flagSet := flag.NewFlagSet(createAccountCmd, flag.ExitOnError)
|
|
||||||
|
|
||||||
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
|
||||||
flagSet.StringVar(&util.password, "password", util.password, "user password")
|
|
||||||
|
|
||||||
flagSet.Usage = func() {
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("The command options: none\n")
|
|
||||||
flagSet.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
util.subCmd = subCmd
|
|
||||||
|
|
||||||
case deleteAccountCmd:
|
|
||||||
flagSet := flag.NewFlagSet(deleteAccountCmd, flag.ExitOnError)
|
|
||||||
|
|
||||||
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
|
||||||
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
|
||||||
|
|
||||||
flagSet.Usage = func() {
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("The command options: none\n")
|
|
||||||
flagSet.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
util.subCmd = subCmd
|
|
||||||
|
|
||||||
case listAccountsCmd:
|
|
||||||
flagSet := flag.NewFlagSet(listAccountsCmd, flag.ExitOnError)
|
|
||||||
|
|
||||||
flagSet.Usage = func() {
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("The command options: none\n")
|
|
||||||
flagSet.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
util.subCmd = subCmd
|
|
||||||
|
|
||||||
case updateAccountCmd:
|
|
||||||
flagSet := flag.NewFlagSet(updateAccountCmd, flag.ExitOnError)
|
|
||||||
|
|
||||||
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
|
||||||
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
|
||||||
|
|
||||||
flagSet.StringVar(&util.newUsername, "newUsername", util.newUsername, "new user name")
|
|
||||||
flagSet.StringVar(&util.newPassword, "newPassword", util.newPassword, "new user password")
|
|
||||||
flagSet.BoolVar(&util.disable, "disable", util.disable, "disable account")
|
|
||||||
|
|
||||||
flagSet.Usage = func() {
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("The command options: none\n")
|
|
||||||
flagSet.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
util.subCmd = subCmd
|
|
||||||
|
|
||||||
case setGrantCmd:
|
|
||||||
flagSet := flag.NewFlagSet(setGrantCmd, flag.ExitOnError)
|
|
||||||
|
|
||||||
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
|
||||||
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
|
||||||
flagSet.StringVar(&util.operation, "operation", util.operation, "grant type")
|
|
||||||
|
|
||||||
flagSet.Usage = func() {
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("The command options: none\n")
|
|
||||||
flagSet.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
util.subCmd = subCmd
|
|
||||||
|
|
||||||
case deleteGrantCmd:
|
|
||||||
flagSet := flag.NewFlagSet(deleteGrantCmd, flag.ExitOnError)
|
|
||||||
|
|
||||||
flagSet.StringVar(&util.username, "username", util.username, "user name")
|
|
||||||
flagSet.Int64Var(&util.accountID, "accountId", util.accountID, "account ID")
|
|
||||||
flagSet.StringVar(&util.operation, "operation", util.operation, "grant type")
|
|
||||||
|
|
||||||
flagSet.Usage = func() {
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("The command options: none\n")
|
|
||||||
flagSet.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
util.subCmd = subCmd
|
|
||||||
|
|
||||||
case getDumpCmd:
|
|
||||||
flagSet := flag.NewFlagSet(getDumpCmd, flag.ExitOnError)
|
|
||||||
flagSet.StringVar(&util.filename, "file", util.filename, "dump file name")
|
|
||||||
|
|
||||||
flagSet.Usage = func() {
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("The command options: none\n")
|
|
||||||
flagSet.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
util.subCmd = subCmd
|
|
||||||
|
|
||||||
case restoreDumpCmd:
|
|
||||||
flagSet := flag.NewFlagSet(restoreDumpCmd, flag.ExitOnError)
|
|
||||||
flagSet.StringVar(&util.filename, "file", util.filename, "dump file name")
|
|
||||||
|
|
||||||
flagSet.Usage = func() {
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("Usage: %s [global options] %s [command options]\n", exeName, subCmd)
|
|
||||||
fmt.Printf("\n")
|
|
||||||
fmt.Printf("The command options: none\n")
|
|
||||||
flagSet.PrintDefaults()
|
|
||||||
fmt.Printf("\n")
|
|
||||||
}
|
|
||||||
flagSet.Parse(subArgs)
|
|
||||||
util.subCmd = subCmd
|
|
||||||
|
|
||||||
default:
|
|
||||||
help()
|
|
||||||
return errors.New("Unknown command")
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
type Response struct {
|
|
||||||
Error bool `json:"error" yaml:"error"`
|
|
||||||
Message string `json:"message,omitempty" yaml:"message,omitempty"`
|
|
||||||
Result any `json:"result,omitempty" yaml:"result,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (util *Util) Exec() error {
|
|
||||||
var err error
|
|
||||||
err = util.GetOpt()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
var timeout = time.Duration(util.cmdTimeout) * time.Second
|
|
||||||
ctx, close := context.WithTimeout(context.Background(), timeout)
|
|
||||||
defer close()
|
|
||||||
|
|
||||||
var res any
|
|
||||||
switch util.subCmd {
|
|
||||||
case getHelloCmd:
|
|
||||||
res, err = util.GetHello(ctx)
|
|
||||||
|
|
||||||
case createAccountCmd:
|
|
||||||
res, err = util.CreateAccount(ctx)
|
|
||||||
case updateAccountCmd:
|
|
||||||
res, err = util.UpdateAccount(ctx)
|
|
||||||
case listAccountsCmd:
|
|
||||||
res, err = util.ListAccounts(ctx)
|
|
||||||
case deleteAccountCmd:
|
|
||||||
res, err = util.DeleteAccount(ctx)
|
|
||||||
|
|
||||||
case setGrantCmd:
|
|
||||||
res, err = util.SetGrant(ctx)
|
|
||||||
case deleteGrantCmd:
|
|
||||||
res, err = util.DeleteGrant(ctx)
|
|
||||||
|
|
||||||
case getDumpCmd:
|
|
||||||
res, err = util.GetDump(ctx)
|
|
||||||
case restoreDumpCmd:
|
|
||||||
res, err = util.RestoreDump(ctx)
|
|
||||||
|
|
||||||
default:
|
|
||||||
err = errors.New("Unknown cli command")
|
|
||||||
}
|
|
||||||
|
|
||||||
var resp Response
|
|
||||||
if err != nil {
|
|
||||||
resp.Error = true
|
|
||||||
resp.Message = fmt.Sprintf("%v", err)
|
|
||||||
} else {
|
|
||||||
resp.Result = res
|
|
||||||
}
|
|
||||||
respBytes, _ := yaml.Marshal(resp)
|
|
||||||
fmt.Println(string(respBytes))
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (util *Util) GetHello(ctx context.Context) (*mbctl.GetHelloResult, error) {
|
|
||||||
var err error
|
|
||||||
res := &mbctl.GetHelloResult{}
|
|
||||||
grpcConn, cont, err := client.NewClient(&util.access)
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
defer grpcConn.Close()
|
|
||||||
|
|
||||||
params := &mbctl.GetHelloParams{}
|
|
||||||
res, err = cont.GetHello(ctx, params)
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
return res, err
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"mbase/cmd/mbaseadmin/account"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Util struct {
|
||||||
|
rootCmd *cobra.Command
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUtil() *Util {
|
||||||
|
return &Util{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) GetRooCmd() *cobra.Command {
|
||||||
|
return util.rootCmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) Build() error {
|
||||||
|
var err error
|
||||||
|
execName := filepath.Base(os.Args[0])
|
||||||
|
rootCmd := &cobra.Command{
|
||||||
|
Use: execName,
|
||||||
|
Short: "\nAccount operations",
|
||||||
|
SilenceUsage: true,
|
||||||
|
}
|
||||||
|
rootCmd.CompletionOptions.DisableDefaultCmd = true
|
||||||
|
|
||||||
|
accountUtil := account.NewUtil()
|
||||||
|
rootCmd.AddCommand(accountUtil.BuildCmds())
|
||||||
|
|
||||||
|
util.rootCmd = rootCmd
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (util *Util) Exec(args []string) error {
|
||||||
|
var err error
|
||||||
|
util.rootCmd.SetArgs(args)
|
||||||
|
err = util.rootCmd.Execute()
|
||||||
|
return err
|
||||||
|
}
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"mbase/app/config"
|
||||||
|
"mbase/app/maindb"
|
||||||
|
"mbase/pkg/descr"
|
||||||
|
"mbase/pkg/auxtool"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"go.yaml.in/yaml/v4"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (util *Util) DumpDatabase(cmd *cobra.Command, args []string) {
|
||||||
|
util.dumpDatabaseParams.Filename = args[0]
|
||||||
|
res, err := util.dumpDatabase(util.dumpDatabaseParams)
|
||||||
|
printResponse(res, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type dumpDatabaseParams struct {
|
||||||
|
Filename string
|
||||||
|
}
|
||||||
|
type dumpDatabaseResult struct{}
|
||||||
|
|
||||||
|
func (util *Util) dumpDatabase(params dumpDatabaseParams) (dumpDatabaseResult, error) {
|
||||||
|
var err error
|
||||||
|
res := dumpDatabaseResult{}
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
conf := config.NewConfig()
|
||||||
|
err = conf.ReadFile()
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
err = conf.ReadEnv()
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
db, err := maindb.NewDatabase(conf.DataDir)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
err = db.OpenDatabase()
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
file := os.Stdout
|
||||||
|
if params.Filename != "-" {
|
||||||
|
file, err = os.OpenFile(params.Filename, os.O_CREATE|os.O_WRONLY, 0640)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
}
|
||||||
|
listAccounts, err := db.CompletedListAccounts(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
listGrants, err := db.ListGrants(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
dump := descr.Dump{
|
||||||
|
Timestamp: auxtool.TimeNow(),
|
||||||
|
Accounts: listAccounts,
|
||||||
|
Grants: listGrants,
|
||||||
|
}
|
||||||
|
dumpBytes, err := yaml.Marshal(dump)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
_, err = file.Write(dumpBytes)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"mbase/app/config"
|
||||||
|
"mbase/app/maindb"
|
||||||
|
"mbase/pkg/descr"
|
||||||
|
"mbase/pkg/logger"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"go.yaml.in/yaml/v4"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (util *Util) RestoreDatabase(cmd *cobra.Command, args []string) {
|
||||||
|
util.restoreDatabaseParams.Filename = args[0]
|
||||||
|
res, err := util.restoreDatabase(util.restoreDatabaseParams)
|
||||||
|
printResponse(res, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type restoreDatabaseParams struct {
|
||||||
|
Filename string
|
||||||
|
DeleteAllRecords bool
|
||||||
|
}
|
||||||
|
type restoreDatabaseResult struct{}
|
||||||
|
|
||||||
|
func (util *Util) restoreDatabase(params restoreDatabaseParams) (restoreDatabaseResult, error) {
|
||||||
|
var err error
|
||||||
|
res := restoreDatabaseResult{}
|
||||||
|
ctx := context.Background()
|
||||||
|
log := logger.NewLogger("restore")
|
||||||
|
|
||||||
|
conf := config.NewConfig()
|
||||||
|
err = conf.ReadFile()
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
err = conf.ReadEnv()
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
db, err := maindb.NewDatabase(conf.DataDir)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
err = db.OpenDatabase()
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
file := os.Stdin
|
||||||
|
if params.Filename != "-" {
|
||||||
|
file, err = os.Open(params.Filename)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
}
|
||||||
|
buffer := bytes.NewBuffer(nil)
|
||||||
|
_, err = io.Copy(buffer, file)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
dump := descr.Dump{}
|
||||||
|
err = yaml.Unmarshal(buffer.Bytes(), &dump)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
if params.DeleteAllRecords {
|
||||||
|
err = db.CleanDatabase(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, account := range dump.Accounts {
|
||||||
|
log.Infof("Insert account %s", account.Username)
|
||||||
|
err = db.InsertAccount(ctx, &account)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Insert account error: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, grant := range dump.Grants {
|
||||||
|
log.Infof("Insert grant %s for account %d", grant.Operation, grant.AccountID)
|
||||||
|
err = db.InsertGrant(ctx, &grant)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Insert account error: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
@@ -4,20 +4,10 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"context"
|
|
||||||
"io"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"mbase/app/config"
|
|
||||||
"mbase/app/maindb"
|
|
||||||
"mbase/app/descr"
|
|
||||||
"mbase/pkg/auxtool"
|
|
||||||
"mbase/pkg/logger"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"go.yaml.in/yaml/v4"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Util struct {
|
type Util struct {
|
||||||
@@ -72,144 +62,3 @@ func (util *Util) Exec(args []string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (util *Util) DumpDatabase(cmd *cobra.Command, args []string) {
|
|
||||||
util.dumpDatabaseParams.Filename = args[0]
|
|
||||||
res, err := util.dumpDatabase(util.dumpDatabaseParams)
|
|
||||||
printResponse(res, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
type dumpDatabaseParams struct {
|
|
||||||
Filename string
|
|
||||||
}
|
|
||||||
type dumpDatabaseResult struct{}
|
|
||||||
|
|
||||||
func (util *Util) dumpDatabase(params dumpDatabaseParams) (dumpDatabaseResult, error) {
|
|
||||||
var err error
|
|
||||||
res := dumpDatabaseResult{}
|
|
||||||
ctx := context.Background()
|
|
||||||
|
|
||||||
conf := config.NewConfig()
|
|
||||||
err = conf.ReadFile()
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
err = conf.ReadEnv()
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
db, err := maindb.NewDatabase(conf.DataDir)
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
err = db.OpenDatabase()
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
file := os.Stdout
|
|
||||||
if params.Filename != "-" {
|
|
||||||
file, err = os.OpenFile(params.Filename, os.O_CREATE|os.O_WRONLY, 0640)
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
}
|
|
||||||
listAccounts, err := db.CompletedListAccounts(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
listGrants, err := db.ListGrants(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
dump := descr.Dump{
|
|
||||||
Timestamp: auxtool.TimeNow(),
|
|
||||||
Accounts: listAccounts,
|
|
||||||
Grants: listGrants,
|
|
||||||
}
|
|
||||||
dumpBytes, err := yaml.Marshal(dump)
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
_, err = file.Write(dumpBytes)
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (util *Util) RestoreDatabase(cmd *cobra.Command, args []string) {
|
|
||||||
util.restoreDatabaseParams.Filename = args[0]
|
|
||||||
res, err := util.restoreDatabase(util.restoreDatabaseParams)
|
|
||||||
printResponse(res, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
type restoreDatabaseParams struct {
|
|
||||||
Filename string
|
|
||||||
DeleteAllRecords bool
|
|
||||||
}
|
|
||||||
type restoreDatabaseResult struct{}
|
|
||||||
|
|
||||||
func (util *Util) restoreDatabase(params restoreDatabaseParams) (restoreDatabaseResult, error) {
|
|
||||||
var err error
|
|
||||||
res := restoreDatabaseResult{}
|
|
||||||
ctx := context.Background()
|
|
||||||
log := logger.NewLogger("restore")
|
|
||||||
|
|
||||||
conf := config.NewConfig()
|
|
||||||
err = conf.ReadFile()
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
err = conf.ReadEnv()
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
|
|
||||||
db, err := maindb.NewDatabase(conf.DataDir)
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
err = db.OpenDatabase()
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
file := os.Stdin
|
|
||||||
if params.Filename != "-" {
|
|
||||||
file, err = os.Open(params.Filename)
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
}
|
|
||||||
buffer := bytes.NewBuffer(nil)
|
|
||||||
_, err = io.Copy(buffer, file)
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
dump := descr.Dump{}
|
|
||||||
err = yaml.Unmarshal(buffer.Bytes(), &dump)
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
if params.DeleteAllRecords {
|
|
||||||
err = db.CleanDatabase(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, account := range dump.Accounts {
|
|
||||||
log.Infof("Insert account %s", account.Username)
|
|
||||||
err = db.InsertAccount(ctx, &account)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Insert account error: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, grant := range dump.Grants {
|
|
||||||
log.Infof("Insert grant %s for account %d", grant.Operation, grant.AccountID)
|
|
||||||
err = db.InsertGrant(ctx, &grant)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Insert account error: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ go 1.26.2
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/gin-gonic/gin v1.12.0
|
github.com/gin-gonic/gin v1.12.0
|
||||||
|
github.com/google/uuid v1.6.0
|
||||||
github.com/jmoiron/sqlx v1.4.0
|
github.com/jmoiron/sqlx v1.4.0
|
||||||
github.com/mattn/go-sqlite3 v1.14.44
|
github.com/mattn/go-sqlite3 v1.14.44
|
||||||
github.com/sirupsen/logrus v1.9.4
|
|
||||||
github.com/spf13/cobra v1.10.2
|
github.com/spf13/cobra v1.10.2
|
||||||
github.com/stretchr/testify v1.11.1
|
github.com/stretchr/testify v1.11.1
|
||||||
go.yaml.in/yaml/v4 v4.0.0-rc.4
|
go.yaml.in/yaml/v4 v4.0.0-rc.4
|
||||||
|
|||||||
@@ -82,8 +82,6 @@ github.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRC
|
|||||||
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
||||||
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
|
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
|
||||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=
|
|
||||||
github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=
|
|
||||||
github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
|
github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
|
||||||
github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
|
github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
|
||||||
github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
|
github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
package auxgin
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
)
|
|
||||||
|
|
||||||
func CorsMiddleware() gin.HandlerFunc {
|
|
||||||
|
|
||||||
headers := []string{"Content-Type", "Content-Length", "Accept-Encoding", "X-CSRF-Token", "Authorization"}
|
|
||||||
headerList := strings.Join(headers, ",")
|
|
||||||
|
|
||||||
methods := []string{"POST", "GET", "OPTIONS", "PUT", "DELETE", "UPDATE"}
|
|
||||||
methodList := strings.Join(methods, ",")
|
|
||||||
|
|
||||||
return func(gctx *gin.Context) {
|
|
||||||
gctx.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
|
||||||
gctx.Writer.Header().Set("Access-Control-Max-Age", "86400")
|
|
||||||
gctx.Writer.Header().Set("Access-Control-Allow-Methods", methodList)
|
|
||||||
gctx.Writer.Header().Set("Access-Control-Allow-Headers", headerList)
|
|
||||||
gctx.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
|
|
||||||
|
|
||||||
if gctx.Request.Method == "OPTIONS" {
|
|
||||||
gctx.AbortWithStatus(http.StatusOK)
|
|
||||||
} else {
|
|
||||||
gctx.Next()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
package auxgin
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func LogMiddleware() gin.HandlerFunc {
|
|
||||||
return func(ctx *gin.Context) {
|
|
||||||
|
|
||||||
start := time.Now()
|
|
||||||
|
|
||||||
ctx.Next()
|
|
||||||
|
|
||||||
var reqSize int64
|
|
||||||
var method string
|
|
||||||
var reqURI string
|
|
||||||
var remAddr string
|
|
||||||
if ctx.Request != nil {
|
|
||||||
reqSize = ctx.Request.ContentLength
|
|
||||||
method = ctx.Request.Method
|
|
||||||
reqURI = ctx.Request.RequestURI
|
|
||||||
remAddr = ctx.RemoteIP()
|
|
||||||
}
|
|
||||||
|
|
||||||
duration := time.Since(start).Microseconds()
|
|
||||||
|
|
||||||
var resCode int
|
|
||||||
var resSize int
|
|
||||||
if ctx.Writer != nil {
|
|
||||||
resCode = ctx.Writer.Status()
|
|
||||||
resSize = ctx.Writer.Size()
|
|
||||||
}
|
|
||||||
|
|
||||||
logString := fmt.Sprintf("%s %s %s in=%d out=%d res=%d %dms",
|
|
||||||
remAddr, method, reqURI, reqSize, resSize, resCode, duration)
|
|
||||||
|
|
||||||
logger := logrus.WithField("object", "accesslog")
|
|
||||||
logger.Infoln(logString)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type LogWriter struct {
|
|
||||||
gin.ResponseWriter
|
|
||||||
body *bytes.Buffer
|
|
||||||
}
|
|
||||||
|
|
||||||
func (lw LogWriter) Write(data []byte) (int, error) {
|
|
||||||
lw.body.Write(data)
|
|
||||||
return lw.ResponseWriter.Write(data)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (lw LogWriter) WriteString(data string) (int, error) {
|
|
||||||
lw.body.WriteString(data)
|
|
||||||
return lw.ResponseWriter.WriteString(data)
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
package auxgin
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"io/ioutil"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func RequestLogMiddleware() gin.HandlerFunc {
|
|
||||||
return func(context *gin.Context) {
|
|
||||||
|
|
||||||
contentType := context.GetHeader("Content-Type")
|
|
||||||
contentType = strings.ToLower(contentType)
|
|
||||||
|
|
||||||
var requestBody []byte
|
|
||||||
if context.Request.Body != nil {
|
|
||||||
requestBody, _ = ioutil.ReadAll(context.Request.Body)
|
|
||||||
}
|
|
||||||
|
|
||||||
if strings.Contains(contentType, "application/json") && context.Request.Method == "POST" {
|
|
||||||
buffer := bytes.NewBuffer(nil)
|
|
||||||
json.Indent(buffer, requestBody, "", " ")
|
|
||||||
logger := logrus.WithField("object", "requestlog")
|
|
||||||
logger.Infoln("request:\n", buffer.String())
|
|
||||||
}
|
|
||||||
|
|
||||||
context.Request.Body = ioutil.NopCloser(bytes.NewReader(requestBody))
|
|
||||||
context.Next()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
package auxgin
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func ResponseLogMiddleware() gin.HandlerFunc {
|
|
||||||
return func(context *gin.Context) {
|
|
||||||
contentType := context.GetHeader("Content-Type")
|
|
||||||
contentType = strings.ToLower(contentType)
|
|
||||||
|
|
||||||
writer := &LogWriter{
|
|
||||||
body: bytes.NewBuffer(nil),
|
|
||||||
ResponseWriter: context.Writer,
|
|
||||||
}
|
|
||||||
context.Writer = writer
|
|
||||||
|
|
||||||
context.Next()
|
|
||||||
|
|
||||||
if strings.Contains(contentType, "application/json") {
|
|
||||||
buffer := bytes.NewBuffer(nil)
|
|
||||||
json.Indent(buffer, writer.body.Bytes(), "", " ")
|
|
||||||
logger := logrus.WithField("object", "responselog")
|
|
||||||
logger.Infoln("request:\n", buffer.String())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
|
||||||
|
*/
|
||||||
|
package auxuuid
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
const ZeroUUID string = "00000000-0000-0000-0000-000000000000"
|
||||||
|
|
||||||
|
func NewUUID() string {
|
||||||
|
return uuid.New().String()
|
||||||
|
}
|
||||||
@@ -1 +0,0 @@
|
|||||||
package common
|
|
||||||
@@ -12,7 +12,7 @@ type Dump struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Account struct {
|
type Account struct {
|
||||||
ID int64 `json:"id" yaml:"id" db:"id"`
|
ID string `json:"id" yaml:"id" db:"id"`
|
||||||
Username string `json:"username" yaml:"username" db:"username"`
|
Username string `json:"username" yaml:"username" db:"username"`
|
||||||
Passhash string `json:"passhash" yaml:"passhash" db:"passhash"`
|
Passhash string `json:"passhash" yaml:"passhash" db:"passhash"`
|
||||||
Disabled bool `json:"disabled" yaml:"disabled" db:"disabled"`
|
Disabled bool `json:"disabled" yaml:"disabled" db:"disabled"`
|
||||||
@@ -21,8 +21,8 @@ type Account struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Grant struct {
|
type Grant struct {
|
||||||
ID int64 `json:"id" yaml:"id" db:"id"`
|
ID string `json:"id" yaml:"id" db:"id"`
|
||||||
AccountID int64 `json:"accountID" yaml:"accountID" db:"account_id"`
|
AccountID string `json:"accountID" yaml:"accountID" db:"account_id"`
|
||||||
Operation string `json:"operation" yaml:"operation" db:"operation"`
|
Operation string `json:"operation" yaml:"operation" db:"operation"`
|
||||||
CreatedAt string `json:"createdAt" yaml:"createdAt" db:"created_at"`
|
CreatedAt string `json:"createdAt" yaml:"createdAt" db:"created_at"`
|
||||||
}
|
}
|
||||||
+24
-24
@@ -192,7 +192,7 @@ func (*RestoreDumpResult) Descriptor() ([]byte, []int) {
|
|||||||
type SetGrantParams struct {
|
type SetGrantParams struct {
|
||||||
state protoimpl.MessageState `protogen:"open.v1"`
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
|
Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
|
||||||
AccountID int64 `protobuf:"varint,2,opt,name=accountID,proto3" json:"accountID,omitempty"`
|
AccountID string `protobuf:"bytes,2,opt,name=accountID,proto3" json:"accountID,omitempty"`
|
||||||
Operation string `protobuf:"bytes,3,opt,name=operation,proto3" json:"operation,omitempty"`
|
Operation string `protobuf:"bytes,3,opt,name=operation,proto3" json:"operation,omitempty"`
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
@@ -235,11 +235,11 @@ func (x *SetGrantParams) GetUsername() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *SetGrantParams) GetAccountID() int64 {
|
func (x *SetGrantParams) GetAccountID() string {
|
||||||
if x != nil {
|
if x != nil {
|
||||||
return x.AccountID
|
return x.AccountID
|
||||||
}
|
}
|
||||||
return 0
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *SetGrantParams) GetOperation() string {
|
func (x *SetGrantParams) GetOperation() string {
|
||||||
@@ -251,7 +251,7 @@ func (x *SetGrantParams) GetOperation() string {
|
|||||||
|
|
||||||
type SetGrantResult struct {
|
type SetGrantResult struct {
|
||||||
state protoimpl.MessageState `protogen:"open.v1"`
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
GrantID int64 `protobuf:"varint,1,opt,name=grantID,proto3" json:"grantID,omitempty"`
|
GrantID string `protobuf:"bytes,1,opt,name=grantID,proto3" json:"grantID,omitempty"`
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
}
|
}
|
||||||
@@ -286,17 +286,17 @@ func (*SetGrantResult) Descriptor() ([]byte, []int) {
|
|||||||
return file_mbctl_proto_rawDescGZIP(), []int{5}
|
return file_mbctl_proto_rawDescGZIP(), []int{5}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *SetGrantResult) GetGrantID() int64 {
|
func (x *SetGrantResult) GetGrantID() string {
|
||||||
if x != nil {
|
if x != nil {
|
||||||
return x.GrantID
|
return x.GrantID
|
||||||
}
|
}
|
||||||
return 0
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
type DeleteGrantParams struct {
|
type DeleteGrantParams struct {
|
||||||
state protoimpl.MessageState `protogen:"open.v1"`
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
|
Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
|
||||||
AccountID int64 `protobuf:"varint,2,opt,name=accountID,proto3" json:"accountID,omitempty"`
|
AccountID string `protobuf:"bytes,2,opt,name=accountID,proto3" json:"accountID,omitempty"`
|
||||||
Operation string `protobuf:"bytes,3,opt,name=operation,proto3" json:"operation,omitempty"`
|
Operation string `protobuf:"bytes,3,opt,name=operation,proto3" json:"operation,omitempty"`
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
@@ -339,11 +339,11 @@ func (x *DeleteGrantParams) GetUsername() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *DeleteGrantParams) GetAccountID() int64 {
|
func (x *DeleteGrantParams) GetAccountID() string {
|
||||||
if x != nil {
|
if x != nil {
|
||||||
return x.AccountID
|
return x.AccountID
|
||||||
}
|
}
|
||||||
return 0
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *DeleteGrantParams) GetOperation() string {
|
func (x *DeleteGrantParams) GetOperation() string {
|
||||||
@@ -443,7 +443,7 @@ func (x *CreateAccountParams) GetPassword() string {
|
|||||||
|
|
||||||
type CreateAccountResult struct {
|
type CreateAccountResult struct {
|
||||||
state protoimpl.MessageState `protogen:"open.v1"`
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
AccountID int64 `protobuf:"varint,1,opt,name=accountID,proto3" json:"accountID,omitempty"`
|
AccountID string `protobuf:"bytes,1,opt,name=accountID,proto3" json:"accountID,omitempty"`
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
}
|
}
|
||||||
@@ -478,17 +478,17 @@ func (*CreateAccountResult) Descriptor() ([]byte, []int) {
|
|||||||
return file_mbctl_proto_rawDescGZIP(), []int{9}
|
return file_mbctl_proto_rawDescGZIP(), []int{9}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *CreateAccountResult) GetAccountID() int64 {
|
func (x *CreateAccountResult) GetAccountID() string {
|
||||||
if x != nil {
|
if x != nil {
|
||||||
return x.AccountID
|
return x.AccountID
|
||||||
}
|
}
|
||||||
return 0
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
type DeleteAccountParams struct {
|
type DeleteAccountParams struct {
|
||||||
state protoimpl.MessageState `protogen:"open.v1"`
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
|
Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
|
||||||
AccountID int64 `protobuf:"varint,2,opt,name=accountID,proto3" json:"accountID,omitempty"`
|
AccountID string `protobuf:"bytes,2,opt,name=accountID,proto3" json:"accountID,omitempty"`
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
}
|
}
|
||||||
@@ -530,11 +530,11 @@ func (x *DeleteAccountParams) GetUsername() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *DeleteAccountParams) GetAccountID() int64 {
|
func (x *DeleteAccountParams) GetAccountID() string {
|
||||||
if x != nil {
|
if x != nil {
|
||||||
return x.AccountID
|
return x.AccountID
|
||||||
}
|
}
|
||||||
return 0
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
type DeleteAccountResult struct {
|
type DeleteAccountResult struct {
|
||||||
@@ -576,7 +576,7 @@ func (*DeleteAccountResult) Descriptor() ([]byte, []int) {
|
|||||||
type UpdateAccountParams struct {
|
type UpdateAccountParams struct {
|
||||||
state protoimpl.MessageState `protogen:"open.v1"`
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
|
Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
|
||||||
AccountID int64 `protobuf:"varint,2,opt,name=accountID,proto3" json:"accountID,omitempty"`
|
AccountID string `protobuf:"bytes,2,opt,name=accountID,proto3" json:"accountID,omitempty"`
|
||||||
NewUsername string `protobuf:"bytes,3,opt,name=newUsername,proto3" json:"newUsername,omitempty"`
|
NewUsername string `protobuf:"bytes,3,opt,name=newUsername,proto3" json:"newUsername,omitempty"`
|
||||||
NewPassword string `protobuf:"bytes,4,opt,name=newPassword,proto3" json:"newPassword,omitempty"`
|
NewPassword string `protobuf:"bytes,4,opt,name=newPassword,proto3" json:"newPassword,omitempty"`
|
||||||
Disabled bool `protobuf:"varint,5,opt,name=disabled,proto3" json:"disabled,omitempty"`
|
Disabled bool `protobuf:"varint,5,opt,name=disabled,proto3" json:"disabled,omitempty"`
|
||||||
@@ -621,11 +621,11 @@ func (x *UpdateAccountParams) GetUsername() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *UpdateAccountParams) GetAccountID() int64 {
|
func (x *UpdateAccountParams) GetAccountID() string {
|
||||||
if x != nil {
|
if x != nil {
|
||||||
return x.AccountID
|
return x.AccountID
|
||||||
}
|
}
|
||||||
return 0
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *UpdateAccountParams) GetNewUsername() string {
|
func (x *UpdateAccountParams) GetNewUsername() string {
|
||||||
@@ -1063,17 +1063,17 @@ var file_mbctl_proto_rawDesc = string([]byte{
|
|||||||
0x65, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1a, 0x0a,
|
0x65, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1a, 0x0a,
|
||||||
0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
|
0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||||
0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x63, 0x63,
|
0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x63, 0x63,
|
||||||
0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x63,
|
0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63,
|
||||||
0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61,
|
0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61,
|
||||||
0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72,
|
0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72,
|
||||||
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x0e, 0x73, 0x65, 0x74, 0x47, 0x72, 0x61, 0x6e,
|
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x0e, 0x73, 0x65, 0x74, 0x47, 0x72, 0x61, 0x6e,
|
||||||
0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74,
|
0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74,
|
||||||
0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x49,
|
0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x49,
|
||||||
0x44, 0x22, 0x6b, 0x0a, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74,
|
0x44, 0x22, 0x6b, 0x0a, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74,
|
||||||
0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61,
|
0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61,
|
||||||
0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61,
|
0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61,
|
||||||
0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x18,
|
0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x18,
|
||||||
0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44,
|
0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44,
|
||||||
0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20,
|
0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20,
|
||||||
0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x13,
|
0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x13,
|
||||||
0x0a, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73,
|
0x0a, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73,
|
||||||
@@ -1084,19 +1084,19 @@ var file_mbctl_proto_rawDesc = string([]byte{
|
|||||||
0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,
|
0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,
|
||||||
0x72, 0x64, 0x22, 0x33, 0x0a, 0x13, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f,
|
0x72, 0x64, 0x22, 0x33, 0x0a, 0x13, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f,
|
||||||
0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x63, 0x63,
|
0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x63, 0x63,
|
||||||
0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x63,
|
0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63,
|
||||||
0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x22, 0x4f, 0x0a, 0x13, 0x64, 0x65, 0x6c, 0x65, 0x74,
|
0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x22, 0x4f, 0x0a, 0x13, 0x64, 0x65, 0x6c, 0x65, 0x74,
|
||||||
0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1a,
|
0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1a,
|
||||||
0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
|
0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
|
||||||
0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x63,
|
0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x63,
|
||||||
0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61,
|
0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61,
|
||||||
0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x22, 0x15, 0x0a, 0x13, 0x64, 0x65, 0x6c, 0x65,
|
0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x22, 0x15, 0x0a, 0x13, 0x64, 0x65, 0x6c, 0x65,
|
||||||
0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22,
|
0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22,
|
||||||
0xaf, 0x01, 0x0a, 0x13, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
|
0xaf, 0x01, 0x0a, 0x13, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
|
||||||
0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e,
|
0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e,
|
||||||
0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e,
|
0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e,
|
||||||
0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44,
|
0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44,
|
||||||
0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49,
|
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49,
|
||||||
0x44, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65,
|
0x44, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65,
|
||||||
0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x55, 0x73, 0x65, 0x72, 0x6e,
|
0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x55, 0x73, 0x65, 0x72, 0x6e,
|
||||||
0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f,
|
0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f,
|
||||||
|
|||||||
+6
-6
@@ -35,16 +35,16 @@ message restoreDumpResult {
|
|||||||
|
|
||||||
message setGrantParams {
|
message setGrantParams {
|
||||||
string username = 1;
|
string username = 1;
|
||||||
int64 accountID = 2;
|
string accountID = 2;
|
||||||
string operation = 3;
|
string operation = 3;
|
||||||
}
|
}
|
||||||
message setGrantResult {
|
message setGrantResult {
|
||||||
int64 grantID = 1;
|
string grantID = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
message deleteGrantParams {
|
message deleteGrantParams {
|
||||||
string username = 1;
|
string username = 1;
|
||||||
int64 accountID = 2;
|
string accountID = 2;
|
||||||
string operation = 3;
|
string operation = 3;
|
||||||
}
|
}
|
||||||
message deleteGrantResult {}
|
message deleteGrantResult {}
|
||||||
@@ -55,18 +55,18 @@ message createAccountParams {
|
|||||||
string password = 2;
|
string password = 2;
|
||||||
}
|
}
|
||||||
message createAccountResult {
|
message createAccountResult {
|
||||||
int64 accountID = 1;
|
string accountID = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
message deleteAccountParams {
|
message deleteAccountParams {
|
||||||
string username = 1;
|
string username = 1;
|
||||||
int64 accountID = 2;
|
string accountID = 2;
|
||||||
}
|
}
|
||||||
message deleteAccountResult {}
|
message deleteAccountResult {}
|
||||||
|
|
||||||
message updateAccountParams {
|
message updateAccountParams {
|
||||||
string username = 1;
|
string username = 1;
|
||||||
int64 accountID = 2;
|
string accountID = 2;
|
||||||
string newUsername = 3;
|
string newUsername = 3;
|
||||||
string newPassword = 4;
|
string newPassword = 4;
|
||||||
bool disabled = 5;
|
bool disabled = 5;
|
||||||
|
|||||||
Reference in New Issue
Block a user