2014年2月15日土曜日

DNS named.root 更新確認スクリプト

#!/bin/bash
# DNSのnamed.rootファイルの更新確認スクリプト
# 最新版のnamed.rootファイルを取得し、差分を確認する。
# 更新履歴
# 2014.02.07 watari

# お約束
export LANG=C
## 実行ディレクトリ
#PRGDIR=/usr/local/bin
## 実行スクリプト名
PRGNAME=named_hint_check.sh
## named.rootの一時保存場所
TMPDIR=/tmp
## bindのconfigディレクトリ
BINDCONFDIR=[BINDのzoneファイルが設置してあるパス(/etc/bind など)]
## 確認対象ファイル
BINDFILE=[named.confで指定しているファイル名(named.ca など)]
## GETするサーバリスト
GETSRVARRAY=("ftp.internic.net" "ftp.rs.internic.net")
## GETするファイル名
GETFILENAME=named.root
## GETするディレクトリ名
GETDIRNAME=domain
## 宛先メールアドレス
MAILADDR=異常時のメール送信先(name@domain)
## ログ出力先
LOGFILE=/var/log/named_hint_check.log

# おまじない
## メール送信関数(${MAILADDR}宛)
## kw_sendmail "件名" "本文"
kw_sendmail() {
        echo -e "$2" | nkf -j | mail -a 'MIME-Version: 1.0' \
        -a 'Content-Type: text/palin;charset="iso-2022-jp"' \
        -s "$1" ${MAILADDR}
}

## ファイル取得関数
## kw_getfile "プロトコル" "サーバ"
kw_getfile() {
        wget -T 15 -t 1 ${1}://${2}/${GETDIRNAME}/${GETFILENAME} > /dev/null 2>&1
        if [ $? != 0 ]; then
                ### 失敗したが、確認のため再度GET
                wget -T 15 -t 1 ${1}://${2}/${GETDIRNAME}/${GETFILENAME} > /dev/null 2>&1
                if [ $? != 0 ]; then
                        return 1
                fi
        fi
}

## ログ記載関数
## kw_log "ログの内容"
kw_log() {
        echo "`date '+%b %d %T' ` `hostname` ${PRGNAME}: ${1}" >> ${LOGFILE}
}

## iptables設定関数
## kw_iptables "FQDN"
kw_iptables() {
        IPADDR="`/sbin/ifconfig eth0 | awk -F ":" '/inet addr/ { split($2,a," "); print a[1] }'`"
        sudo iptables -A OUTPUT -s ${IPADDR} -d ${1} -j ACCEPT
        IPNUM=`sudo iptables -L OUTPUT --line-numbers | tail -n 1 | awk '{ print $1 }'`
}

# お仕事開始
## 作業ディレクトリに移動
cd ${TMPDIR}

## named.root ダウンロード開始
kw_getfile "http" "${GETSRVARRAY[0]}"
if [ $? != 0 ]; then
        kw_iptables "${GETSRVARRAY[0]}"
        kw_getfile "ftp" "${GETSRVARRAY[0]}"
        if [ $? != 0 ]; then
                kw_log "{GETSERVARRAY[0]}: ${GETFILENAME} の取得に失敗しました。"
                kw_getfile "http" "${GETSRVARRAY[1]}"
                if [ $? != 0 ]; then
                        kw_iptables "${GETSRVARRAY[1]}"
                        kw_getfile "ftp" "${GETSRVARRAY[1]}"
                        if [ $? != 0 ]; then
                                ### ログに記載
                                kw_log "{GETSERVARRAY[0]}: ${GETFILENAME} の取得に失敗しました。"
                                ### メール送信
                                kw_sendmail "${GETFILENAME} diff check script NG!" "${GETFILENAME} のダウンロードに失敗しました。\n担当者は 確認して下さい。"
                                ### 異常終了
                                exit 1
                        else
                                PROTO="ftp"
                                GETSERVNAME="${GETSRVARRAY[1]}"
                                sudo iptables -D OUTPUT ${IPTNUM}
                        fi
                else
                        PROTO="http"
                        GETSERVNAME="${GETSRVARRAY[1]}"
                fi
        else
                PROTO="ftp"
                GETSERVNAME="${GETSRVARRAY[0]}"
                sudo iptables -D OUTPUT ${IPTNUM}
        fi
else
        PROTO="http"
        GETSERVNAME="${GETSRVARRAY[0]}"
fi

## 差分確認
diff ${TMPDIR}/${GETFILENAME} ${BINDCONFDIR}/${BINDFILE} > /dev/null 2>&1
if [ $? != 0 ]; then
        ### 取得ファイルのシリアルを確認
        GETSERIAL=`grep version ${TMPDIR}/${GETFILENAME} | awk '{ print $7 }'`
        NOWSERIAL=`grep version ${BINDCONFDIR}/${BINDFILE} | awk '{ print $7 }'`
        if [ ${GETSERIAL} -gt ${NOWSERIAL} ]; then
                ### ログに記載
                kw_log "${PROTO}://${GETSERVNAME}: ${GETFILENAME} が更新されているようです。${BINDFILE} を確認して下さい。"
                ### メール送信
                kw_sendmail "${GETFILENAME} diff check script NG!" "${BINDFILE} が更新されているようです。\n担当者は差分内容を確認して対応してください。\n${PROTO}://${GETSERVNAME}/${GETDIRNAME}/${GETFILENAME} が該当ファイルです。"
        else
                kw_log "${PROTO}://${GETSERVNAME}: ${GETFILENAME} の更新は必要ありません。"
        fi
else
        kw_log "${PROTO}://${GETSERVNAME}: ${GETFILENAME} の差分はありません。"
fi

## 一時ファイルを削除
rm ${TMPDIR}/${GETFILENAME}

exit 0

2014年2月3日月曜日

壁紙チェンジャー改良

前回のスクリプトから、さらに機能追加して、壁紙ディレクトリを選択できるように改良した。 (しかもGUIで可能!)
$ vi /usr/local/bin/wpchange
#!/bin/bash
# wallpaper changer
# 2014.01.25 ver 1.0 watari
#   とりあえず作成
# 2014.02.03 ver 2.0 watari
#   壁紙ディレクトリの指定機能を追加
# 2014.03.25 ver 2.1 watari
#   ディレクトリ選択時にキャンセルした場合の処理を追加
# crontab指定
# --- ココカラ ---
# # 壁紙チェンジャー
# */15 * * * * /usr/local/bin/wpchange -c > /dev/null 2>&1
# --- ココマデ ---
# ここの時間指定で変更タイミングを修正する。

# お約束
## 更新対象(壁紙ディレクトリ)
PCMANDIR="${HOME}/.config/pcmanfm/LXDE"
WPCONF="${PCMANDIR}/pcmanfm.conf"
DIRCONF="${PCMANDIR}/pictdir.conf"

# お仕事開始
## オプションによる機能選択
case $1 in
    --selectdir | -s)
        ## お約束
        PICTDIR=`zenity --file-selection --title "壁紙ディレクトリの選択" --directory`
        if [ $? -eq 0 ]; then
            ## ディレクトリ設定ファイルの存在確認
            if [ ! -f ${DIRCONF} ]; then
                touch ${DIRCONF}
            fi
            ## 指定されたディレクトリを設定ファイルへ書き込む
            echo ${PICTDIR} > ${DIRCONF}
            ## GUIにて設定完了のお知らせ
            zenity --info --title="設定完了のお知らせ" --text="壁紙ディレクトリに ${PICTDIR} を指定しました。"
            ## おしまい
            exit 0
        else
            ## メッセージなしに終了
            exit 0
        fi
        ;;
    --changepict | -c)
        WPDIR=`cat ${DIRCONF}`
        ##ファイル一覧
        WPLST=($(ls ${WPDIR}))
        ## 要素数
        i=${#WPLST[@]}
        ## 現在の壁紙
        NOWWP=`grep "wallpaper=" ${WPCONF} | awk -F"=" '{ print $2 }'`
        ## 変更予定の壁紙
        RAND=$(((RANDOM % ${i})+1))
        NEXTWP=${WPLST[${RAND}]}
        if [ ${NOWWP} == ${NEXTWP} ]; then
          RAND2=$(((RANDOM % ${i})+1))
          NEXTWP=${WPLST[${RAND2}]}
        fi

        pcmanfm -w ${WPDIR}/${NEXTWP}

        exit 0
        ;;
    *)
        if [ ! ${DISPLAY} == "" ]; then
            zenity --warning --text="利用できるオプションは、--selectdir または -s と、--changepict または -c の2種類です。"
            exit 1
        else
            echo "Usage: $0 Option Failed."
            echo "  MUST with --selectdir(-s) or --changepict(-c)."
            exit 1
        fi
        ;;
esac

exit 0
これ1つでオプション指定によって2つの機能が利用できる。

2014年1月25日土曜日

lxdeで壁紙チェンジャーを作る

$ vi /usr/local/bin/wpchange.sh 
--- ココカラ ---
#!/bin/bash
# wallpaper changer
# 2014.01.25 watari
# ver 1.0
#

# お約束
## 更新対象(壁紙ディレクトリ)
WPDIR=$1
##ファイル一覧
WPLST=($(ls ${WPDIR}))
## 要素数
i=${#WPLST[@]}
## 現在の壁紙
NOWWP=`grep "wallpaper=" ${HOME}/.config/pcmanfm/LXDE/pcmanfm.conf | awk -F"=" '{ print $2 }'`
## 変更予定の壁紙
RAND=$(((RANDOM % ${i})+1))
NEXTWP=${WPLST[${RAND}]}
if [ ${NOWWP} == ${NEXTWP} ]; then
  RAND2=$(((RANDOM % ${i})+1))
  NEXTWP=${WPLST[${RAND2}]}
fi

# お仕事開始
pcmanfm -w ${WPDIR}/${NEXTWP}

exit 0
--- ココマデ ---
$ chmod 755 /usr/local/bin/wpchange.sh
これで、ディレクトリを指定したら、ランダムに壁紙が変わるので、
$ crontab -e
--- ココカラ ---
*/15 * * * * /usr/local/bin/wpchange.sh "ディレクトリパス" > /dev/null 2>&1
--- ココマデ ---
を指定したらOK。 この場合、15分ごとにランダムに壁紙が変わる。「*/15」を適当に変更すれば更新タイミングが変わる。

2013年7月9日火曜日

Pythonで差し込みメール送信 その2

のは処理がスマートでないのと、値1、値2を複数埋め込む必要があったのとで、改良

mailsend.py

#!/usr/bin/env python
#coding: utf-8

# CSVからメール送信スクリプト
# Ver 1.5 わたり 2013.07.09
# 使い方
# /path/to/mailsend.py csv_filename

# おまじない
import sys
import csv
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

argvs = sys.argv

# 引数の確認
# CSVファイルの指定がない場合には、終了
if (len(argvs) != 2):
  print 'Usage: $ %s CSV_filename' % argvs[0]
  quit()

# CSVファイルの読み込み
csvline = csv.reader(open(argvs[1], 'rb'), delimiter = ',', quotechar='"')
for row in csvline:

  if __name__ == "__main__":

    # お約束
    ## メールサーバ
    mailsv       = "メールサーバアドレス"
    ## 送信元メールアドレス
    from_address = "送信者メールアドレス"
    ## 送信先メールアドレス
    to_address   = unicode(row[0], "utf-8")
    ## CC メールアドレス
    cc_address   = "ccするメールアドレス"
    ## 名前 その1
    to_name1 = unicode(row[1], "utf-8")
    ## 名前 その2
    to_name2 = unicode(row[2], "utf-8")

    ## 値1 と 値2(1つ目)
    ataiinfo = row[3] + u"\t" + row[4] + u"\n"
    ## 値1 と 値2(2つ目以降)
    ### 個数分ぶんまわし
    if (len(row) > 5):
      for acount in range(5, len(row) - 1, 2):
        ainfo = row[acount] + u"\t" + row[acount + 1] + u"\n"
        ataiinfo += ainfo
    ### ぶんまわし ここまで

    ## 文字エンコードの指定
    charset = "ISO-2022-JP"
    ## 件名
    subject = u"メール件名を入力。"
    ## 本文(ここから)
    text    = to_name1 + u''' ''' + to_name2 + u''' 様

ここは好きに、

書いて下さい。本文です。

''' + ataiinfo + u'''

末尾の御挨拶など。'''
    ## 本文(ここまで)

    msg = MIMEText(text.encode(charset),"plain",charset)
    msg["Subject"] = Header(subject,charset)
    msg["From"]    = from_address
    msg["To"]      = to_address
    msg["Cc"]      = cc_address
    msg["Date"]    = formatdate(localtime=True)

    ## メールサーバの指定
    smtp = smtplib.SMTP(mailsv)
    ## メールの送信
    smtp.sendmail(from_address,[to_address,cc_address],msg.as_string())
    smtp.close()

# CSV 1行分の処理終わり。以下最終行までぶんまわし
前のはさらにawkなんかでぶん回す必要があったけど、これは、スクリプト内で、csvファイルの読み込み処理までするので、
/path/to/mailsend.py CSV-filename
のみで良い。 作業がスマートになった。 ちなみに、CSVは、
宛先メールアドレス,名前1,名前2,値1,値2,値1,値2,値1,値2,・・・
なんていう行も適切に処理できるようになった。

Pythonで差し込みメール送信

やってみた。

mailsend.py

#!/usr/bin/env python
#coding: utf-8
import sys
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

argvs = sys.argv

if __name__ == "__main__":
  from_address = "送信元メールアドレス"
  to_address = unicode(argvs[1], "utf-8")
  cc_address = "送信先メールアドレス"
  to_name1 = unicode(argvs[2], "utf-8")
  to_name2 = unicode(argvs[3], "utf-8")
  atai1 = unicode(argvs[4], "utf-8")
  atai2 = unicode(argvs[5], "utf-8")
  charset = "ISO-2022-JP"

  subject = u"メール件名です。"
  text = to_name1 + u''' ''' + to_name2 + u''' 様

文章です。

改行も可能です。

''' + atai1 + u'''\t''' + atai2 + u'''

複数の差し込みも可能です。'''

  msg = MIMEText(text.encode(charset),"plain",charset)
  msg["Subject"] = Header(subject,charset)
  msg["From"] = from_address
  msg["To"] = to_address
  msg["Cc"] = cc_address
  msg["Date"] = formatdate(localtime=True)

  smtp = smtplib.SMTP("メールサーバアドレス")
  smtp.sendmail(from_address,[to_address,cc_address],msg.as_string())
  smtp.close()
こんな感じ。今回は、宛名を2つに分ける必要があったため、2つ付いているだけ。 途中の差し込みリストもさらに2つほど渡してやりたかった。

送信リスト

メールアドレス,名前1,名前2,値1,値2
メールアドレス,名前1,名前2,値1,値2
メールアドレス,名前1,名前2,値1,値2
・・・

コマンド実行

awk -F"," '{ print "./mailsend.py",$1,$2,$3,$4,$5 }' | /bin/bash
こんな感じ

2012年3月8日木曜日

apt-get upgrade時のメール送信について

$ cat /etc/apt/listchanges.conf
[apt]
frontend=pager
email_address=root
confirm=0
save_seen=/var/lib/apt/listchanges.db
which=news
この中の「confirm」が「1」になっていると、確認ダイアログが表示されて「email_address」宛にメール送信される。

2011年7月11日月曜日

Shell Script で環境変数を設定する方法

コマンドを使用する。 たとえば、
#!/bin/sh
export LANG=ja_JP.utf-8
というスクリプト「a.sh」があるとすると、
$ source ./a.sh
で反映される。

DNS named.root 更新確認スクリプト

#!/bin/bash # DNSのnamed.rootファイルの更新確認スクリプト # 最新版のnamed.rootファイルを取得し、差分を確認する。 # 更新履歴 # 2014.02.07 watari # お約束 export LANG=C ## 実行ディレクトリ #PR...