複数のpdfファイルに一括してパスワードを設定する事が
かなりの頻度で必要になったので、
手持ちのacrobatで何とかしようと思ったが、
9のstandardしかなく、バッチ処理に対応していなかった。
しょうがないので、フリーのツールを探すと
pdftkがメジャーなようで記事がたくさんあるので、とりあえずインストールしてみる。
# wget https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/pdftk-2.02-1.i386.rpm
www.pdflabs.com の証明書(発行者: /C=US/O=DigiCert Inc/CN=DigiCert Secure Server CA)の検証に失敗しました:
発行者の権限を検証できませんでした。
www.pdflabs.com に安全の確認をしないで接続するには、`--no-check-certificate' を使ってください。
SSL による接続が確立できません。
なるほど、
# wget --no-check-certificate https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/pdftk-2.02-1.i386.rpm
保存完了したので、
# yum install --nogpgcheck pdftk-2*
署名無いので、--nogpgcheck で署名なしのオプションつけないと蹴られる。
インストール後の使い方
変換前ファイル mae.pdf
変換後ファイル(任意名称) ato.pdf
スタンプ stamp.pdf
印刷のみ許可のオプション owner_pw ***** allow printing
pdftk mae.pdf stamp stamp.pdf output ato.pdf owner_pw ***** allow printing
当初、指定のフォルダにファイルを置き、cronで5分間隔で実行すればいいだろうと
考えていたのだが、
利用者から、cronでの自動化だと操作した感が無く、忘れそうだとの事だったので、
今回は、スクリプトシェルにして、phpで動作させた。
++++++ソース converter.sh++++++
#!/bin/sh
# PDFコンバート&パスワード保護 スクリプトシェル
#
#作業 ディレクトリ /home/storage1/AAA/ConvertPdf
#変換後 ディレクトリ /home/storage1/AAA/ConvertedPdf
#スタンプ /home/storage1/AAA//ConvertPdf/sourse/stamp.pdf
cd /home/storage1/AAA/ConvertPdf
for file in *.pdf; do pdftk $file stamp ./sourse/stamp.pdf output /home/storage1/AAA/ConvertedPdf/`date '+%Y-%m-%d-%H%M%S'_`$file owner_pw **** allow printing; done
rm *.pdf
+++++++++++++++++++++++++++
作業内容
ConvertPdfにあるpdfにstamp.pdfをして印刷のみ許可の状態にしたファイルを
先頭に日付を付けてConvertedPdfにコピーし、
ConvertPdfにあるpdfファイルを削除する。
phpに関して
phpを動かす同じディレクトリにスクリプトシェルを置かないといけない模様。
(chdirを使ったが、指定のディレクトリに上手く移動してくれないので、 あきらめた。)
shell_execをhtmlspecialcharsで括らないと、中身をうまく認識できないらしく、
スクリプトシェルが動かなかった。
unixのコマンドだとexecだけでも動くようだが、変数などを使っているので、駄目っぽい。
$command = './converter.sh.sh';
htmlspecialchars( shell_exec( $command ) ) ;
?>
あとは、form等でボタンをそれなりに作っておく。
動作試験をして、意図するように動いたので、
あとは、stamp等を調整して完了とする。
2014/12/02
2014/06/14
データバックアップ⇒データ移行⇒HDD交換⇒LVM領域拡張
ファイルサーバの空き容量が5GBを割ってしまったので、やむなく交換。
もともと格安のNECサーバに付いていた180GBのSATAⅡをそのまま使っていたが、
500GBに交換することにした。
dumpとrestoreが良いようだが、イマイチ操作が良くわからないので、
ddコマンドと、LVMの拡張で何とかした。
まずは、ddコマンドを実行するため、KNOPPIX
(LIVEでターミナルでddコマンドが動くなら何でもいい)のDVDを作成し、
BIOS弄って、DVD優先起動にする。
$ sudo -s でroot化
コピー元を sda コピー先を sdbとする場合、
# dd if=/dev/sda of=/dev/sdb bs=1024
今回は、HDDにエラーが出た状態ではないので、
ブロックサイズはデフォルトの512Kごと送るよりは、倍の方が早いだろうということで、
オプションを追加。
ifとofを逆にしちゃうと、大変な事態に。もう二度とデータは帰ってこない・・・。
この作業、あんまりしたくない・・・。
結果、およそ2時間ほどでコピー完了
途中経過を確認する方法は別のターミナルを起動して
$ killall -USR1 dd
これで、その時点の作業量からおよその時間が割り出せる。
完了したら、シャットダウンして、その後HDDをつなぎかえて起動。
起動すると、外側は500GBなっているが、内側は180GBのままなので、
これを正しく直してあげる必要がある。
$ su -
# df -H
Filesystem Size Used Avail Use% マウント位置
/dev/mapper/VolGroup00-LogVol00
168G 164G 4G 97% /
/dev/sda1 104M 64M 35M 65% /boot
現状、こんな感じ
ボリュームグループの構成を見て、割り当てられる領域を確認。
# /usr/sbin/vgdisplay -v
作業中に保存し忘れた・・・。
これは、最終形だが、
Total PEが上限値なので、その付近まで、領域を拡張すれば良い。
Finding all volume groups
Finding volume group "VolGroup00"
--- Volume group ---
VG Name VolGroup00
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 6
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size 168 GB
PE Size 32.00 MB
Total PE 14901
Alloc PE / Size 14563 / 455.09 GB
Free PE / Size 338 / 10.56 GB
VG UUID Ys3H7T-UY61-MnKG-Ue0I-bMGI-mRHd-1oYDvm
# lvextend -l 14500 /dev/VolGroup00/LogVol00
最初は、14500でなく、14901でコマンドを叩いたのだが、
他に使われている領域が有るらしく、エラーが出たので、
わりと近めのきれいな数値でコマンド実行した。
その結果が、上の状態。
# resize2fs /dev/VolGroup00/LogVol00
resize2fsでサイズを変更。
途中迷走し、fdiskで一端sda2を消して、Wで保存する前に、
再度、目一杯の領域でsda2を作り直してWして、
再起動したが、効果が有ったのか不明。
ほんとは、 resize2fsの前に、
Filesystem Size Used Avail Use% マウント位置
/dev/mapper/VolGroup00-LogVol00
472G 164G 308G 34% /
/dev/sda1 104M 64M 35M 65% /boot
この形になれば、成功。
もともと格安のNECサーバに付いていた180GBのSATAⅡをそのまま使っていたが、
500GBに交換することにした。
dumpとrestoreが良いようだが、イマイチ操作が良くわからないので、
ddコマンドと、LVMの拡張で何とかした。
まずは、ddコマンドを実行するため、KNOPPIX
(LIVEでターミナルでddコマンドが動くなら何でもいい)のDVDを作成し、
BIOS弄って、DVD優先起動にする。
$ sudo -s でroot化
コピー元を sda コピー先を sdbとする場合、
# dd if=/dev/sda of=/dev/sdb bs=1024
今回は、HDDにエラーが出た状態ではないので、
ブロックサイズはデフォルトの512Kごと送るよりは、倍の方が早いだろうということで、
オプションを追加。
ifとofを逆にしちゃうと、大変な事態に。もう二度とデータは帰ってこない・・・。
この作業、あんまりしたくない・・・。
結果、およそ2時間ほどでコピー完了
途中経過を確認する方法は別のターミナルを起動して
$ killall -USR1 dd
これで、その時点の作業量からおよその時間が割り出せる。
完了したら、シャットダウンして、その後HDDをつなぎかえて起動。
起動すると、外側は500GBなっているが、内側は180GBのままなので、
これを正しく直してあげる必要がある。
$ su -
# df -H
Filesystem Size Used Avail Use% マウント位置
/dev/mapper/VolGroup00-LogVol00
168G 164G 4G 97% /
/dev/sda1 104M 64M 35M 65% /boot
現状、こんな感じ
ボリュームグループの構成を見て、割り当てられる領域を確認。
# /usr/sbin/vgdisplay -v
作業中に保存し忘れた・・・。
これは、最終形だが、
Total PEが上限値なので、その付近まで、領域を拡張すれば良い。
Finding all volume groups
Finding volume group "VolGroup00"
--- Volume group ---
VG Name VolGroup00
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 6
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size 168 GB
PE Size 32.00 MB
Total PE 14901
Alloc PE / Size 14563 / 455.09 GB
Free PE / Size 338 / 10.56 GB
VG UUID Ys3H7T-UY61-MnKG-Ue0I-bMGI-mRHd-1oYDvm
# lvextend -l 14500 /dev/VolGroup00/LogVol00
最初は、14500でなく、14901でコマンドを叩いたのだが、
他に使われている領域が有るらしく、エラーが出たので、
わりと近めのきれいな数値でコマンド実行した。
その結果が、上の状態。
# resize2fs /dev/VolGroup00/LogVol00
resize2fsでサイズを変更。
途中迷走し、fdiskで一端sda2を消して、Wで保存する前に、
再度、目一杯の領域でsda2を作り直してWして、
再起動したが、効果が有ったのか不明。
ほんとは、 resize2fsの前に、
#fsck -f
/dev/VolGroup00/LogVol00 でディスクチェックすべきかも。
# df -H
Filesystem Size Used Avail Use% マウント位置
/dev/mapper/VolGroup00-LogVol00
472G 164G 308G 34% /
/dev/sda1 104M 64M 35M 65% /boot
この形になれば、成功。
2014/05/05
バックアップ機のメンテナンス
過去に作っていたバックアップマシンをしばらく使っていなかったが、
メインマシンがお亡くなりになった際に、阿鼻叫喚となるので、
バックアップを現行に近づけておく。
ユーザを作る
# useradd ユーザ名
パスワード設定
# passwd ユーザ名
メイン機の環境を丸ごと圧縮取ってくる。
$ tar zcvf ユーザ名.tar.gz
SCPで先程作ったサブマシンのユーザ配下に置き、展開
$ tar xvf ユーザ名.tar.gz
動作確認
postgreSQLが動いているか確認
$ psql データベース名
psql (8.4.7)
動いている。
Tomcatが動くか
tomcatは動くが、logにインクルードが上手くいかないと書かれている。
/home/ユーザ名/ver3/web-inf/web.xml
この中にcatalinaの定義されているものがあった・・・。
これで嵌った・・・。
iptableでポート解放して
iptable をrestartして設定反映。
tomcat起動で動いた。
メインマシンがお亡くなりになった際に、阿鼻叫喚となるので、
バックアップを現行に近づけておく。
ユーザを作る
# useradd ユーザ名
パスワード設定
# passwd ユーザ名
メイン機の環境を丸ごと圧縮取ってくる。
$ tar zcvf ユーザ名.tar.gz
SCPで先程作ったサブマシンのユーザ配下に置き、展開
$ tar xvf ユーザ名.tar.gz
動作確認
postgreSQLが動いているか確認
$ psql データベース名
psql (8.4.7)
動いている。
Tomcatが動くか
tomcatは動くが、logにインクルードが上手くいかないと書かれている。
/home/ユーザ名/ver3/web-inf/web.xml
この中にcatalinaの定義されているものがあった・・・。
これで嵌った・・・。
iptableでポート解放して
iptable をrestartして設定反映。
tomcat起動で動いた。
2014/02/20
port解放
# nano /etc/sysconfig/iptables
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*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 -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-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 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 14000 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 14000 -j ACCEPT
開けたいポートを記載する。 14000とか
ipテーブルを読み直す
# /etc/init.d/iptables restart
これで、ポート解放
複数のユーザでtomcatを動かす場合など必要だった。
2014/02/19
useraddのパスが通らない
リモートでuseraddをしたが、bash: useradd: command not found
となる。
su -
でrootにならないとpathが通らないことに気付かなかった・・・。
忘れないように残す。
となる。
su -
でrootにならないとpathが通らないことに気付かなかった・・・。
忘れないように残す。
2014/02/01
Linux rsyncで差分バックアップの実装
基本的な使い方
$ rsync -av /コピー元 /コピー先
フルパスで行けた。
差分バックアップについては、
rsync -av --delete --link-dest=../<<比較元>> <<バックアップ元>> /<<バックアップ先>>
で行ける。(比較元のパスはバックアップ先から相対パスで指定すること)
cronで毎日稼働させるようであれば、次のように修正して稼働させればよい。
既に先人が偉大な資料を残してくれているので、参考に作成した。
--link-dest コマンド:インクリメンタルバックアップ
ハードリンクを作ってくれるので、ディスク圧迫を防げるので、コマンド採用している。
□□□□□□シェルスクリプトの内容ここから□□□□□□□
#!/bin/bash
# バックアップ先を指定
back_up_dir=/<<バックアップ先のディレクトリのパス>>/dailyBack
mkdir -p $back_up_dir
# バックアップログ名
backup_log=/<<ログを残すディレクトリ>>/log/rsync_backup.log
rm -f $backup_log
touch $backup_log
chmod 600 $backup_log
# エラー処理 あった方がよさそうなので、そのまま使わせて頂いた。
error_exit () {
exit 1
}
# バックアップ実行
echo "毎日のバックアップ開始" >> $backup_log
#このあたりは素敵な感じ。当初別の方法で書いたが、ゐくをさんの方法の方が分かりやすいので、パクった。
latest=`ls -t $back_up_dir | grep backup | head -1`
newly=`date +%Y%m%d`backup
mkdir $back_up_dir/$newly
rsync -av --delete --link-dest=../$latest /<<バックアップ元のディレクトリ>> $newly/$latest >>
#ここから下もそのまま利用させて頂いた。
$backup_log 2>&1
code=$?
if [ $code -ne 0 ]; then
cat $backup_log | mail -s "BACKUP NG CODE IS $code" root
rm -rf $back_up_dir/$newly
error_exit
fi
echo "毎日のバックアップ完了" >> $backup_log
□□□□□□□□ここまで□□□□□□□□□
$ rsync -av /コピー元 /コピー先
フルパスで行けた。
差分バックアップについては、
rsync -av --delete --link-dest=../<<比較元>> <<バックアップ元>> /<<バックアップ先>>
で行ける。(比較元のパスはバックアップ先から相対パスで指定すること)
cronで毎日稼働させるようであれば、次のように修正して稼働させればよい。
既に先人が偉大な資料を残してくれているので、参考に作成した。
--link-dest コマンド:インクリメンタルバックアップ
ハードリンクを作ってくれるので、ディスク圧迫を防げるので、コマンド採用している。
Webエンジニア・インフラエンジニアゐくをの日常 様のほぼそのままです。
詳しくは、この方のWEBサイトを確認してください。
□□□□□□シェルスクリプトの内容ここから□□□□□□□
#!/bin/bash
# バックアップ先を指定
back_up_dir=/<<バックアップ先のディレクトリのパス>>/dailyBack
mkdir -p $back_up_dir
# バックアップログ名
backup_log=/<<ログを残すディレクトリ>>/log/rsync_backup.log
rm -f $backup_log
touch $backup_log
chmod 600 $backup_log
# エラー処理 あった方がよさそうなので、そのまま使わせて頂いた。
error_exit () {
exit 1
}
# バックアップ実行
echo "毎日のバックアップ開始" >> $backup_log
#このあたりは素敵な感じ。当初別の方法で書いたが、ゐくをさんの方法の方が分かりやすいので、パクった。
latest=`ls -t $back_up_dir | grep backup | head -1`
newly=`date +%Y%m%d`backup
mkdir $back_up_dir/$newly
rsync -av --delete --link-dest=../$latest /<<バックアップ元のディレクトリ>> $newly/$latest >>
#ここから下もそのまま利用させて頂いた。
$backup_log 2>&1
code=$?
if [ $code -ne 0 ]; then
cat $backup_log | mail -s "BACKUP NG CODE IS $code" root
rm -rf $back_up_dir/$newly
error_exit
fi
echo "毎日のバックアップ完了" >> $backup_log
□□□□□□□□ここまで□□□□□□□□□
Linux ディレクトリ・ファイル容量の確認コマンド du
dfはHDD等の利用率や容量の確認コマンド
duはカレントディレクトリの容量を調べることができる。
du --オプション ファイル名やディレクトリ
オプション
-s 引数で指定したファイルやディレクトリの総計を表示する
-h 適当なサイズで表示 K G等
-d シンボリック・リンク・ファイルは元ファイルの容量を集計する
良く使うのはこのあたり
最初に調べたいディレクトリに移ってからコマンドを打っても良い。
du -sh
大概はこれでOK。
duはカレントディレクトリの容量を調べることができる。
du --オプション ファイル名やディレクトリ
オプション
-s 引数で指定したファイルやディレクトリの総計を表示する
-h 適当なサイズで表示 K G等
-d シンボリック・リンク・ファイルは元ファイルの容量を集計する
良く使うのはこのあたり
最初に調べたいディレクトリに移ってからコマンドを打っても良い。
du -sh
大概はこれでOK。
2014/01/21
PostgreSQL 配列関数 複数行帰ってくるクエリを一行で表示させる表現 ARRAY関数
複数のテーブルを跨いだクエリで、selectの結果が複数行で返ってくる場合、
pg_fetch_array等で、一覧表として表現したい事がある。
通常、LEFT JOIN等を行っても、複数行がそのまま表示されてしまう。
ただ内容を見る場合は、これでも良いのだが、
pg_num_rows 等で件数を合わせて管理したい場合、カウントがおかしくなってしまう。
いろいろと探したところ、配列関数でクエリを投げれるようなので、実装した際のオボエガキ。
条件
テーブル
tab1
tab2
tab1 のカラム
seqnumber
name
add
・
・
tab2 のカラム
tab2seqnumber
number こいつもユニークでこれを軸に番号を発番している。
memo
・
・
クエリ生成
select seqnumber,
( select array_to_string(ARRAY(select number||memo from tab2
where tab1.seqnumber=tab2.tab2seqnumber ), ',') ) AS combine,name,add from tab1 where seqnumber=7777;
このような表現でOK
大枠のクエリの抽出条件の中に、
select array_to_string(ARRAY・・・, ',' )を入れ子にしているのがポイント。
たとえば、
select seqnumber,number||memo,name,add from tab1 left join tab2 on tab1.seqnumber=tab2.tab2seqnumber where seqnumber=7777;
この場合、3行の検索結果が返ってくるとすると、
seqnumber,101memo1,102memo2,103memo3,name,add
のように
number||memo が若い順にカンマ区切りで文字列として表示される。
何気にすごく使える。
本家の解説ページ
http://www.postgresql.jp/document/8.0/html/functions-array.html
pg_fetch_array等で、一覧表として表現したい事がある。
通常、LEFT JOIN等を行っても、複数行がそのまま表示されてしまう。
ただ内容を見る場合は、これでも良いのだが、
pg_num_rows 等で件数を合わせて管理したい場合、カウントがおかしくなってしまう。
いろいろと探したところ、配列関数でクエリを投げれるようなので、実装した際のオボエガキ。
条件
テーブル
tab1
tab2
tab1 のカラム
seqnumber
name
add
・
・
tab2 のカラム
tab2seqnumber
number こいつもユニークでこれを軸に番号を発番している。
memo
・
・
クエリ生成
select seqnumber,
( select array_to_string(ARRAY(select number||memo from tab2
where tab1.seqnumber=tab2.tab2seqnumber ), ',') ) AS combine,name,add from tab1 where seqnumber=7777;
このような表現でOK
大枠のクエリの抽出条件の中に、
select array_to_string(ARRAY・・・, ',' )を入れ子にしているのがポイント。
たとえば、
select seqnumber,number||memo,name,add from tab1 left join tab2 on tab1.seqnumber=tab2.tab2seqnumber where seqnumber=7777;
この場合、3行の検索結果が返ってくるとすると、
seqnumber,101memo1,102memo2,103memo3,name,add
のように
number||memo が若い順にカンマ区切りで文字列として表示される。
何気にすごく使える。
本家の解説ページ
http://www.postgresql.jp/document/8.0/html/functions-array.html
登録:
投稿 (Atom)