블로그 이미지
JEEN

서울에 사는 꽃청년의 IT찌질모험기

Rss feed Tistory
IT/Perl 2009.08.25 12:53

[ Perl/Inotify/Flickr ] 특정 디렉토리에 그림파일을 넣으면 자동으로 Flickr 업로드

  2009/08/24 - [IT/Perl] - [ SVN/Perl/Inotify ] 고객 후렌들리하게 SVN 운용법 - 자동커밋/업데이트

 이전에 썼던 Inotify 떡밥을 또 계속 물고 늘어져 보겠습니다.
 SVN 을 가지고 노는 그닥 아름답지 못한 방법이 있었지만, 이번에는 특정 디렉토리에 파일이 생성되면 그것을 자동으로 flickr 로 업로드 시켜주는 녀석을 만들어 보겠습니다.

 사실 이 아이디어는 최근에 일본에서 주목을 받고 있는 fic*** 라는 회사의 툴에서 본 것입니다. 특정 디렉토리를 지정해서 거기에 그림 파일을 올리면 자동으로 업로드해서 웹 서비스에서 그림을 관리할 수 있게 해놓은 것이죠. 뭐 물론 이러저래 많은 기능이 있지만, 유저가 그림을 업로드하기 편리한 뭐 그런 것이죠.

  뭐 Dropbox 라든가, SugarSync 라든가.. 생각해보면 이런 Inotify 를 사용했을 것 같다라는 서비스는 찾아보면 좀 많이 있을 것 같기도 합니다.

  아무튼 작동환경은 Linux (Ubuntu 9.04) 이며, 위의 링크의 지난 포스팅과 같은 환경입니다.
  사용모듈은 Flickr::Upload , File::ChangeNotify 입니다.
 
  우선 flickr API 키와 암호를 받습니다.

- http://www.flickr.com/services/api/keys/

  이 화면에서 키와 암호를 얻기까지의 인증을 수행합니다.
jeen@haak:~$ flickr_upload --auth --key [your key] --secret [your secret]
1. Enter the following URL into your browser

http://....

2. Follow the instructions on the web page
3. Hit <Enter> When finished.

  그리고 Flickr::Upload 를 설치하면 사용할 수 있는 flickr_upload 커맨드로 위의 명령을 수행합니다.
  이것을 AuthToken 을 수령하기 위함입니다. 해당 API 를 사용한 어플리케이션이 유저의 Filckr 계정에 접근할 수 있는 토큰을 부여받기 위함입니다. 
  위에 제시되는 URL 로 접속해서 모든 확인을 끝내고 콘솔로 돌아와서 엔터를 누르면, AuthToken 을 받을 수 있습니다.

  그럼 특정 디렉토리에 그림을 업로드할 디렉토리를 하나 만들어 둡니다.

# flickr-auto-upload.pl
use strict;
use warnings;
use File::ChangeNotify;
use Flickr::Upload;

my $ua = Flickr::Upload->new({ 'key' => 'your flickr key',  'secret' => 'your flickr secret' });

my $dir = '/home/jeen/image/';
my $watcher = File::ChangeNotify->instantiate_watcher(
  directories => [ $dir ],
);

while(my @events = $watcher->wait_for_events()) {
  foreach my $event (@events) {
     my $path = $event->path;
     next unless $event->type eq 'create';
     $ua->upload(
      'photo' => $path,
      'auth_token' => 'your auth token',
      'tags' => 'auto',
      'is_public' => 1,
      'is_friend' => 1,
      'is_family' => 1
     ) or do { warn "something wrong"; next };
     unlink($path);

     print $path. " is uploaded\n";
  }
}

  key, secret, auth_token 에는 앞에서 발행받은 것들을 그대로 집어넣습니다. 그외 Flickr Upload 시의 파라메터에 대해서는 Flickr::Upload 모듈페이지를 참고해주세요.
  파일은 업로드 이후에 자동으로 삭제해버리게 해버렸습니다.
  뭐 그외 필터도 필요하겠죠. gif/jpg/png 가 아니라면 업로드 안되게 한다든가, 파일사이즈가 얼마라든가...

  굳이 Flickr 가 아니더라도, Picasa 라든가, TwitPic 이라든가.. 이런 부류의 서비스는 많고... 이런 서비스들의 API 를 구현한 CPAN 모듈도 찾아보면 금방 나올겁니다. (없으면 만들어서 올려주시구요)

   Mac 에서는 FSEvents 를 사용해서 해당 디렉토리의 변경에 대한 통보만을 받을 수 있습니다. 파일은 어케 안되는 것 같더라구요. 변경통보시에 매번 파일리스트에서 최신 변경일자를 조사해서 파일을 건져낸다든가 여러가지 방법은 있겠지만요. 혹은 뭐 여러가지 다른 방법도 많을 것 같습니다. 어차피 파일의 변경이력을 못건진다면 Mac 에서는 그냥 launchd 같은 것을 쓰는 편이 더 낫지 않을까 하는 생각도 해봅니다.
신고
IT/Perl 2009.08.24 18:54

[ SVN/Perl/Inotify ] 고객 후렌들리하게 SVN 운용법 - 자동커밋/업데이트

  A 라는 회사는 B 사의 웹서비스를 운영하면서 밥벌이를 하고 있다. 그러니 B 회사는 A 회사에게 "너흰 우리때문에 밥먹고 사는 거잖아" 라며 거만해 한다. A 회사는 꾸벅꾸벅 말도 잘 듣고 있다.

  A 회사의 J 군은 최근에 B 회사의 일을 중간에 떠맡았다.
  B 회사의 서비스는 흔히말하는 MVC 구조로 이래저래 잘도 관리되고 있는 형국이다.
  거기에 소스코드 관리도 SVN 을 쓰면서... 코드또한 별시리 문제가 없이 관리되고 있었다.

  어느날 B 사의 디자이너에게 전화가 와서, SSSS 라는 페이지가 이상하다는 얘기를 듣고 원인 파악에 나섰다. SSSS 페이지에 표시되어야 할 배너가 표시되지 않고 있다는 뭐 그런 얘기였다. "단순한 화면 표시 어쩌고 저쩌고 라면 그냥 니가 하면되잖아" 라고 소리치고 싶은 J군은 템플릿 파일을 훑어봤지만 그딴 거 없었다.
 하지만 B 사의 디자이너는 <이제껏 나왔었다. 갑자기 안나온다! 시스템 문제가 있는 거 아니냐?> -- 대략 이런 러쉬를 걸어오기 시작했다.

  이쯤에서 J군은 B 사의 웹서비스의 치명적인 맹점을 알게되었다.

  1. B 사의 디자이너는 PHP 코드따위 만질 일 없다.
  2. 템플릿이라면 때에따라서 유연하게 바뀌어야 하니, 템플릿 파일은 FTP 로 올린다.
  3. FTP 로 올라온 템플릿 파일은 이전 파일이 뭐든 간에 일단 덮어씌우고 본다.
  4. B 사의 디자이너는 가끔 템플릿 파일에 {php} {/php} 라는 것도 해놓았다.
  5. B 사의 디자이너는 SVN 을 모른다.
  6. B 사의 디자이너는 백업이라는 행위의 중요성을 실감하지 못했다.

  즉, 이제껏 B 사의 디자이너가 작업한 것들은 백업/소스코드 관리 가 이뤄지지 않은 상태였다.
  그러니 로고가 어찌되었는지에 대한 상황파악은 어려운 상태!
  SVN 좀 쓰면 안되겠니? 라고 해도... 그런 거 배울 시간이 없다는 적절한 핑계로 넘어가 주신다.

  그래서 서버에서 디자이너가 FTP 로 파일을 올리면, 그대로 커밋 => Product 업데이트 를 자동으로 수행해야 한다.

 ________________________

 미션은 대략 위의 상황과 같습니다.
 FTP 로 올라오는 파일의 변경 이력을 실시간으로 파악해서, 그것을 바로 커밋하고, Product 환경에서 자동으로 업데이트 해주는 것입니다.
  서버의 환경은 Linux(CentOS) 이며, 커널 버젼은 2.6 이상입니다.
  리눅스 커널 2.6 부터는 Inotify 라는 것이 생겼습니다. 시스템 상의 특정 파일/디렉토리의 생성/변경을 파악할 수 있는 기능이죠. :-)

  Perl 구현으로는 Linux::Inotify 가 있습니다. 그리고 이것을 래핑한 File::ChangeNotify 라는 모듈을 사용하기로 했습니다. (Mooose++)

# svn-auto-commit-update.pl
use strict;
use warnings;
use File::ChangeNotify;

my $watcher = File::ChangeNotify->instantiate_watcher(
    directories => [ @ARGV ],
);

while ( my @events = $watcher->wait_for_events() ) {
    my @files;
    for my $event ( @events ) {
        my $path = $event->path;

        # filter 한다면 filter 처리 (.swp 등의 파일은 커밋필요없음. 혹은 디자이너의 파일 백업 스타일(index.html => index.html.090822)를 고려) 
       
        # $event->type 에는 (create/modify/delete/unknown) 이 있으니, 각자 맞는 걸 쓰면 되겠죠?
        if ($event->type eq 'create') {
            system("svn","add", $path);
        }
        # ... delete 라든가의 경우도 삭샥샥
        push @files, $path;
    }
    system("svn","commit",@files,"-m YYMMDD,, fucking designer's templates");
    system("svn", "update", "/path/path2/product/template/");
}

  실행은
perl svn-auto-commit-update.pl [해당 디렉토리]
  로 실행하면 됩니다.

  물론 아직 제대로 안써봤습니다. 그냥 이러면 안될까 해서 그냥 써봤을 뿐입니다;;
  제 맘대로 서비스 정책과 운용룰을 여차저차 할 수 없으니ㅜㅜ
  뭐 권한이 어쩌니, 디렉토리 구성이 어쩌니, 파일 경로가 어쩌니 자질구레한 건 생략합니다.

  Linux Inotify 에 대한 얘기는 좀 오래된 얘기고... 실제로 이것을 어떻게 사용하느냐 하는 건 잘 모르겠지만, 아마 이런 곳에도 사용될 수 있지 않을까 합니다.

  최근 일본의 Fi*** 라는 사진공유 서비스는 디렉토리를 지정해서 거기에 파일을 올리면 자동으로 업로드되는 툴을 만들어 놨습니다. 뭐 위의 코드와는 달리 리눅스 이외의 여러 OS 도 고려한 툴이겠지만요. (Mac 에서 밖에 테스트 안해봤습니다)
   (이것도 Inotify 를 통해서 Flickr 나 Picasa 에 자동으로 올라가도록 해보고 나중에 블로깅을 해볼 수 있다면 해보지요 :-) )

    그리고 rsync 대신에 이렇게 미러링하는 것은 어떠냐? 라는 얘기로 최근에 본 위키페이지도 있습니다.

 - http://trac.mizzy.org/public/wiki/InotifyAndMakuosan

    참고가 되었으면 합니다.
신고
TOTAL 464,235 TODAY 10

티스토리 툴바