死活監視ツール Java MITライセンス
Javaで作る死活監視ツール
JavaコードはMITライセンスで公開します。コードの先頭にBOOGALOO記述をお願い致します
シンプルなGUI、日ごとの累積ログ機能を付けました
操作はシンプルで、「監視」ボタンをクリックするだけ
MK (hoge):対象アドレス名
DMSN (hoge):異常ステータス・オフライン状態
IMSN (hoge):正常ステータス・オンライン状態
使用環境の条件としては、死活監視の対象がPing応答有効であることのみ。一般的な死活監視ツール同様にPingコマンドを使って判定しております
1分ごとに判定して状態を更新いたします
当日日付ディレクトリ(フォルダ)をカレントディレクトリへ自動生成し、ログファイルを保存更新いたします
ログフォルダ名:yyyymmdd
ログファイル名:ip_monitor_log_”yyyymmdd”.csv
カンマ区切りのCSVデータです
2024/2/13 11:00 | 192.168.1.○ | IMSN |
2024/2/13 11:01 | 192.168.1.○ | IMSN |
2024/2/13 11:02 | 192.168.1.○ | DMSN |
2024/2/13 11:03 | 192.168.1.○ | DMSN |
2024/2/13 11:04 | 192.168.1.○ | IMSN |
2024-02-13 11:00:00,192.168.1.〇,IMSN
2024-02-13 11:01:00,192.168.1.〇,IMSN
2024-02-13 11:02:00,192.168.1.〇,DMSN
2024-02-13 11:03:00,192.168.1.〇,DMSN
2024-02-13 11:04:00,192.168.1.〇,IMSN
エディタで開いた場合
/*
DMSN監視
Copyright (c) 2024 BOOGALOO Yasuhiro Yamanaka.
This software is released under the MIT License.
*/
import java.io.File;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileWriter;
import java.io.IOException;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;
public class IPMonitor {
private static final String LOG_FILE_PATH = "ip_monitor_log.csv";
private static final Color ONLINE_COLOR = new Color(255, 165, 0); // オレンジ色
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
String ipAddress = "〇〇〇.〇〇〇.〇〇〇.〇〇〇";
boolean[] isOnline = {false}; // finalまたは事実上のfinalにするため、配列を使用する
JFrame frame = new JFrame("DMSN監視");
JButton monitorButton = new JButton("監視");
JLabel label = new JLabel();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.getContentPane().setBackground(new Color(0, 0, 128)); // 紺色に設定
frame.setLayout(new BorderLayout());
monitorButton.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 14)); // システムで利用可能なサンセリフフォントを指定
monitorButton.setForeground(Color.WHITE);
monitorButton.setBackground(new Color(0, 0, 0, 128)); // 半透明の黒色に設定
monitorButton.setFocusPainted(false);
monitorButton.setPreferredSize(new Dimension(100, 50)); // ボタンのサイズを調整
monitorButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
monitorButton.setEnabled(false); // ボタンを無効化して連続クリックを防止
monitorButton.setText("監視中"); // ボタンのテキストを変更
new Thread(() -> {
try {
InetAddress address = InetAddress.getByName(ipAddress);
boolean currentStatus = address.isReachable(5000); // 5000ミリ秒のタイムアウトでPingを送信
String message = currentStatus ? "MKはIMSNしました" : "MKはDMSNしました";
label.setText(message);
logToCSV(ipAddress, currentStatus);
// オンラインのときに背景色をオレンジに変更
if (currentStatus) {
frame.getContentPane().setBackground(ONLINE_COLOR);
} else {
frame.getContentPane().setBackground(new Color(0, 0, 128)); // 紺色に戻す
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
SwingUtilities.invokeLater(() -> {
monitorButton.setEnabled(true); // ボタンを再度有効化
});
}
}).start();
}
});
JPanel buttonPanel = new JPanel(new GridBagLayout()); // GridBagLayoutを使用してボタンを中央に配置するためのパネル
buttonPanel.setOpaque(false);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
buttonPanel.add(monitorButton, gbc); // ボタンを中央に配置
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setForeground(Color.WHITE);
JPanel centerPanel = new JPanel(new BorderLayout()); // 中央配置用のパネル
centerPanel.setOpaque(false);
centerPanel.add(buttonPanel, BorderLayout.CENTER); // ボタンパネルを中央に配置
centerPanel.add(label, BorderLayout.SOUTH); // メッセージラベルを下部に配置
frame.add(centerPanel, BorderLayout.CENTER); // 中央パネルを中央に配置
frame.setVisible(true);
// タイマーを使って60秒ごとにオンライン状態を確認してメッセージを更新
Timer timer = new Timer(60000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Thread(() -> {
try {
InetAddress address = InetAddress.getByName(ipAddress);
boolean currentStatus = address.isReachable(5000); // 5000ミリ秒のタイムアウトでPingを送信
String message = currentStatus ? "MKはIMSNしました" : "MKはDMSNしました";
label.setText(message);
logToCSV(ipAddress, currentStatus);
// オンラインのときに背景色をオレンジに変更
if (currentStatus) {
frame.getContentPane().setBackground(ONLINE_COLOR);
} else {
frame.getContentPane().setBackground(new Color(0, 0, 128)); // 紺色に戻す
}
} catch (Exception ex) {
ex.printStackTrace();
}
}).start();
}
});
timer.start();
});
}
private static void logToCSV(String ipAddress, boolean status) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
String currentDate = dateFormat.format(new Date());
String folderPath = currentDate; // フォルダパスを設定
// フォルダが存在しない場合は作成
File folder = new File(folderPath);
if (!folder.exists()) {
folder.mkdir();
}
String logFilePath = folderPath + "/ip_monitor_log_" + currentDate + ".csv"; // ファイル名に日付を付加
dateFormat.applyPattern("yyyy-MM-dd HH:mm:ss");
String timestamp = dateFormat.format(new Date());
String statusString = status ? "IMSN" : "DMSN";
try (FileWriter writer = new FileWriter(logFilePath, true)) {
writer.append(timestamp)
.append(",")
.append(ipAddress)
.append(",")
.append(statusString)
.append("\n");
} catch (IOException e) {
e.printStackTrace();
}
}
}
String ipAddress = “〇〇〇.〇〇〇.〇〇〇.〇〇〇”;
ここを対象IPアドレスに書き換えて使ってください
複数のclassファイルなので、jarファイルに圧縮することを推奨いたします
GUIを独立して起動するためには、javaコマンドではなくjavawコマンドを使ってください
exeファイルにコンパイルして使う場合で、DMZではなくローカルで使用する場合は、アンチウイルスソフトが実行ファイルの挙動(ログファイル更新時)をブロックすることが多いので、その場合は除外設定が必要です
情報セキュリティシステムのツールとして使うのであれば、自動保存されたログを集計、解析してRASIS指標・RAS指標、MTBF指標・MTTR指標を出力すると良いかと存じます。ご自身でログアナライザーを作ってみるのも面白いですね