76 lines
1.5 KiB
Go
76 lines
1.5 KiB
Go
package admin
|
|
|
|
import (
|
|
"errors"
|
|
"jiacrontab/models"
|
|
"jiacrontab/pkg/rpc"
|
|
"reflect"
|
|
"strings"
|
|
|
|
"github.com/iwannay/log"
|
|
)
|
|
|
|
func rpcCall(addr string, serviceMethod string, args interface{}, reply interface{}) error {
|
|
err := rpc.Call(addr, serviceMethod, args, reply)
|
|
if err != nil {
|
|
log.Errorf("rpcCall(%s->%s):%v", addr, serviceMethod, err)
|
|
}
|
|
if err == rpc.ErrRpc || err == rpc.ErrShutdown {
|
|
models.DB().Unscoped().Model(&models.Node{}).Where("addr=?", addr).Update("disabled", true)
|
|
}
|
|
return err
|
|
}
|
|
|
|
func validStructRule(i interface{}) error {
|
|
rt := reflect.TypeOf(i)
|
|
rv := reflect.ValueOf(i)
|
|
|
|
if rt.Kind() == reflect.Ptr {
|
|
rt = rt.Elem()
|
|
}
|
|
|
|
if rv.Kind() == reflect.Ptr {
|
|
rv = rv.Elem()
|
|
}
|
|
|
|
for i := 0; i < rt.NumField(); i++ {
|
|
sf := rt.Field(i)
|
|
r := sf.Tag.Get("rule")
|
|
br := sf.Tag.Get("bind")
|
|
|
|
if br == "required" && rv.Field(i).Kind() == reflect.Ptr {
|
|
if rv.Field(i).IsNil() {
|
|
return errors.New(sf.Name + " is required")
|
|
}
|
|
}
|
|
|
|
if r == "" {
|
|
continue
|
|
}
|
|
if rs := strings.Split(r, ","); len(rs) == 2 {
|
|
rvf := rv.Field(i)
|
|
if rs[0] == "required" {
|
|
switch rvf.Kind() {
|
|
case reflect.String:
|
|
if rvf.Interface() == "" {
|
|
return errors.New(rs[1])
|
|
}
|
|
case reflect.Array, reflect.Map:
|
|
if rvf.Len() == 0 {
|
|
return errors.New(rs[1])
|
|
}
|
|
|
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
if rvf.Interface() == 0 {
|
|
return errors.New(rs[1])
|
|
}
|
|
default:
|
|
}
|
|
|
|
}
|
|
continue
|
|
}
|
|
}
|
|
return nil
|
|
}
|