태그 보관물: Pogoplug

Arch Linux에서 Transmission을 Telegram으로 제어하기

최근 텔레그램 봇을 이것저것 뜯어보니, 생각보다 매우 간편하게 봇을 만들고 명령하고 답변 받을 수 있어서 어디 쓸까 생각하던 차에, 트랜스미션을 텔레그램으로 제어하는 프로그램을 발견했다.
(물론 이것 말고도 만들어진 다른 프로그램들이 있다. 이 프로그램이 가장 편리하겠다고 생각해서 선택했다.)

https://github.com/pyed/transmission-telegram

사실 난 안드로이드만 쓰고 트랜스미션 어플이 안드로이드에는 있어서 이 방식이 별로 필요 없지만, 아이폰이나 아이패드 같은 경우는 트랜스미션 앱도 없고 파일을 왓치 폴더에 올리는 식으로 밖에 할 수 없어서 이 방식이 매우 유용할 것으로 본다.

먼저 transmission-telegram을 다운로드 한다.

https://github.com/pyed/transmission-telegram/releases

나는 포고플러그 E02를 쓰고 있으니 transmission-telegram_Linux_arm.tar.gz을 받았다. 각자 OS와 CPU에 맞게 받으면 된다.

이제 텔레그램에서 내가 쓸 봇을 생성해보자. 봇아빠(@BotFather)를 찾아가자. 앞으로 BotFather을 봇아빠라고 한다.
봇아빠한테서 봇 하나 생성한다.

/newbot

채팅창에서 보일 이름을 정한다. 바로 구분할 수 있는 게 좋으니 난 그냥 Transmission으로 했다.

Transmission

다음은 이 봇의 고유 이름을 붙인다. 다른 봇들과 이름이 중복이 안 되고, 마지막은 bot으로 끝나야 한다. TransmissionBot이나 transmission_bot 뭐 이런 식이면 된다. 중복되는 게 없을 때까지 물어보니 맘에 드는 걸로 한다. 여기서는 예로 TransmissionBot.

TransmissionBot

이러면 이제 봇아빠는 생성한 봇의 토큰 값을 알려준다.

012345678:ABCDEFGHIJKLMNOPQRSTUVWXYZ

이런 형식의 토큰 값이다. 누구에게도 알려주지 말고 잘 간직하자. 노출이 됐으면 봇을 그냥 지우고 새로 만들면 된다.

이제 만든 봇한테 가서 말 한번 걸어보자. 봇아빠가 마지막에 준 메시지에서 클릭해서 들어가도 되고, @TransmissionBot와 같이 찾아서 들어가도 된다.
시작을 누르거나 /start를 주고 아무 말이나 한번 걸어준다.

이제 이러면 내가 쓸 텔레그램 봇은 마련이 됐고, 이제 처음에 받은 transmission-telegram을 설치한다.

/usr/local/bin

나는 여기다 설치했지만 그냥

export $PATH

해서 나오는 $PATH 중에 맘에 드는 걸로 하거나 새로 하나 만들고 $PATH에 추가해도 된다.
소유자도 원하는 걸로 바꿔놓든가 하고 실행 권한도 준다.

cd /usr/local/bin
chown root:root transmission-telegram
chmod a+x transmission-telegram

이제 그냥 실행시키고 나와도 상관이 없으나, 재부팅 하거나 하면 또 실행시켜야 하니 systemctl에 등록을 한다.

nano /usr/lib/systemd/system/transmission-telegram.service

다음 아래와 같은 형식으로 채워 넣는다.

[Unit]
Description=Transmission-Telegram
After=transmission.service

[Service]
User=(트랜스미션을 실행하는 유저 혹은 그보다 상위 유저)
Type=simple
ExecStart=/usr/local/bin/transmission-telegram -token=(위에서의 토큰 값) -master=@(봇의 아이디가 아닌 봇을 제어할 내 자신의 아이디) -username=(Transmission 유저 이름) -password=(Transmission 비밀번호)

[Install]
WantedBy=multi-user.target

트랜스미션에 로그인을 해야 해서 트랜스미션 서비스가 실행된 뒤에 실행이 되고, 이 서비스로부터 피드백은 받지 않게 했다. 조금씩 고칠 부분이 있으면 고치면 된다.
또한 systemctl status transmission-telegram으로 볼 때마다 저기서 쓴 비밀번호가 그냥 노출이 되니 혼자 쓰는 NAS면 누가 들어와서 보지 않는 이상 보진 않겠지만 찝찝하면 노출이 돼도 상관이 없는 것으로 바꾸자.

이제 transmission-telegram을 등록하고 실행해보자.

systemctl enable transmission-telegram
systemctl start transmission-telegram

다음 만들어둔 봇에게 가서 /help 한번 쳐보자. 응답이 온다면 성공.
나머지 명령어는 /help를 읽읍시다.

Arch Linux에서 Transmission 실행 설정

맨날 새로 깔 때마다 마치 처음 보는 것처럼 “아 뭘 했었지?” 하는 것도 지쳐서 나중에는 한방에 좀 하라고 기록해놓는다.

일단 systemctl로 실행되는 트랜스미션은 transmission 계정으로 실행이 되기는 하는데, 이렇게 실행하면 혼자 쓰는 NAS에서 폴더 관리하기가 참 귀찮다.
그래서 그냥 실행되는 서비스의 계정을 바꿔놓는다.

nano /usr/lib/systemd/system/transmission.service

여기서 보면

User=transmission

이렇게 있는 부분을

User=sweru

로 내가 주로 쓰는 계정으로 바꿔놓는다.

systemctl enable transmission
systemctl start transmission

이러면 재부팅 할 때마다 일일이 계정으로 로그인해서 데몬을 실행시킬 필요가 없어진다.

Pogoplug를 NAS로 – 라디오 녹음하기

원래는 하드 디스크도 설정하고, FTP도 설치하고 설정하고 하며 차근차근 포스팅을 할 예정이었는데 중간에 쓰다 보니 몇 번이나 한 거 기억해서 쓰기도 힘들고 해서 지금 하고 있는 거 먼저 올린다. 이제부터의 글들은 포고플러그에만 제한되는 내용은 아니다. 대부분의 리눅스에서 쓸 수 있다.
먼저 하드 디스크가 마운트 된 상태라고 가정한다. 녹음 파일은 여기에 저장될 것이다. 이 글은 MMS 프로토콜을 통한 녹음만 해당 된다. 다른 프로토콜은 아래의 구문들을 조금씩 고치거나 다른 프로토콜에 대한 플레이어를 쓰거나 추가적으로 프로그램을 설치해 쓰면 될 것이다.

원래 라디오 녹음에 대해서는 얘기만 듣다가 흥미가 생겨 어제부터 계속 이것저것 해보았다. 처음에는 Mplayer를 사용해 녹음을 해보려 했으나 WAV로 밖에 녹음이 안 돼 용량 때문에 변환 작업이 꼭 필요했다. WAV인 만큼 한 시간이나 두 시간을 녹음하면 용량도 기가바이트 단위가 돼버리고, 한 시간 녹음을 하면 다시 그 이상의 변환 시간이 필요했다. 안 그래도 포고플러그는 여타 다른 NAS에 비해서는 성능이 좋지 않기에 많은 프로세스를 차지하는 프로그램은 지양하는 것이 좋다. 또 종료 시간을 따로 지정하는 옵션이 없어 sleep으로 종료 시간을 지정해야 하는데 sleep을 실행하는 순간 계속 Mplayer도 같이 멈춰버려서 다른 게 없나 찾아 보니 VLC라는 프로그램이 있었다. MP3로 바로 압축해서 저장이 되고, 녹음 종료 시간도 지정해놓을 수 있어서 VLC를 선택했다.
먼저 VLC가 없다면 설치한다.

pacman -S vlc

용량도 좀 있고 파일이 많아 시간이 좀 많이 걸린다. Root 사용자가 아닌 다른 계정으로 모든 작업을 하고 있다면 상관 없지만 만약 Root 사용자로 모든 작업을 한다면, 일단 설치하고 프롬프트에 vlc를 실행시켜 보면 Root 사용자는 보안의 문제로 사용할 수 없다고 하며 종료한다. 일단 Root 사용자로 실행이 되게 수정하자. 설정을 수정하는 게 아니라 프로그램을 수정한다. 여기서는 sed라는 프로그램을 사용한다. 여러 파일들의 특정 열이나 문자를 조건에 맞게 일괄적으로 바꾸는 프로그램이다. 없다면 받아 설치한다.

pacman -S sed

설치하고 아래와 같이 입력한다.

sed -i 's/geteuid/getppid/g' `which vlc`

이러면 수정이 된다. vlc를 다시 입력해 Root 권한에서도 작동이 되는지 확인한다.
이제 몇 가지 밑작업을 한다. 현재 나는 /data에 하드 디스크가 마운트 되어 있고, /data/radio, /data/tmp라는 폴더를 만들고 권한을 모두 777을 줬다. tmp 폴더를 따로 만들어 먼저 이 폴더에서 녹음 파일을 만들고 녹음이 끝나면 radio 폴더로 옮긴다. 이는 녹음 도중에 radio 폴더에 접속했을 때 불완전한 파일을 듣는 걸 방지하기 위함이다.
다음은 적당한 곳에 실행 스크립트 파일을 만든다. 나는 /radio라는 폴더를 만들었다

mkdir /radio

/radio/(라디오 방송국).sh와 같은 방식으로 실행 파일을 만들었다. 실행 파일 하나는 하나의 방송국을 녹음하는 데에 쓰일 것이다.
예로 MBC FM4U의 녹음 스크립트 파일을 만들어 보겠다.

nano /radio/mbc_fm4u.sh

아래의 스크립트를 복사해서 붙여넣는다. VLC에 관한 스크립트를 제외하고는 간단한 구문이라 입맛에 맞게 고치면 된다. VLC 구문의 옵션은 너무 많아서 나도 대충 이렇게 저렇게 붙여서 만들었다. 여기서는 라디오 프로그램 이름, 녹음 시간, 최종 저장 폴더를 변수로 놓았다. ID3 태그도 대한 부분도 있는데 처음에 mimms와 Mplayer 가지고 끙끙댈 때 거기서는 기능을 지원해서 넣어놨는데 VLC에서는 어떻게 적용하는지도 모르겠고 일단 그냥 남겨 놓은 것이다. 필수적인 건 아니니 저 부분은 지워도 된다. 공백 처리를 하려고 하니 이것저것 할 게 생겨서 그냥 언더바(_)로 대체했다.

또한 아래의 라디오 스트리밍 주소는 청주MBC의 라디오 주소로 MBC 라디오 본사에서는 스트리밍 주소를 현재 제공하지 않는다. 지금은 대부분이 공개하지 않고 앱이나 웹의 프로그램으로만 들을 수 있으며, 주소를 그대로 공개하는 건 지방의 MBC들이다. 지방의 MBC는 지방에 있는 사람은 알듯 몇몇 라디오 프로그램은 그 지방의 방송을 송출한다. 인기 프로그램들은 대부분 본사의 라디오 방송을 그대로 보내주니 감안하고 사용하도록 한다. 이도 사정에 따라 계속 없어지거나 주소가 변하니 처음에는 녹음이 됐는데 나중에 안 된다면 주소를 적절히 수정해 사용한다.

#!/bin/bash
RADIO_ADDR="mms://211.181.136.136/livefm"
RADIO_NAME="MBC FM4U"

PROGRAM_NAME=$1
RECORD_MINS=$2
DEST_DIR=$3

REC_DATE=`date +%m%d`
MP3_FILE_NAME=$PROGRAM_NAME"_"$REC_DATE.mp3

ID3_TITLE=$REC_DATE" - "$PROGRAM_NAME
ID3_ARTIST=$RADIO_NAME
ID3_ALBUM=$PROGRAM_NAME
ID3_YEAR=`date +%Y`

cd /data/tmp
cvlc -q "$RADIO_ADDR" ":sout=#transcode{acodec=mp3,ab=128}:std{access=file,mux=dummy,dst="$MP3_FILE_NAME"}" --run-time=$RECORD_MINS vlc://quit

mkdir -p $DEST_DIR
mv $MP3_FILE_NAME $DEST_DIR

다음 만든 스크립트 파일에 실행 권한을 준다.

chmod a+x mbc_fm4u.sh

이제 실행 스크립트에 변수를 넣어 실행하면 녹음이 시작될 것이다. 테스트를 해보자. 다음과 같이 넣어봤다.

/radio/mbc_fm4u.sh Temp 10 /data/radio/mbc_fm4u

Temp라는 라디오 프로그램 이름, 그리고 10초간 녹음을 하고 끝나면 /data/radio/mbc_fm4u 폴더로 파일을 가져다 놓는다. 안 된다면 위의 구문상 오류가 있거나 파일이 이동을 했는데 파일을 실행시켜도 소리가 안 나면 녹음에 문제가 있는 것이다. 오류가 날 여지는 다양하니 처음부터 뭐가 잘못 됐는지 살펴보거나 조금씩 수정하길 바란다.

이제 스크립트만 제대로 짜졌다면 정해진 시간에 녹음을 시작하게 스케줄을 설정하기만 하면 된다. crontab을 이용해보자. crontab은 정해진 시간이나 날짜에 지정한 작업을 수행하는 리눅스 내장 서비스이다. 기본적으로 crontab은 내장된 vi를 사용하기 때문에 이걸 nano로 바꿔서 하는 게 편하다. 시스템 기본 에디터를 nano, 혹은 사용하는 에디터로 바꾼다.

export EDITOR=nano

그런 다음 crontab에 스케줄을 추가한다. 그냥 한 줄 죽 써주고 저장하면 된다. 아래는 위의 스크립트로 만든 예이다.

0 22 * * * /radio/mbc_fm4u.sh Music_City 7320 /data/radio/mbc_fm4u/musiccity

각 항목은 공백으로 구분한다. 맨 앞부터 분, 시, 일, 달, 주, 실행할 스크립트이다. 분과 시는 최소 시작 단위니 꼭 써줘야 하고 * 혹은 ,를 사용해 격일이나 휴일을 두는 둥 조건을 좀 더 다양하게 줄 수 있다. 자세한 것은 cron – ArchWiki를 참조한다.
이 명령을 해석해 보자. MBC FM4U, 성시경의 음악도시를 녹음하는 스크립트다. 매일 매달 매주 22시 0분에 실행하는데 서버 시간과 포고플러그의 시간이 몇 초 정도 차이가 날 수 있다. 구조상 인터넷 라디오가 항상 좀 더 느리다. 많은 차이가 나지는 않으니 여분의 시간 없이 그냥 이렇게 설정했다.

이제 잘 되는지 안 되는지 기다리는 일만 남았다. 그리고 녹음 중에는 포고플러그의 CPU 리소스를 대부분 다 차지하니 그 시간대에는 무리한 명령을 주지 않도록 하자.