소프트웨어‎ > ‎

Transmission

http://www.transmissionbt.com/

토런트 프로그램. 다양한 플랫폼과 다양한 환경을 지원한다.
나의 경우 리눅스에서 데몬(서버)을 구동하고 transgui를 통해 처리한다. (GTK+ 빌드의 경우 데몬이 나오기 전에 먼저 나왔기 때문에 구동중인 데몬에 접속해서 처리하는 기능이 없지만) Qt 빌드의 경우 나중에 나왔기 때문에 웹에서처럼 이미 구동중인 데몬에 접속하는 것도 가능하다. 웹 클라이언트는 환경 특성상 많은 목록 많은 파일에 대해서는 성능이 충분하지 않은 문제가 있고 모바일 환경에 대응하는 부분도 부족한 면이 있다. 안드로이드 앱은 몇 개가 있는 것 같은데, 아이폰 앱은 토런트 관련이 애플에 등록되는 절차를 통과하지 못해서 존재하지 않는다.

utorrent가 지원하는 webseed 형식을 지원하지 않는 문제가 있었으나, 1.9 이후에는 utorrent에서만 되던 시드와 아울러 magnet도 받아들일 수 있는 등 거의 완전한 최신 구현을 갖추었다.


script-torrent-done-enabled, script-torrent-done-filename 설정을 통해 전송이 끝난 다음에 스크립트를 실행할 수 있는데, 자세한 작성 방식에 대해 별도로 문서화된 것은 없어 보인다. 소스 코드 중에 스크립트를 호출하는 부분은 다음과 같다.
static void
torrentCallScript( tr_torrent * tor, const char * script )
{
    assert( tr_isTorrent( tor ) );

    if( script && *script )
    {
        char buf[128];
        const time_t now = tr_time( );

        tr_setenv( "TR_APP_VERSION", SHORT_VERSION_STRING, 1 );

        tr_snprintf( buf, sizeof( buf ), "%d", tr_torrentId( tor ) );
        tr_setenv( "TR_TORRENT_ID", buf, 1 );
        tr_setenv( "TR_TORRENT_NAME", tr_torrentName( tor ), 1 );
        tr_setenv( "TR_TORRENT_DIR", tor->currentDir, 1 );
        tr_setenv( "TR_TORRENT_HASH", tor->info.hashString, 1 );
        tr_strlcpy( buf, ctime( &now ), sizeof( buf ) );
        *strchr( buf,'\n' ) = '\0';
        tr_setenv( "TR_TIME_LOCALTIME", buf, 1 );
        tr_torinf( tor, "Calling script \"%s\"", script );
        system( script );
    }
}
인자로 전달하는 방식이 아니라 실행 전에 환경변수(environment variable)로 지정하고 스크립트에서는 $TR_TORRENT_ID 등으로 변수를 참조하면 된다.


watch-dirwatch-dir-enabledstart-added-torrents, trash-original-torrent-files 설정을 통해 특정 디렉토리에 파일을 배치하는 것만으로 데몬 등이 파일을 인식하고 추가해 바로 전송을 시작하도록 할 수 있다. 이때 추가된 시드 파일이 삭제되지 않는 것은 데몬이 실행되는 사용자가 해당 디렉토리나 파일에 대해 쓰기 권한이 없는 것일 수 있으며 chmod, chgrp 등 명령으로 처리할 수 있다.

Too many open files (utils.c:218) 오류를 내고 파일 처리를 못 하는 증상은 /etc/security/limits.d/transmission.conf 안에 nofile 설정도 바꿔보고 /etc/pam.d/common-session 에서 pam_limits.so 줄도 추가해보고 했는데 적용되지 않았다. initscript에 ulimit -n 명령을 그대로 쓰라는 얘기가 있어서 upstart로 처리할 수 있을까 찾아보니 limit 설정이 있어서 /etc/init/transmission-daemon 파일에 적용했다.

transmission-qt가 transmission-daemon에 즉시 자동으로 붙지 않는 것이 (obsolete인) QHttp가 첫 전송 때문에 이후 300개 가량의 처리를 무시해서 생기는 문제였고, QNetworkAccessManager로 바꿔서 해결했다고 한다.

transmission-qt에서 토런트의 저장 위치를 바꿀 때 지금까지는 파일 대화창이 나와서 잘 썼는데 r10722부터 그냥 입력칸 하나로 대체됐다. 무척 불편하게 바뀐 변화라서 찾아보니 원격 세션에 접속했을 때는 파일시스템 구조가 다르기 때문에 파일 대화창을 보여주는 의미가 없다는 점이 지적되었다. 합당한 지적이라서 이의제기를 하기가 어렵다. 127.0.0.1에 접속하는 원격 세션의 경우는 따로 취급해달라는 요청은 터널링을 통해 접속했을 경우를 구분할 수 없어서 기각.


queue 갯수를 정해서 동시에 몇 개까지 받을지 보낼지를 정할 수 있는데, 갯수를 넘어서 전송이 발생한다. 실제로 통신이 이루어지는 건 아니고 진전 없이 대기만 하고 있는 것들로 보이기는 한다. 대기하다가 일정 시간이 지나면 정지한 걸로 간주한다는 시간을 짧게 잡으면 늘어나는 속도가 빨라지는 걸로 봐서도 대기하는 것들 때문인 것 같기는 한데. 비슷해 보이는 티켓이 있긴 한데 증상이 완전히 같은 건 아니고 또 워낙 예전 것이기도 해서 맞는지 모르겠다. 혹은 libcurl 쪽의 문제라는 티켓에 해당하는 증상인지도 모르겠다. 아마 libcurl이 1024 이상에서는 문제가 생겨서 강제로 1024로 맞춰서 쓴다는 문제 때문인 것 같다.
Comments