You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
3.0 KiB
130 lines
3.0 KiB
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() |
|
}
|
|
|