はじめに
私が行った研究において,SlackのAPIとPythonを用いてVMからSlackにメッセージを送信する方法について知ることが出来たので,今回得た知識をまとめました.
事前準備
- Slack apiからappを作成し,webook URLを取得する
- 取得したURLをメモしておく
通知方法
Slackに通知する関数は以下のように作成しました.
#slackへの通知をする関数
def send_to_slack(message):
webhook_url = #事前準備で取得したWebhookのURL
payload = {
"channel": "通知したいチャンネル名",
"username": "通知するユーザ名",
"text": message,
"icon_emoji": ":ghost:" #好きなアイコンを記述
}
requests.post(webhook_url, json=payload)
DDNSサーバのログからslackに通知するメッセージを作成する関数は以下のように作成しました.
DNSマッピングがADDのもののみを通知するようにしています.
私はDDNSサーバをkeaで作成しており,他のソフトウェアで作成した場合,ログの形が違う可能性があるので修正する必要があるかもです.
#slackへ通知するためのテキストをログ文から生成する
def generate_message(line):
global log_time, message_lst, add_remove_flag
#DNSへの追加が成功していたらそのログの日時を小数点第2位まで取得する
if "DHCP_DDNS_ADD_SUCCEEDED" in line:
#4桁の数字(年度),2桁の数字(月)のようにして日時を取得する
log_time = re.match(r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{2}', line).group()
add_remove_flag = True
elif "DHCP_DDNS_REMOVE_SUCCEEDED" in line:
log_time = re.match(r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{2}', line).group()
add_remove_flag = False
#取得した日時と同じで,FQDNがあれば
elif "FQDN:" in line and log_time in line:
message = re.search(r'FQDN: \[(.*?)\.\]', line).group(1)
message_lst.append(message)
#取得した日時と同じで,IP Addressがあれば
elif "Address:" in line and log_time in line:
message = re.search(r'IP Address: \[(.*?)\]', line).group(1)
message_lst.append(message)
#IPアドレス,FQDNが追加されていれば
if len(message_lst) >= 2:
#Slackに通知
fqdn = message_lst[0]
ip_address = message_lst[1]
if add_remove_flag:
#連続でADDされていなければ通知
if add_and_remove_check(fqdn):
new_message = f"{fqdn} is binded new client.(ip_addr: `{ip_address}`)"
send_to_slack(new_message)
message_lst = []
else:
remove_text(fqdn)
new_message = f"{fqdn} is removed client.(ip_addr: `{ip_address}`)"
send_to_slack(new_message)
message_lst = []
上記の関数を用いてSlackにメッセージを送信すると以下のように通知されます.
おわりに
本記事では,私が研究を通じて得たpythonを用いてDDNSサーバのログをSlackに通知する方法についてまとめました.