| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
D.M.Z
CONTENT
PRE
NEXT
17.1 Delivering News Netnews에서 가장 대중적인 소프트웨어 패키지 중 하나는 C News이다. 그것은 UUCP 링크를 통해 뉴스를 운반하는 사이트들을 위해 디자인되었다. 이 장은 C Nes의 핵심 개념과, 기본적인 인스톨과 관리 임무에관해 논의한다. C News는 그 설정파일을 /usr/lib/news에, 그리고 대부분의 바이너리를 /usr/lib/news/bin에 저장한다. article들은 /var/spool/news아래에 보존된다. 이들 디렉토리 내의 모든 파일이 유저 news, 그룹 news의 소유인지 확인해야하는데, 그 이유는 대부분의 문제가 C News가 파일에 억세스 할 수 없는 데서 발생하기 때문이다. 그 곳에서 뭔가를 건드리기 전에 su로 유저 news가 되는 습관을 들여야 한다. 단 한가지 예외가 있는데, 그것은 setnewsid로, 몇가지 뉴스 프로그램의 실제 유저 id를 지정하는데 사용되는 것이다. 이는 반드시 root의 소유여야하며, setuid 비트가 걸려 있어야 한다. 이후로, 우리는 C News 설정에 대해 자세히 설명하고, 당신의 사이트가 계속 돌아가도록 유지하기위해 무엇을 해야하는가를 보여 줄 것이다.
article은 여러가지 방법을 통해 C News로 feed된다. 로컬 유저가 article을 포스팅할 때, newsreader는 보통 그것을 inews 커맨드로 넘겨주어 불완전한 헤더 정보 부분을 완성하게 한다. 리모트 사이트로부터의 뉴스들(single article또는 batch일 것이다)은 rnews 커맨드에게 넘겨주고, rnews는 이를 /var/spool/newsin.coming 디렉토리에 저장하여, 이후에 newsrun이 이것들을 pick up한다. 그러나 이들 두가지 방법중 어느 것을 쓰더라도 결국엔 relaynews가 article을 넘겨받는다. relaynews 커맨드는 각 article에대해서 history 파일내의 메시지 id를 검색함으로써 그 article이 이미 로컬 사이트에서 받은 적이 있는 메시지인가를 체크하여, 중복된 것이라면 drop시킨다. 그런 후에, relaynews는 Newsgroups: 헤더라인을 읽어, 로컬 사이트가 거기에 지정된 그룹들에 대한 article을 받고 있는지를 판별한다. 만약 그렇다면, 그 뉴스 그룹은 active 파일에 추가되고, relaynews는 news spool area내의 해당 뉴스그룹 디렉토리에 그 article을 저장하려하는데, 만약 이 때 디렉토리가 존재하지 않는다면 새로이 생성된다. 그리고 나서 그 article의 메시지 id는 history 파일에 로그된다. 그러나 만약 이들 그룹 중 어떤 것에대해서도 뉴스를 요청하지 않고 있다면, relaynews는 그 article을 drop시킨다. 만약 incoming article이 포스팅 된 뉴스 그룹이, 당신의 active파일에 리스트되어 있지 않은 이유로 인해 relaynews가 그것을 저장할 수 없는 경우, 그 article은 junk 그룹으로 옮겨진다. relaynews는 그 외에도, 기한이 만료 되거나 날짜가 잘못 표기된 article이 있는지 체크하여 만약 그럴 경우 그것들을 거부한다. 그 외 다른 여러가지 이유로 저장하지 못한 batch들은 /var/spool/news/in.coming/bad로 옮겨지고, 로그에 에러 메시지가 남는다. 이런 후에, 그 article은 특정 사이트 각각에 지정된 전송수단에 의해, 이들 그룹을 요청한 다른 사이트로 릴레이된다. 각 사이트는, 그것이 어떤 사이트에 이미 보냈던 것이 아니란 것을 확인하기위해, article이 거쳐간 사이트 리스트가 들어있는 bang path 스타일의 Path: 필드와 비교되고, 목적지 사이트의 이름이 리스트에 없는 경우에만 그 사이트에 article을 보낸다. C News는 NNTP 환경에서도 사용가능하나, 보통은 UUCP 사이트간에 뉴스를 릴레이하는데 사용된다. 리모트 UUCP 사이트로 뉴스를 배달하기위해 - 그것이 single article이건 batch이건 - 리모트 사이트의 rnews 커맨드를 실행하는데 uux를 사용하고, 표준입력으로 article 또는 batch를 넘겨준다. 주어진 사이트에 batching이 가능하다면, C News는 incoming article을 즉시 보내지않고, 단지 그것의 경로명을 파일에 (보통, out.going/site/togo) 덧붙인다. 일정시간을 간격으로 crontab 엔트리에서 batcher와 프로그램이 실행되어 article들을 하나, 또는 그 이상의 파일에 뭉쳐 넣고, 압축을 하여(하지 않기도 한다), 그것을 리모트 사이트의 rnews로 보낸다. 그림 17.1은 relaynews를 통한 news의 흐름을 나타낸 것이다. article은 로컬 사이트 (ME로 지칭되어 있다), ponderosa라는 이름의 어떤 사이트, 그리고 batching이 가능한 moria라는 사이트로 릴레이 될 것이다.
C News를 인스톨하기 위해선, 파일들을 적절한 장소에 untar하고(아직 그렇게 하지 않았다면), 아래에 나열된 설정파일들을 편집하라. 그것들은 모두 /usr/lib/news에 있으며, 각각의 포맷에 대해서는 다음 절에서 적는다.
뉴스 그룹의 초기 계층을 만들기 위해선, 당신에게 뉴스를 feed 해 주는 사이트에서 active 파일과 newsgroup 파일을 얻고, 그것들을 /usr/lib/news에 인스톨한 후, 그것이 news의 소유이며 644 모드인지를 확인하자. active 파일에서 모든 to.* 그룹을 제거하고, to.mysite와 to.feedsite, 그리고 junk와 control을 추가하라. to.* 그룹들은 보통 ihave/sendme 메시지 교환에 쓰이나, ihave/sendme를 사용할 지 않을 지에 상관 없이 그것들을 만들어 주어야 할 것이다. 다음으로, 아래의 커맨드를 이용하여 active의 두번째와 세번째의 모든 article 번호를 대체해 주어야 한다.
# cp active active.old # sed '/ [0-9]* [0-9]* / 0000000000 00001 /' active.old > active # rm active.old두번째 커맨드는, 내가 선호하는 UN*X 커맨드 중의 하나인 sed(1)를 실행한다. 이것은 두 10진수 문자열을 각각 0으로 채우고, 00001로 대체시킨다. 마지막으로, 새 news spool 디렉토리를 만들고, incoming과 outgoing news들에 사용되는 서브 디렉토리를 만들자.
# cd /var/spool # mkdir news news/in.coming news/out.going # chown -R news.news news # chmod -R 755 news 만약, C News의 보다 최근 릴리즈를 사용한다면, news spool 디렉토리내에 out.master를 만들어 주어야 하기도 한다. 당신이 돌리고 있는 C News과는 다른 배포판에 있는 newsreader를 사용한다면, 어떤 것은 /var/spool/news가 아니라 /usr/spool/news에 news spool이 있다고 간주한다는 것을 발견할 것이다. 당신의 newsreader가 어떠한 article도 찾을 수 없는것 같다면, /usr/spool/news에서 /var/spool/news로의 심볼릭 링크를 만들어 두자. 이제, 당신은 뉴스를 수신할 준비가 되었다. 위에 적힌 것 외에 다른 어떤 디렉토리를 만들 필요는 없다. 왜냐하면, spool 디렉토리가 없는 그룹에서 article을 수신할 때마다, C News가 새로이 그것을 만들기 때문이다. 특히, article이 crosspost된 모든 그룹에대해 이러한 일이 일어나는데, 이 때문에 이후에 alt.lang.teco와 같이, 절대 subscribe한 적없는 뉴스그룹의 디렉토리로 news spool이 어질럽혀져 있음을 발견하게 될 것이다. 이를 막기위해선, active에서 원하지 않는 모든 뉴스그룹을 삭제하거나 /var/spool/news하의 빈 디렉토리를 지워주는 쉘 스크립트를 정기적으로 돌리면 된다. (물론, out.going과 in.coming 디렉토리를 제외하고 말이다.) C News는 에러메시지와 상태보고를 보낼 유저를 필요로 하며, 디폴트로 usenet이다. 디폴트 그대로를 사용한다면 메일을 책임자에게로 포워드해주는 앨리어스를 셋업해 주어야 한다. (chapter 14, 15에서 이러한 일을 smail과 sendmail에 어떻게 해주는 지를 설명하고 있다.) 이것은 환경변수 NEWSMASTER를 적절한 네임으로 세팅함으로써 override할 수도 있다. 앨리어스를 만들지 않는다면, 관리용 툴을 매번 손수 실행시키거나, news의 crontab파일에서 환경변수를 세팅하는 일을 해주어야 한다. 물론 그보단 앨리어스를 세팅하는 편이 훨씬 쉬울 것이다. 당신이 /etc/passwd를 해킹할 때, 모든 유저가 자신의 실제이름을 패스워드 파일의 pw_gecos 필드에 넣어두었는지를 확인해야 한다. 보낸이의 실제 이름이 From: 필드에 들어가는 것은 Usenet의 네티켓에 관련된 사항이다. 물론 메일을 사용할 때도 그렇다.
/usr/lib/news에 위치한 sys파일은 당신이 수신하여 다른 사이트로 포워드하는 Usenet 계층을 컨트롤한다. addfeed와 delfeed라는 관리 툴이 있긴 하지만, 손수 이 파일을 관리하는 편이 낫다고 생각한다. sys 파일은 당신이 뉴스를 포워드하는 각 사이트들에 대한 엔트리와, 당신이 승인하는 그룹에 대한 사항을 담고있다. 하나의 엔트리는 다음과 같은 형태를 지닌다.
뉴라인 캐릭터 앞에 백슬래쉬를 사용하면 한 엔트리를 여러줄에 걸쳐 쓸 수도 있다. 해쉬 부호(#)는 코멘트임을 나타낸다.
C News를 구동할 때, 대부분의 경우 당신은 당신 고유의 sys파일을 적어줘야 할 것이다. 그것을 돕기 위해 아래에 vbrew.com의 샘플 파일을 실어 놓았으니, 필요한 부분을 카피해서 쓰기 바란다.
# We take whatever they give us. ME:all/all:: # We send everything we recives to moria, except for local and # brewery-related articles. We use batching. moria/moria.orcnet.org:all,!to,to.moria/all,!local,!brewery:f: # We mail comp.risks to jack@ponderosa.uucp ponderosa:comp.risks/all::rmail jack@ponderosa.uucp # swim gets a minor feed swim/swim.twobirds.com:comp.os.linux,rec.humor.oracle/all,!local:f: # Log mail map articles for later processing usenet-maps:comp.mail.maps/all:F:/var/spool/uumaps/work/batch
active파일은 /usr/lib/news에 있고, 당신 사이트에서 알고 있는 모든 그룹과 현재 온라인 상태인 article을 리스트한다. 그것을 건드릴 필요는 거의 없으나, 완벽을 위해 설명하고자 한다.
newsgroup high low perm newsgroup은 당연히 뉴스 그룹의 이름이다. low와 high는 현재 유효한 글의 최저와 최소 번호이다. 만약 어떤 것도 유효하지 않다면, low는 high+1과 동일하다. 적어도, 그것이 low 필드가 의미하는 바이나, 효율성을 위하여 C News는 이 필드를 업데이트 하지 않는다. 그것에 의존하는 newsreader가 없을 경우라면, 이는 그다지 큰 손실이 되지 않는다. 예를 들어, trn은 자신의 thread 데이터베이스에서 어떤 아티클을 제거할 지를 이 필드를 체크함으로써 결정한다. low 필드를 업데이트하기 위해선, 정기적으로 updatemin 커맨드를 돌려 주어야 한다 (또는, C News 오래된 버전에선 upact 스크립트를 돌린다). perm은 유저들을 그룹에서 받아들이는 억세스에 관한 것을 세부적으로 설명하는 파라미터이다. 그것은 다음 중의 하나를 그 값으로 받는다.
C News에선, 일반적으로 이들 파일에 직접 억세스할 필요는 없다. addgroup과 delgroup을 사용하여 (아래의 Maintenance Tools and Tasks 섹션을 보라) 로컬의 그룹을 추가하거나 삭제할 수 있다. 그룹을 Usenet 전체에대해 추가 또는 삭제할 때엔 보통 newgroup 또는 rmgroup 컨트롤 메시지를 보내는 방법을 쓴다. 그러한 메시지를 당신자신에게 절대로 보내지 말기 바란다 뉴스 그룹을 새로 생성하는 방법에 대한 절차를 원한다면, news.announce.newusers에 매달 포스팅되는 글을 읽기 바란다. active에 밀접한 관계를 가진 파일은 active.times이다. 어떤 그룹이 생성될 때마다 C News는 이 파일에, 생성된 그룹 명과 생성된 일자, 그리고 그것이 newgroup 컨트롤 메시지에의해 생성된 것인지 또는 로컬에서 생성된 것인지, 그리고 누가 생성했는지를 포함하는 메시지를 로그로 남긴다. 이는 newsreader가 최근에 생성된 그룹을 유저에게 알릴 수 있게 하기 위함이다. 그것은 NNTP의 NEWGROUPS 커맨드에의해 사용되기도 한다.
newsreader는 Bnews와 C News, INN에 대해 동일한 특정 포맷을 따른다. 각 article 앞엔 이와 같은 라인이 붙는다.
#! rnews countcount엔 아티클의 바이트 수가 들어간다. batch compression을 사용할 때, 결과 파일은 전체적으로 압축되어, unpacking에 사용되는 메시지에 다음과 같은 라인이 또 앞에 붙는다. 표준 압축 툴은 compress로, 다음과 같이 표시된다.
#! conbatch 때때로, 모든 데이터에서 8번째 비트를 없애는 메일 소프트웨어를 통해 메시지를 보내야 할 경우, c7-encoding이라는 것을 사용하여 압축된 batch를 보호하는데, 이 경우엔 c7unbatch라고 표시된다. batch가 리모트 사이트의 rnews로 feed될 때, 리모트 사이트는 이들 marker를 체크함으로써 적절하게 batch를 처리한다. 어떤 사이트는 gzip과 같은 다른 압축 툴을 사용하며, 이 때엔 대신 zunbatch를 앞에 붙인다. C News는 이와 같은 비표준의 헤더를 인식하지 못하므로, 그것들을 지원하도록 소스를 수정해 주어야 한다. C News에서 article batching은 /usr/lib/news/bin/batch/sendbatches가 수행하는데, 이는 site/togo 파일에서 아티클의 목록을 얻어 몇개의 newsbatch들에 집어 넣는 것이다. 이러한 작업은 traffic의 양에 따라 매 시간 또는 그보다 잦게 실행된다. article batching은 /usr/lib/news내의 batchparam 파일에서 컨트롤 된다. 이 파일엔 각 사이트마다 허용된 최대 batch와, 사용되는 batching과 압축 프로그램, 그리고 리모트 사이트에 배달하는 전송 수단이 적혀 있다. 사이트 각각에 별도의 batching 파라미터를 지정할 수 있으며, 디폴트 파라미터을 쓰고자 하는 사이트에 대해선 따로 언급을 해줄 필요가 없다. 특정 사이트에대해 batching을 수행하려면, 다음을 실행하라.
# su news -c "/usr/lib/news/bin/batch/sendbatches site인자 없이 실행될 때 sendbatches는 모든 batch queue에대해 적용된다. "all"의 해석은 batchparam내의 디폴트 엔트리의 존재 여부에 달려 있다. 만약 하나라도 있다면, /var/spool/news/out.going내의 모든 디렉토리가 체크되고, 그렇지 않을 경우 batchparam내의 모든 엔트리에만 적용된다. out.going 디렉토리를 스캐닝할 때, sendbatches는 점 또는 at 부호(@)가 사이트 네임에 들어있지 않는 디렉토리들만을 받아 처리한다. C News를 인스톨할 때, 배포판 내에있는 적당한 디폴트 엔트리를 가지고 있는 batchparam 파일을 찾을 수 있을 것이다. 따라서, 당신이 그 파일을 건드릴 필요는 없겠지만, 포맷에 관해서는 적고자 한다. 각 라인은 6개의 필드로 이루어지며, 각 필드는 공백이나 탭으로 구분된다:
site size max batcher muncher transport 이들 필드가 의미하는 바는 다음과 같다. site는 해당 엔트리가 적용될 사이트의 이름이다. 이 사이트에 대한 togo 파일은 반드시 news spool 아래의 out.going/togo내에 있어야 한다. 여기에 /default/라는 사이트 네임이 들어가면, 이는 디폴트 엔트리를 가리키는 것이다. size는 생성되는 article batch들의(압축전) 최대 사이즈이다. 이 보다 큰 사이즈의 단일 아티클에 대해서 C News는, 예외적으로 그것 자체를 하나의 batch로 만든다. max는, 이 특정 사이트에 대해 batching을 저지하기 전에, 전송에 대해 생성하고 스케쥴할 batch의 최대 수이다. 이는 리모트 사이트가 오랜 기간동안 다운될 경우에 유용한데, 왜냐하면 C News가 무수한 newsbatch들로 UUCP spool 디렉토리를 어지럽혀 놓는 일을 막아주기 때문이다. C News는 queue되는 batch의 수를 /usr/lib/news/bin 내의 queuelen 스크립트를 사용하여 결정한다. Vince Skahan의 newspak 릴리즈는 BNU 호환 UUCP들에 대한 스크립트를 포함하고 있을 것이다. 만약 다른 취향의 spool 디렉토리를 사용한다면, 예를 들어 Taylor UUCP 같은 경우, 당신은 당신 고유의 스크립트를 만들어야 한다. batcher 필드는 togo 파일내의 아티클 리스트에서 batch를 생성해 내는데 사용되는 커맨드가 들어간다. 정기적인 feed의 경우, 이는 보통 batcher이다. 다른 목적에 대해선 다른 batcher를 넣어 줄 수 있다. 예를 들어, ihave/sendme 프로토콜은 아티클 리스트가, 뉴스그룹 to.site로 포스팅되는 ihave 또는 sendme 컨트롤 메시지로 변환되길 요하는데, 이는 batchih와 batchsm에 의해 수행된다. muncher 필드는 압축에 사용되는 커맨드를 가리킨다. 보통 이는 compcun으로, 압축된 batch를 만들어내는 스크립트이다. 그 대신에, gzip을 사용하는 muncher, 이를테면 gzipcun(당신 스스로 만들어 주어야 한다)을 넣을 수도 있다. 이 경우, 당신은 리모트 사이트의 uncompress가 gzip으로 압축된 파일을 인식할 수 있도록 패치되었는지 확인해야 한다. 만약 리모트 사이트가 uncompress 커맨드를 갖고 있지 않다면, 당신은 압축을 하지않도록 nocomp를 지정해 주면 된다. 마지막 필드인 transport엔 사용되는 전송 수단을 적는다. via로 시작하는 이름을 가진, 다른 전송 수단에 대한 몇개의 표준 커맨드를 사용할 수 있다. sendbatches는 그것들을 커맨드라인의 목적지 사이트 네임으로 넘겨 준다. 만약 batchparam 엔트리가 /default/가 아니라면, 그것은 site 필드의 첫번째 도트나 슬래쉬를 포함하여, 그 뒷부분을 없애버림으로써 사이트 네임을 얻어낸다. 만약 엔트리가 /default/라면, out.going 내의 디렉토리 네임들이 사용된다. 리모트 시스템의 rnews를 실행하는데 uux를 사용하는 두개의 커맨드가 존재하는데, 바로 viauux와 viauuxz이다. 후자는 (옛버전의) uux에 -z를 지정하여, 배달하는 각 아티클마다 sucess메시지를 계속 리턴하게 한다. 또 다른 커맨드인 viamail은 아티클 batch를 메일로 리모트 시스템의 유저인 rnews에게 보낸다. 물론, 이는 리모트 시스템이 어떻게든 rnews로 오는 메일을 로컬 뉴스 시스템에 feed한다는 것을 전제로 한다. 이들 전송 수단에 어떤 것이 있는지 완전한 목록을 보길 원한다면 newsbatch(8) 매뉴얼 페이지를 참고하라. 뒤쪽의 세개의 필드에 쓰이는 모든 커맨드들은 반드시 out.going/site 또는 /usr/lib/news/bin/batch 내에 위치하고 있어야 한다. 그것들 중의 대부분이 스크립트이므로, 당신의 개인적 용도에 따라 쉽게 새로운 툴을 짤 수 있다. 그것을은 pipe로써 실행된다. 아티클 목록은 표준 입력을 통해 batcher로 feed되고, batcher는 표준 출력으로 batch를 만들어 보낸다. 이것은 muncher등에 pipe된다. 아래는 샘플 파일이다.
# batchparams file for the brewery # site | size |max |batcher |muncher |transport #--------------+--------+-------+---------+-----------+----------- /default/ 100000 22 batcher compcun viauux sqim 10000 10 batcher nocomp viauux
Bnews에선, expire라 불리는 프로그램을 사용하여 expiring을 수행하는데, 이 프로그램은 newsgroup의 리스트와, 아티클이 expire될 시간 지정을 인자로 받는다. 서로 다른 뉴스 그룹 계층이 다른 시간에 파기 되도록 하기 위해선, 그들 각각에 대해 개별적으로 expire를 호출하는 스크립트를 짜주어야 한다. C News는 이것에 대한 보다 간편한 솔루션을 제공한다: explist라는 파일 내에 뉴스 그룹과 expire 시간 간격을 지정해 줄 수 있다. doexpire라는 커맨드가 보통 하루에 한번씩 cron에서 실행되어, 이 리스트에 따라 모든 그룹을 처리한다. 이따금씩, 특정 그룹에서의 아티클들을 expire되는 기간 후에도 유지하고 싶을 때가 있다. 예를 들어, comp.source.unix에 포스팅된 프로그램을 보존하려 할 수도 있는 것으로, 이를 일컬어 archiving이라 부른다. explist에서 archiving할 그룹들을 표시할 수 있다. explist의 엔트리는 다음의 형태를 지닌다.
grouplist perm times archivegrouplist는 엔트리가 적용될 뉴스 그룹을 콤마를 구분자로 하여 나열한 목록이다. 그룹 네임 prefix를 주고, all을 붙여 (혹은 붙히지 않고) 계층 전체를 지정할 수도 있다. 예를 들어, comp.os 아래의 모든 그룹에 적용되는 엔트리를 원한다면, comp.os 또는 comp.os.all 중 하나를 grouplist에 넣으면 된다. 어떤 그룹에서 뉴스를 expiring할 때, 주어진 순서에 따라 explist내의 모든 엔트리들에 대해 그 그룹의 네임이 체크된다. 이 때, 첫번째로 매치되는 엔트리가 적용된다. 예를 들어, 한 주 동안 보존하고자 하는 comp.os.linux.announce를 제외한 comp의 대부분을 4일 후에 폐기하기 위해선, 단순히 후자에 대한 엔트리에 7일의 expiring 기간을 지정해 주고, 그 뒤에 4일이 지정된 comp를 적어주면 된다. perm 필드는 그 엔트리가 moderated, unmoderated 또는 어떠한 그룹에도 적용되는지를 표시한다. 그것은 m, u, 또는 x의 값을 받는데, 그것들은 각각 moderated, unmoderated, 또는 any type을 지칭한다. 세번째 필드인 times는 보통 단일한 숫자를 그 값으로 가진다. 이것은 아티클 헤더의 Expires: 필드내에 인위적인 파기일이 지정되어 있지 않는 경우, times 필드의 값에 해당되는 수만큼의 날 뒤에 아티클을 파기하게 한다. 주의할 것은, 이것이 당신 사이트에 도착한 때 부터 카운트 되는 것이지, 포스팅 된 때 부터가 아니라는 것이다. 그러나 times 필드는 그 보다 좀 더 복잡할 수도 있다. 그것은 세개의 숫자를 대쉬로 구분하여 조합될 수도 있는데, 이 중 첫번째 것은 아티클이 expire될 후보로써 간주되기까지 얼마만큼의 기간이 지나야 하는지를 가리키고, 이에 0 이외의 다른 값을 쓰는 일은 극히 드문일이다. 두번째 필드는 위에 언급한바 있는, 디폴트로 지정된 아티클 파기까지의 경과일 수 이다. 세번째는, 그것이 Expires: 필드를 갖고 있든지 아니든지 간에 상관없이, 무조건 아티클을 파기할 날 수 이다. 만약 오직 가운데 수만이 주어진다면, 그 외의 두가지는 디폴트 값을 취하게 된다. 이들을 특수한 엔트리인 /bounds/를 사용하여 지정할 수도 있는데, 이에 관해선 아래에서 적는다. 네번째 필드인 archive는 뉴스 그룹이 archive되는지, 된다면 어디에 되는지를 가리킨다. 만약 archiving을 할 생각이 없다면 대쉬를 적어 주어야 한다. 반면에 이를 사용하려 한다면, full path 명을 (디렉토리를 가리키는) 적어주거나 at 부호(@)를 쓰면된다. at 부호는 커맨드 라인에서 -a를 사용하여 doexpire에 주는 디폴트 archive 디렉토리를 가리킨다. archive 디렉토리는 news의 소유여야 한다. 가령, doexpire가 comp.source.unix에서의 아티클을 archive할 때, 그것은 archive 디렉토리 아래의 comp/source/unix내에 그것을 저장하고, 만약 그 리덱토리가 존재하지 않을 경우 그것을 새로 생성한다. 그러나 archive 디렉토리 자체는 생성되지 않는다. 당신의 explist 파일 내엔 doexpire가 의존하는 두개의 특수 엔트리가 존재한다. 그것들은 뉴스 그룹의 리스트 대신, /bounds/와 /expired/ 키워드를 지닌다. /bounds/ 엔트리는 위에 적은바 있는 times에 주어진 세개의 값에대한 디폴트 값을 담고 있다. /expired/ 필드는 C News가 history 파일의 길이를 얼마로 할 것인가를 결정한다. 이는 C News가 history 파일에서 한 라인에 해당되는 아티클이 파기될 때 그 라인을 제거하지 않고, 이 날짜 이후에 중복된 것이 도착할 가능성때문에 그것을 유지하고 있기 때문이다. 만약 당신이 하나의 사이트에서 feed 받는다면, 이 값을 작게 잡아주는 것이 좋다. 그렇지 않을 경우엔, UUCP 네트웍에선 2주 정도가 적당하나, 이들 사이트에서의 아티클이 얼마정도 지연되는가에 대한 당신의 경험에 따라 조절하면 된다. 아래는 다소 빡빡한 expiry 기간을 두도록 설정된 샘플 explist이다.
# keep history lines for two weeks. Nobody gets more than three months /expired/ x 14 - /bounds/ x 0-1-90 - # groups we want to keep longer than the rest comp.os.linux.announce m 10 - comp.os.linux x 5 - alt.folklore.computers u 10 - rec.humor.oracle m 10 - soc.feminism m 10 - # Archive *.sources groups comp.sources, alt.sources x 5 @ # defaluts for tech groups comp,sci x 7 - # enough for a long weekend misc,talk x 4 - # throw away junk quickly junk x 1 - # control messages are of scant interest, too control x 1 - # catch-all entry for the rest of it all x 2 - C News에서의 expiring엔 몇가지 잠재적인 문제가 있다. 하나는 당신의 newsreader가, 온라인 아티클의 최저수를 가지고 있는 active 파일의 세번째 필드에 의존할 수 있다는 점이다. 아티클을 파기할 때, C News는 이 필드를 업데이트하지 않는다. 만일 이 필드가 실제 상황을 보여주도록 할 필요가 있거나, 그러길 원한다면, 매번 doexpire을 실행한 후마다 updatemiin이라는 프로그램을 돌려줄 필요가 있다. 둘째로, C News는 뉴스 그룹의 디렉토리를 스캐닝하는 방법으로 expire하는 것이 아니라, 단순히 그 아티클이 파기되어야 하는지에대한 결정을 history 파일을 체크한 결과에 의존한다. 만약 history 파일이 어떤 이유로 인해 서로 sync되지 않는다면, 해당 아티클은 디스크에 영원히 남게되는데, 그 이유는 C News가 그것의 존재를 실제로 잊어버리기 때문이다. 당신은 /usr/lib/news/bin/maint내의 addmissing 스크립트를 사용하여 누락된 아티클들을 history 파일에 추가해 주거나, mkhistory를 사용하여 전체파일을 새로 작성해 주어야 한다. 이러한 일을 하기전에 반드시 유저 news가 되어야 한다는 사실을 잊지말기 바란다. 그렇지 않을 경우 C News가 history 파일을 읽지 못하게 될 것이다.
C News의 동작을 컨트롤하는 몇가지 파일이 존재하나, 그것들은 기능상에 근본적인 영향을 미치진 않는다. 그것들은 모두 /usr/lib/news에 존재하며, 여기선 그에관해 간략하게 설명한다.
Usenet 뉴스 프로토콜은 특정한 답장이나 동작을 유발하는 특수한 케이트고리의 아티클을 인식한다. 이들을 일컬어 control 메시지라고 하며, 수행할 컨트롤 오퍼레이션을 정의하는 Control: 필드가 아티클의 헤더에 있는가를 통해 인식된다. 그것엔 여러가지 타입이 존재하는데, /var/lib/news/ctl내에 위치한 쉘 스크립트들이 그들 모두를 핸들한다. 이들 대부분이 news master에 알리지 않고, C News가 그것을 처리하는 시점에 자동으로 수행된다. 디폴트로, 오직 checkgroup 메시지만이 newsmaster에의해 핸들될 것이나, 스크립트를 편집함으로써 이를 변경할 수도 있다. 가장 널리 알려진 메시지는 cancel로, 이것으로 유저는 이전에 그가 보냈던 아티클의 등록을 취소할 수 있다. 이것은 스풀 디렉토리에 아티클이 존재한다면, 효과적으로 그것을 제거해준다. cancel 메시지는, 이미 해당 아티클(cancel 메시지)을 수신한 적이 있는지 없는지를 상관하지않고, 영향을 받는 모든 그룹에서 뉴스를 수신한 모든 사이트로 보내진다. 이는 원 아티클이 cancel 메시지보다 지연될 수 있는 가능성을 고려한 것이다. 어떤 뉴스 시스템은 유저가 다른 사람의 메시지를 취소하는 일도 허용한다; 물론 이는 해선 안될 짓이다. 뉴스그룹의 생성과 제거에 관해 다루는 두개의 메시지는 newgroup과 rmgroup 메시지이다. "보통의" 계층 아래의 뉴스 그룹들은 Usenet reader들 간의 논의와 투표를 거친 후에만 생성될 것이나, alt 계층에 적용되는 룰은 거의 무정부 상태에 가깝다. 더 많은 정보를 위해선, news.announce.newusers와 news.announce.newgroups에 정기적으로 포스팅 되는 글을 참조하라. 당신이 허용되어 있다는것을 확신하고 있지 않다면, 절대 당신 자신에게 newgroup이나 rmgroup메시지를 보내지 말기 바란다. 17.8.3 The checkgroups Message checkgroups 메시지는, news 관리자가 한 네트웍 내 모든 사이트의 active파일과 실제 Usenet을 동기화 시키기 위해서 보내는 것이다. 예를 들자면, 상업적인 인터넷 서비스 제공자(ISP)가 이러한 메시지를 고객의 사이트에 보낼 것이다. 한달에 한번, 메이저 계층에 대한 "공식적인" checkgroups 메시지는 그 그룹의 moderator에 의해 comp.announce.newgroups에 포스팅된다. 그러나 그것은 일반 메시지로서 포스팅 되는 것이지, 컨트롤 메시지로서가 아니다. checkgroups 오퍼레이션을 수행하기 위해선, 이 아티클을 파일, 이를테면 /tmp/check로 저장하고, 컨트롤 메시지 자체의 시작부분이 있는 곳 까지를 제거한 뒤, 다음의 커맨드를 써서 그것을 checkgroups 스크립트에 feed해 주면 된다. # su news -c "/usr/lib/news/bin/ctl/checkgroups" < /tmp/check이것은 당신의 newsgroups 파일을, localgroups 내에 리스트된 그룹을 추가하여 업데이트 할 것이다. 이전 newsgroups 파일은 newstroups.bac으로 옮겨질 것이다. 주의할 것은, 그 메시지를 로컬상에 포스팅 하는 것은 거의 동작하지 않는다는 점인데, 왜냐하면 inews가 그렇게 큰 아티클을 받아들이지 않기 때문이다. 만약 C News가 checkgroups 리스트와 active 파일간에 일치되지 않는 점을 찾아낸다면, 그것은 당신의 사이트를 최신정보로 업데이트시켜 주는 커맨드 목록을 만들어서 news 관리자의 메일로 보낸다. 그 결과물은 보편적으로 이와 같다.
From news Sun Jan 30 16:18:11 1994 Date: Sun, 30 Jan 94 16:18 MET From: news (News Subsystem) To: usenet Subject: Problems with you active file The following newsgroups are not valid and should be removed. alt.ascii-art bionet.molbio.gene-org comp.windows.x.intrisics de.answers You can do this by executing the commands: /usr/lib/news/bin/maint/delgroup alt.ascii-art /usr/lib/news/bin/maint/delgroup bionet.molbio.gene-org /usr/lib/news/bin/maint/delgroup comp.windows.x.intrisics /usr/lib/news/bin/maint/delgroup de.answers The following newsgroups were missing. comp.binaries.cbm comp.databases.rdb comp.os.geos comp.os.qnx comp.unix.user-friendly misc.legal.moderated nes.newsiites soc.culture.sicentists talk.politics.crypto talk.politics.tibet당신의 뉴스 시스템에서 이러한 메시지를 수신했다하더라도, 맹목적으로 그것을 믿지는 말기 바란다. 누가 checkgroups 메시지를 보냈는가에 따라 몇개의 그룹, 또는 심지어는 계층마저도 누락되어 있을 수 있다. 그러므로, 어떠한 그룹을 지우는데는 조심해야한다. 당신의 사이트로 뉴스를 가져오고자 하는 그룹이 missing 리스트쪽에 나열되어 있다면, addgroup 스크립트로 그것들을 추가해 주어야 한다. missing 그룹 리스트를 파일로 저장하여 다음의 작은 스크립트에 넘겨주자.
#!/bin/sh cd /usr/lib/news while read group; do if grep -si "^$group[[:space:]].*moderated" newsgroup; then mod=m else mod=y fi /usr/lib/news/bin/maint/addgroup $group $mod done 17.8.4 sendsys, version, and senduuname 마지막으로, 네트웍의 토폴로지를 알아낼 수 있는 세개의 스크립트가 존재한다. 이들은 sendsys, version 그리고 senduuname이다. 그것들은 C News로부터 sender에게 각각, sys파일과 소프트웨어 문자열, 그리고 uuname(1)의 출력결과를 리턴하게 만든다. C News는 version 메시지에 대해 아주 무뚝뚝한 편으로, 단순하고 멋없는 "C"만을 리턴한다. 다시 말하지만, 위와 같은 메시지가 당신의 (국지적인) 네트웍을 떠나지 않는다고 확신할 수 없다면, 절대로 배포하지 말기 바란다. sendsys 메시지의 reply들은, 금새 UUCP 네트웍을 다운시켜 버릴수 있다.
17.9 C News in an NFS Environment 로컬 네트웍에서 뉴스를 배포하는 가장 단순한 방법은 중앙 호스트에 모든 뉴스를 보존하고, NFS로 그 디렉토리를 export하여, newsreader가 직접 아티클을 스캔하게 하는 것이다. 이것이 NNTP보다 유리한 점은, 아티클을 가져오고 thread하는데 드는 오버헤드가 확연이 낮나는 것이다. 반면에 NNTP는, 호스트 장비간에 큰 차이가 있거나, 유저가 서버머신에 계정을 가지고 있지 않은 이질적인 네트웍에서 유리하다. NFS를 사용할 때, 로컬 호스트에 포스팅되는 아티클은 중앙 머신에 포워드 되어야 하는데, 왜냐하면 그렇지 않을 경우, 관리용 파일에의 억세스가 파일을 일관성 없게 만듦으로써 시스템을 경쟁상태(race condition)에 빠뜨릴 수 있기 때문이다. 또한, 중앙 머신으로 포워딩할 필요가 있는 뉴스 스풀 구역은 read-only로 export함으로써 보호하는 것이 좋다. C News는 이것을 투명성있게 다룬다. 당신이 아티클을 포스팅할 때, newsreader는 아티클을 뉴스 시스템에 끼워넣기 위해 inews를 소환한다. 이 커맨드는 아티클에대한 몇가지 검사를 하고, 헤더를 완성시키고, /usr/lib/news 내의 server 파일을 체크한다. 이 파일이 존재하고, 로컬 호스트 네임외의 다른 호스트 네임을 지니고 있다면, rsh를 통해 서버 호스트의 inews가 소환된다. 이 때, inews 스크립트가 몇가지 바이너리 커맨드와 C News에서 지원하는 파일을 사용하기 때문에, C News를 로컬 상에 인스톨 하든지, 서버에서 뉴스 소프트웨어를 마운트하든지 해야한다. rsh 실행이 제대로 동작하게 하기 위해, 각 유저는 반드시 서버 시스템상에 등가의 계정을 가져야만 한다. 즉, 그가 패스워드 프롬프트 없이 로그인 할 수 있는 것을 말한다. server에 주어진 호스트네임이 실제로 서버머신에서 hostname(1)을 실행한 결과와 같은지 확인하라. 그렇지 않을 경우, C News는 아티클을 배달하려 할 때 무한 루프를 돌 것이다.
17.10 Maintenance Tools and Tasks C News의 복잡성에도 불구하고, 뉴스 관리자의 일상은 어느정도 쉬워질 수 있다. 왜냐하면, C News가 다양한 관리용 툴을 제공하기 때문이다. 이들 중 몇몇은 cron에서 정기적으로 실행되어야 하는 것으로, newsdaily 같은 것이 그것이다. 이들 스크립트를 사용함으로써 설치와 관리에 필요한 일을 크게 줄여준다. 따로 지정하지 않는다면, 이들 커맨드는 /usr/lib/news/bin/maint에 들어있다. 주의할 것은, 이들 커맨드를 실행하기 전에 news 유저가 되어야 한다는 것이다. 슈퍼유저로 그 커맨드들을 실행한다면, 이후 C News가 이들 파일에 억세스를 할 수 없게 되어버린다.
Other Chapters |
1. Introduction to Networking
Appendix |
A. A Null Printer Cable for PLIP |