Apache mod_pioでPOSTデータをログに記録

CentOS 6.5 さくらVPS

POSTデータをログに記録する

vi /etc/httpd/conf/httpd.conf
#mod_dumpio.soをロード
LoadModule dumpio_module modules/mod_dumpio.so
#インプットデータのダンプをON
DumpIOInput On
#LogLevelをdebugに変更
LogLevel debug
/etc/init.d/httpd configtest
/etc/init.d/httpd restart

何かデータをPOSTしてみて、ログを確認

cat /var/log/httpd/error.log
[Tue Jan 28 18:58:05 2014] [debug] mod_dumpio.c(74): mod_dumpio:  dumpio_in (data-HEAP): memo=posttest&payment=2000&delete_id=

iptables

CentOS 6.5 さくらVPS

iptablesフィルタ設定ファイル新規作成

vi /etc/sysconfig/iptables

インバウンドはフィルタ、アウトバンドは全て開放
いずれのフィルタにもマッチしなかったらログ出力

*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SSH, HTTP, HTTPS
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT

# LOG
-A RH-Firewall-1-INPUT -m limit --limit 1/s -j LOG --log-prefix "[iptables firewall] : " --log-level=info

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

COMMIT

rsyslogの設定

vi /etc/rsyslog.conf
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console
kern.info /var/log/iptables.log

iptables,rsyslog再起動

/etc/init.d/iptables restart
/etc/init.d/rsyslog restart

許可していないポートにアクセスしてログ確認

Jan 28 18:44:26 hogehoge kernel: [iptables firewall] : IN=eth0 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=yyy.yyy.yyy.yyy DST=zzz.zzz.zzz.zzz LEN=52 TOS=0x00 PREC=0x00 TTL=116 ID=23725 DF PROTO=TCP SPT=37967 DPT=8080 WINDOW=8192 RES=0x00 SYN URGP=0
Jan 28 18:44:26 hogehoge kernel: [iptables firewall] : IN=eth0 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=yyy.yyy.yyy.yyy DST=zzz.zzz.zzz.zzz LEN=52 TOS=0x00 PREC=0x00 TTL=116 ID=23726 DF PROTO=TCP SPT=38761 DPT=8080 WINDOW=8192 RES=0x00 SYN URGP=0
Jan 28 18:44:26 hogehoge kernel: [iptables firewall] : IN=eth0 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=yyy.yyy.yyy.yyy DST=zzz.zzz.zzz.zzz LEN=40 TOS=0x00 PREC=0x00 TTL=52 ID=44998 PROTO=TCP SPT=37967 DPT=8080 WINDOW=1024 RES=0x00 ACK RST URGP=0
Jan 28 18:44:26 hogehoge kernel: [iptables firewall] : IN=eth0 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=yyy.yyy.yyy.yyy DST=zzz.zzz.zzz.zzz LEN=40 TOS=0x00 PREC=0x00 TTL=52 ID=45000 PROTO=TCP SPT=38761 DPT=8080 WINDOW=1024 RES=0x00 ACK RST URGP=0
Jan 28 18:44:26 hogehoge kernel: [iptables firewall] : IN=eth0 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=yyy.yyy.yyy.yyy DST=zzz.zzz.zzz.zzz LEN=52 TOS=0x00 PREC=0x00 TTL=116 ID=23728 DF PROTO=TCP SPT=41488 DPT=8080 WINDOW=8192 RES=0x00 SYN URGP=0
Jan 28 18:44:33 hogehoge kernel: [iptables firewall] : IN=eth0 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=yyy.yyy.yyy.yyy DST=zzz.zzz.zzz.zzz LEN=48 TOS=0x00 PREC=0x00 TTL=116 ID=23734 DF PROTO=TCP SPT=52180 DPT=8080 WINDOW=8192 RES=0x00 SYN URGP=0
Jan 28 18:44:33 hogehoge kernel: [iptables firewall] : IN=eth0 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=yyy.yyy.yyy.yyy DST=zzz.zzz.zzz.zzz LEN=48 TOS=0x00 PREC=0x00 TTL=116 ID=23733 DF PROTO=TCP SPT=47279 DPT=8080 WINDOW=8192 RES=0x00 SYN URGP=0
Jan 28 18:44:33 hogehoge kernel: [iptables firewall] : IN=eth0 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=yyy.yyy.yyy.yyy DST=zzz.zzz.zzz.zzz LEN=40 TOS=0x00 PREC=0x00 TTL=52 ID=45028 PROTO=TCP SPT=52180 DPT=8080 WINDOW=1024 RES=0x00 ACK RST URGP=0
Jan 28 18:44:33 hogehoge kernel: [iptables firewall] : IN=eth0 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=yyy.yyy.yyy.yyy DST=zzz.zzz.zzz.zzz LEN=40 TOS=0x00 PREC=0x00 TTL=52 ID=45030 PROTO=TCP SPT=47279 DPT=8080 WINDOW=1024 RES=0x00 ACK RST URGP=0
Jan 28 18:44:33 hogehoge kernel: [iptables firewall] : IN=eth0 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=yyy.yyy.yyy.yyy DST=zzz.zzz.zzz.zzz LEN=48 TOS=0x00 PREC=0x00 TTL=116 ID=23748 DF PROTO=TCP SPT=56318 DPT=8080 WINDOW=8192 RES=0x00 SYN URGP=0

Javascript

IntelliJ IDEA のJSコード添削メモ

配列の定義はnew Array() より []で

before

var tmp = new Array();

Array instantiation can be simplified.
Checks for improper usage of wrappers for JavaScript primitive types.
Also, warning will be produced when property of primitive type is modified, as assigned value will be lost.

after

var tmp = [];

for in ループでプロパティの存在チェックを

before

var current_id;
for(var id in ids) {
    current_id = ids[id];
}

Possible iteration over unexpected (custom / inherited) members, probably missing hasOwnProperty check.
Checks for using unfiltered for-in loops in JavaScript, using this construction causes processing inherited or unexpected properties, one needs to filter own properties with hasOwnProperty() method. The validation works in JavaScript, html or jsp files.

after

var current_id;
for(var id in ids) {
    if(ids.hasOwnProperty(id)) {
        var current_id = ids[id];
    }
}

jQuery IDセレクタの重複(同じIDセレクタが複数回登場し、毎回DOMを検索している)

before

            // 移動先の要素をテンポラリにコピー
            for(var i=1; i<=3; i++) {
                tmp['td'+i] = $('#td'+i+'_'+moved_id).children().clone();
                // 移動元の要素を移動先に移動
                $('#td'+i+'_'+moved_id).children().replaceWith($('#td'+i+'_'+current_id).children());
                // テンポラリの要素を移動元に移動
                $('#td'+i+'_'+current_id).append(tmp['td'+i]);
            }

Duplicated jQuery selector.
Checks that jQuery selectors are used in an efficient way. It suggests to split descendant selectors which are prefaced with ID selector and warns about duplicated selectors which could be cached.

after

            // 移動先の要素をテンポラリにコピー
            for(var i=1; i<=3; i++) {
                var moved_obj = $('#td'+i+'_'+moved_id);
                var current_obj = $('#td'+i+'_'+current_id);
                tmp['td'+i] = moved_obj.children().clone();
                // 移動元の要素を移動先に移動
                moved_obj.children().replaceWith(current_obj.children());
                // テンポラリの要素を移動元に移動
                current_obj.append(tmp['td'+i]);
            }

var 定義漏れ

変数がvarで宣言されていない。for in 時も。

before

    for(i in ids) {
        current_id = i;
    }

Variable id implicitly declared.
Checks JavaScript variables to be declared explicitly with var statement. The validation works in JavaScript, html or jsp files.

after

    var current_id;
    for(var i in ids) {
        current_id = i;
    }

インターネット側からWOL(Wake On Lan)

目標

インターネット側の端末からマジックパケットを送信し、自宅LAN上にある端末の電源を投入する

今回の構成(すべて有線LANでの接続)

  • インターネット側の端末:CentOS6.3 (さくらVPS
  • 自宅LAN側のルーターAterm WH822N (コミュファ貸与のブロードバンドルーター)
  • 自宅LAN側の端末(1):Windows7 Professional SP1(Let's Note CF-S9)
  • 自宅LAN側の端末(2):MacOS X 10.9(Mac mini Late 2012)
  • 自宅LANのネットワーク:192.168.1.0/24

まずは自宅LAN上で MacOS X から Windows7 の電源を投入できる様にする

  1. Windows7端末のBIOS設定から、WOLを有効にする
    • 詳細タブ の「Power On by LAN機能」を「有効」にして保存
  2. WIndows7端末のデバイスマネージャ > {使用しているNICのプロパティ} > 電源の管理タブから、WOL関連の設定を有効にする
    • 「このデバイスで、コンピューターのスタンバイ状態を解除できる様にする」にチェック
    • 「Magick Packet でのみ、コンピューターのスタンバイ状態を解除できるようにする」にチェック
  3. WIndows7端末のデバイスマネージャ > {使用しているNICのプロパティ} > 詳細設定タブから、WOL関連の設定を有効にする
    • 「PMEをオンにする」値:オン
    • 「Wake on Link 設定」値:強制
    • 「Wake On Magic Paket」値:オン
    • 「Wake On Pattern Match」値:オン
  4. MacOS Xマジックパケットを送信するツールを導入
  5. ツールを起動し、メニューから [HOST] > [Scan Local Networks...] を選択し [All Computers]にチェックを入れて[Scan]
  6. Windows7端末のIPアドレスMACアドレスが端末一覧に表示されている事を確認する。
  7. Windows7端末をシャットダウンしておき、ツールの端末一覧からWindows7端末のものを選択して[Wake Up!]
  8. Windows7端末が起動したら成功

WOL関連の設定が一部もれている状態の場合に、スリープ状態からは起動するがシャットダウン状態からは起動できないという状況が発生した。

インターネット側からのマジックパケットを受け付けられるように、自宅LANのルーターを設定する

インターネット側から来たマジックパケットを自宅LANにブロードキャストさせる

  1. Aterm WH822NのWEB管理画面から 詳細設定 > IPv4ポートマッピング設定 を開いて [追加]
    • LAN側ホスト「自宅LANのブロードキャストアドレスを入力」(ここでは192.168.1.255)
    • プロトコルUDP
    • ポート番号「Any」のチェックを外して使用する任意のポート番号を入力(ここでは301とする)
    • 優先度「1」(NATの設定状況にあわせて設定)
  2. エントリを追加したら[保存]

※LAN側ホストにブロードキャストアドレスが設定できないルーターの場合は、あきらめる

インターネット側端末のCentOSからマジックパケットを送信し、Windows7端末の電源を投入する

  1. CentOSマジックパケットを送信するツールをインストール
  2. 自宅LANのグローバルIPアドレスルーターに設定したポート、Windows7端末のMACアドレスを指定してコマンドを実行
    • wol -i yyy.yyy.yyy.yyy -p 301 xx:xx:xx:xx:xx:xx
  3. Windows7端末が起動したら成功

マジックパケット送信ツールとして「ether-wake」があるが、宛先IPアドレスが指定できないので別途「wol」を導入した

インターネット側端末のCentOSからマジックパケットを送信し、Mac端末の電源を投入スリープから復帰する

  1. Mac OSXの システム環境設定 > 省エネルギー を開いて設定
    • 「ネットワークアクセスによるスリーブ解除」 にチェック
  2. 自宅LANのグローバルIPアドレスルーターに設定したポート、Mac OSXのMACアドレスを指定してコマンドを実行
    • wol -i yyy.yyy.yyy.yyy -p 301 xx:xx:xx:xx:xx:xx

その他Mac OSXに関するメモ

  • MacOS XWake On Lanでは、電源断からの電源投入には対応していない
  • マジックパケットを受け付けられる状態の時にPINGを打つとTTLが32になる(通常起動時は64)
  • スリープから復帰したあとグラフック関連の挙動が不安定。(画面がグレーのまま操作できないなど)
    • スリープ復帰時にパスワードを要求しない設定にしておくと大丈夫そう。
  • ChromeリモートデスクトップWindows7からMac OSXに接続した場合に、ログインやスリープ復帰後画面のパスワード入力欄にキー入力ができない
    • 自動ログイン、スリープ復帰時にパスワード不要な設定にするか、VNCで接続して入力
  • 操作できなくなったらSSHで接続して、コマンドラインから再起動

PHPからcURL関数を使ってSCPでアップロード

<?php
// PHP5.3.26 win32
$send_file_path = 'c:/hoge/fuga/test.txt';                 // 送信するファイルのローカスパス
$target_file_path = 'scp://example.jp/home/user/test.txt'; // 送信先ファイルのリモートパス

$ch = curl_init();
curl_setopt($ch, CURLOPT_UPLOAD, true);                                 // アップロードを指定
curl_setopt($ch, CURLOPT_INFILE, fopen($send_file_path, 'r'));          // 送信ファイルを開く
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($send_file_path));        // 送信ファイルのサイズを指定
curl_setopt($ch, CURLOPT_URL, $target_file_path);                       // 送信先サイルのリモートパス(プロトコル含む)を指定
curl_setopt($ch, CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_PASSWORD);        // 認証方式を指定(ここではパスワード)
curl_setopt($ch, CURLOPT_USERPWD,'user:password');                      // 認証ユーザー、パスワード

$ret = curl_exec($ch); // 通信実行

if($ret) {
    echo 'send ok!';
} else {
    // 送信結果がfalseならエラーメッセージと通信情報を表示
    var_dump(curl_error($ch));
    var_dump(curl_getinfo($ch));
}

Windowsのコマンドラインでファイルコピーするならxcopyよりrobocopy

Windowsで、バッチ処理でファイルのバックアップを行う場合、
xcopyコマンドでファイルコピーを行うと、ファイルパスが長いファイルがあった場合にエラーとなり処理が停止します。

これはファイルシステムの制限による物で、回避する事ができません。
NTFS ファイル システム上のファイルまたはフォルダを削除できない

原因 4 : ファイル パスの長さが MAX_PATH の文字制限を超えている
ファイル パスに問題があると、ファイルの表示、編集、または削除を行うことができない場合があります。

通常のディレクトリにエクスプローラからアクセスしている場合は
ファイルの作成段階でエラーになりますが、
ネットワークドライブとして割り当てている様な場合(実際のパスは長いが、クライアントがアクセスするパスは短い場合)は、
長いファイルパスを作成できてしまいます。

回避策の一つとして、xcopyではなく255文字以上のファイルパスに対応しているrobocopyを使う方法があります。

Robocopy
Xcopy

使用例

・Eドライブのfromフォルダ以下をdドライブのtoフォルダへコピーする。
・ログをc:\copy.logに残す
・更新されていないファイルはコピーしない
・進行状況は表示しない
ディレクトリ名はログに記録しない

robocopy e:\from\ d:\to\ /S /E /XO /NP /NDL /R:0 /XO /XD "e:\$RECYCLE.BIN" "e:\from\hogehoge" /LOG:c:\copy.log