1.创建 /usr/local/nagios/script/hwc_sms.py
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
""" @author: @contact: @version: """ # -*- coding: utf-8 -*- import time import uuid import hashlib import base64 import requests # 需要先使用pip install requests命令安装依赖 import sys import urllib3 # 日志处理 # 必填,请参考"开发准备"获取如下数据,替换为实际值 url = 'https://rtcsms.cn-north-1.myhuaweicloud.com:10743/sms/batchSendSms/v1' # APP接入地址+接口访问URI APP_KEY = "" # APP_Key APP_SECRET = "" # APP_Secret sender = "" # 国内短信签名通道号或国际/港澳台短信通道号 TEMPLATE_ID = "" # 模板ID # 条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 # 国际/港澳台短信不用关注该参数 signature = "华为云短信测试" # 签名名称 # 必填,全局号码格式(包含国家码),示例:+8615123456789,多个号码之间用英文逗号分隔 # receiver = "+8615123456789" # 短信接收人号码 # 选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告 statusCallBack = "" ''' 选填,使用无变量模板时请赋空值 TEMPLATE_PARAM = ''; 单变量模板示例:模板内容为"您的验证码是${1}"时,TEMPLATE_PARAM可填写为'["369751"]' 双变量模板示例:模板内容为"您有${1}件快递请到${2}领取"时,TEMPLATE_PARAM可填写为'["3","人民公园正门"]' 模板中的每个变量都必须赋值,且取值不能为空 查看更多模板和变量规范:产品介绍>模板和变量规范 输入参数 用例:python hwc_sms.py ServiceName Hostname WarningState WarningNote ''' receiver = str(sys.argv[1]).replace(".", "_").replace("-", "_") ServiceName = str(sys.argv[2]).replace(".", "").replace("-", "").replace("_", "").replace("Service", "") HostName = str(sys.argv[3]).replace(".", "-").replace("-", "_") WarningState = str(sys.argv[4]).replace(".", "_").replace("-", "_") ReportTime = time.strftime("%H:%M:%S").replace(".", "_") WarningNotes = str(sys.argv[5]).replace(".", "_").replace("-", "_")[0:14] TEMPLATE_PARAM = [] TEMPLATE_PARAM.append(ServiceName) TEMPLATE_PARAM.append(HostName) TEMPLATE_PARAM.append(WarningState) TEMPLATE_PARAM.append(ReportTime) TEMPLATE_PARAM.append(WarningNotes) TEMPLATE_PARAM = str(TEMPLATE_PARAM) ''' 构造X-WSSE参数值 @param appKey: string @param appSecret: string @return: string ''' def buildWSSEHeader(appKey, appSecret): now = time.strftime('%Y-%m-%dT%H:%M:%SZ') # Created nonce = str(uuid.uuid4()).replace('-', '') # Nonce print(nonce) digest = hashlib.sha256((nonce + now + appSecret).encode()).hexdigest() digestBase64 = base64.b64encode(digest.encode()).decode() # PasswordDigest return 'UsernameToken Username="{}",PasswordDigest="{}",Nonce="{}",Created="{}"'.format(appKey, digestBase64, nonce, now); def main(): # 请求Headers header = {'Authorization': 'WSSE realm="SDP",profile="UsernameToken",type="Appkey"', 'X-WSSE': buildWSSEHeader(APP_KEY, APP_SECRET)} # 请求Body formData = {'from': sender, 'to': receiver, 'templateId': TEMPLATE_ID, 'templateParas': TEMPLATE_PARAM, 'statusCallback': statusCallBack, # 'signature': signature #使用国内短信通用模板时,必须填写签名名称 } print(header) print(TEMPLATE_PARAM) requests.packages.urllib3.disable_warnings() # 为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 r = requests.post(url, data=formData, headers=header, verify=False) print(r.text) # 打印响应信息 # def console_out(logFilename): # ''''' Output log to file and console ''' # # Define a Handler and set a format which output to file # logging.basicConfig( # level=logging.DEBUG, # 定义输出到文件的log级别,大于此级别的都被输出 # format='%(asctime)s %(filename)s : %(levelname)s %(message)s', # 定义输出log的格式 # datefmt='%Y-%m-%d %A %H:%M:%S', # 时间 # filename=logFilename, # log文件名 # filemode='w') # 写入模式“w”或“a” # # Define a Handler and set a format which output to console # console = logging.StreamHandler() # 定义console handler # console.setLevel(logging.INFO) # 定义该handler级别 # formatter = logging.Formatter('%(asctime)s %(filename)s : %(levelname)s %(message)s') # 定义该handler格式 # console.setFormatter(formatter) # # Create an instance # logging.getLogger().addHandler(console) # 实例化添加handler # # # Print information # 输出日志级别 # logging.debug('logger debug message') # logging.info('logger info message') # logging.warning('logger warning message') # logging.error('logger error message') # logging.critical('logger critical message') if __name__ == '__main__': # filename = 'recode.log' sys.stdout = open('recode.log', mode='a', encoding='utf-8') main()
//华为云字符长度、特殊符号限制比较严重,需要注意
2. 在command.cfg中增加短信报警命令
# 'notify-by-sms' command definition define command{ command_name notify-by-sms command_line /usr/local/python3/bin/python3 /usr/local/nagios/script/hwc_sms.py $CONTACTPAGER$ "$SERVICEDESC$" "$NOTIFICATIONTYPE$" "$SERVICEST ATE$" "$SERVICEOUTPUT$" }
3. 在contacts.cfg中,对需要接受短信的用户添加
service_notification_commands notify-by-sms
host_notification_commands notify-by-sms
4. 重启nagios服务