業務用エアコン関連の技術情報、エラーコード、環境問題対策に関する別サイト「エアコンの安全な修理・適切なフロン回収」

AlmaLinux9.8 : Logwatch , DNS Update, Disk Usage Check Script

Logwatch

①Install

# dnf -y install logwatch

Edit configuration file

# cat /usr/share/logwatch/default.conf/logwatch.conf >> /etc/logwatch/conf/logwatch.conf

# vi /etc/logwatch/conf/logwatch.conf

Line 51  : Comment
#MailTo = root

Line 52 : Add
MailTo = [mail address]

Per Line 84 : Set the level of detail for log notifications
#Detail = Low
Detail = High

Output Logwatch reports

# logwatch --output stdout

It will appear as follows

 ################### Logwatch 7.5.5 (01/22/21) ####################
        Processing Initiated: Fri Jul  3 15:24:25 2026
        Date Range Processed: yesterday
                              ( 2026-Jul-02 )
                              Period is day.
        Detail Level of Output: 10
        Type of Output/Format: stdout / text
        Logfiles for Host: Lepard
 ##################################################################

 --------------------- Kernel Audit Begin ------------------------

  Number of audit daemon starts: 1

  Number of audit initializations: 1

 **Unmatched Entries**
    auditd[760]: audit dispatcher initialized with q_depth=2000 and 1 active plugins: 1 Time(s)

 ---------------------- Kernel Audit End -------------------------

------------------------------------------(Omitted)---------------------------------------------------

 --------------------- Disk Space Begin ------------------------

 Filesystem                  Size  Used Avail Use% Mounted on
 /dev/mapper/almalinux-root   36G  7.1G   28G  21% /
 /dev/nvme0n1p1              960M  462M  499M  49% /boot


 ---------------------- Disk Space End -------------------------


 --------------------- lm_sensors output Begin ------------------------

 No sensors found!
 Make sure you loaded all the kernel drivers you need.
 Try sensors-detect to find out which these are.

 ---------------------- lm_sensors output End -------------------------


 ###################### Logwatch End #########################

Test to see if the report arrives at the address you set. Check if you receive a log report email like the one above.

# /etc/cron.daily/0logwatch

DNS Update

Whenever the internet connection is lost or the router reboots, causing the global IP address to change, you must access the dynamic DNS service to notify it of the IP address change.

Create a dedicated Python file and schedule it for regular execution via Cron.
This time, it's about DNS settings on Valudomain.

# cd /var/www/system
# vi ddnsset.py

Contents of ddnset.py

#setddns.py
import requests
import ipaddress
from datetime import datetime
from pathlib import Path

# SETTING DATA
MY_DOMAIN = "example.jp"  ←Self-hosted domain
MY_PASS = "xxxxxxxxxx" ←Password
MY_HOSTNAME = "xxxx" ←Hostname
OUT_FILE = Path("/tmp/ipadress") ←IP Address Log File

def time_msg():
    now = datetime.now()
    return now.strftime("%Y/%m/%d %H:%M:%S")

def is_valid_ip(ip_str):
    try:
        ipaddress.ip_address(ip_str)
        return True
    except ValueError:
        return False

def main():
    # Check Global IP Address
    url_get_ip = "https://dyn.value-domain.com/cgi-bin/dyn.fcg?ip"
    try:
        response = requests.get(url_get_ip, timeout=10)
        response.raise_for_status()
        current_ip = response.text.strip()
    except requests.RequestException as e:
        print(f"{time_msg()} Failed to get IP: {e}")
        return

    # IP check
    mssg = time_msg()
    if not current_ip:
        print(f"{mssg} invalid IP NULL")
        return

    if not is_valid_ip(current_ip):
        print(f"{mssg} invalid IP={current_ip}")
        return

    # Read previous IP
    previous_ip = ""
    if OUT_FILE.exists():
        with open(OUT_FILE, "r") as f:
            previous_ip = f.read().strip()

    if current_ip == previous_ip:
        print(f"{time_msg()} no change IP={current_ip}")
        return
    else:
        print(f"change IP from {previous_ip} to {current_ip}")

    # Update DDNS
    mssg = time_msg()
    print(f"{mssg} access to value-domain")

    url_set_ddns = (
        f"https://dyn.value-domain.com/cgi-bin/dyn.fcg?"
        f"d={MY_DOMAIN}&p={MY_PASS}&h={MY_HOSTNAME}"
    )

    try:
        response = requests.get(url_set_ddns, timeout=10)
        response.raise_for_status()
        # Convert line breaks to spaces, and merge consecutive spaces into a single space
        result = ' '.join(response.text.strip().split())
    except requests.RequestException as e:
        print(f"{time_msg()} Failed to update DDNS: {e}")
        return

    mssg = time_msg()
    print(f"{mssg} {MY_HOSTNAME}.{MY_DOMAIN} {result} IP={current_ip}")

    # Save the IP address only if the DDNS update is successful
    if "status=0" in result:
        with open(OUT_FILE, "w") as f:
            f.write(current_ip)
        print(f"{mssg} Successfully saved new IP: {current_ip}")
    else:
        print(f"{mssg} DDNS update failed, IP not saved")

if __name__ == "__main__":
    main()

IP Address Log File Creation

# touch /tmp/ipadress

Run periodically

# crontab -e

* 00 * * * /usr/bin/python3 /var/www/system/ddnsset.py >> /var/log/ddns_updater.log 2>&1

Introduce disk usage check script

1. Script Creation

# cd /var/www/system
# vi disk_capacity_check.sh

Contents of disk_capacity_check.sh

#!/bin/bash

#Designation of e-mail address to be notified
MAIL="<your mailaddress>"

DVAL=`/bin/df / | /usr/bin/tail -1 | /bin/sed 's/^.* \([0-9]*\)%.*$/\1/'`

if [ $DVAL -gt 80 ]; then
echo "Disk usage alert: $DVAL %" | mail -s "Disk Space Alert in `hostname`" $MAIL
fi
# chmod 700 disk_capacity_check.sh

2. Execution Confirmation

①Check current usage rates

# df -h

It appears as follows

Filesystem                  Size  Used Avail Use% Mounted on
devtmpfs                    1.8G     0  1.8G   0% /dev
tmpfs                       1.8G     0  1.8G   0% /dev/shm
tmpfs                       725M  9.4M  716M   2% /run
/dev/mapper/almalinux-root   36G  7.1G   28G  21% /
/dev/loop0                  128K  128K     0 100% /var/lib/snapd/snap/hello-world/29
/dev/nvme0n1p1              960M  462M  499M  49% /boot
/dev/loop3                   74M   74M     0 100% /var/lib/snapd/snap/certbot/5603
/dev/loop1                   50M   50M     0 100% /var/lib/snapd/snap/snapd/26865
/dev/loop2                  106M  106M     0 100% /var/lib/snapd/snap/core/17292
/dev/loop4                   67M   67M     0 100% /var/lib/snapd/snap/core24/1643
tmpfs                       363M  8.0K  363M   1% /run/user/1000

②Create a dummy file to achieve at least 80% utilization(In the example, a file named dummyfile with a size of about 25GB)

# dd if=/dev/zero of=dummyfile bs=1M count=25000

③check again
Verify that it is at least 80% by performing the following:

# df -h

④Run check scripts

# /var/www/system/disk_capacity_check.sh

You will receive an email to the email address you have set up, stating something like "Disk usage alert: 90 %".

⑤Delete "dummyfile"

# rm dummyfile

⑥Periodic Execution Setting

# crontab -e
Add the following
30 2 * * * /var/www/system/disk_capacity_check.sh