自動生成プログラムの機能はオプション‘-h’を付けると確認することが出来る。この辺は普通のコマンドラインプログラムっぽく作ってみました。
root@xxx:~# blockset.py -h
usage: blockset.py [-h] [-n] [-f] [-d] [-u] [-o MASK,COUNT] [-c COUNT] [-a ADDRESS] [logfile]
blockset.py collection of unauthorized access list and restart firewall(ufw)
positional arguments:
logfile input log file default:/var/log/mail.log
optional arguments:
-h, --help show this help message and exit
-n, --none Check only mode.
-f, --force bloclist force update, unless new record.
-d, --debug debug print mode
-u, --update blocklist update and restart firewall(ufw)
-o MASK,COUNT, --orderck MASK,COUNT
ipset order ckeck
-c COUNT, --count COUNT
abuse count
-a ADDRESS, --address ADDRESS
individually address entry to blacklist
root@xxx:~#
- -h(–help)
ヘルプの表示、引数やコマンドラインオプション説明 - -n(–none)
ログファイルの検査のみで何もしない - -f(–foce)
ログの検査で不正アクセスが無かった場合でも、ファイヤーウォール設定ファイルへのブロックリスト追加を続行する(ネットマスクによるリスト整理時に使用する) - -u(–upadte)
ファイヤーウォール設定ファイルの更新とプロセスリスタートを行う - -o MASK,COUNT (–oderck MASK,COUNT)
ブロックリストを再検査し、指定したマスクビットにてグループ化して、一定数以上のものをリストアップする。-fオプションで該当アドレスをマスクビットでまとめてファイヤーウォール設定ファイルを更新する、ファイヤーウォールの再起動には-uオプションを併用する - -c N(–count N)
検査対象ログにて不正アクセスがN回以上あった場合にリストアップする - -a ADDRESS(–address ADDRESS)
IPアドレスを直接指定して登録する、ログ検査と併用する仕様上、便宜的に100回不正アクセスがあったことにしている
argparse
上記のコマンドラインオプションを効率よく解析し組み込んでくれるのがargpaseモジュール。ヘルプまで作ってくれる
import argparse
・・・・・
# オプション解析
parser = argparse.ArgumentParser(description='blockset.py collection of unauthorized access list and restart firewall(ufw)')
parser.add_argument('logfile', nargs='?', help='input log file default:' + maillog_default, default='')
parser.add_argument('-n', '--none', action='store_true', help='Check only mode.')
parser.add_argument('-f', '--force', action='store_true', help='bloclist force update, unless new record.')
parser.add_argument('-d', '--debug', action='store_true', help='debug print mode')
parser.add_argument('-u', '--update', action='store_true', help='blocklist update and restart firewall(ufw)')
parser.add_argument('-o', '--orderck', type=int_tuple, metavar='MASK,COUNT', help='ipset order ckeck')
parser.add_argument('-c', '--count', type=int, help='abuse count', default = 5)
parser.add_argument('-a', '--address', type=ipv4adr, help='individually address entry to blacklist')
args = parser.parse_args()
ライブラリのインポート後に(クラスや関数宣言があればその後に)、parserオブジェクトを生成し、add_argumentメソッドでオプションを追加していく。ハイフン1つに短いバージョンとハイフン二つの正規バージョン、オプションの型、ヘルプ文章、デフォルト値などからなる。コマンドラインの説明となるヘルプオプションが登録されてないが、これはオプション変数の登録情報から自動的に生成されるようである。
最後にコマンドライン解析(parse_argesメソッド)結果を変数argとする。
以降、オプション –hoge であれば、args.hogeでプログラム中で使用出来るようになる。
add_argumentの引数でtypeによってオプション引数の型が指定出来るが、変わった使い方として、ここを関数名にすることで、オプション引数を関数に与えてその結果をオプション変数として使用することが出来る。
5番目の–oderckはマスクビット数と集計数をMSK,COUNTというようにカンマで区切った形で与えるが、これをtype=int_tuple
として、関数を
def int_tuple(str):
t = tuple(map(lambda x: int(x), str.split(',')))
return t
とすることで、オプション変数args.orderck=(MSK,COUNT)
の様に整数のタプルとして扱うことが出来る。
最後の–address → args.addressも同様に変換して前回紹介したipv4adrsetオブジェクトとして扱っている。