2017年07月26日

PHPでIPアドレス+ネットマスクに適合するかチェック

あるIPアドレスが、ネットワークアドレス/ネットマスク長にヒットするかどうかを検査したい。ソースアドレスでアクセス制限したいとかいう時によくあるアレである。
IPv4だけのときは、ip2long/long2ipでマスク長のビット演算をして比較すればよかったが、昨今IPv6も普通にあり得るのでそっちにも適用しなくちゃいけない。
IPv6は128ビットなので、longでは検査できないので、inet_ptonを使って検査するルーチンを書いてみた。

Github はこちら。
https://github.com/usoinfo/php_ipaddrmask_test

function ipaddr_mask($src, $mask)
{
$iarr = str_split($src);
$marr = str_split($mask);
$ret = false;
for($i=0;$i<count($iarr);$i++){
$ret .= $iarr[$i] & $marr[$i];
}
return $ret;
}

function ipaddr_compare($srcaddr, $netaddr, $netmask)
{
if( !$netmask && ($pos = strpos($netaddr,"/")) !== FALSE ){
$netmask = intval( substr($netaddr, $pos+1) );
$netaddr = substr($netaddr, 0, $pos);
}

$addr = inet_pton($srcaddr);
$comp = inet_pton($netaddr);

$len = strlen($addr)*8;
if($netmask > $len) $netmask = $len;

$mask = str_repeat('f', $netmask>>2);
switch($netmask & 3){
case 3: $mask .= 'e'; break;
case 2: $mask .= 'c'; break;
case 1: $mask .= '8'; break;
}
$mask = pack('H*', str_pad($mask, $len>>2, '0') );

return ipaddr_mask($addr, $mask) == ipaddr_mask($comp, $mask);
}

/*

使用法サンプル
$srcaddr = "192.168.1.12";
$netaddr = "192.168.1.0";
$netmask = 24;
$r = ipaddr_compare($srcaddr, $netaddr, $netmask);
echo $srcaddr." compare ".$netaddr."/".$netmask." => ".($r ? "match" : "unmatch")."\n";

$srcaddr = "25ef:91:c540:1:a00:27fa:fce1:28c";
$netaddr = "25ef:91:c540:1::0";
$netmask = 64;
$r = ipaddr_compare($srcaddr, $netaddr, $netmask);
echo $srcaddr." compare ".$netaddr."/".$netmask." => ".($r ? "match" : "unmatch")."\n";

実行結果
192.168.1.12 compare 192.168.1.0/24 => match
25ef:91:c540:1:a00:27fa:fce1:28c compare 25ef:91:c540:1::0/64 => match

*/

タグ:PHP
posted by usoinfo at 18:06 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2016年03月20日

同じUSBデバイスが複数ある時にデバイスを識別する

全く同じUSBデバイスが複数繋がっている時、特定の1つを指定するにはどうすればいいか困っていた。
ベンダーID・プロダクトIDが異なっていればudevでデバイス名を固定すればいいのだが、同じだとどうやら固定できなさそう。そもそも/dev配下にデバイスとして見えないものはどうすればいいのか。
具体的にはUSB温度計が複数繋がっている時。
USBのデバイス番号で読み取り先の温度計を指定できるものの、USBのデバイス番号は毎回変わるので、決め打ちで一意に指定できない。

lsusbでUSBデバイスの接続状況が見られるわけだが、'lsusb'だとバス・デバイス番号・デバイスIDが、'lsusb -t'だと、カスケードされたハブの接続とその先のデバイス番号が分かる。
そこで、例えば
+PCのUSBポート
|
+---ハブ1--+--エレコムのカメラ
| +--USB温度計
|
+---ハブ2--+--バッファローのカメラ
+--USB温度計

こんな感じに機器が繋がっているならば、

”エレコムのカメラと同じハブに繋がってるUSB温度計”
”バッファローのカメラと同じハブに繋がってるUSB温度計”

という特定の仕方をすれば、USB温度計のデバイス番号が一意に求められる(別にカメラじゃなくても、ベンダーID・プロダクトIDが違っていれば何でもいいけど)。
よって、まず lsusb -t の出力でツリー構造を分析して、ルートからどうハブを経由しているかとデバイス番号を紐付けして、その結果をlsusbの出力でデバイス番号とベンダーID・プロダクトIDを紐付けすれば、”エレコムのカメラと同じハブに繋がってるUSB温度計”が分かるようになるだろう。

ということで、lsusb -tとlsusbの出力結果を解析して、接続されている場所・デバイス番号・デバイスIDを列挙するコードをPHPで書いてみた。

https://github.com/usoinfo/usb_device_list

初めてgithubを使ってみた。
使い方のサンプルは、 sample.php にあります。
タグ:PHP USB
posted by usoinfo at 10:26 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2015年05月08日

玄箱にDebian Jessieをインストール

Squeeze化しカーネルを2.6.39.4にして使っていた玄箱だが、Jessieがリリースされたのを機に、追い付いておくことにした。

と言っても、HDL-GXRでWheezy/Jessieを動かすよりは簡単に済んだ。玄箱は、正式にカーネルに取り込まれているので、カーネルソースをいじらなくてよいので。
よって、Weezy用は3.2系logtermの3.2.68、Jessie用は最新のstableである3.19.6を選択した。

基本的な作業は、3.x系のカーネルをコンパイルして(参照記事)、debootstrapでrootfsを作成(参照記事)、玄箱からディスクを取り出して別のPCにマウントし、ブート環境を整えた上で、作ったカーネルとrootfsを展開した。
作ったrootfsとカーネルを一応置いておく。

Wheezy向け
rootfs kurobox-rootfs-wheezy.tar.bz2
kernel kurobox-kernel-3.2.68.tar.bz2
lib kurobox-lib-3.2.68.tar.bz2
config kurobox-config-3.2.68.txt

Jessie向け
rootfs kurobox-rootfs-jessie.tar.bz2
kernel kurobox-kernel-3.19.6.tar.bz2
lib kurobox-lib-3.19.6.tar.bz2
config kurobox-config-3.19.6.txt

インストール手順
1. ハードディスクのパーティションを切る
Linuxの動いているPCにHDDを接続して、
(※接続したHDDはsdbの想定)
/dev/sdb1 MontaVista Linux (100M〜お好みで)
/dev/sdb2 swap (256M〜お好みで)
/dev/sdb3 Debian (残り全部)

sdb1,sdb3はext3でフォーマット、sdb2はmkswapする。
玄人志向のページからファームウェアアップデート Ver1.02をダウンロードし解凍、中のimage.zipを解凍して、tmpimage.tgzを /dev/sdb1 に展開する。(この段階で玄箱MontaVistaが動くようになるはず。つまり第1パーティションに玄箱オリジナルのLinuxが入ればいいので、通常の初期化手順を実行しても良い、はず。)

2. ブート環境の整備
玄箱/玄箱HG 用 ubuntu 12.04 LTS imageより、kuro-bootsel2.20080419.tar.gzubuntu-precise-installer.zip をダウンロード。
ubuntu-precise-installer.zip を解凍し、u-boot-1.2.0-hd.ram.bin uloader-2.4.17_mvl21-sandpoint.oをsdb1:/boot に置く。
kuro-bootsel2.20080419.tar.gz を解凍して、install.shの内容を手作業で実行。
# mount /dev/sdb1 /mnt (※接続したHDDはsdbの想定)
# cp u-boot-1.2.0-hd.ram.bin /mnt/boot
# cp uloader-2.4.17_mvl21-sandpoint.o /mnt/boot
# mkdir -p /mnt/boot/tools
# cp kuro_swread kuro_morse /mnt/boot/tools/
# cp kuro_bootsel2.sh /mnt/etc/init.d/
# chmod 755 /mnt/etc/init.d/kuro_bootsel2.sh
# pushd /mnt/etc/rc.d/rcS.d
# ln -s ../init.d/kuro_bootsel2.sh S15kuro_bootsel2.sh
# popd
# cp kuro_boot.conf /mnt/etc/
sdb1:/etc/init.d/kuro_bootsel2.sh を次のように変更。
101行目から
if [ ! -f $2 ]; then
/bin/echo "Kernel does not exist."
/boot/tools/kuro_morse F $AVR
return 0;
fi
init_avr

# if [ ! -f $2 ]; then
# /bin/echo "Kernel does not exist."
# /boot/tools/kuro_morse F $AVR
# return 0;
# fi
if [ -f $2 ]; then
/sbin/insmod $1 kernel=$2 $3
else
echo /sbin/insmod $1 $2 $3
/sbin/insmod $1 $2 $3
echo /sbin/init 6
/sbin\/init 6
fi
init_avr
している内容は、ubuntu-precise-installer-kuroBOX.sh の sed -e "101,105 s/^./#/" -e "110 s/^./#/" ... と同じ。
sdb1:/etc/kuro_boot.conf を次のように変更。
# kuro_bootsel config file (2008-04-01)
#
# "bootdefault"
# 1: Linux, 2-9: See below
bootdefault=2

(略)

# Menu entry No.2
#
menu2="Debian"
loader2="-f /boot/uloader-2.4.17_mvl21-sandpoint.o"
kernel2='uboot=/boot/u-boot-1.2.0-hd.ram.bin'
option2=''
している内容は、ubuntu-precise-installer-kuroBOX.sh の sed -e "s/^#bootdefault=1$/bootdefault=2/" ... と同じ。

3. rootfs,kernel,lib を展開
カーネルをsdb1へ、rootfsとlibをsdb3へ展開する。
# mount /dev/sdb1 /mnt
# tar xvfj kurobox-kernel-XXXXXX.tar.bz2 -C /mnt/boot
# umount /mnt
# mount /dev/sdb3 /mnt
# tar xvfj kurobox-rootfs-XXXXXX.tar.bz2 -C /mnt
# tar xvfj kurobox-lib-XXXXXX.tar.bz2 -C /mnt
# umount /mnt
4. ハードディスクを玄箱に接続してブート
eth0はdhcpでアドレスを取得。電源投入から3〜5分くらいで、sshd が上がりアクセス可能になる。はず。
ユーザー名root、パスワードkuroadmin でログインできる。
続きを読む
posted by usoinfo at 06:54 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2015年05月05日

HDL-GXRでJessieを動かす。

前記事で、HDL-GXRでWheezyを動かしたが、こっちが本命、Jessie。Jessieはつい先日出たばかりだが、Debianの過去バージョンの捨て去り方は急すぎるというか、もう少し余韻を残してくれてもいいんじゃないか。ミラーサイトからイメージが消えるの早い早い。

というわけで、HDL-GXRでJessieを動かした。
Jessieのカーネルは3.16番台のようなので、3.16.7 をコンパイルし、debootstrapでrootfsを作成。
やった内容は、Wheezyとほぼ同じなので割愛。前記事の3.2.68を3.16.7に、wheezyをjessieに読み替えれば大体合っている。

作ったカーネルとrootfsを。簡単なまとめはこちら。使用は自己責任で。
patch hdl-gxr-kernel-3.16.7.patch
config hdl-gxr-config-3.16.7.txt
kernel hdl-gxr-kernel-3.2.68.tar.bz2
lib hdl-gxr-lib-3.2.68.tar.bz2
rootfs hdl-gxr-rootfs-wheezy.tar.bz2
(Wheezyと同じく、eth0のアドレスはDHCPで、アクセスはsshで、ユーザー名root、パスワードはolpadminです。)

最新のstableカーネル3.19.6を使おうと思ったんだが、うまく動かせていない。何がいけないのかわからない。続きを読む
posted by usoinfo at 16:44 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

HDL-GXRをWheezyで動かす

今更ながらのHDL-GXRについて。
USB温度計を繋げてmuninで監視していたのだが、どうも時々通信が切れ、不安定。
セキュリティに不安もあるし、Debianのバージョンを上げようと挑戦したものの、なかなかに難儀であった…。

1. カーネルを作成

カーネル2.6.39.4のままWheezyにすると、通信が出来なくなったりして、うまく動かないので、まず3.x系のカーネルを作る。
Wheezyは3.2系で動いているので、3.2系のlongterm、3.2.68 を使うことにした。
クロスコンパイル環境は、前記事を参照。
基本的な作業手順は、2.6系と変わらない
カーネルパッチは再び手移植してみた。カーネルソースって、かなり頻繁に変更されているんだなあ。
3.2.68用のカーネルパッチはこれ
.configのサンプル
というわけで、カーネルをクロスでコンパイル。(これはDebian8+emdebianの環境での例)

# wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.2.68.tar.xz
# tar xvfJ linux-3.2.68.tar.xz
# cd linux-3.2.68
# patch -p1 < ../hdl-gxr-kernel-3.2.68.patch
patching file arch/arm/boot/compressed/head.S
patching file arch/arm/kernel/head.S
patching file arch/arm/mach-orion5x/Kconfig
patching file arch/arm/mach-orion5x/Makefile
patching file arch/arm/mach-orion5x/hdl_gxr-setup.c
patching file arch/arm/tools/mach-types
# cp ../hdl-gxr-config-3.2.68.txt .config
# ARCH=arm make menuconfig (※必要ならconfigを変更)
# ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make uImage modules
scripts/kconfig/conf --silentoldconfig Kconfig
CHK include/config/kernel.release
UPD include/config/kernel.release
:
(略)
:
# mkdir -p /opt/arm/boot
# ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/opt/arm make modules_install
# cp -p arch/arm/boot/uImage /opt/arm/boot/uImage.new
# cp -p System.map /opt/arm/boot/
# cp -p .config /opt/arm/boot/config-3.2.68.hdl-gxr
# pushd /opt/arm/boot
# tar cvfj /opt/arm/hdl-gxr-kernel-3.2.68.tar.bz2 .
# cd /opt/arm
# tar cvfj /opt/arm/hdl-gxr-lib-3.2.68.tar.bz2 lib
# popd

出来上がった hdl-gxr-kernel-3.2.68.tar.bz2 hdl-gxr-lib-3.2.68.tar.bz2 を、どこかに取っておく。

2. rootfsを作成

debootstrapでWheezyのrootfsを作成。
基本的な作業手順は、Squeeze化と同じ。
HDL-GXRはSqueeze以降でないと、xzがない、鍵がないなどでうまくない。


# aptitude install binutils (※arが入っていない場合のみ)
# mkdir -p /opt/landisk/debootstrap (※任意のディレクトリ)
# cd /opt/landisk/debootstrap
# wget http://ftp.jp.debian.org/debian/pool/main/d/debootstrap/debootstrap-udeb_1.0.67_all.udeb
# ar -x debootstrap-udeb_1.0.67_all.udeb
# tar Jxvfp data.tar.xz
# export DEBOOTSTRAP_DIR=`pwd`/usr/share/debootstrap
# export PATH=$PATH:`pwd`/usr/sbin
# mkdir -p /opt/landisk/wheezy (※任意のディレクトリ)
# debootstrap --arch=armel wheezy /opt/landisk/wheezy http://ftp.jp.debian.org/debian
I: Retrieving Release
I: Retrieving Release.gpg
:
(略)
:
I: Base system installed successfully.
# mount -t proc proc /opt/landisk/wheezy/proc
# chroot /opt/landisk/wheezy
# dpkg-reconfigure tzdata (※タイムゾーン設定)
# passwd (※rootのパスワード設定)
# vi /etc/apt/sources.list (※aptの設定)
--
deb http://ftp.jp.debian.org/debian wheezy main contrib non-free
deb-src http://ftp.jp.debian.org/debian wheezy main contrib non-free
deb http://security.debian.org wheezy/updates main contrib non-free
--
# apt-get update
# apt-get upgrade
# apt-get install udev openssh-server
# vi /etc/network/interfaces (※ネットワークを設定)
# vi /etc/fstab
--
proc /proc proc defaults,nosuid,noexec 0 0
/dev/sda1 /boot ext3 defaults,rw 0 0
/dev/sda2 swap swap defaults 0 0
/dev/sda3 / ext3 defaults,rw 1 1
--
# apt-get clean
# exit
# umount /opt/landisk/wheezy/proc
# cd /opt/landisk/wheezy
# tar cjvf /opt/landisk/hdl-gxr-wheezy-rootfs.tar.bz2 .

出来上がった hdl-gxr-wheezy-rootfs.tar.bz2 を、どこかに取っておく。

3. ディスクに展開

HDL-GXRに入れるディスクを、USB-SATA接続キットなどを使ってLinuxの動いているPCに接続する。
(※新しいディスクなどの場合は、パーティションの切り方などは過去記事参照。)
第1パーティションにカーネル、第3パーティションにrootfsとカーネルモジュールを展開する。
ターゲットのディスクを /dev/sdb と仮定すると、さっき作った hdl-gxr-kernel-3.2.68.tar.bz2 hdl-gxr-lib-3.2.68.tar.bz2 hdl-gxr-wheezy-rootfs.tar.bz2 をPCに持ってきて


# mount /dev/sdb1 /mnt
# tar xvfj hdl-gxr-kernel-3.2.68.tar.bz2 -C /mnt
# umount /mnt
# mount /dev/sdb3 /mnt
# tar xvfj hdl-gxr-wheezy-rootfs.tar.bz2 -C /mnt
# tar xvfj hdl-gxr-lib-3.2.68.tar.bz2 -C /mnt
# umount /mnt


てな感じ。展開したディスクをHDL-GXRに接続し、電源投入。
うまくいけば、WheezyになったDebianが動いているはず。



作ったカーネルとrootfsを一応置いておく。簡単なまとめはこちら。使用は自己責任で。
patch hdl-gxr-kernel-3.2.68.patch
config hdl-gxr-config-3.2.68.txt
kernel hdl-gxr-kernel-3.2.68.tar.bz2
lib hdl-gxr-lib-3.2.68.tar.bz2
rootfs hdl-gxr-rootfs-wheezy.tar.bz2
これをディスクに放り込めば、とりあえず動く。はず。
eth0のアドレスはDHCPで、アクセスはsshで、ユーザー名root、パスワードはolpadminです。

Jessieは次で。
続きを読む
posted by usoinfo at 16:28 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2015年05月04日

Debian 8 (Jessie) でクロスコンパイル環境を作る

過去にDebian Squeeze+Emdebianで、玄箱/LANDISKのカーネルをクロスコンパイルする環境を作ったが、Debian Jessieになって、ちょっと違っているようなので。

基本的には、このページ(CrossToolchains)に従って作っていく。
アーキテクチャ 'armel' になっているところは、別のターゲットの場合は適宜読み替え。

手順を簡単にまとめると、
  • sources.list にEmdebianを追加
  • Emdebianの鍵を追加
  • アーキテクチャを追加
  • aptitude update
  • aptitude install crossbuild-essential-(アーキテクチャ)
である。

1. EmbedianのAPTを設定

※ソースリストにEmdebianを追加
# echo 'deb http://emdebian.org/tools/debian/ jessie main' \
> /etc/apt/sources.list.d/crosstools.list

※鍵を追加
# wget -q -O - http://emdebian.org/tools/debian/emdebian-toolchain-archive.key \
| apt-key add -

※アーキテクチャ armel を追加
# dpkg --add-architecture armel

※APTを更新
# aptitude update

2. ツールチェインをインストール
# aptitude install crossbuild-essential-armel
以下の新規パッケージがインストールされます:
:
(略)


その他のツールも必要に応じて。(カーネルコンパイルに必要なものを入れる)
# aptitude install u-boot-tools ncurses-dev bzip2


3. HDL-GXRのカーネルをコンパイルしてみる
過去記事参照
# tar xvfj linux-2.6.39.4.tar.bz2
# cd linux-2.6.39.4/
# patch -p1 < ../hdl-gxr-kernel-2.6.39.4.patch
# cp ../hdl-gxr-config-2.6.39.4.txt .config
# ARCH=arm make oldconfig
# ARCH=arm make menuconfig
# ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make uImage modules
# mkdir -p /opt/arm/boot
# ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/opt/arm make modules_install
# cp -p arch/arm/boot/uImage /opt/arm/boot/uImage.new
# cp -p System.map /opt/arm/boot/
# cp -p .config /opt/arm/boot/config-2.6.39.4.hdl-gxr
# pushd /opt/arm/boot
# tar cvfz ../kern.tgz .
# cd /opt/arm
# tar cvfz lib.tgz lib
# popd

posted by usoinfo at 07:45 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2015年04月26日

CentOS6にawstatsをインストールする

Apacheのログを解析するため、awstatsをサクッと入れる。
環境は、CentOS6 + Apache 2.4 での例。

1. epelからawstatsをインストール

EPELが入ってない場合は適宜いれる。過去記事などを参照。
# yum install --enablerepo=epel awstats
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
:
(略)
:
Installed:
awstats.noarch 0:7.0-3.el6
Complete!


2.awstatsのconfigを書き換える

デフォルトでは、/etc/awstats 以下に、awstats.(ホスト名).conf ができている。
解析するサーバーが1つで、ホスト名とWebサーバー名が同一ならこのままのファイル名でいいが、バーチャルホストを切っていたりして複数の設定にしたい時は、awstats.(設定名).conf という名前でファイルを作成する。(設定名)は、後でアクセスするときに使う。
例えば、設定名www、設定名virtualの2つを使うときはこんな感じにする。
# cp awstats.model.conf awstats.www.conf
# cp awstats.model.conf awstats.virtual.conf
# ls -l
total 320
-rw-r--r-- 1 root root 61665 Feb 21 2013 awstats.model.conf
-rw-r--r-- 1 root root 61665 Apr 26 08:39 awstats.virtual.conf
-rw-r--r-- 1 root root 61665 Apr 26 08:37 awstats.www.conf
それぞれのconfを書き換える。
最低限書き換える箇所は# vi awstats.XXXX.conf
---
LogFile="(ログファイルのパス)"
LogFormat=(ログファイルの形式:1-4)
---
LogFileは、ログファイルのパスを、解析したいログの場所に変更する。複数のログファイルを結合して解析したい時は、
LogFile="/usr/share/awstats/tools/logresolvemerge.pl (ログファイル1) (ログファイル2) (...) |"こんな風にlogresolvemerge.plを使うと、複数ファイルを時系列で並べ替えて結合してくれる。

LogFormatは、ログファイルの形式を指定する。commonの時は4にするが、combinedの方が取れるデータが多いのでオススメ。変更するときはApacheの設定ファイルのCustomLogを書き換える。
# vi (http.confあるいはVirtualHostの中)
---
CustomLog (ログファイルのパス) common

CustomLog (ログファイルのパス) combined
---
古いログをよけてから、apacheをリスタートする。

3.Webからawstatsを見えるように設定。

設定を直接httpd.confかVirtualHostの中に書いても良いし、conf/extra/awstats.conf などに分けてincludeしてもいい。必要なら認証もかける。
例・awstats.confを作る
# vi (apacheのconfディレクトリ)/extra/awstats.conf
---
Alias /awstatsclasses "/usr/share/awstats/wwwroot/classes/"
Alias /awstatscss "/usr/share/awstats/wwwroot/css/"
Alias /awstatsicons "/usr/share/awstats/wwwroot/icon/"
ScriptAlias /awstats/ "/usr/share/awstats/wwwroot/cgi-bin/"

<Directory "/usr/share/awstats/wwwroot/cgi-bin">
DirectoryIndex awstats.pl
Options ExecCGI
</Directory>

<Directory "/usr/share/awstats/wwwroot">
AuthUserFile (パスワードファイルの配置ディレクトリ)/passwd.awstats
AuthName "AWSTATS"
AuthType Basic
Require valid-user
Require all denied
Require ip 127.0.0.1
</Directory>
---

例・httpd.confから設定ファイルをincludeする
# vi httpd.conf
---
:
(任意の場所に追加)
Include conf/extra/awstats.conf
---

例・BASIC認証を設定
# htpasswd -c (パスワードファイルの配置ディレクトリ)/passwd.awstats
New password:
Re-type new password:
Adding password for user XXXX
#

4.初回の解析データ生成

まだ解析データはないので、初回だけ手動でデータを生成する。
ログサイズによっては、初回の生成は時間がかかるかも。
# /usr/share/awstats/tools/awstats_updateall.pl now \
-configdir="/etc/awstats" \
-awstatsprog="/usr/share/awstats/wwwroot/cgi-bin/awstats.pl"

Running '"/usr/share/awstats/wwwroot/cgi-bin/awstats.pl" -update -config=XXXXXX -configdir="/etc/awstats"' to update config XXXXXX
Create/Update database for config "/etc/awstats/awstats.XXXXXX.conf" by AWStats version 7.0 (build 1.971)
From data in log file "/usr/local/apache2/logs/access_XXXXXX_log"...
Phase 1 : First bypass old records, searching new record...
:
(略)
:
Found 1 new qualified records.
#

5.アクセスできるか試してみる

2. で、設定名とサーバー名が同じで1つしかないなら、http://(インストールしたサーバー名)/awstats/ にアクセスしてみる。
設定が複数あったり、設定名がサーバー名と違うなら、http://(インストールしたサーバー名)/awstats/awstats.pl?config=(設定名) にアクセスしてみる。

awstat-example-150426.png


うまくできていれば、解析された結果が表示される。
データの更新は、標準では1時間に1回で、起動のためのスクリプトは /etc/cron.hourly/awstats に配置されている。1日1回に変えたい、あるいは任意の頻度に変えたい場合は、このスクリプトを適当な場所に移したりすると良い。
タグ:Linux Apache awstats
posted by usoinfo at 10:32 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2015年04月12日

METARのデータを取得して整形する

前回に引き続き。
気象庁以外で気温などの現在値が取れるものはないか、ということで、世界各国の空港の気象情報であるMETARからデータを取るPHP関数も作ってみた。
これ metar.phps

適当な場所に置いて include して使用する。
例:metar_sample.php

#!/usr/local/bin/php
<?php
include 'metar.phps';

$data = METAR_get('RJAA');

foreach($data['info'] as $i => $v){
echo $v['name'].' '.$data['data'][ $i ].' '.$v['unit']."\n";
}
?>

空港のコードには、ICAOの4レターコードをくべる。
例えば、成田空港のデータを引っ張ってきて表示。こんな結果。

$ ./metar_sample.php
時刻 2015/04/12 08:30:00
気温 12 ℃
湿度 71 %
気圧 1030 hPa
風向 NNE
風速 10 kt

空港によっては30分刻みでデータが来るので、気象庁よりいいかも知れない。気温の値の小数点以下が丸まってしまうのが欠点。
posted by usoinfo at 09:11 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2015年04月11日

気象庁のアメダス、今日のデータを取得して整形する

気象庁のアメダスのデータは、昨日より前のものはcsvで取得できるが、今日の分は取れない。Webページで見られるだけである。
このページを取得して、不要な部分を削除してデータだけ抜き出したかったので、ちょっとPHPで関数を書いてみた。
これ jma.phps

適当な場所に置いて include して使用する。
例:jma_sample.php

#!/usr/local/bin/php
<?php
include 'jma.phps';
$data = JMA_get('44132');
foreach($data['data'] as $h)
{
foreach($data['info'] as $key => $i){
echo $i['title'].$h[ $key ].$i['unit']." ";
}
echo "\n";
}
?>

場所のコードには、アメダスのURLの http://www.jma.go.jp/jp/amedas_h/today-XXXXX.html の XXXXX(数字5桁) をくべる。
例えば、東京(44132)のデータを引っ張ってきて表示。こんな結果。

$ ./jma_sample.php
時刻1時 気温8.5℃ 降水量0.5mm 風向北北西16方位 風速3.3m/s 日照時間0h 積雪深96cm 湿度1020.7% 気圧hPa
時刻2時 気温8.8℃ 降水量0.5mm 風向北北西16方位 風速3.8m/s 日照時間0h 積雪深97cm 湿度1019.6% 気圧hPa
時刻3時 気温8.8℃ 降水量2.0mm 風向北北西16方位 風速3.4m/s 日照時間0h 積雪深97cm 湿度1019.0% 気圧hPa
時刻4時 気温8.8℃ 降水量0.5mm 風向北西16方位 風速3.2m/s 日照時間0.0h 積雪深0cm 湿度97% 気圧1018.7hPa
時刻5時 気温8.9℃ 降水量0.5mm 風向北西16方位 風速3.5m/s 日照時間0.0h 積雪深0cm 湿度97% 気圧1018.8hPa
時刻6時 気温9.1℃ 降水量1.0mm 風向北北西16方位 風速3.5m/s 日照時間0.0h 積雪深0cm 湿度97% 気圧1019.3hPa
時刻7時 気温9.4℃ 降水量1.0mm 風向北北西16方位 風速3.2m/s 日照時間0.0h 積雪深0cm 湿度97% 気圧1019.6hPa
時刻8時 気温9.9℃ 降水量0.5mm 風向北北西16方位 風速4.0m/s 日照時間0.0h 積雪深0cm 湿度97% 気圧1019.7hPa
時刻9時 気温10.4℃ 降水量0.0mm 風向北北西16方位 風速3.1m/s 日照時間0.0h 積雪深0cm 湿度96% 気圧1020.4hPa
時刻10時 気温11.4℃ 降水量0.5mm 風向北北西16方位 風速2.8m/s 日照時間0.0h 積雪深0cm 湿度94% 気圧1020.6hPa
時刻11時 気温11.9℃ 降水量0.0mm 風向北北西16方位 風速1.3m/s 日照時間0.0h 積雪深0cm 湿度92% 気圧1020.3hPa
時刻12時 気温13.1℃ 降水量0.5mm 風向北北西16方位 風速2.1m/s 日照時間0.0h 積雪深0cm 湿度90% 気圧1019.9hPa
時刻13時 気温14.0℃ 降水量0.0mm 風向北16方位 風速1.5m/s 日照時間0.0h 積雪深0cm 湿度83% 気圧1020.1hPa
時刻14時 気温14.9℃ 降水量0.0mm 風向北東16方位 風速2.9m/s 日照時間0.0h 積雪深0cm 湿度70% 気圧1019.8hPa
時刻15時 気温15.9℃ 降水量0.0mm 風向東北東16方位 風速3.2m/s 日照時間0.0h 積雪深0cm 湿度69% 気圧1019.8hPa
時刻16時 気温15.2℃ 降水量0.0mm 風向東16方位 風速2.9m/s 日照時間0.0h 積雪深0cm 湿度72% 気圧1020.4hPa

自己責任でどうぞ。
(※気象庁のホームページには、自動収集を遠慮せよとの旨記載があるので注意)
posted by usoinfo at 17:22 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2015年01月30日

ffmpegでmp3やらm4aやらmp4やらを結合する

端的に言うと
  1. -i で繋げたい元ファイルをひとつずつ列挙
  2. -filter_complex "concat=n=(ファイル数):v=(ビデオなら1それ以外は0):a=1"
  3. 出力ビットレートを指定する場合は後ろに付ける
  4. 最後に出力ファイル名
例:
#part?.mp3 をビットレート160kで繋いで partall.mp3 に出力。
ffmpeg -i part1.mp3 -i part2.mp3 -i part3.mp3 \
-filter_complex "concat=n=3:v=0:a=1" \
-b:a 160k partall.mp3
で繋がるようだ。
mp3でもm4aでも繋がるし、mp4も繋がる。意外に便利かもしれん。
posted by usoinfo at 16:29 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする