BOOGALOOメニュー
おしゃれな憩いの場・コミュニティサイトのnanini
nanani | フリーのロジックパズル・掲示板サイトはこちら

死活監視ツール Java MITライセンス

Javaで作る死活監視ツール

JavaコードはMITライセンスで公開します。コードの先頭にBOOGALOO記述をお願い致します

シンプルなGUI、日ごとの累積ログ機能を付けました

dmsn_surveillance_gui-0.webp

操作はシンプルで、「監視」ボタンをクリックするだけ

dmsn_surveillance_gui-1.webp

MK (hoge):対象アドレス名

DMSN (hoge):異常ステータス・オフライン状態

IMSN (hoge):正常ステータス・オンライン状態

使用環境の条件としては、死活監視の対象がPing応答有効であることのみ。一般的な死活監視ツール同様にPingコマンドを使って判定しております

1分ごとに判定して状態を更新いたします

当日日付ディレクトリ(フォルダ)をカレントディレクトリへ自動生成し、ログファイルを保存更新いたします

ログフォルダ名:yyyymmdd

ログファイル名:ip_monitor_log_”yyyymmdd”.csv

カンマ区切りのCSVデータです

2024/2/13 11:00192.168.1.○IMSN
2024/2/13 11:01192.168.1.○IMSN
2024/2/13 11:02192.168.1.○DMSN
2024/2/13 11:03192.168.1.○DMSN
2024/2/13 11:04192.168.1.○IMSN
excelで開いた場合

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指標を出力すると良いかと存じます。ご自身でログアナライザーを作ってみるのも面白いですね

この記事が気に入ったら
フォローしてね!

  • URLをコピーしました!
  • URLをコピーしました!
おしゃれな憩いの場・コミュニティサイトのnanini

この記事を書いた人

BOOGALOO BOOGALOO ブガルー代表

ロジックパズル・雑談掲示板サイト
nanini を開発いたしております
左のリンクボタンからどうぞ↓🙏

目次