131 lines
3.0 KiB
Go
131 lines
3.0 KiB
Go
package dao
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"crypto/md5"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
"sort"
|
|
"strings"
|
|
"time"
|
|
|
|
"go-common/library/ecode"
|
|
"go-common/library/log"
|
|
)
|
|
|
|
const (
|
|
_selectQuery = "SELECT index.dmid,index.oid,index.mid,index.state,content.msg,b_long2ip(content.ip),content.ctime FROM ods.ods_dm_index AS index, ods.ods_dm_content AS content WHERE index.dmid=content.dmid AND index.state in (0,2,6) %s limit 1000000"
|
|
)
|
|
|
|
var (
|
|
signParams = []string{"appKey", "timestamp", "version"}
|
|
)
|
|
|
|
// SendTask send task to BI
|
|
func (d *Dao) SendTask(c context.Context, taskSQL []string) (statusURL string, err error) {
|
|
var (
|
|
sql string
|
|
res struct {
|
|
Code int64 `json:"code"`
|
|
StatusURL string `json:"jobStatusUrl"`
|
|
Message string `json:"msg"`
|
|
}
|
|
params = url.Values{}
|
|
)
|
|
if len(taskSQL) > 0 {
|
|
sql = fmt.Sprintf(" AND %s", strings.Join(taskSQL, " AND "))
|
|
} else {
|
|
err = ecode.RequestErr
|
|
return
|
|
}
|
|
log.Warn("send task sql(%s)", fmt.Sprintf(_selectQuery, sql))
|
|
params.Set("appKey", "672bc22888af701529e8b3052fd2c4a7")
|
|
params.Set("query", fmt.Sprintf(_selectQuery, sql))
|
|
params.Set("timestamp", time.Now().Format("2006-01-02 15:04:05"))
|
|
params.Set("version", "1.0")
|
|
params.Set("signMethod", "md5")
|
|
uri := d.berserkerURI + "?" + sign(params)
|
|
log.Warn("send task uri(%s)", uri)
|
|
req, err := http.NewRequest(http.MethodGet, uri, nil)
|
|
if err != nil {
|
|
log.Error("http.NewRequest(%s) error(%v)", uri, err)
|
|
return
|
|
}
|
|
for i := 0; i < 3; i++ {
|
|
if err = d.httpCli.Do(c, req, &res); err != nil {
|
|
log.Error("d.httpCli.Do error:%v", err)
|
|
time.Sleep(100 * time.Millisecond)
|
|
continue
|
|
}
|
|
if res.Code != 200 {
|
|
err = fmt.Errorf("uri:%s,code:%d", uri, res.Code)
|
|
log.Error("d.res.Code error:%v", err)
|
|
time.Sleep(100 * time.Millisecond)
|
|
continue
|
|
}
|
|
break
|
|
}
|
|
if err != nil {
|
|
log.Error("d.SendTask(uri:%s) error(%v)", uri, err)
|
|
}
|
|
return res.StatusURL, err
|
|
}
|
|
|
|
// Sign calculate appkey and appsecret sign.
|
|
func sign(params url.Values) (query string) {
|
|
tmp := params.Encode()
|
|
signTmp := encode(params)
|
|
if strings.IndexByte(tmp, '+') > -1 {
|
|
tmp = strings.Replace(tmp, "+", "%20", -1)
|
|
}
|
|
var b bytes.Buffer
|
|
b.WriteString("bee5e4b744a22a59abbaecc7ade5de9c")
|
|
b.WriteString(signTmp)
|
|
b.WriteString("bee5e4b744a22a59abbaecc7ade5de9c")
|
|
mh := md5.Sum(b.Bytes())
|
|
// fmt.Println(b.String())
|
|
// query
|
|
var qb bytes.Buffer
|
|
qb.WriteString(tmp)
|
|
qb.WriteString("&sign=")
|
|
qb.WriteString(strings.ToUpper(hex.EncodeToString(mh[:])))
|
|
query = qb.String()
|
|
return
|
|
}
|
|
|
|
// Encode encodes the values into ``sign encoded'' form
|
|
// ("barbazfooquux") sorted by key.
|
|
func encode(v url.Values) string {
|
|
if v == nil {
|
|
return ""
|
|
}
|
|
var buf bytes.Buffer
|
|
keys := make([]string, 0, len(v))
|
|
for k := range v {
|
|
keys = append(keys, k)
|
|
}
|
|
sort.Strings(keys)
|
|
for _, k := range keys {
|
|
found := false
|
|
for _, p := range signParams {
|
|
if p == k {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
if !found {
|
|
continue
|
|
}
|
|
vs := v[k]
|
|
prefix := k
|
|
for _, v := range vs {
|
|
buf.WriteString(prefix)
|
|
buf.WriteString(v)
|
|
}
|
|
}
|
|
return buf.String()
|
|
}
|