見出し画像

D-DNS「mydns.jp」サービスでの自宅サーバーのサブドメイン名の維持

 この記事は、当方が、自宅のRaspberry PIと言う小型のLinux機を使い、家族と知人等に対し、認証付でのWeb接続を出来る様にしているサービスを維持する上で必要な、サブドメイン名の維持を目的に沿って共に低負荷で実現することを目的に、作成したPython3プログラムを、備忘も兼ねて、公開し、皆様と共有する為の場所です。

概要説明

D-DNSとは

 ダイナミックDNS(ドメインネームサービス)は、不定のグローバルIPアドレス一つを接続時に割当てられた形で、インターネット接続しているLAN環境に、そのD-DNSが処理可能なドメイン名とサブドメイン名を与えるもので、
それにより、そのURLを知る人が容易に、LAN内のWebサーバー等に外からアクセス可能にするものです。
 固定IPでは無いので、変化時には、ドメイン名とIPアドレスの対情報を
更新し、全世界のDNSサーバー網へ通知してくれるシステムのことです。

mydns.jp

 日本で、非営利にD-DNSのサービスを提供している有難い所です。
 手持ちのメーアドレスを使い、アカウントを起こし、IDとパスワードを
手順に従い取得し、ドメイン名等のDNSサーバー設定の一部を入力し、
グローバルIPを通知することで、サービス利用が可能に成ります。
 無償なので、一定期間ログインしてIPアドレスの通知が無いときは、
サービスの停止、そしてアカウントの廃止をするシステムに成っています。

このプログラムは

グローバルIPの変更時に素早く通知すると同時に、変化の無いときには、維持の為に日に1回は、通知する様に工夫したものです。

① サービス維持の為の更新間隔は、日に1度に成る様にし、mydns.jp側の受信負荷を低減した上で、
② 起動時に、前回の更新時と異なるグローバルIPに変化していた場合には
その起動間隔で、mydns.jp側に通知が行く様にしています。
③ バカ除けですが、プライベートIPアドレス経由と成った場合には無意味ですので、接続しません。
④ 当方では、消費電力の関係もあり、Raspberry PIという、手のひらサイズの小型PC上に入れで運用開始しています。日常使いのPCの場合は、持出等で、モバイルルーターのIPを掴んだ時に、それの通知が意図せずに行ったり、そのIPが、グローバルではなく、プライベート領域と成ったりと、好ましくない結果を生む可能性も在りますので、好ましいとは思いません。
⑤当方では、IPv6は未対応の回線なので、そちらは省いています。対応は、
通知するURLが変化することと、IPが全く異なる規格の長いものに成ることの差です。その辺りを変更すれば、IPv6も固定でない場合でも、多少の変更で対応可能かと思います。

ソースコード

⓵初版 0.0.0alpha for Python

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-
'''
################################################################################
# CRON活用前提のMyDNS.JPへのIP自動通知 for Python3 2023-04-10                      #
################################################################################
①処理感覚は、CRON依存1時間より細かくすることを推奨、私は6分置き(他の実行開始と被らない分指定)
※crontabに、以下の行を書き込むと毎時2分から、指定通りに6分置きに、このプログラムが起動。
2,8,14,20,26,32,38,44,50,58 * * * * root /usr/bin/python3 /[絶対PATH]/mydns_jp.py
※書き込んだら、sudo service retart cron 等の様に、cronのdaemon(サービス)を再起動

②Global IP Address変化を調べ変化時のみ通知する方式で、サーバー負荷を軽減。
※Global IPが、変わった時には、その最初に起動したときに、通知のログインを実行するので、
cron daemon の設定間隔次第に例えば6分後以内に、DDNSサーバーにログインし、次々と全世界の
DNSサーバー網に更新が伝わって行くことになる。

③維持の為、日に一度だけは、変化無くとも通知を実施する
※変化していないなら、DNSサーバー網に更新が伝わって行くことになる。しかし、変化していないなら、
指定した時間帯に、一日一回だけは、通知を行ない、DDNS設定とアカウントの維持を図る。

④ドメインやアカウント喪失を防止する為に、導入PCの死活監視を組むことを推奨
※このプログラムを入れたLINUX機で、正常に実行出来て、且つ、cron daemonでも定期実行する
状態にあるなら、cronが起動しなくなるか、機械が停止またはネットワークから切り離されない限り
目的のドメインネームは維持され続けます。
従って、その機器がネット上にあり、生きていること程度は、他の機器から監視して、早めに対処可能な様に
別途しておくことは大切なことです。
'''

__author__      = "Mire in Japan"
__version__     = '0.0.0alpha for Python3'
__copyright__   = 'Copyright (c) 2023-04-10 Mire'
__license__     = 'GPLv3'


DDNS_dada = '/etc/ddns/datas'                    #
GIP = '/var/.ddns/.gip'                          #
DATE = '/var/.ddns/.date'                        #
DAILY_SET_HOUR = 3                               #

def get_gip_addr():
    '''
    接続中のLANのGlobal IP Addressを調べる
    GLOBAL IP Adress by https://ifconfig.me
    '''
    import requests
    res = requests.get('https://ifconfig.me')
    return res.text

def get_auth_data(DDNS_dada):
    '''
    MYDNSJPへのアカウント情報の読込
    Gets DDNS data from file
    '''
    _f = open(DDNS_dada)
    _lines = _f.readlines()
    _id, _pwd = _lines[0].strip().split('\t')
    _f.close()
    return _id, _pwd

def login_mydns_jp(id='dummy', pwd='naisho_desu', url='https://ipv4.mydns.jp/login.html'):
    '''
    MYDNSJPへのログインでIP通知と更新
    '''
    import requests
    res = requests.get(url, auth=(id, pwd))
    return res.text

def get_pre_gip(GIP):
    '''
    ファイルから、前回迄に通知した最新のGlobal IP Addressを読込
    Gets pre record of GLOBAL ADDESS from file
    '''
    _f = open(GIP)
    _line = _f.readline()
    _gip = _line.strip()
    _f.close()
    return _gip    

def change_pre_gip(gip, GIP):
    '''
    ファイルに、通知したGlobal IP Addressを書込
    Changes record of GLOBAL IP ADDESS
    '''
    from os.path import exists
    from os import mkdir 

    if not exists('/var/.ddns'):
        mkdir('/var/.ddns')
    _f = open(GIP, 'w')
    _f.write(gip)
    _f.close()
    
def is_global_ip(gip):
    '''
    GLOBAL IP ADDESS チェック
    '''
    #gip = get_gip_addr()
    if (gip[:8]=='192.168.' or gip[:3]=='10.' or
       (gip[:4]=='172.' and gip[4:7] in['16.', '17.', '18.', '19.', '20.', '21.', '22.', '23.', '24.', '25.', '26.', '27.', '28.', '29.', '30.', '31.'])):
        return False
    else:
        return True

def set_gip_to_mydns_jp(DATE):
    '''
    Global IP Addressをセット
    Set GLOBAL IP ADDESS to mydns.jp
    '''
    from os.path import exists
    from datetime import datetime, timedelta #, strftime
    nw = datetime.now()
    #ァ#print([nw])
    if exists(DATE):
        _f = open(DATE)
        _line = _f.readline()
        _pd = _line.split('-')
        p_date = datetime(int(_pd[0]), int(_pd[1]), int(_pd[2]), 0, 0, 0, 0)
        _f.close()
    else:
        _f = open(DATE, 'w')
        p_date = nw - timedelta(days=1)
        print([p_date.strftime('%Y-%m-%d')])
        _f.write(p_date.strftime('%Y-%m-%d'))
        _f.close()
    #print([nw.hour])
    gip = get_gip_addr()
    _id, _pwd = get_auth_data(DDNS_dada)


    if is_global_ip(gip):                           #  ルータの接続IPが、Global IP Address ならば、
        print(gip)
        if not exists(GIP):
            change_pre_gip(gip)
        _pregip = get_gip_addr()
        if not _pregip==gip:                        #    前回処理時のIPと異なるGlobal IP Addressならば、
            change_pre_gip(gip)
            res = login_mydns_jp(_id, _pwd)
         
        elif (nw.hour==DAILY_SET_HOUR
              and not nw.date()==p_date):           #    でなく、処理時間帯が7であり、且つ、前回通知更新が昨日ならば、
            res = login_mydns_jp(_id, _pwd)
            _f = open(DATE, 'w')
            _f.write(nw.strftime('%Y-%m-%d'))
            _f.close()
        else:                                       #    でもないなら、何もしない
            pass
    else:                                           #  でもないなら、プライベートアド゛レスだと表示
        print (gip, 'is private ip address.')

#ここから実行
if __name__ == '__main__':
    #print('your globalip: ' + get_gip_addr())
    set_gip_to_mydns_jp(DATE)                      #  Global IP Addressをセット

②2023-04-14 0.0.0alpha2 for Python3公開

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-
'''
################################################################################
# CRON活用前提のMyDNS.JPへのIP自動通知 for Python3 2023-04-10                      #
################################################################################
①処理感覚は、CRON依存1時間より細かくすることを推奨、私は6分置き(他の実行開始と被らない分指定)
※crontabに、以下の行を書き込むと毎時2分から、指定通りに6分置きに、このプログラムが起動。
2,8,14,20,26,32,38,44,50,58 * * * * root /usr/bin/python3 /[絶対PATH]/mydns_jp.py
※書き込んだら、sudo service retart cron 等の様に、cronのdaemon(サービス)を再起動

②Global IP Address変化を調べ変化時のみ通知する方式で、サーバー負荷を軽減。
※Global IPが、変わった時には、その最初に起動したときに、通知のログインを実行するので、
cron daemon の設定間隔次第に例えば6分後以内に、DDNSサーバーにログインし、次々と全世界の
DNSサーバー網に更新が伝わって行くことになる。

③維持の為、日に一度だけは、変化無くとも通知を実施する
※変化していないなら、DNSサーバー網に更新が伝わって行くことになる。しかし、変化していないなら、
指定した時間帯に、一日一回だけは、通知を行ない、DDNS設定とアカウントの維持を図る。

④ドメインやアカウント喪失を防止する為に、導入PCの死活監視を組むことを推奨
※このプログラムを入れたLINUX機で、正常に実行出来て、且つ、cron daemonでも定期実行する
状態にあるなら、cronが起動しなくなるか、機械が停止またはネットワークから切り離されない限り
目的のドメインネームは維持され続けます。
従って、その機器がネット上にあり、生きていること程度は、他の機器から監視して、早めに対処可能な様に
別途しておくことは大切なことです。
'''

history = '''
* 2023-04-10 0.0.0alpha for Python3 初版公開
* 2023-04-12 初版定期動作確認完了
             ソースコードにコメント追加
* 2023-04-13 DDNSサーバー負荷の分散の為、送信タイミングを5分内でランダムな時点に分散
             IP定期更新の5分内/変化時30秒内の通知実行時の分散化
* 2023-04-14 with文活用で例外処理を含める
             関連関数の追加(未使用、別機器での監視用に利用予定)
             参考にしたURL:  https://self-development.info/python%E3%81%A7%E3%82%B5%E3%82%A4%E3%83%88url%E3%81%8B%E3%82%89ip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%80%90url%E2%86%92%E3%83%89%E3%83%A1%E3%82%A4/
'''

ToDo = '''
* 2023-04-13 Log Info によると、サーバーへの更新が、6分刻みで遅れている。理由不明
'''

__author__      = "Mire in Japan"
__version__     = '0.0.0alpha2 for Python3'
__copyright__   = 'Copyright (c) 2023-04-10 Mire'
__license__     = 'GPLv3'


DDNS_dada = '/etc/ddns/datas'                    # ダイナミック・ドメイン・ネーム・サービスの外部サーバーへの接続IDとパスワードをタブ文字1字で区切ったテキストファイル
GIP = '/var/.ddns/.gip'                          # 前回処理迄の最新のグローバルIPアドレスの記録先
DATE = '/var/.ddns/.date'                        # 最終更新処理日の記録先
DAILY_SET_HOUR = 3                               # サービス維持目的の定期通知の時間帯 0-23 default 3

def get_gip_addr():
    '''
    接続中のLANのGlobal IP Addressを調べる
    GLOBAL IP Adress by https://ifconfig.me
    '''
    import requests
    res = requests.get('https://ifconfig.me')
    return res.text

def get_auth_data(DDNS_dada):
    '''
    MYDNSJPへのアカウント情報の読込
    Gets DDNS data from file
    '''
    with open(DDNS_dada) as _f:
        _lines = _f.readlines()
        _id, _pwd = _lines[0].strip().split('\t')
        _f.close()
        return _id, _pwd

def login_mydns_jp(id='dummy', pwd='naisho_desu', url='https://ipv4.mydns.jp/login.html'):
    '''
    MYDNSJPへのログインでIP通知と更新
    '''
    import requests
    res = requests.get(url, auth=(id, pwd))
    return res.text

def get_pre_gip(GIP):
    '''
    ファイルから、前回迄に通知した最新のGlobal IP Addressを読込
    Gets pre record of GLOBAL ADDESS from file
    '''
    with open(GIP) as _f:
        _line = _f.readline()
        _gip = _line.strip()
        #_f.close()
        return _gip    

def change_pre_gip(gip, GIP):
    '''
    ファイルに、通知したGlobal IP Addressを書込
    Changes record of GLOBAL IP ADDESS
    '''
    from os.path import exists
    from os import mkdir 

    if not exists('/var/.ddns'):
        mkdir('/var/.ddns')
    with open(GIP, 'w') as _f:
        _f.write(gip)
        #_f.close()
    
def is_global_ip(gip):
    '''
    GLOBAL IP ADDESS チェック
    '''
    #gip = get_gip_addr()
    if (gip[:8]=='192.168.' or gip[:3]=='10.' or
       (gip[:4]=='172.' and gip[4:7] in['16.', '17.', '18.', '19.', '20.', '21.', '22.', '23.', '24.', '25.', '26.', '27.', '28.', '29.', '30.', '31.'])):
        return False
    else:
        return True

def get_ip_from_domain_name(domain_name):
    '''
    ドメイン名から、IPアドレスを取得
    '''
    from socket import gethostbyname
    ip = gethostbyname(domain_name)
    #print([ip])
    return ip

def get_domain_from_url(url):
    '''
    URLから、ドメイン名を取得
    '''
    from urllib.parse import urlparse
    parse_url = urlparse(url)
    domain = parse_url.netloc
    return domain

def get_ip_from_uri(uri):
    '''
    URIから、IPを取得
    '''
    domain_name = get_domain_from_url(url)
    ip = get_ip_from_domain_name(domain_name)
    return ip
   

#CRON活用前提のMyDNS.JPへのIP自動通知処理の本体#
def set_gip_to_mydns_jp(DATE):
    '''
    Global IP Addressをセット
    Set GLOBAL IP ADDESS to mydns.jp
    '''
    from os.path import exists
    from datetime import datetime, timedelta #, strftime
    from time import sleep
    from random import randint
    
    nw = datetime.now()
    #ァ#print([nw])
    if exists(DATE):
        with open(DATE) as _f:
            _line = _f.readline()
            _pd = _line.split('-')
            p_date = datetime(int(_pd[0]), int(_pd[1]), int(_pd[2]), 0, 0, 0, 0)
            #_f.close()
    else:
        with open(DATE, 'w') as _f:
            p_date = nw - timedelta(days=1)
            print([p_date.strftime('%Y-%m-%d')])
            _f.write(p_date.strftime('%Y-%m-%d'))
            #_f.close()
    #print([nw.hour])
    gip = get_gip_addr()
    _id, _pwd = get_auth_data(DDNS_dada)


    if is_global_ip(gip):                           #  ルータの接続IPが、Global IP Address ならば、
        print(gip)
        if not exists(GIP):
            change_pre_gip(gip)
        _pregip = get_gip_addr()
        if not _pregip==gip:                        #    前回処理時のIPと異なるGlobal IP Addressならば、
            change_pre_gip(gip)
            sleep(randint(0, 30))
            res = login_mydns_jp(_id, _pwd)
         
        elif (nw.hour==DAILY_SET_HOUR
              and not nw.date()==p_date):           #    でなく、処理時間帯が7であり、且つ、前回通知更新が昨日ならば、
            sleep(randint(0, 300))
            res = login_mydns_jp(_id, _pwd)
            with open(DATE, 'w') as _f:
                _f.write(nw.strftime('%Y-%m-%d'))
                #_f.close()
        else:                                       #    でもないなら、何もしない
            pass
    else:                                           #  でもないなら、プライベートアドレスだと表示
        print (gip, 'is private ip address.')

#ここから実行
if __name__ == '__main__':
    #print('your globalip: ' + get_gip_addr())
    set_gip_to_mydns_jp(DATE)                      #  Global IP Addressをセット

設定と動作チェック

  1. ソースコードのコピぺでスクリプトファイルの作成

    • このままてでは、動きませんが、先ずは、OSのログインユーザーで読書き可能なディレクトリーに、ファイルを作り2の設定ファイル作成等を済ませ、不具合を失くしましょう。

    • 開発実行環境としては、Raspberry PI 3B+ 程度の非力気味な環境でも動き、最初からインストールされている「Thonny」辺りがお奨めですが、テストとして動作させる前提でなら、日常用途のPCで使っている開発環境で構いません。尚、設定ファイルも、その場所はLinux前提で記載していますが、Windowsでも、そのドライブ名+フォルダ名に置き換えれば、それで動作する筈です。その場合はWindowsの定期実行の仕組みで使いましょう。但し、DDNS管理の性質上、常設稼働であるものにして下さい。

  2. 設定ファイルの作成

    1. DDNSのログイン情報ファイル「/etc/ddns/datas」の作成

      • mydmd.jpで、自身メールアドレスを使い、取得したIDとパスワードをタブ文字一つで区切った内容のテキストファイル「datas」を作成

        • 最終はセキュリティ上、所有者はcron実行アカウント(root)のみの権限に絞る方が少しだけ安全には成ります。

        • 必要により、記載の暗号化と複合の仕組みを加えた方がより良いかと。

    2. 「/var/.ddns」フォルダーの作成

      • このフォルダでは、「/var/.ddns/.gip」と「/var/.ddns/.date」の2つのファイルが作成され、処理時に確認したLANから見える、LANの入口のグローバルIPアドレスを書込み、次回実行時に「.gip」は変異の有無の照合用にています。「.date」は、ドメイン設定とアカウントの維持の為に、グローバルIP変異の有無に拘らず、日に1度、mydns.jpに、ログインする為に、執行した処理日を記載し、日付が変わる迄、グローバルIP変更が無いときにはログインはしない様にする目的で使っています。

      • フォルダーへの書込権限が、必要に成りますので、適宜対処して下さい。

  3. Cron daemon(定期実行サービス)への登録と自動実行の確認

    1. Linuxの場合、定時実行にはcronを利用します。それへの登録には、「crontab」コマンドで入力するか直接「/etc/crontab」ファイルを編集し、動作を登録します。

    2. 細かい説明は省きますが、毎時2分を始めとし6分置きに実行させるなら、次の行を追加することに成ります。ソースコード内の説明にも記載しています。

      • 2,8,14,20,26,32,38,44,50,58 * * * * root /usr/bin/python3 /[絶対PATH]/mydns_jp.py

    3. Cron daemonのサービスのリスタート

      • 「sudo service cron restart 」等としたりします。

      • 「sudo service cron status 」として状態確認をすることで、「mydns_jp.py」が、実行しているかの確認が出来ます。

    4. 「/var/.ddns/.gip」と「/var/.ddns/.date」の書き換え確認

    5. 自動実行が出来ていたら、その時間にファイルのタイムスタンプが更新されます。.gipはグローバルIPが切替わったときのみ、,dateは、日付が変わり、日一回の通知時間帯のみですが、これにより正常動作の推定も出来ます。

  4. mydns.jpのログ確認

    • ブラウザ上で、ログインすることで、mydns.jp側へのログ情報が確認出来る。しかし、アドレス通知のログは日に1回のみしか表示されない仕組みに成っている。2日程度置いて、連続して指定時間帯にログが遺って居たら意図通り動作。暫くは週1回以上は確認し通知が途切れてないことを確認しよう。

    • その間に、仕込んだ機器の死活監視を組んで、落ちたことが速やかに判る様にしておきましょう。

参考資料

mydns.jpのLog Info画面

mydns.jpのログ確認
mydns.jpにログインすると、Log Infoで、利用内容のログの確認が出来る。    
①見覚えの無い操作が在ればパスワード変更               
②意図しない結果は、自動処理の見直し                 
③意図通りのログの並びなら、良し。                  
尚、ブラウザからのログインは「LOGIN : <IPアドレス>」のみの表示となり、
「UPDATE」のログは、日に1回の最初のログしか表示されない。日に何度も、
同じ更新処理をしても、此処ては確認出来ませんし、それはサーバー負荷に
つながりますし、その処理をする手許機器の負荷にも成ります。更新処理は
アドレス変更時以外は、日に1度程度が維持には最適だと考えます。    

cronの動作ログの確認方法

 以下の様に「grep "cron" /var/log/syslog*」とコンソール画面で叩くとsyslog内で文字列「cron」を含む行のみを表示出来る。「crontab」で指定した時分に意図通りのログが確認できれば、少なくとも定時実行だけは正常と判断出来る。尚、Logrotateで、ログファイルは、バックアップと消去が繰り返されているので、出ない時には「ls -la /var/log」等して、ログファイルを確認して欲しい。1日経過しても、前述の「mydns.jpのLog Info画面」に「UPDATE」が出なければ、このプログラムコードか、指定したpythonの位置の誤りである可能性が在る。開発環境での実行開始の実行でも「UPDATE」が日に1度入るならば、crontabの記載が、導入端末に符合しているかの確認が必要です。

myid@SVR:~ $ grep "cron" /var/log/syslog*
/var/log/syslog:Apr 11 06:26:01 RP_PRN_CC CRON[25624]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 06:32:01 RP_PRN_CC CRON[25702]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 06:38:01 RP_PRN_CC CRON[25721]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 06:44:01 RP_PRN_CC CRON[25758]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 06:50:01 RP_PRN_CC CRON[25777]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 06:58:01 RP_PRN_CC CRON[25846]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 07:02:01 RP_PRN_CC CRON[25869]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 07:08:01 RP_PRN_CC CRON[25888]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 07:14:01 RP_PRN_CC CRON[25906]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 07:17:01 RP_PRN_CC CRON[25922]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
/var/log/syslog:Apr 11 07:20:01 RP_PRN_CC CRON[25941]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 07:26:01 RP_PRN_CC CRON[25959]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 07:32:01 RP_PRN_CC CRON[25983]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 07:38:01 RP_PRN_CC CRON[26212]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 07:44:01 RP_PRN_CC CRON[26339]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 07:50:01 RP_PRN_CC CRON[26465]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 07:58:01 RP_PRN_CC CRON[26753]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 08:02:01 RP_PRN_CC CRON[26934]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 08:08:01 RP_PRN_CC CRON[27263]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 08:14:01 RP_PRN_CC CRON[27282]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 08:17:01 RP_PRN_CC CRON[27511]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
/var/log/syslog:Apr 11 08:20:01 RP_PRN_CC CRON[27747]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)
/var/log/syslog:Apr 11 08:26:01 RP_PRN_CC CRON[27870]: (root) CMD (/usr/bin/python3 /etc/cron.hourly/mire_mydns_jp__2.py)

python3のパスの確認

 もしも、python3が一つもリストされなかったら、そのインストールが必要なのかもしれませんね。只、今時のLinuxであれば標準でインストールされてはいます。

myid@SVR:~ $ which python3
/usr/bin/python3
myid@SVR:~ $ 

TODO

① mydns.jpのLog InfoのUpdateログの時間帯が、1~2タイミング遅れてついている。理由は不明。syslogのcronのログを確認する限り、現3時台の初回実行の03:02, 03:08も実行されてはいる。でも、Log InfoのUpdateログは、03:14な成ってしまう。日に1回り記録は出るので実用中の問題は無いが、どつき負荷が高い結果の可能性も考え、DDNSサーバー負荷の分散の為、送信タイミングを5分内でランダムな時点に分散 IP定期更新の5分内/変化時30秒内の通知実行時の分散化した。ログ確認は難しくなった。単純なcron設定では、分単位で、タイムサーバーで同期させた時刻に送出してしまう。そういうログインの集中はサーバーには決して良くない。

履歴 

②2023-04-14 0.0.0alpha2 for Python3公開

 バグ取りは在りません。
2023-04-13
  DDNSサーバー負荷の分散の為、送信タイミングを5分内でランダムな時点に分散 IP定期更新の5分内/変化時30秒内の通知実行時の分散化
2023-04-14
 with文活用で例外処理を含める 関連関数の追加(未使用、別機器での監視用に利用予定)


この記事が気に入ったらサポートをしてみませんか?