2003年09月17日(水) << 前の日記 | 次の日記 >>
これまでの09月17日 編集

■5 続・ローカルミラーシステム[http://www.nantoka.com/~kei/diary/?200308b&to=200308153#T200308153][hns]<< 前の記事 | 次の記事 >> このエントリーをはてなブックマークに追加

※警告※このシステムを設置する際は、basic認証などを用いて、ローカルミラーを筆者にしか見られない様に設置して下さい。著作権上の問題と、セキュリティ上の問題を招きます(2005/02/23付記)。
リクエストがあった気がしたので、AS ISだけれども、まとめられるところをまとめてみる。 誰かリリースしてくれると嬉しいなと思って公開。
仕組みは:
  1. cronから呼び出されるhns_linkarc.plが、Hnfをスキャンして、mirrorを生成する。
  2. public_html/diary/lib/HNS/Hnf/Command.pmにパッチが当っていて、theme.phの置換文字列に'%arcbase'を加える。
  3. theme.phでは、'%arcbase'を利用して、各リンクの後ろに'_'を使用した隠しリンクを付加する。
  4. '%arcbase'を付与したリンク先には、cgiプログラムがいて、URL引数をローカルファイル名に変換してリダイレクトする。
という感じです。
1の、"hns_linkarc.pl"。
#!/usr/bin/perl
#==============================================================================
#	hns_linkarcr.pl	hnsファイルに現われるURLをアーカイブ
#		$Id: d20030917.hnf,v 1.1 2009/09/23 12:57:31 kei Exp $
#==============================================================================

use	strict;
use File::Find;
use	LWP::Simple;

my $HNF_DIR		=	'/home/kei/diary/';
my $ARCHIVE_DIR	=	'/home/kei/public_html/archive';

my @EXCEPT_URL	=	(
	'http://www.nantoka.com/~kei/diary/',
);


my	($LastCheck, $Now, %Rlink);

&main();
exit(0);


sub	main	{
	my (@stat, $last);
	my ($lastfile);

	$lastfile = "$ARCHIVE_DIR/.last_check";
	if (! open(FILE, $lastfile)) {
		$last = 0;
	}
	else {
		$last = <FILE>;
		chomp($last);
		close(FILE);
	}
	$LastCheck = $last;
	$Now = time();

	open(FILE, "$HNF_DIR/conf/rlink.txt");
	while(<FILE>) {
		chomp;
		if (/^([^\s]+)\s+(.+)$/) {
			$Rlink{$1} = $2;
		}
	}
	close(FILE);

	find(\&hnf_check, $HNF_DIR);

	open(FILE, "> $lastfile");
	print FILE "$Now\n";
	close(FILE);
}


sub	hnf_check {
	my (@stat, $last, $file);
	my ($file);

	$file = $_;
	if ($file =~ /^d[0-9]+\.hnf$/) {
		@stat = stat($file);
		if ($stat[9] >= $LastCheck) {
			hns_scan("$file");
		}
	}
}


sub hns_scan($) {
	my ($file) = @_;
	my ($savename, $url);

	print "$file\n";
	open(FILE, $file);
	while (<FILE>) {
		if ($_ =~ /^(LINK|LSUB|LNEW|LSTRIKE|LIMG)\s+((http:|ftp:)\S+)/) {
			fetch($2);
		}
		elsif ($_ =~ /^(RLINK|RLSUB|RLNEW)\s+(\S+)\s+(\S+)/) {
			$url = $Rlink{$2} . $3;
			if ($url =~ m!^http://|ftp://!) {
				fetch($url);
			}
		}
	}
	close(FILE);
}


sub	fetch($) {
	my ($url) = @_;
	my ($hit, $savename);

	$url =~ s/#.+$//;
	$hit = 0;
	foreach my $except (@EXCEPT_URL) {
		if ($url =~ /$except/) {
			$hit = 1;
			last;
		}
	}
	if (! $hit) {
		$savename = $url;
		$savename =~ s/\//!/g;
		mirror("$url", "$ARCHIVE_DIR/$savename");
		print "\t$url\n";
	}
}

2の、パッチ。
public_html/diary/config.ph
--- config.ph-bak       Tue Feb  4 13:05:09 2003
+++ config.ph   Thu Aug 14 14:21:35 2003
@@ -92,6 +92,9 @@
 # Display Schedule as User Var
 $UseYoteiView = 0;     # 0 -> off (default)

+# Archive System Base URL
+$ArchiveURLBase =       '../archive/?';
+
 ################################################################
 package HNS::Style;
 $UnagiUse = "ON";

public_html/lib/HNS/Hnf/Command.pm
--- lib/HNS/Hnf/Command.pm.orig Wed Aug 13 15:30:29 2003
+++ lib/HNS/Hnf/Command.pm      Thu Aug 14 14:20:30 2003
@@ -217,6 +217,7 @@

     my $templ = new HNS::Template;
     $params->{content} = $self->{arg_content};
+    $params->{arcbase} = $HNS::System::ArchiveURLBase;
     for (1..3){
        $params->{$_} = $self->{attr}->[$_];
     }
@@ -246,6 +247,7 @@

     my $templ = new HNS::Template;
     $params->{content} = $self->{arg_content};
+    $params->{arcbase} = $HNS::System::ArchiveURLBase;
     $self->ExpandTempl($templ, $params);
     for (1..3){
        $params->{$_} = $self->{attr}->[$_];

theme.phはたくさんいじっててもはやdiffが取れないのでポイントのみ。
<a href="%url%2">%content</a><a href="%arcbase%url%2">_</a></h3>
っていう感じで、%contentのリンクの後に、'%arcbase%リンク先URL引数'へのリンクを埋め込んでいく。ここでは、'_'使っているけれども、これはお好みで。
リンク先のcgiプログラム。hns_lincarc.plのロジックとあわせればOK。
#!/usr/bin/perl

$url = $ENV{'QUERY_STRING'};
$url =~ s/\//!/g;
$url =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;

#print "Content-type: text/plain\n\n";
print "Location: $url\n\n";
もし、もう少しインストールしやすい形でまとめてもらえたら、私にもぜひ知らせてください。

■ 関連記事

以上、1 日分です。

指定日の日記を表示

前月 2003年09月 翌月
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

最近の日記

2019年04月01日

新元号「令和」について

2019年03月23日

DXアンテナ ワイヤレスチューナー メディアコンセント DMC10F1

2019年02月17日

#例のグラボを活用する

2019年01月03日

シリーズ5・myHomeAlexaで自分のCDをかける

2018年12月25日

シリーズ4・英語の楽曲・アルバム・アーティスト名をカタカナに直す

2018年12月23日

シリーズ3: Echo Dotがやってきた

2018年12月19日

続・Echo Dotがやってきた

分野別タイトル一覧


全て
CLIP
SYA!nikki
book
freebsd
hns
magic
おさけ
おしごと
お買いもの
ぐる
ごはん
アクセシビリティ
オープンソース
セキュリティ
音楽
地域情報化
電子自治体
日記

keikuma on Twitter

keikuma Name:前田勝之
Location:長崎市
Web:http://www.nantok...
Bio:前田勝之(まえだかつゆき)。長崎在住。コンサル、SE、プログラマー、 なんとか株式会社代表、非常勤講師(情報セキュリティ)。 セキュアド、テクニカルエンジニア(SV,NW)。サーバ管理とWeb日記を10年ほど。 ネットとリアルの接点に関心あり。食べること・歌うこと・愛すること・作ること・飲むこと。おいしいものがぜんぶすき。

サイト内検索

Google AdSense

Powered by hns-2.19.9, HyperNikkiSystem Project