강좌/XPEnology 활용

Xpenology DownloadStation 알림 메시지 텔레그램 전송

acidpop 2015. 8. 13. 17:34
반응형

DSM 6.0 에서도 사용 할 수 있는 방법을 올려 두었습니다.

http://blog.acidpop.kr/240

 

현재 DSM 6 버전에서는 오류가 발생 한다고 합니다.

 

DSM 6 사용자는 해당 알림 기능을 사용하지 않으시는게 좋을것 같습니다.

 

복구가 필요 하신분은 아래 방법으로 복구 하시면 됩니다.

 

Download Station DB 복구 방법

 

psql -U postgres -d download

위 명령을 이용해서 psql 에 접속(?) 합니다.

다음 쿼리로 삭제 하시면 됩니다.

1. Trigger 삭제
DROP TRIGGER btdownload_event ON download_queue;

2. Function 삭제
DROP FUNCTION process_btdownload_event();

3. Table 삭제
DROP TABLE btdownload_event;

 


 

 

2015/08/20 일 15:40분부로 아래 코드가 수정되었습니다.

 

이전에 적용하셨던 분들은 btdownload_event 테이블을 삭제 하신 다음 다시 진행 하시면 됩니다.

 

psql -U postgres -d download -c "drop table btdownload_event;"

 

 


 

 

 

 

XPenology 의 Download Station 을 활용해서 사용중이다.

 

하지만 다운로드가 완료가 되어도 알람 메시지를 받을 수가 없어서 수시로 확인을 해주어햐 하는 불편함이 있다.

 

그래서 Download Station 을 분석하여 텔레그램을 이용해 다운로드 상태 알람 메시지를 받을 수 있게 되었다.

 

 

 

 

아마 XPenology 사용하는 사람들중에 Download Station 보다는 Trasminssion 을 설치해서 활용 하는 사람이 더 많을것이라 생각된다.

 

transmission 은 다운로드 완료시 특정 실행 파일을 실행 할 수 있는 옵션이 있다.

 

Download Station 도 대충 보면 Transmission 을 모토로 개발된것으로 보이지만 환경 설정이 불가능하다.

 

 

필자가 분석한 방법을 토대로 정리해본다.

 

Download Station 은 내부의 postgresql DB를 사용한다.

 

download DB의 download_queue 테이블을 가지고 작동하는것을 확인하였다.

 

해당 테이블을 분석하여 download_queue 테이블에 INSERT, UPDATE, DELETE 에 대해 Trigger 를 걸어 필자가 만든 함수를 실행 하도록 수정하였다.

 

 

적용 방법은 다음과 같다.

 

 

XPenology 의 SSH 에 접속한다.

 

다음 명령어를 수행한다.

 

psql -U postgres -d download

 

위 명령을 수행하면 다음과 같이 나오게 된다.

 

 

psql (9.3.6)
Type "help" for help.

download=# 

 

위 상태에서 다음 Query 문을 이용해 Table, Function 을 생성하고

 

download_queue 테이블에 Trigger 를 걸어주자.

 

순서대로 실행 되어야 한다.

 

1. CREATE TABLE

2. CREATE OR REPLACE FUNCTION

3. CREATE TRIGGER

 

 

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
);




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.total_size > 0 AND NEW.current_size > 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;
            END IF;
            RETURN NEW;
        ELSIF (TG_OP = 'DELETE') THEN
                DELETE FROM btdownload_event WHERE task_id = OLD.task_id;
            RETURN OLD;
        END IF;
        RETURN NULL;
    END;
$btdownload_event$ LANGUAGE plpgsql;



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

 

 

 

 

Copy가 안되는 분은 첨부 파일을 다운로드 한다.

 

 

 

btdownsql.txt

 

 

 

 

 

위와 같이 하였다면

 

Download Station 에서 다운로드가 시작되었을때와 완료 되었을때 각각 btdownload_event 테이블에 다음 정보를 Insert 하게 된다.

1. Task ID    - Download Station 에서 사용하는 Task ID이다.

2. user name - 다운로드를 요청한 DSM 사용자 ID

3. File Name    - 다운로드 중인 토렌트의 제목

4. Status        - 다운로드 상태 코드

5. Total_Size    - 다운로드 중인 토렌트의 총 크기

6. isread            - btdownload_event 테이블에서 읽었는지 여부를 표시 하기 위한 Flag 값

7. create_time     - btdownload_event 에 insert 된 시간

 

 

 

 

psql 에서 \q 를 입력하여 psql 을 종료한다.

 

다음 경로로 이동한다.

 

cd /volume1/homes/user

 

user 는 자신의 계정이다.

 

/root 에서 작업하면 DSM 마이그레이션시 전부 날아가므로 주의

 

다음 Shell Script 를 저장한다.

 

※ 최근 xpenology 텔레그램 알림 떄문에 아래 쉘 스크립트를 수정해서 사용하시는 분들이 많이 있는것 같습니다.

마음껏 수정해서 쓰셔도 되지만 스크립트 최상단에 작성자 정보를 삭제 하지 말아주세요.

 

dsmonitor.sh

 

 

#! /bin/sh

#-------------------------------------------------------
# Created by Acidpop on 2015.   .   .
# [author] acidpop(http://blog.acidpop.kr)
# [version] v0.1
#-------------------------------------------------------

FILE_NAME="/tmp/dsdown.txt"


date "+%Y/%m/%d %H:%M:%S" > $FILE_NAME
echo "DS DonwloadStation Monitor 서비스가 시작되었습니다" >> $FILE_NAME

curl --form userfile=@$FILE_NAME --form password=5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8 http://192.168.0.199/tgcli.php


while :
do

    psql -U postgres -d download -t -A -c "SELECT * FROM btdownload_event WHERE isread=0;" | while  read line
    do
        IDX=`echo $line | cut -d '|' -f1`
        USER_NAME=`echo $line | cut -d '|' -f2`
        TITLE=`echo $line | cut -d '|' -f3`
        STATUS_VALUE=`echo $line | cut -d '|' -f4`
        SIZE=`echo $line | cut -d '|' -f5`
        CREATE_TIME=`echo $line | cut -d '|' -f7`
    
        case $STATUS_VALUE in
            1) STATUS="대기 중" ;;
            2) STATUS="다운로드 중" ;;
            3) STATUS="일시 정지" ;;
            4) STATUS="종료 중" ;;
            5) STATUS="다운로드 완료" ;;
            6) STATUS="해시 체크" ;;
            7) STATUS="시딩 중" ;;
            8) STATUS="파일 호스팅 대기" ;;
            9) STATUS="압축 해제 중" ;;
            *) STATUS="알 수 없는 코드 [$STATUS_VALUE]" ;;
        esac

        echo "상태   : $STATUS" > $FILE_NAME
        echo "파일   : $TITLE" >> $FILE_NAME
    
        CONV_SIZE=`echo $SIZE | awk '{ sum=$1 ; hum[1024**3]="GB";hum[1024**2]="MB";hum[1024]="KB"; for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}'`
    
        echo "크기   : $CONV_SIZE" >> $FILE_NAME
        echo "사용자 : $USER_NAME" >> $FILE_NAME

        psql -U postgres -d download -c "UPDATE btdownload_event SET isread = 1 WHERE task_id = $IDX"
    
        curl --form userfile=@$FILE_NAME --form password=5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8 --form username=$USER_NAME http://192.168.0.199/tgcli.php
    done

    sleep 5
done


 

저장 하였다면 다음 명령을 이용하여 실행 권한을 주자.

 

chmod 755 dsmonitor.sh

 

위 Shell Script 는 5초에 한번씩 btdownload_event 테이블을 체크하여 isread 가 0인 항목을 가져와 /tmp/dsdown.txt 파일에 저장을 한다.

 

btdownload_event 테이블을 체크하는 Query 는 다음과 같다.

 

 

 psql -U postgres -d download -t -A -c "SELECT * FROM btdownload_event WHERE isread=0;"

 

 

그 후 해당 파일을 curl 을 이용하여 라즈베리파이의 php 로 전송한다.

 

라즈베리파이와 Telegram CLI, PHP 는 다음 강좌를 참고한다.

 

 

2015/08/13 - [강좌/RaspberryPI 활용] - 라즈베리파이 Telegram - PHP를 이용하여 메시지 보내기

 

 

만약 PushBullet 을 사용중이라면 curl --form 라인의 코드를 다음과 같이 수정하면 된다.

 

 

BODY=`cat /tmp/dsdown.txt`

 

curl -u $token: https://api.pushbullet.com/v2/pushes -d type=note -d title="Download Station" -d body="$BODY" --insecure

 

BODY=`cat 이 부분의 ` 이 코드는 작은 따옴표가 아닌 키보드의 ~ 모양(숫자1 키 왼쪽) 키에 있는 기호이다.

 

/tmp/dsdown.txt 파일에 내용이 기록되므로 다양한 방법으로 알림을 사용 할 수 있을 것이다.

 

 

이제 위 Shell Script 를 데몬으로 실행 해야 하는데

 

dsmonitor.sh &

 

위와 같이 실행 하면 SSH 접속이 종료 될때 dsmonitor.sh 도 종료된다.

 

다음과 방법으로 실행 하면 된다.

 

/opt/bin/bash -c "/volume1/homes/user/dsmonitor.sh &"

 

Bash 를 이용해서 데몬으로 실행 하는 방법인데 만약 /opt/bin/bash 가 없다면

 

ipkg 를 이용해서 설치하자.

 

/opt/bin/ipkg install bash

 

XPenology 가 리부팅 되어도 위 스크립트를 데몬으로 항상 실행하게 하고 싶다면

 

다음 파일에 내용을 추가하자.

 

/etc/rc.local

 

 

위 파일을 vi 또는 nano 등 에디터로 열어

 

가장 마지막 줄에 exit 0 위쪽에 다음과 같이 추가해준다.

 

/opt/bin/bash -c "/volume1/homes/user/dsmonitor.sh &"

 

 

 

혹여 bash 설치를 못하시는 분들을 위해 shell Script 와 bash 파일을 압축하여 첨부한다.

 

 

dsmon.tgz

 

 

 

 

 

 

 

 

※ 위 방법을 통해 XPenology 가 이상 작동을 하여도 필자는 책임 지지 않습니다.

 

중요한 정보가 저장되어 있다면 꼭 백업 하시고 작업하세요.

 

특히 download_queue 테이블은 건드리시면 안됩니다.

 

 


 

 

XPenology 의 알림 메시지 모두를 Telegram 으로 전송 받고 싶지만

 

도무지 Notify 메시지가 어디에 저장이 되는지 찾을 수가 없네요..

 

혹시 아시는 분은 댓글에 부탁드려요~!

 

 

 


 

XPEnology  바탕화면의 알림 메시지는 다음 경로에 json format 으로 저장된다

 

/usr/syno/etc/preference/userid/dsmnotify

 

userid 는 자신이 사용하는 계정 ID 이다.

 

 


 

DSM 5.2-5644 에서는 /etc/rc.local 파일이 없는 경우가 있다.

 

다음 경로로 이동

 

/usr/syno/etc/rc.d

 

#!/bin/sh

/volume1/homes/userid/bash /volume1/homes/userid/dsdown_monitor.sh &

 

userid 를 자신의 계정 ID로 변경 하고 다음 파일명으로 저장한다.

S99dsdownmonitor.sh

 

chmod 755 ./S99dsdownmonitor.sh

 

이렇게 sh 파일만 생성하면 부팅시 자동으로 실행 된다.

반응형