강좌/XPEnology 활용

XPEnology DSM 6.0 이상에서 다운로드 스테이션 텔레그램 알림 받기

acidpop 2016. 8. 29. 17:38
반응형

xpebot 프로젝트가 중단 되었습니다.

 

synobot 프로젝트로 다시 시작 합니다.

 

https://blog.acidpop.kr/305

 

synobot 프로젝트

기존 xpebot 이 Synology DSM 이 업데이트 되면서 인증서 관련 오류가 발생.. ㅠㅠ 언젠가는 Download Station API 를 이용하도록 바꿔야지 하면서 미루다가 이제서야 작업 진행. DSM 의 환경이 워낙 자주 바뀌기..

blog.acidpop.kr

 

DSM 의 Database 를 변경 하는것이기 때문에 꼭 중요한 자료를 백업 하고 진행하세요.

데이터 손실에 대해 책임지지 않습니다.

 

 

 

DSM 6.0 이상 버전에서 xpebot (https://github.com/acidpop/xpebot) 을 적용하게 되면

 

다운로드 완료 시점에서 상태 정보가 "에러" 로 표시 되는걸 확인 할 수 있었다.

 

DSM 6.0 시스템이 없어서 무슨 문제인지 알수가 없었으나

 

최근 Hyper-V 에서 XPEnology 의 DSM 6.0 버전을 설치 할 수 있게 되어 디버깅을 시작.

 

 

몇번의 삽질 결과 DSM 6 버전부터는 각 Application 별로 계정이 따로 존재하고 postgresql DB 에서도 계정별로 권한이 주어져 있는것을 알게 되었다.

 

이 문제로 인해서 기존 Trigger 와 sql function 이 내부적으로 permission denied 오류가 발생하게 되었던걸로 확인 된다.

 

 


 

DSM 6.0 에서는 xpebot 만 git으로 받고 실행 한다고 해서 알림을 받을수는 없다.

 

아래의 조금 복잡(?)한 과정이 필요하지만 이 글을 천천히 따라한다면 가능할 것이라 생각된다.

 

1. Download Staion 설치 및 설정하기

 

먼저 DSM 에 Download Station 이 설치되어 있어야 한다. 당연한 이야기이지만 설치를 안하고 텔레그램 알림 받기 글을 따라 하다가는 막히는 부분이 많다.

 

DownloadStation 을 설치 하고 다운로드 받을 대상 폴더와 감시 폴더를 각각 설정한다.

 

 

 

 

주의 : 다른 시스템의 디스크를 Mount 한 디렉토리는 감시 폴더 작동이 제대로 안된다.

 

2. GitServer 설치 하기

 

패키지 센터를 열고 GitServer 를 설치 한다.

 

3. Python 설치 하기

 

패키지 센터를 열고 개발자 도구 메뉴를 클릭한 다음 Python3 와 Python Module 을 설치 한다.

 

4. 사용자 설정

 

제어판 -> 사용자 메뉴를 클릭한 다음

 

고급 탭으로 이동한다.

 

그후 스크롤을 가장 아래로 내려보면 사용자 홈 서비스 활성화 버튼이 있는데 해당 부분을 체크 하고 확인 버튼을 누른다.

 

 

5. SSH 서비스 활성화

 

제어판 -> 터미널 및 SNMP 메뉴를 클릭한 다음

 

SSH 서비스 활성화 버튼을 체크하고 "적용" 버튼을 클릭한다.

 

 

 

6. SSH 접속하기.

 

SSH 에 접속 할 수 있는 툴을 실행한다.

(없다면 http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 이곳에서 putty.exe 를 다운로드 받는다.)

 

필자는 XShell 을 사용한다. 혹여 SSH 접속할 일이 많다면 XShell 을 설치 하자 (http://www.netsarang.co.kr/download/down_xsh5.html) 개인 사용자 무료

 

 

putty 또는 ssh 접속 툴을 이용하여 NAS 의 ip 를 적고 port 는 22 번으로 접속한다. (5번에서 port 를 변경 하였다면 변경한 port 로 접속)

 

ID : DSM 로그인 ID (Admin Group 에 속해 있어야 함)

 

PW : DSM 로그인 ID 의 Password

 

 

7. Download Station 계정 변경하기

 

ssh 접속된 상태에서 다음 명령으로 root 계정으로 전환 할 수 있다.

 

sudo -i

 

위 명령을 실행 하면 Password 를 물어 보는데

 

DSM 로그인 ID 의 Password 를 입력 하면 된다.

 

whoami 명령을 이용해서 root 라고 표시 된다면 root 로 로그인 된것이다.

 

다음 명령으로 계정 정보를 변경 해야 한다.

 

vim /etc/passwd

 

위 명령을 수행하면 아래와 같은 화면을 볼수 있다.

 

anonymous:x:21:21::/nonexist:/usr/bin/nologin
avahi:x:84:84::/:/bin/false
dbus:x:81:81::/:/usr/bin/nologin
dovecot:x:143:143::/dev/null:/usr/bin/nologin
DownloadStation:x:125560:125560::/var/packages/DownloadStation/target:/usr/bin/nologin
ftp:x:21:21::/nonexist:/usr/bin/nologin
guest:x:1025:100:Guest:/nonexist:/usr/bin/nologin
http:x:1023:1023::/var/services/web:/bin/false
ldap:x:439:439::/var/lib/openldap:/usr/bin/nologin

 

수 많은 계정들 중 DownloadStation 이라는 계정을 보면 가장 끝에 /usr/bin/nologin 뭐 이런식으로 되어 있는걸 볼 수 있다.

 

이 부분을 다음과 같은 변경 한다.

 

커서를 수정 하려는 곳으로 이동 후에 i 키를 누르고 /bin/sh 를 입력한다.

 

필요 없는 부분은 delete 키를 이용해서 지운다.

 

anonymous:x:21:21::/nonexist:/usr/bin/nologin
avahi:x:84:84::/:/bin/false
dbus:x:81:81::/:/usr/bin/nologin
dovecot:x:143:143::/dev/null:/usr/bin/nologin
DownloadStation:x:125560:125560::/var/packages/DownloadStation/target:/bin/sh
ftp:x:21:21::/nonexist:/usr/bin/nologin
guest:x:1025:100:Guest:/nonexist:/usr/bin/nologin
http:x:1023:1023::/var/services/web:/bin/false
ldap:x:439:439::/var/lib/openldap:/usr/bin/nologin

 

/usr/bin/nologin 에서 /bin/sh 로 변경 하였다.

 

수정 완료 후 ESC 키를 한번 누르고

 

:wq  (콜론 wq) 명령을 입력하고 엔터를 치면 수정 된다.

 

 

8. DownloadStation 계정으로 로그인하기

 

/etc/passwd 수정이 끝났다면 다음 명령으로 DownloadStation 계정으로 로그인 할 수 있다.

 

su - DownloadStation

 

 

위 명령을 수행 하고 whoami 명령을 이용해서 DownloadStation 계정으로 로그인 되었는지 확인 한다.

 

 

 

9. 알림을 받을 Table 및 트리거 생성하기.

 

DownloadStation 계정으로 로그인 되었다면 아래 명령을 이용해서 postgresql 에 접속 한다.

 

psql -U DownloadStation -d download

 

명령을 수행 하면 다음과 같은 화면을 볼 수 있다.

 

psql (9.3.6)

 

Type "help" for help.

download=# 

 

 

위 상태에서 다음 Query 문을 이용하여 Table, Function, Trigger 를 생성한다.

 

다음 순서 대로 Query 문을 복사/붙여넣기 한다.

 

 

 

1. Create Table.

CREATE TABLE btdownload_event(
    task_id           integer   NOT NULL,
    username          character varying(128),
    filename          text,
    status            integer,
    total_size        bigint,
    isread            integer,
    create_time       date
);


 

2. Create OR Replace function

CREATE OR REPLACE FUNCTION process_btdownload_event() RETURNS TRIGGER AS $btdownload_event$
    DECLARE
        rec_count integer;
    BEGIN
        IF (TG_OP = 'INSERT') THEN
            RETURN NEW;
        ELSIF (TG_OP = 'UPDATE') THEN
            IF (NEW.status = 2 AND NEW.current_size > 0 AND NEW.total_size > 0 AND NEW.current_rate > 0 ) THEN
                SELECT COUNT(*) into rec_count FROM btdownload_event WHERE task_id = NEW.task_id AND status = 2;
                IF ( rec_count = 0 ) THEN
                    INSERT INTO btdownload_event VALUES(NEW.task_id, NEW.username, NEW.filename, NEW.status, NEW.total_size, 0, now());
                END IF;
            ELSIF (NEW.status = 5 ) THEN
                SELECT COUNT(*) into rec_count FROM btdownload_event WHERE task_id = NEW.task_id AND status = 5;
                IF ( rec_count = 0 ) THEN
                    INSERT INTO btdownload_event VALUES(NEW.task_id, NEW.username, NEW.filename, NEW.status, NEW.total_size, 0, now());
                END IF;
            ELSIF (NEW.status = 118) THEN
                UPDATE download_queue SET status = 5, extra_info = '' WHERE task_id = NEW.task_id;
                DELETE FROM task_plugin WHERE task_id = NEW.task_id;
                DELETE FROM thumbnail WHERE task_id = NEW.task_id;
            ELSIF (NEW.status = 123) THEN
                SELECT COUNT(*) into rec_count FROM btdownload_event WHERE task_id = NEW.task_id AND status = 123;
                IF ( rec_count = 0 ) THEN
                    INSERT INTO btdownload_event VALUES(NEW.task_id, NEW.username, NEW.filename, NEW.status, NEW.total_size, 0, now());
                END IF;
            END IF;
            RETURN NEW;
        ELSIF (TG_OP = 'DELETE') THEN
            IF (OLD.status = 2) THEN
                INSERT INTO btdownload_event VALUES(OLD.task_id, OLD.username, OLD.filename, 999, OLD.total_size, 0, now());
            ELSE
                DELETE FROM btdownload_event WHERE task_id = OLD.task_id;
            END IF;
            RETURN OLD;
        END IF;
        RETURN NULL;
    END;
$btdownload_event$ LANGUAGE plpgsql;

 

3. Create Trigger

CREATE TRIGGER btdownload_event
AFTER INSERT OR UPDATE OR DELETE ON download_queue
    FOR EACH ROW EXECUTE PROCEDURE process_btdownload_event();


 

Query 가 성공적으로 끝났다면 \q 를 입력하면 psql 이 종료 된다.

 

10. root 계정으로 전환 후 xpebot 설치 하기

 

exit 명령을 이용해서 root 계정으로 다시 돌아온다.

 

혹시 root 계정으로 돌아오지 않는다면 ssh 접속을 종료하고 다시 접속하여

 

sudo -i 명령을 이용해 root 계정으로 로그인한다.

 

 

다음 명령을 이용해서 사용자 홈 경로로 이동한다.

 

volume 은 사용자 환경에 맞게 volume1, volume2 등으로 구성 되므로 자신의 홈 디렉토리가 어디에 설치 되어 있는지는 알아야 한다.

 

cd /volume1/homes/admin

 

 

위 명령에서 admin 은 자신의 dsm 로그인 ID 이다. 각자 ID에 맞게 수정해서 수행한다.

 

 

xpebot 설치는 다음 명령을 차례대로 수행한다.

 

기존 5.2 버전과는 다르게 bot6.sh.ori 파일을 복사해서 사용하여야 한다.

 

 

git clone "https://github.com/acidpop/xpebot"

wget "https://bootstrap.pypa.io/get-pip.py"
   
python ./get-pip.py
   
pip install telepot
   
pip install BeautifulSoup
   
pip install psycopg2
    
pip install Pillow
    
pip install psutil
   
cd xpebot
    
cp bot6.sh.ori bot.sh
    
cp xpebot.cfg.ori xpebot.cfg

 

 

bot.sh 파일을 열어 3번째 줄의 admin 부분을 자신의 계정으로 변경한다.

 

xpebot.cfg 파일을 열어 각각의 정보를 변경한다.

 

1) NOTY_CHAT_ID 는 Downlaod Staion 에서 다운로드 진행 현황 알림을 받을 사용자의 Chat ID 값을 입력한다.

2) DSM_ID 는 자신의 DSM ID 를 입력한다.

3) BOT_TOKEN 은 Telegram 의 Bot Father 에서 /newbot 을 요청하여 BOT 생성 후 자신의 BOT TOKEN 값을 입력한다.

4) VALID_USER 는 인증된 사용자의 chat_id 값을 입력한다. 여러명일 경우 ,(콤마)를 이용해 구분한다.

5) NAVER_API 섹션에 발급 받은 CLIENT_ID_KEY 값과 CLIENT_SECRET_KEY 값을 입력한다.

6) RSS_NEWS 섹션에 보고 싶은 뉴스의 RSS 주소를 입력한다.

7) DATA 섹션에 data.go.kr 에서 발급 받은 서비스 키를 입력한다

 

수정이 완료 되었다면 다음 명령어로 bot 을 실행 하거나 중지 시킬 수 있다.

 

./bot.sh start

./bot.sh stop

./bot.sh restart

./bot.sh chk

 

 


Download Station 계정으로 로그인 하고 Table, Function , Trigger 까지만 생성이 되었다면 https://github.com/acidpop/xpebot

 

github 에 있는 내용대로 하면 된다.

 

 

반응형