Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
DolphinScheduler
提交
7b1744ba
DolphinScheduler
项目概览
apache
/
DolphinScheduler
上一次同步 接近 2 年
通知
707
Star
9572
Fork
3514
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
DolphinScheduler
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
7b1744ba
编写于
1月 12, 2022
作者:
K
Kerwin
提交者:
GitHub
1月 12, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
cherry-pick DingTalk alert plugin adds signature. #7805 (#7959)
上级
1642968b
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
102 addition
and
37 deletion
+102
-37
dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-dingtalk/src/main/java/org/apache/dolphinscheduler/plugin/alert/dingtalk/DingTalkAlertChannelFactory.java
...er/plugin/alert/dingtalk/DingTalkAlertChannelFactory.java
+42
-26
dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-dingtalk/src/main/java/org/apache/dolphinscheduler/plugin/alert/dingtalk/DingTalkParamsConstants.java
...eduler/plugin/alert/dingtalk/DingTalkParamsConstants.java
+7
-1
dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-dingtalk/src/main/java/org/apache/dolphinscheduler/plugin/alert/dingtalk/DingTalkSender.java
...olphinscheduler/plugin/alert/dingtalk/DingTalkSender.java
+49
-8
dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-dingtalk/src/test/java/org/apache/dolphinscheduler/plugin/alert/dingtalk/DingTalkAlertChannelFactoryTest.java
...lugin/alert/dingtalk/DingTalkAlertChannelFactoryTest.java
+1
-1
dolphinscheduler-ui/src/js/module/i18n/locale/en_US.js
dolphinscheduler-ui/src/js/module/i18n/locale/en_US.js
+1
-0
dolphinscheduler-ui/src/js/module/i18n/locale/zh_CN.js
dolphinscheduler-ui/src/js/module/i18n/locale/zh_CN.js
+2
-1
未找到文件。
dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-dingtalk/src/main/java/org/apache/dolphinscheduler/plugin/alert/dingtalk/DingTalkAlertChannelFactory.java
浏览文件 @
7b1744ba
...
...
@@ -50,46 +50,62 @@ public final class DingTalkAlertChannelFactory implements AlertChannelFactory {
@Override
public
List
<
PluginParams
>
params
()
{
InputParam
webHookParam
=
InputParam
.
newBuilder
(
DingTalkParamsConstants
.
NAME_DING_TALK_WEB_HOOK
,
DingTalkParamsConstants
.
DING_TALK_WEB_HOOK
)
InputParam
webHookParam
=
InputParam
.
newBuilder
(
DingTalkParamsConstants
.
NAME_DING_TALK_WEB_HOOK
,
DingTalkParamsConstants
.
DING_TALK_WEB_HOOK
)
.
addValidate
(
Validate
.
newBuilder
()
.
setRequired
(
true
)
.
build
())
.
build
();
InputParam
keywordParam
=
InputParam
.
newBuilder
(
DingTalkParamsConstants
.
NAME_DING_TALK_KEYWORD
,
DingTalkParamsConstants
.
DING_TALK_KEYWORD
)
InputParam
keywordParam
=
InputParam
.
newBuilder
(
DingTalkParamsConstants
.
NAME_DING_TALK_KEYWORD
,
DingTalkParamsConstants
.
DING_TALK_KEYWORD
)
.
addValidate
(
Validate
.
newBuilder
()
.
setRequired
(
tru
e
)
.
setRequired
(
fals
e
)
.
build
())
.
build
();
RadioParam
isEnableProxy
=
RadioParam
.
newBuilder
(
DingTalkParamsConstants
.
NAME_DING_TALK_PROXY_ENABLE
,
DingTalkParamsConstants
.
NAME_DING_TALK_PROXY_ENABLE
)
.
addParamsOptions
(
new
ParamsOptions
(
STRING_YES
,
STRING_TRUE
,
false
))
.
addParamsOptions
(
new
ParamsOptions
(
STRING_NO
,
STRING_FALSE
,
false
))
.
setValue
(
STRING_TRUE
)
.
addValidate
(
Validate
.
newBuilder
()
.
setRequired
(
false
)
.
build
())
.
build
();
InputParam
proxyParam
=
InputParam
.
newBuilder
(
DingTalkParamsConstants
.
NAME_DING_TALK_PROXY
,
DingTalkParamsConstants
.
DING_TALK_PROXY
)
.
addValidate
(
Validate
.
newBuilder
()
.
setRequired
(
false
).
build
())
.
build
();
InputParam
portParam
=
InputParam
.
newBuilder
(
DingTalkParamsConstants
.
NAME_DING_TALK_PORT
,
DingTalkParamsConstants
.
DING_TALK_PORT
)
InputParam
secretParam
=
InputParam
.
newBuilder
(
DingTalkParamsConstants
.
NAME_DING_TALK_SECRET
,
DingTalkParamsConstants
.
DING_TALK_SECRET
)
.
addValidate
(
Validate
.
newBuilder
()
.
setRequired
(
false
).
build
())
.
setRequired
(
false
)
.
build
())
.
build
();
RadioParam
isEnableProxy
=
RadioParam
.
newBuilder
(
DingTalkParamsConstants
.
NAME_DING_TALK_PROXY_ENABLE
,
DingTalkParamsConstants
.
DING_TALK_PROXY_ENABLE
)
.
addParamsOptions
(
new
ParamsOptions
(
STRING_YES
,
STRING_TRUE
,
false
))
.
addParamsOptions
(
new
ParamsOptions
(
STRING_NO
,
STRING_FALSE
,
false
))
.
setValue
(
STRING_FALSE
)
.
addValidate
(
Validate
.
newBuilder
()
.
setRequired
(
false
)
.
build
())
.
build
();
InputParam
proxyParam
=
InputParam
.
newBuilder
(
DingTalkParamsConstants
.
NAME_DING_TALK_PROXY
,
DingTalkParamsConstants
.
DING_TALK_PROXY
)
.
addValidate
(
Validate
.
newBuilder
()
.
setRequired
(
false
)
.
build
())
.
build
();
InputParam
portParam
=
InputParam
.
newBuilder
(
DingTalkParamsConstants
.
NAME_DING_TALK_PORT
,
DingTalkParamsConstants
.
DING_TALK_PORT
)
.
addValidate
(
Validate
.
newBuilder
()
.
setRequired
(
false
)
.
build
())
.
build
();
InputParam
userParam
=
InputParam
.
newBuilder
(
DingTalkParamsConstants
.
NAME_DING_TALK_USER
,
DingTalkParamsConstants
.
DING_TALK_USER
)
.
addValidate
(
Validate
.
newBuilder
()
.
setRequired
(
false
).
build
())
.
build
();
PasswordParam
passwordParam
=
PasswordParam
.
newBuilder
(
DingTalkParamsConstants
.
NAME_DING_TALK_PASSWORD
,
DingTalkParamsConstants
.
DING_TALK_PASSWORD
)
InputParam
userParam
=
InputParam
.
newBuilder
(
DingTalkParamsConstants
.
NAME_DING_TALK_USER
,
DingTalkParamsConstants
.
DING_TALK_USER
)
.
addValidate
(
Validate
.
newBuilder
()
.
setRequired
(
false
)
.
build
())
.
build
();
PasswordParam
passwordParam
=
PasswordParam
.
newBuilder
(
DingTalkParamsConstants
.
NAME_DING_TALK_PASSWORD
,
DingTalkParamsConstants
.
DING_TALK_PASSWORD
)
.
setPlaceholder
(
"if enable use authentication, you need input password"
)
.
build
();
return
Arrays
.
asList
(
webHookParam
,
keywordParam
,
isEnableProxy
,
proxyParam
,
portParam
,
userParam
,
passwordParam
);
return
Arrays
.
asList
(
webHookParam
,
keywordParam
,
secretParam
,
isEnableProxy
,
proxyParam
,
portParam
,
userParam
,
passwordParam
);
}
}
dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-dingtalk/src/main/java/org/apache/dolphinscheduler/plugin/alert/dingtalk/DingTalkParamsConstants.java
浏览文件 @
7b1744ba
...
...
@@ -18,12 +18,18 @@
package
org.apache.dolphinscheduler.plugin.alert.dingtalk
;
public
final
class
DingTalkParamsConstants
{
static
final
String
DING_TALK_PROXY_ENABLE
=
"isEnableProxy"
;
static
final
String
NAME_DING_TALK_PROXY_ENABLE
=
"IsEnableProxy"
;
static
final
String
DING_TALK_WEB_HOOK
=
"webhook"
;
static
final
String
NAME_DING_TALK_WEB_HOOK
=
"WebHook"
;
static
final
String
DING_TALK_KEYWORD
=
"keyword"
;
static
final
String
NAME_DING_TALK_KEYWORD
=
"Keyword"
;
static
final
String
NAME_DING_TALK_PROXY_ENABLE
=
"IsEnableProxy"
;
static
final
String
DING_TALK_SECRET
=
"secret"
;
static
final
String
NAME_DING_TALK_SECRET
=
"Secret"
;
static
final
String
DING_TALK_PROXY
=
"proxy"
;
static
final
String
NAME_DING_TALK_PROXY
=
"Proxy"
;
static
final
String
DING_TALK_PORT
=
"port"
;
...
...
dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-dingtalk/src/main/java/org/apache/dolphinscheduler/plugin/alert/dingtalk/DingTalkSender.java
浏览文件 @
7b1744ba
...
...
@@ -20,6 +20,7 @@ package org.apache.dolphinscheduler.plugin.alert.dingtalk;
import
org.apache.dolphinscheduler.alert.api.AlertResult
;
import
org.apache.dolphinscheduler.spi.utils.JSONUtils
;
import
org.apache.commons.codec.binary.Base64
;
import
org.apache.commons.codec.binary.StringUtils
;
import
org.apache.http.HttpEntity
;
import
org.apache.http.HttpHost
;
...
...
@@ -36,16 +37,30 @@ import org.apache.http.impl.client.HttpClients;
import
org.apache.http.util.EntityUtils
;
import
java.io.IOException
;
import
java.net.URLEncoder
;
import
java.nio.charset.StandardCharsets
;
import
java.util.HashMap
;
import
java.util.Map
;
import
javax.crypto.Mac
;
import
javax.crypto.spec.SecretKeySpec
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
/**
* <p>
* https://open.dingtalk.com/document/robots/custom-robot-access
* https://open.dingtalk.com/document/robots/customize-robot-security-settings
* </p>
*/
public
final
class
DingTalkSender
{
private
static
final
Logger
log
=
org
.
slf4j
.
LoggerFactory
.
getLogger
(
DingTalkSender
.
class
);
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
DingTalkSender
.
class
);
private
final
String
url
;
private
final
String
keyword
;
private
final
String
secret
;
private
final
Boolean
enableProxy
;
private
String
proxy
;
...
...
@@ -59,6 +74,7 @@ public final class DingTalkSender {
DingTalkSender
(
Map
<
String
,
String
>
config
)
{
url
=
config
.
get
(
DingTalkParamsConstants
.
NAME_DING_TALK_WEB_HOOK
);
keyword
=
config
.
get
(
DingTalkParamsConstants
.
NAME_DING_TALK_KEYWORD
);
secret
=
config
.
get
(
DingTalkParamsConstants
.
NAME_DING_TALK_SECRET
);
enableProxy
=
Boolean
.
valueOf
(
config
.
get
(
DingTalkParamsConstants
.
NAME_DING_TALK_PROXY_ENABLE
));
if
(
Boolean
.
TRUE
.
equals
(
enableProxy
))
{
port
=
Integer
.
parseInt
(
config
.
get
(
DingTalkParamsConstants
.
NAME_DING_TALK_PORT
));
...
...
@@ -109,13 +125,13 @@ public final class DingTalkSender {
if
(
null
==
result
)
{
alertResult
.
setMessage
(
"send ding talk msg error"
);
log
.
info
(
"send ding talk msg error,ding talk server resp is null"
);
log
ger
.
info
(
"send ding talk msg error,ding talk server resp is null"
);
return
alertResult
;
}
DingTalkSendMsgResponse
sendMsgResponse
=
JSONUtils
.
parseObject
(
result
,
DingTalkSendMsgResponse
.
class
);
if
(
null
==
sendMsgResponse
)
{
alertResult
.
setMessage
(
"send ding talk msg fail"
);
log
.
info
(
"send ding talk msg error,resp error"
);
log
ger
.
info
(
"send ding talk msg error,resp error"
);
return
alertResult
;
}
if
(
sendMsgResponse
.
errcode
==
0
)
{
...
...
@@ -124,7 +140,7 @@ public final class DingTalkSender {
return
alertResult
;
}
alertResult
.
setMessage
(
String
.
format
(
"alert send ding talk msg error : %s"
,
sendMsgResponse
.
getErrmsg
()));
log
.
info
(
"alert send ding talk msg error : {}"
,
sendMsgResponse
.
getErrmsg
());
log
ger
.
info
(
"alert send ding talk msg error : {}"
,
sendMsgResponse
.
getErrmsg
());
return
alertResult
;
}
...
...
@@ -134,7 +150,7 @@ public final class DingTalkSender {
String
resp
=
sendMsg
(
title
,
content
);
return
checkSendDingTalkSendMsgResult
(
resp
);
}
catch
(
Exception
e
)
{
log
.
info
(
"send ding talk alert msg exception : {}"
,
e
.
getMessage
());
log
ger
.
info
(
"send ding talk alert msg exception : {}"
,
e
.
getMessage
());
alertResult
=
new
AlertResult
();
alertResult
.
setStatus
(
"false"
);
alertResult
.
setMessage
(
"send ding talk alert fail."
);
...
...
@@ -144,8 +160,18 @@ public final class DingTalkSender {
private
String
sendMsg
(
String
title
,
String
content
)
throws
IOException
{
String
msgToJson
=
textToJsonString
(
title
+
content
+
"#"
+
keyword
);
HttpPost
httpPost
=
constructHttpPost
(
url
,
msgToJson
);
StringBuilder
text
=
new
StringBuilder
();
if
(
org
.
apache
.
dolphinscheduler
.
spi
.
utils
.
StringUtils
.
isNotBlank
(
keyword
))
{
text
.
append
(
keyword
);
text
.
append
(
":"
);
}
text
.
append
(
title
);
text
.
append
(
"\n"
);
text
.
append
(
content
);
String
msgToJson
=
textToJsonString
(
text
.
toString
());
HttpPost
httpPost
=
constructHttpPost
(
org
.
apache
.
dolphinscheduler
.
spi
.
utils
.
StringUtils
.
isBlank
(
secret
)
?
url
:
generateSignedUrl
(),
msgToJson
);
CloseableHttpClient
httpClient
;
if
(
Boolean
.
TRUE
.
equals
(
enableProxy
))
{
...
...
@@ -166,13 +192,28 @@ public final class DingTalkSender {
}
finally
{
response
.
close
();
}
log
.
info
(
"Ding Talk send title :{},content : {}, resp: {}"
,
title
,
content
,
resp
);
log
ger
.
info
(
"Ding Talk send title :{},content : {}, resp: {}"
,
title
,
content
,
resp
);
return
resp
;
}
finally
{
httpClient
.
close
();
}
}
private
String
generateSignedUrl
()
{
Long
timestamp
=
System
.
currentTimeMillis
();
String
stringToSign
=
timestamp
+
"\n"
+
secret
;
String
sign
=
org
.
apache
.
dolphinscheduler
.
spi
.
utils
.
StringUtils
.
EMPTY
;
try
{
Mac
mac
=
Mac
.
getInstance
(
"HmacSHA256"
);
mac
.
init
(
new
SecretKeySpec
(
secret
.
getBytes
(
"UTF-8"
),
"HmacSHA256"
));
byte
[]
signData
=
mac
.
doFinal
(
stringToSign
.
getBytes
(
"UTF-8"
));
sign
=
URLEncoder
.
encode
(
new
String
(
Base64
.
encodeBase64
(
signData
)),
"UTF-8"
);
}
catch
(
Exception
e
)
{
logger
.
error
(
"generate sign error, message:{}"
,
e
);
}
return
url
+
"×tamp="
+
timestamp
+
"&sign="
+
sign
;
}
static
final
class
DingTalkSendMsgResponse
{
private
Integer
errcode
;
private
String
errmsg
;
...
...
dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-dingtalk/src/test/java/org/apache/dolphinscheduler/plugin/alert/dingtalk/DingTalkAlertChannelFactoryTest.java
浏览文件 @
7b1744ba
...
...
@@ -32,7 +32,7 @@ public class DingTalkAlertChannelFactoryTest {
DingTalkAlertChannelFactory
dingTalkAlertChannelFactory
=
new
DingTalkAlertChannelFactory
();
List
<
PluginParams
>
params
=
dingTalkAlertChannelFactory
.
params
();
JSONUtils
.
toJsonString
(
params
);
Assert
.
assertEquals
(
7
,
params
.
size
());
Assert
.
assertEquals
(
8
,
params
.
size
());
}
@Test
...
...
dolphinscheduler-ui/src/js/module/i18n/locale/en_US.js
浏览文件 @
7b1744ba
...
...
@@ -726,6 +726,7 @@ export default {
WebHook
:
'
WebHook
'
,
webHook
:
'
WebHook
'
,
Keyword
:
'
Keyword
'
,
Secret
:
'
Secret
'
,
Proxy
:
'
Proxy
'
,
receivers
:
'
Receivers
'
,
receiverCcs
:
'
ReceiverCcs
'
,
...
...
dolphinscheduler-ui/src/js/module/i18n/locale/zh_CN.js
浏览文件 @
7b1744ba
...
...
@@ -724,7 +724,8 @@ export default {
IsEnableProxy
:
'
启用代理
'
,
WebHook
:
'
Web钩子
'
,
webHook
:
'
Web钩子
'
,
Keyword
:
'
密钥
'
,
Keyword
:
'
关键词
'
,
Secret
:
'
密钥
'
,
Proxy
:
'
代理
'
,
receivers
:
'
收件人
'
,
receiverCcs
:
'
抄送人
'
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录