MyMiniCity踏んでください!!

ただいま絶賛MyMiniCity参加中です.是非リンクを踏んでください!!(笑
November 7th, 2006

オレオレ流pearのミラー

(Read: 7808)
Add to Hatena Bookmark

参照: ベイエリア情報局: PEAR パッケージをローカルでミラーする
「おー本当にやったんだーすげー」みたいにコメントしたけどすぐに表示されないので
ムッとしたところ別のやり方を思いついたのでオレオレ流を書いてみる.
まだテストミラーが終わってないのですが,こんな感じ.
多分超見やすいロジックです(ホントか?

まず注意

このエントリに紹介している各種ファイル取得のワンライナーやスクリプトはチャンネルサーバーからパッケージを根こそぎ取ってくるので場合によっては相手に非常に大きな負荷をかけます.
どーしても試してみたい場合はその辺りを十分注意してください.

環境の用意

pearコマンドが動作する環境,ワークディレクトリとミラーするディレクトリを作ります.
PEARはバージョン1.4以上だかうまく動作する適当なバージョンを用意してください.


$ PHP_PEAR_INSTALL_DIR="インストール済PEARのディレクトリ"
$ PEAR_MIRROR_DIR="ミラーしたパッケージを保存したいディレクトリ"
$ PEAR_MIRROR_TMP_DIR="作業上に作成したファイルなどを置いておくディレクトリ"
$ mkdir -p ${PEAR_MIRROR_TMP_DIR}
$ mkdir -p ${PEAR_MIRROR_DIR}
PHP_PEAR_INSTALL_DIRはよくわからなければこんな感じででも多分設定できます.


PHP_PEAR_INSTALL_DIR=`pear config-get php_dir`

空の設定ファイルを作る

こんな感じでパッケージが何もないスッカラカンのpearの設定ファイルを作ります.


$ mkdir -p ${PEAR_MIRROR_TMP_DIR}/pear/etc/
$ pear config-create ${PEAR_MIRROR_TMP_DIR}/pear/ ${PEAR_MIRROR_TMP_DIR}/pear/etc/pear.conf
これで${PEAR_MIRROR_TMP_DIR}/pearにpear.confというファイル名で設定ファイルが作成されます.
設定ファイルを作成しただけなので,パッケージなどはスッカラカンです.


$ pear -c pear.conf list
(no packages installed from channel pear.php.net)
このままだと警告が出てくることがあるのでチャンネル情報をアップデートしておきます.


$ pear -c pear.conf channel-update pear.php.net
Retrieving channel.xml from remote server
Update of Channel "pear.php.net" succeeded

チャンネルサーバーに登録されているパッケージ群を取得する

ここでおもむろに「pear list-all」します.
いろいろあるのですが,大体こんな感じでほぼパッケージ情報と最新バージョンのファイル名が取得できます.


$ pear list-all | grep -E '^[a-zA-Z\_-0-9]+/' | awk '$2 ~ /^[0-9]/ {print $1 "-" $2 ".tgz"}' > pear.list
正規表現は「'^[a-z]+/'」だけでもいいかもしれないです.
これで


pear/Auth_HTTP-2.1.6.tgz
pear/Auth-1.4.1.tgz
pear/Auth_SASL-1.0.2.tgz
pear/LiveUser-0.16.12.tgz
pear/Auth_PrefManager-1.1.4.tgz
pear/Auth_RADIUS-1.0.5.tgz
pear/Auth_PrefManager2-2.0.0dev1.tgz
pear/LiveUser_Admin-0.3.9.tgz
pear/Benchmark-1.2.6.tgz
pear/Cache-1.5.5RC4.tgz
(snip)
みたいな内容のファイルができるので,「このファイルがなければダウンロードしてローカルに保存」みたいな処理を書くだけです.

システムに登録しているチャンネルサーバー名を取得しよう

ちなみにlist-allは-cでチャンネルを指定できるのですが,チャンネル名の情報が${PHP_PEAR_INSTALL_DIR}/.channels/に*.regというファイル名で保存されています.
#チャンネル名を持たないパッケージのために__uri.regというのもあります.
つまり,


$ cd {PHP_PEAR_INSTALL_DIR}/.channels/
$ ls *.reg | grep -v __uri | sed 's/\.reg//g'
pear.ethna.jp
pear.hatotech.org
pear.php.net
pear.symfony-project.com
pecl.php.net
phpch.oss.poyo.jp
とかチャンネル名を取得できます.さらに補足すると,.aliasに入れば別名の取得もできます.


$ cd {PHP_PEAR_INSTALL_DIR}/.channels/.alias
$ ls *.txt | grep -v __uri | sed 's/\.txt//g'
ethna
hatotech
pear
pecl
poyo
symfony
#関係ないけどchannelsだけどaliasとか単数表記と複数表記の混在が個人的に気持ち悪いです.

ついでなので全部のパッケージミラーしてみない?

ってことでざっとまとめてみました.pear list-channelsで出てくる全チャンネルからパッケージを取ってきます.


#!/bin/sh

TODAY=`date '+%Y-%m-%d'`

if [ "${PHP_PEAR_INSTALL_DIR}x" = "x" ]; then
PHP_PEAR_INSTALL_DIR=`pear config-get php_dir`
fi

# 手抜きでカレントディレクトリにミラー
PEAR_MIRROR_DIR="$PWD/mirror/"
PEAR_MIRROR_TMP_DIR="$PWD/tmp/"

mkdir -p ${PEAR_MIRROR_DIR}
mkdir -p ${PEAR_MIRROR_TMP_DIR}

if [ ! -f "${PEAR_MIRROR_TMP_DIR}/pear/etc/pear.conf" ]; then
mkdir -p ${PEAR_MIRROR_TMP_DIR}/pear/etc/
pear config-create ${PEAR_MIRROR_TMP_DIR}/pear/ ${PEAR_MIRROR_TMP_DIR}/pear/etc/pear.conf
fi

PEAR_CMD="pear -c ${PEAR_MIRROR_TMP_DIR}/pear/etc/pear.conf"

cd ${PEAR_MIRROR_DIR}

PEAR_CHANNELS=`cd ${PHP_PEAR_INSTALL_DIR}/.channels; ls *.reg | grep -v __uri | sed 's/\.reg//g' `
for PEAR_CHANNEL in ${PEAR_CHANNELS}
do
if [ ! -f "${PEAR_MIRROR_TMP_DIR}/pear/pear/php/.channels/${PEAR_CHANNEL}.reg" ]; then
${PEAR_CMD} channel-discover ${PEAR_CHANNEL}
fi
${PEAR_CMD} channel-update ${PEAR_CHANNEL}
done

PEAR_ALIASES=`cd ${PEAR_MIRROR_TMP_DIR}/pear/pear/php/.channels/.alias; ls *.txt | grep -v __uri | sed 's/\.txt//g' `
for PEAR_ALIAS in ${PEAR_ALIASES}
do
PACKAGES_LIST_FILE="${PEAR_MIRROR_TMP_DIR}/${PEAR_ALIAS}-${TODAY}.list"
if [ ! -f ${PACKAGES_LIST_FILE} ]; then
echo ${PEAR_CMD} list-all -c ${PEAR_ALIAS}
${PEAR_CMD} list-all -c ${PEAR_ALIAS} | grep -E '^[a-z]+/' | awk '$2 ~ /^[0-9]/ {print $1 "-" $2 ".tgz"}' > ${PACKAGES_LIST_FILE}
fi

for PACKAGE in `cat ${PACKAGES_LIST_FILE}`
do
if [ ! -f ${PACKAGE} ]; then
mkdir -p ${PEAR_ALIAS} > /dev/null
pushd ${PEAR_ALIAS} > /dev/null
${PEAR_CMD} download ${PACKAGE}
popd > /dev/null
else
echo "${PACKAGE} is already exists."
fi
done
done
ダウンロード


▼ この記事へのコメント ▼
向こうのスクリプトは古いバージョンのパッケージは削除しているようにもみえなくない.
引数は気が向いたらサポートしよう.

やばい
なんか大分複雑になってきてしまった

結構いろいろ工夫してます。
1回ダウンロードしたやつはダウンロードしないとか
--delete つけると古いの削除したりとか

うちも1回ダウンロードしたのはダウンロードしないですよ
ディレクトリを任意に指定できなくて--verboseと--helpがなくて古いの消さないだけじゃないかなとか思ったり


トピックの参照元

▼最近のトピック

▼ 人気のトピック


< 過去の記事 [ 10All Categories ] 新しい記事 >
Powered by gsblog (customize)

[ POST ] [ AddLink ] [ CtlPanel ]

Subscribe blog

Bookmark blog

About me

about me

応援しています

我が息子が産まれたアクア・バースハウス(東京都世田谷区にある助産院)を応援しています.

翻訳のお仕事

腕に自信がある方,修行をしたい方はこちらをどうぞ.

2019 calendar

10月
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
| Day | Month | Year |

Powered by RRDTOOL.

Archives

Categories

Links


Mail to admin

人気ブログランキングへ RSS feed meter for http://blog.poyo.jp/ Search Engine Optimization
blogpeople.netに登録!! スカウター : よくきたblog

My Google news

My Google News

Related site

ころんころん♪ べびぽよ フォト蔵Wiki
string(14) "/id-1162829716"