[첫화면으로]UseModWiki소스수정/RemoteWiki

마지막으로 [b]

RemoteWIki 지원

Bab2님이 /사용자의견에 작성한 내용을 그대로 옮김.

특정위키사이트의 인덱스목록을 받아와서 지정한 값과 일치하는 제목이 있으면 그 사이트의 해당페이지로 링크를 만들어줍니다.
* 페이지 목록을 받아오는 액션은 wiki.pl?action=remotepage 이며 현재 plain/text만 가능
NoSmok http://no-smok.net /ns/moin.cgi?action=titleindex


#이것을
        $txt =~ s/\&__LT__;metasearch\(([^\n]+)\)\&__GT__;/&MacroMetaSearch($1)/gei;
#이렇게
        $txt =~ s/\<metasearch\(([^\n]+)\)\>/&MacroMetaSearch($1)/gei;


#config.pl 에 추가해야할 내용
$RemoteDir   = "$DataDir/remotewiki"; # 원격위키의 타이틀인덱스가 저장될 장소.
$UseRemoteWiki = 1; #1 원격 활성 0 비활성
$RemoteFile = "remotemap"; # 원격위키 타이틀인덱스 경로
#### 끝.

# wiki.pl에 추가할 내용.
#### 변수추가.
use vars qw(@RcDays @HtmlPairs @HtmlSingle
....
$RemoteFile $UseRemoteWiki $RemoteDir ### 추가
....
#### 해당페이지의 쌍둥이페이지가 있고, $UseRemoteWiki=1일때 페이지하단에 쌍둥이페이지 링크를 무조건 출력한다. KLE의 RemoteWiki 설명 참고.
sub BrowsePage {
....
        #### 추가
        if ($UseRemoteWiki eq 1) {
                $oldId = $id if($oldId eq "");
                $fullHtml .= &WikiToHTML("<br><br><hr>\nSee Also: <br><metasearch($oldId)>");
                ## REDIRECT매크로 사용시 리다이렉트된 페이지가 아닌 원래페이지의 목록을 보여줌.
        }
        #### 끝.
        $fullHtml .= &GetFooterText($id, $goodRevision);
        print $fullHtml;
        return  if ($showDiff || ($revision ne ''));  # Don't cache special version
....
}
....
#### <metasearch()> 매크로
sub MacroSubst {
....
        $txt =~ s/\&__LT__;metasearch\(([^\n]+)\)\&__GT__;/&MacroMetaSearch($1)/gei; #### 추가.
....
}

#### 전체추가
#### 원격사이트 페이지목록을 소켓으로 긁어온다.
sub GetUrlSocket {
        use IO::Socket;
        my($url, $addr) = @_;
        my (@data, $result);
        my $sock;

        $sock = IO::Socket::INET->new(PeerAddr=>$url, Proto=>'tcp', PeerPort=>'80');
        print $sock "GET ". $addr . "\n\n";

        @data = <$sock>;

        $result = join ($FS,@data);
        $result =~ s/(\n|\r)//g;

        close($sock);

        return $result;
}

#### 긁어온 목록을 정리해서 화일로 저장한다.
sub GetRemotePage{
        my (@all, $data, $status, $count, $result);

        ($status, $data) = &ReadFile($RemoteFile);
        return ""  if (!$status);
        @all = split(/\s+/, $data);

        &CreateDir($RemoteDir);

        for ($count=1;$count<1+(@all/3);$count++) {
                open (remotewiki, ">"."$RemoteDir"."/"."$all[3*$count-3]".".db");

                @all[3*$count-2] =~ s/http\:\/\/(.*)/$1/g;
                ##### 0은 이름 1(3count-2)은 주소 2(3count-1)는 실행경로 #####
                $result = &GetUrlSocket(@all[3*$count-2], @all[3*$count-1]);

                print remotewiki $FS.$result;

                close (remotewiki);
        }

        print &GetHeader('', T('Get RemotePages'), "");
        print "<br>Getting RemoteWiki pages done.<br>";
        print &ScriptLink("$HomePage", T('<br>첫화면으로..<br>'));
        print "<hr>\n";
        print $q->endform;
        print &GetMinimumFooter();

        return "";
}

#### 페이지 이름과 일치하는 원격사이트 목록을 출력한다.
sub MacroMetaSearch {
        my ($name) = @_;
        my (@remotename, @all, $data, $status, $count, $remotedata);
        my $page;
        my $result = "";

        $name = &RemoveLink($name);
        ($status, $data) = &ReadFile($RemoteFile);
        return ""  if (!$status);
        @all = split(/\s+/, $data);

        for ($count=1;$count<1+(@all/3);$count++) {
                @all[3*$count-2] =~ s/http\:\/\/(.*)/$1/g;
                ##### 0은 이름 1(3count-2)은 주소 2(3count-1)는 실행경로 #####
                open (getdb, ($RemoteDir."/".@all[3*$count-3].".db"));
                $remotedata = <getdb>;
                if ($remotedata =~ /$FS($name)$FS/i) {
                        $result .= &StoreInterPage("@all[3*$count-3]\:$1")." ";
                }
                close (getdb);
        }
        return $result;
}
#### 끝.
....
#### 원격사이트로부터 타이틀인덱스를 받는 action 추가
sub DoOtherRequest {
....
                } elsif ($action eq "titleindex") {
                        DoTitleIndex();
                #### 추가.
                } elsif ($action eq "remotepage") {
                        &GetRemotePage();
                #### 끝.
                } elsif ($action eq "help") {                           # luke added
                        &DoHelp();
....
}
....
sub GetPageOrEditAnchoredLink {
        my ($id, $anchor, $name) = @_;
        my (@temp, $exists);
        my $intername;  #### 추가.
        ....
        if ($exists) {
                $id = "$id#$anchor" if $anchor;
                $name = "$name#$anchor" if $anchor && $NamedAnchors != 2;
                return &GetPageLinkText($id, $name);
        #### 추가한다.
        ## 이곳의 페이지이름을 wikix로 만들어주는 패치를 했다면 아래를 주석해제
#       } elsif (($UseRemoteWiki) && (!$LinkFirstChar) && ($Section{'revision'} > 0)) {
        ## 패치를 하지 않았다면 아래를 주석해제
#       } elsif (($UseRemoteWiki) && ($Section{'revision'} > 0)) {
                $intername = &MacroMetaSearch($id);
                $intername =~ s/\s+(.*)//g;
                return $intername." ".&GetPageLinkText($id,"?") if ($intername ne "");
        }
        #### 끝.
        if ($FreeLinks) {
....
}

Notes

어딜 찾아봐도 구체적으로 어떻게 구현했다는 말이 없으니...원..
그럭저럭 돌아갈겁니다. 노스모크의 "-_-" <- 이 링크가 안되는 문제가 있는데 이것은 StoreInterPage 함수의 문제이기 때문에 어쩔 수 없습니다.
(라기 보단 손대기 귀찮죠 -_-;;)
본문의 리모트 페이지는 우선순위가 제일 높은 한페이지만 표시하게 했습니다.
cron 대몬을 써서 자동으로 갱신시키고자 한다면. GetUrlSocket함수와 GetRemotePage를 별도의 화일로 만들어서 하루에 한 번 정도 갱신시켜주면 될 것입니다.
그 외에는 메뉴에 링크를 걸어서 직접 고쳐주는 수밖에 없죠. --;
WikiX스타일 링크는 적용이 안되는데 그건 wikix스타일을 쓰는 다른분이 해결좀 해주셨음 좋겠군요..
다른 문제는 모두 해결했습니다. (꽁수로 --;)
진짜로 끝냈다 만세~

-- Bab2


이런식의 질문은 좀 안좋다는거 알지만..적용해보니 애러가 납니다. 뭐가 잘못된지는 모르구요..흑흑..이런식의 질문밖에 못하는 제가 미워요..어디어디부분에 어떠어떠한 에러가 나더라..라는식의 질문을 하고싶은데..
-- Nyxity 2003-2-20 11:20 pm

홈페이지가 있는 계정에 telnet 또는 SSH 로 들어갈 수 있나요? 들어갈 수 있다면, 그리고 퍼미션이 허락한다면, (불행히도, 상용 서비스 업체에 하숙하시는 거라면 안 될 것 같습니다만) 아파치 로그를 찾아 보세요. 주로 있을 법한 곳은 /var/log/httpd , /var/log/apache , /usr/local/apache/logs/ 등등인데, 이 디렉토리 아래에 error_log 란 화일에 보면 웹서버 에러의 구체적인 내용이 기록됩니다. (물론.. 유닉스 환경에서 apache 웹서버를 사용하는 경우의 이야기입니다만) 웹브라우저 상에서는 그저 "Internal Server Error" 라고 나오는 것도, 저 로그 화일에는 구체적으로 "wiki.pl 의 몇 번째 라인에 syntax error 가 났다" 라는 식으로 적힙니다. 이것을 볼 수 있으면 원인을 찾기가 훨씬 쉬워지겠죠.
-- Raymundo 2003-2-20 11:47 pm

[Wed Jun 26 16:39:22 2002] [notice] Apache/1.3.26 (Unix) PHP/4.2.1 mod_throttle/3.1.2 configured -- resuming normal operations
[Wed Jun 26 16:39:22 2002] [notice] suEXEC mechanism enabled (wrapper: /usr/loca l/apache/bin/suexec)
[Wed Jun 26 16:39:22 2002] [notice] Accept mutex: sysvsem (Default: sysvsem)
[Wed Jun 26 16:45:29 2002] [error] [client 61.75.86.224] no acceptable variant: /usr/local/apache/htdocs/index.html
음..무슨말인지..흑흑
-- Nyxity 2003-2-20 11:56 pm

위 화일의 이름이 뭔가요? 아까 말을 빼먹었는데.. 만일 수많은 사람들이 같이 돈을 내고 쓰는 서버라면... 각 사람들의 홈페이지에서 발생하는 에러가 한 화일에 기록되는 수도 있습니다. 관리자의 설정에 따라서 각 홈페이지 별로 별도의 로그 화일을 만들 수도 있고요. 후자라면 좋겠지만, 전자라면 저 에러는 Nyxity님 홈페이지와는 관계없는 에러일 수도 있습니다. 뭐, 관계있는 걸 수도 있겠습니다만, 평소에는 잘 돌아가던 wiki.pl 이 패치를 했다고 해서 저런 에러를 낼 것 같지는 않거든요.
-- Raymundo 2003-2-21 12:00 am
힝~ 포기해야겠군요.

개인용컴에 리눅스같은게 깔려있다면 거기서 한번 테스트 해보세요.
-- Bab2 2003-2-21 12:52 pm
우웅...리눅스 깔 엄두는 못내겠어요. 그리고 위의 에러메시지는 '/usr/local/apache/logs/ '에 있는 error_log 를 본겁니다.

음. 그 파일을 볼 수가 있다면요, 다음과 같이 해 보세요. 텔넷으로 접속하셨다면 그 상태에서 다음의 명령을 내립니다.
tail -f /usr/local/apache/logs/error_log
그러면, 저 화일이 변경되는 것을 실시간으로 계속 보여줄 겁니다. 일단 엔터를 다다다 쳐가지고 줄을 좀 띄운 후에, 재빠르게 브라우저에서 문제의 코드를 실행시켜서 에러를 냅니다. 그 순간 텔넷 화면에 뜨는 메세지가 해당 에러 메세지일테니, 얼른 Ctrl+C 를 눌러서 tail 을 종료시키고, 갈무리를 하면 되겠죠. 저번에 말씀드린 것처럼 그 서버에 존재하는 모든 웹사이트들의 로그가 같이 뜬다면, 계속 출력이 쏟아져나와서 정확히 잡아내기가 쉽지 않을수도 있겠습니다만.. 그리고 저 /usr/local/apache/logs 디렉토리에 (만일 운이 좋다면) palmworld.org 로 접속했을때의 에러만 별도의 화일로 남기도록 했을 수도 있습니다. 다른 화일이 없나 살펴보세요.
-- Raymundo 2003-2-21 9:46 pm

[Wed Jun 26 22:47:42 2002] [notice] SIGHUP received. Attempting to restart
[Wed Jun 26 22:47:42 2002] [warn] NameVirtualHost 61.100.2.77:80 has no VirtualHosts
아무래도 제 계정의 비번과 아디를 알려드리고 한번 봐주시는것이 더 빠를듯...어려워요..
-- Nyxity 2003-2-25 10:50 pm

흐음... 저 에러도 웬지 아니다 싶습니다만.. ^^; 거북이님과 Canday님의 경우에는 제가 대신 로긴해서 살펴볼 수 있었습니다만, 이 패치는 Bab2님이 작성하신 것이고 게다가 저는 사용하고 있지 않은 터라... Bab2님께서 괜찮으시다면 그쪽으로 메일을 보내시는 게 낫겠죠. 근데 아무래도 옮겨 적는 과정에서 오타가 났다거나 하는 단순한 에러가 아닐까 싶네요. 폐인월드에서는 잘 돌아가는 패치가 이쪽에서 안 되는 이유가 따로 있을런지...
-- Raymundo 2003-2-25 11:00 pm

혹시 펄에 SOCKET모듈이 없어서 그런건 아니겠죠? ㅡ.ㅡa 아마 기본적으로 깔려있을거라고 믿습니다만은..;; 위키본체랑 컨피그 화일을 메일로 좀 보내주실 수 있겠습니까? bab2 at hanafos.com 입니다.
-- Bab2 2003-2-25 11:48 pm

제불찰이었군요. 이거 ㅡ.,ㅡ;; Wikix스타일의 빈페이지이름 표시가 처리하기 너무 어려워서 wikix스타일을 쓸경우에는 그냥 sisterwiki로만 사용할 수 있게 했는데 거기서 걸린거였군요.
-- Bab2 2003-2-28 11:59 am

안녕하세요. 어제 하관은 일찍 끝났는데, 이후에 어딘가로 계속 왔다갔다 하는 바람에 컴은 손도 못댔습니다. ㅜㅡ 한번 살펴봤는데, 이곳은 WikiX?스타일 패치가 안되어 있더군요. 저도 그걸 언급하는걸 깜빡해버렸습니다. 텔넷이 아직 되길래 들어가서 수정했는데, 화일이름은 보시면 아실거구요.

그대로 적용하실거면 화일이름을 바꾸시면서 위키본체에 선언되어 있는 컨피그 화일의 이름도 수정해주어야 될 겁니다.

그리고 remotemap은 제가 그걸 너무 허접하게 만들어서리..;; 작성하실때 주의하셔야 되는게, 제일 끝의 실제 경로입니다. 예를들어 이것은 텔넷으로
bab2@ftp bab2 $> telnet piwd.net 80 <-- (접속주소)

Trying 218.149.165.189...
Connected to piwd.net.
Escape character is '^]'.

GET http://piwd.net/cgi-bin/wiki.pl?action=titleindex <-- (실제경로)
이렇게 되는데, 이게 아파치의 가상호스트 설정에 따라서 실제경로가 서버의 것이 될지 호스팅받는 도메인의 것이 될지 오락가락 하더라구요. [여기]를 보면 아시겠지만, 그것때문에 remotemap에서 실제경로가 http가 붙기도 하고 안붙기도 하고 오락가락 했던거거든요. 그리고, 출력되는 링크들은 인터위키로 넘기게 했기 때문에 remotemap에 있는 사이트는 마찬가지로 intermap에 인터위키사이트로 등록되어 있어야 합니다.

일단 소스가 돌아가도록 수정은 끝냈고, 개선사항 있으면 알려주시기 바랍니다. 좋은하루 되세요. -- bab2

bab2님 덕택에..잘쓰고 있습니다. 감사감사 --nyxity

마지막 편집일: 2007-1-8 12:19 pm (변경사항 [d])
1363 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기