시스템이야기2014. 10. 15. 13:24

메신저 검열로 '텔레그램(Telegram)' 광풍이 불고 있다. 개인적으로 카톡을 자주 사용하지 않아, 텔레그램이 절실(?)하게 필요하지 않다. 하지만 텔레그램을 사용해야할 이유가 생겼다. 텔레그램이 서버에서 사용할 수 있는 CLI를 제공하고 있고, lua나 python으로 손쉽게 메신저와 연동할 수 있다.


그래서 텔레그램용 lua스크립트를 만들어서 서버 상태를 폰에서 받아볼 수 있다. 예를 들어 특정 서버의 MRTG/RRD를 메신저로 요청하면 그 이미지를 받아 볼 수 있다. 서버의 load값도 같은 방식으로 return받을 수 있다. 서버장애 문자를 텔레그램으로 받을 수 있도록 하신분도 있다. (※ 개인적으로는 이미 SMS로 받고 있는 것을 다시 텔레그램용으로 만들 필요는 없었다.)


텔레그램 CLI설치는 '리눅스에 텔레그램(Telegram) CLI 설치' (글 좋은진호)를 참고하고, 이 글은 서버 모니터링용 텔레그램 스크립트와 실제 사용 예를 보여줄 것이다.



1. 텔레그램 lua 스크립트 기본 구조


메시지를 수신하면 on_msg_receive 함수가 호출된다. 이 함수내에서 send_msg, send_photo, send_text 등의 함수를 이용해서 메시지를 상대에서 보낼 수 있다. 다음은 'hello'를 수신하면, 결과를 보내준다.


[ 스크립트 기본 구조 : hello.lua ]

function on_msg_receive (msg)

if ( msg.text == 'hello' ) then

send_msg(msg.from.print_name, "world", ok_cb, false)

return

end

end

function ok_cb(extra, success, result)

end


$ bin/telegram-cli -s hello.lua

... 생략 ...

[14:21]  Jinho >>> aa

User Jinho is typing

[14:22]  Jinho >>> bb

User Jinho is typing

User Jinho is typing

[14:22]  Jinho >>> 헬로우

User Jinho is typing

[14:22]  Jinho >>> hello

[14:22]  Jinho <<< world

User Jinho marked read 1 outbox and 0 inbox messages



telegram-cli 실행화면[ telegram-cli 실행화면 ]


스마트폰 어플 화면[ 스마트폰 어플 화면 ]



2. 서버모니터링용 스크립트 살펴보기


[ 모니터링용 스크립트 일부 : server_mon.lua ]

now = os.time()


dir_cmd = "/home/cnx/cmd"

cmd_ping = "cd ".. dir_cmd .."; sh ping.sh"

cmd_load = "cd ".. dir_cmd .."; sh load.sh"

cmd_netlog = "cd ".. dir_cmd .."; sh show_netlog.sh"

cmd_mrtg = "cd ".. dir_cmd .."; perl mrtg.pl"

cmd_404 = "cd ".. dir_cmd .."; perl 404.pl"


mrtg_res = {"load", "swap", "public_if", "private_if", "disk_io", "memory_free", "memory_inactive"}

auth_phone = {["821012345678"] = true, ["821087654321"] = true }


-- 메시지 수신 처리

function on_msg_receive (msg)

if msg.date < now then

return

    end

if msg.out then

return

end


-- command

local recv_msg = ""

if ( msg.text ~= nil ) then

recv_msg  = string.gsub(msg.text,"[;|<>]","") -- 받은 msg중에 ;, |, <, > 등의 문자는 지움

end

local cmd, arg  = split(recv_msg) -- exam : ping a b c d => cmd = "ping", arg = "a b c d"

local file_name = ""

cmd = string.lower(cmd)

print("receive : ", cmd, "\n")


-- user_info

print("Name    : ", msg.from.print_name) -- 메시지 보낸사람 real name (Jinho)

print("Phone   : ", msg.from.phone) -- 메시지 보낸사람 전화번호  (8210AAAABBBB)

print("Msg Num : ", msg.id) -- 메시지 번호

print("to.Name : ", msg.to.print_name)


-- 일반대화, 비밀대화 구분해서 메시지 전송

if (msg.to.id == our_id) then

user_id = msg.from.print_name -- 일반대화창

else

user_id = msg.to.print_name -- 비밀대화창

end


-- auth (지정한 폰번호만 인증)

if auth_phone[msg.from.phone] then

print "auth    : OK "

else

print "auth    : invalid user"

return

end

mark_read(user_id, ok_cb, false) -- 읽은 메시지로 표시


-- ping

if ( cmd == 'ping' ) then

os.execute(cmd_ping .. arg)

send_text(user_id, dir_cmd ..'/result_ping.txt', ok_cb, false)

return

end


-- load

if ( cmd == 'load' ) then

... 생략 ...

end


-- netlog

if ( cmd == 'netlog' ) then

... 생략 ...

end


-- MRTG

if ( cmd == 'mrtg' ) then

os.execute(cmd_mrtg .. arg)

arg = trim(arg)

for i=1, table.maxn(mrtg_res) do

file_name = dir_cmd .."/".. arg .."_".. mrtg_res[i] .."-day.png" -- DIR/FILE

-- print (file_name)

if ( file_exists(file_name) ) then

send_photo(user_id, file_name, ok_cb, false)

end

end

return

end


-- web 403/404 status

if ( cmd == '404' ) then

... 생략 ...

end


-- help

-- if ( cmd ~= '' ) then

if ( cmd == 'help' ) then

send_text(user_id, dir_cmd ..'/help.txt', ok_cb, false)

end

end


... 생략 ...


주요부분을 살펴보자.

if ( cmd == 'ping' ) then

os.execute(cmd_ping .. arg)

send_text(user_id, dir_cmd ..'/result_ping.txt', ok_cb, false)

return

end


모니터링용 스크립트에서는 각 명령어마다 외부 명령을 호출하고 결과를 text파일로 저장했다. 그리고, 그 text파일 내용을 메시지로 뿌려지도록 했다. 명령어 추가는 if ( cmd == '명령어 ' ) then 형태로 확장해주고, 외부 명령 처리할 스크립트만 만들어주면 된다.

 

if (msg.to.id == our_id) then

user_id = msg.from.print_name -- 일반대화창

else

user_id = msg.to.print_name -- 비밀대화창

end


secret chat을 지원한다. msg.to.id == our_id 라면, 즉 받는 사람과 CLI 메신저 유저가 같다면 일반대화창으로 대화중이고, 그렇지 않는 것은 비밀대화이다. 비밀대화는 msg.from.print_name이 아닌 msg.to.print_name 에게 메시지를 보내야 한다. 아래 루틴이 없다면 폰에서 비밀대화로 메시지를 보냈더라도 CLI에서는 응답을 일반대화창으로 보낸다.


if auth_phone[msg.from.phone] then

print "auth    : OK "

else

print "auth    : invalid user"

return

end


auth_phone 에서 지정한 휴대폰에서만 명령을 처리한다.


mark_read(user_id, ok_cb, false)


메시지를 읽은 것으로 표시한다.


※ lua스크립트를 처음해봤다. lua 매뉴얼을 보면서 스크립트를 하루에 만들고, 그 이후에 한번 기능을 추가한 정도다. 그래서 스크립트 lua개발자들이 보기에는 좋지 않은 부분도 있을 것이다. lua고수에게는 연필깍는 칼처럼 뻑뻑하게 보일 수 있겠지만, 누군가 다듬어 사용하면 생선회감용 칼처럼 휼륭(?)하게 쓰일 수 있을 것 같다.


※ ping.sh, load.sh 등의 외부 호출 스크립트는 공개하지 않겠다. 내부 서버들의 데이터를 추출하는 부분이라서 공개하기가 쉽지 않고, 이 글을 읽는 분들의 서버상황이 저와는 다를테니 스크립트 내용보다는 호출 방식만 눈여겨 보면 좋을 것 같다.



3. 텔레그램 CLI 실행


$ bin/telegram-cli -s server_mon.lua

또는

$ bin/telegram-cli -s server_mon.lua -d &


테스트위해서는 -s 옵션만, 추후 운영하기 위해서는 -d 옵션으로 넣어 데몬형태로 실행한다.



telegram-cli 화면[ telegram-cli 화면 : help를 보내주고, ping 결과를 보내준 화면 ]


텔레그램 스마트폰 어플 화면[ 스마트폰 어플 화면 : 아무키나 입력해서 도움말을 확인, 서버그룹별 ping과 개별 IP별 ping 결과 요청 ]

※ 스크립트를 수정해서 'help'명령을 내렸을 때만 도움말을 보여주도록 바꿨다. 스크립트 수정 전에 캡쳐한 것임.



telegram-cli 화면[ telegram-cli 화면 : load 결과, MRTG 그래프 7개를 보내준 화면 ]


텔레그램 어플 화면[ 스마트폰 어플 화면 : load 결과, MRTG 그래프를 받은 화면 ]




4. 참고자료


* 텔레그램 CLI 소스에 들어있는 test.lua

* 텔레그램 README-LUA

* Lua check if a file exists

* Telegram Messenger Client



Posted by 좋은진호

댓글을 달아 주세요

IT이야기2010. 12. 1. 23:27
Pingdom 블로그의 'Mobile OS usage splits the world (chart)' 글에 따르면 전세계 모바일OS별 이용률에서 아이폰은 북미, 유럽, 오세아니아 등 선진국이 많은 지역에서 앞선다. 반면, 노키아의 심비안OS는 아프리아, 아시아, 남미 등 개발도상국, 후진국이 많은 곳에서 비율이 높다. 그리고, 안드로이드가 아이폰의 비율을 점점 갉아먹으면서 비율이 높아지고 있다.

심비안 OS  31.93%
iOS           21.94%
블랙베리    19.25%
안드로이드 11.61%

이 자료는 StatCounter( http://gs.statcounter.com/ )의 통계를 기반으로 했다. 이 통계자료의 진정한 가치는 통계 수치보다는 비율의 변화에 있다.

전세계 모바일OS별 웹이용률

[ 전세계 모바일OS별 웹이용률. 출처 : StatCounter ]


한가지 흥미로운 통계는 국가별로 안드로이드 OS의 웹이용률이 50%가 넘는 나라는 우리나라 밖에 없다. 다른 나라와 극명하게 차이가 날 정도로 절대적인 1위를 차지하고 있다. 이게 바로 170만의 갤럭시S의 힘. 삼성의 힘이라고 보면 될 것 같다.

 1. South Korea, 78.3% (오늘 현재 통계는 81.93%)
 2. Austria, 27.3%
 3. Taiwan, 26.5%
 4. Denmark, 25.3%
 5. Slovenia, 24.0%
 6. United States, 23.3%
 7. Netherlands, 21.7%
 8. Sweden, 21.3%
 9. Estonia, 16.8%
10. Norway, 16.0%

우리나라의 모바일OS별 웹이용률 통계다. 안드로이드 81.93%, 아이폰 14.59%.

[ 우리나라의 모바일OS별 웹이용률. 출처 : StatCounter ]


한편 최근에 발표된 11월중순까지의 국내 스마트폰 가입자는 602만명이며, 이중에 안드로이드가 354만명, iOS가 162만명이다. 각각 58.6%, 26.9%를 차지한다.

[ 가입자 통계 출처 : 국내 스마트폰OS 시장, 안드로이드 '1위'(전자신문, 2010.11.30) ]


국내 안드로이드 가입자 비율이 58%인데, 웹이용률은 78.3%로 더 높다는 것은 2가지로 생각해볼 수 있을 것 같다. 첫째는 안드로이드 유저의 모바일웹 이용률이 더 높다는 것이다. 두번째는 이 통계가 전체 인터넷 이용률이 아닌 웹페이지 이용률이므로, 스마트폰 OS별로 유저의 인터넷 이용 성향의 차이가 있다는 것이다.

Posted by 좋은진호

댓글을 달아 주세요

IT이야기2010. 6. 5. 02:08
국내 KT에서 6월에 출시될 예정인 넥서스 원(Nexus One)이 Android 2.2 Froyo(프로요)를 탑재할 것이라고, 지난달 말 KT에서 트위터를 통해 발표를 했다.

Nexus One

구글 넥서스원(Nexus One)


아직 출시전인 6월 3일에 KT IP대역(KTF망=즉, KT 3G망 IP대역)에서 접속한 흔적이 있다. Android 2.2인 것을 확인할 수 있다.

Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF50) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1


그리고, SKT에서 이달 출시 예정인 모토로라의 XT800W, XT800C(XT800W는 3G WCDMA용, XT800C 2G CDMA용)도 출시 전에 SKT IP대역에서 각각 5.28(금), 6.1(화)에 접속했다.

Mozilla/5.0 (Linux; U; Android 2.1-update1; ko-kr; XT800W Build/TTSKT_U_80.10.19R) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17
Mozilla/5.0 (Linux; U; Android 2.1-update1; ko-kr; XT800C Build/TTCSK_X1_00.15.0) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17


가끔 출시 전에 접속하는 경우가 있는데, 각 이통사들의 내부 테스트중? 아니면 해외 구매하여 개통한 국내 유저? (해외 제품이 아닌 국내 휴대폰제조업체의 국내 첫 출시되는 폰의 경우도 출시전 접속하는 경우도 있었다.) 내부 테스트중이라면, 어떤 사이트를 테스트 대상으로 지정하는 것일까...



* 관련글

- 스마트폰, 풀 브라우징폰의 User Agent명(브라우저명)은? ( 2009.4~ )
- 2010/05/03 - [IT이야기] 삼성 갤럭시A 안드로이드폰 User Agent
- 2010/04/20 - [IT이야기] 아이폰용 오페라 미니 브라우저와 iPad의 User Agent
- 2009/07/13 - [IT이야기] 미출시된 초콜릿폰 II에서 웹페이지 접속한 흔적이? 테스트중?

Posted by 좋은진호

댓글을 달아 주세요

IT이야기2009. 7. 13. 19:29
모바일 User-agent명 중에 처음보는 이름이 며칠 전(7월 7일)에 접속한 것을 확인했다.

LG/BL40/V08m Browser/Obigo-Q7.3 MMS/LG-MMS-V1.0/1.2 MediaPlayer/LGPlayer/1.0 Java/ASVM/1.1 Profile/MIDP-2.1 Configuration/CLDC-1.1

모델명이 LG-BL40? 8월에 유럽부터 출시하기로 한 새로운 초콜릿폰인 초콜릿폰 II(블랙라벨 4번째 시리즈)의 모델명이다. 아직 발매가 되지 않았는데, 접속했다면 테스트중? IP는 국내 IP였고, 지금까지 접속했던 이통사의 IP대역은 아니었다.

LG-BL40, 초콜릿폰, 블랙라벨 4번째 시리즈

[ 촐콜릿폰 II (LG-BL40, 블랙라벨 4번째 시리즈) ]


해외에서 LG-BL40 모델로 접속한 경우가 있는지 구글링해봤다. W3C사이트에 딱 한 건 나온다. User-Agent명이 비슷하다.

Mozilla/5.0 (Vodafone/1.0/LG-BL40/V08h Browser/Obigo-Q7.3 MMS/LG-MMS-V1.0/1.2 MediaPlayer/LGPlayer/1.0 Java/ASVM/1.1 Profile/MIDP-2.1 Configuration/CLDC-1.1)

위 2개의 User-agent명을 보면 초콜릿폰 II의 브라우저는 Obigo브라우저 Q7.3버전, 미디어플레이어는 LGPlayer 1.0 등임을 확인할 수 있다. 해상도 정보도 있었으면 딱 좋은데, 아쉽다. 초콜릿폰은 500백만화소 카메라와 345x800 해상도의 21:9 화면을 지원할 것이라는 소문이 있다.

이외 모바일에서 접속한 다양한 User-agent는 '풀 브라우징 휴대폰의 User Agent명(브라우저명)은?'에서 볼 수 있다.
Posted by 좋은진호

댓글을 달아 주세요

IT이야기2009. 4. 17. 22:56
'세상엔 다양한 기기에서 브라우저를 쓰는 유저가 있다.'는 글을 통해 PS3, PSP, iPod의 User Agent명을 확인했다. 그렇다면 휴대폰은 어떻게 표시될까 궁금하여 2탄을 마련했다. WAP페이지가 아닌 풀 브라우징폰으로 일반 웹페이지를 접속한 경우이다.

저장된 웹로그에서 브라우저명만을 스크립트를 이용해서 추출했다. 브라우저명중에 SCH-, SPH-, LG-, CANU, IM-, EV-, iPhone, Nokia, BlackBerry, lgtelecom; 문자열을 검색했다.

사용한 스크립트는 커피닉스에 올려뒀다.
그리고, 블로그에는 User Agent명의 일부만(폰별로 여러 User-Agent명은 특징적인 것 하나씩만. 그리고, 스카이폰과 아이폰은 블로그에서는 제외함. 노키아 모델 1개 제외함) 적어둔다. 자세한 커피닉스의 '풀 브라우징 휴대폰의 User Agent명(브라우저명)은?'에 있다. 추가 User-Agent를 파악하게되면 커피닉스의 글을 수정할 것이다.

1. LG 싸이언

LG 파파라치폰 CANU801EX

[ 사진 출처 : ddaily.co.kr (2008.3.24) 구글 이미지 검색 ]


* 캔유폰
캔유 파파라치폰 (캔유 7)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; 480*752;WV01.00.09;;lgtelecom;EB10-20080405-XXXXXXXXX;CANU801EX;0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

캔유 바이올렛폰 (캔유 8)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; 400*240;WV01.00.01;;lgtelecom;EB10-20090331-XXXXXXXXX;CANU-S1000;0)

블링블링 캔유폰 (캔유 9)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; 240*376;WV01.00.08;;lgtelecom;EB10-20090409-XXXXXXXXX;CANU-F1100;0)

* LG 아르고폰(터치웹폰, 모델명 : LH2300, LH2300W)
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0;800*480;POLARIS 6.0;em1.0;lgtelecom;EB10-20080630-XXXXXXXXX;LG-LH2300;0)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; 800*480;WV01.00.01;;lgtelecom;EB10-20081204-XXXXXXXXX;LG-LH2300W;0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

* LG 롤리팝폰
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; 240*376;WV01.00.08;;lgtelecom;EB10-20090406-XXXXXXXXX;LG-LH8000;0)

* LG 쿠키폰
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; 400*240;WV01.00.08;;lgtelecom;EB10-20090401-XXXXXXXXX;LG-LU9100;0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

* LG 아이스크림폰2
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; 240*296;WV01.00.01;;lgtelecom;EB10-20090408-XXXXXXXXX;LG-LU1600;0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

800 X 480, 320 X 240 등 해상도 정보, 폰 정보 등을 쉽게 확인할 수 있다. EB10... 으로 시작하는 부분이 무엇인지 몰라서 뒷부분 9자리를 XXXXXXXXX로 표시를 하였다. 그리고 눈여겨 볼 것은 'POLARIS 6.0'이다. 국내 인프라웨어(Infraware)의 풀브라우징이 되는 모바일 브라우저다. 현재 Widgets 1.0, RSS, Atom 1.0을 지원하는 7.0까지 나와있다. '모바일 웹브라우저 시장 현황 리뷰'에 따르면, 국내에서는 SKT와 LGT는 인프라웨어의 브라우저를 사용하고, KTF는 지오텔을 통해서 Openwave 엔진을 사용한다고 한다.

2. 삼성 애니콜

삼성 햅픽 haptic

* 삼성 더블폴더폰
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; 240*376;WV01.00.01;;lgtelecom;EB10-20090323-XXXXXXXXX;SPH-W6450;0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

* 삼성 햅틱온
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0;800*480;POLAR;lgtelecom;EB10-20090113-XXXXXXXXX;SPH-W6050;0)
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0;800*480;POLARIS 6.0;em1.0;lgtelecom;EB10-20090219-XXXXXXXXX;SPH-W6050;0)

3. 노키아(Nokia)

* Nokia N81
Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaN81-1/11.0.045 Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413

* Nokia N95 8GB
Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaN95_8GB/11.0.026; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413

심비안 OS와 Safari 브라우저를 사용하는 것을 볼 수 있다. N81모델은 네팔에서 접속했고, 언어셋은 en;q=1.0,id;q=0.5,en;q=0.5. N95모델은 캄보디아에서 접속했고, 언어셋은 en;q=1.0,vi;q=0.5.

4. RIM 블랙베리(BlackBerry)

블랙베리 Black Berry

BlackBerry9530/4.7.0.75 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/105

해외 접속자이며, 언어셋은 en-US,en;q=0.5.

Posted by 좋은진호

댓글을 달아 주세요