IT이야기2015. 6. 24. 12:36

등록한 사람이 없겠지라는 생각으로 확인했는데, 등록되어 있다. 5월 등록이면 '아몰랑'이 언론에 나올 시점일텐데, 이렇게 발빠른 분들이 있다니, 놀랍다. 제가 등록하고 싶은 맘은 없고, 그냥 궁금해서.


$ whois_list.sh amolrang
amolrang.co.kr       => Registered Date : 2015. 06. 09.
amolrang.or.kr       => No match
amolrang.re.kr       => No match
amolrang.pe.kr       => No match
amolrang.go.kr       => No match
amolrang.kr          => Registered Date : 2015. 06. 09.
amolrang.com         => Creation Date: 11-may-2015
amolrang.org         => No match
amolrang.net         => Creation Date: 09-jun-2015


한글 도메인도 확인해봤다.


$ whois_list.sh 아몰랑
아몰랑.co.kr         => No match
아몰랑.or.kr         => No match
아몰랑.re.kr         => No match
아몰랑.pe.kr         => No match
아몰랑.go.kr         => No match
아몰랑.kr            => Registered Date : 2015. 05. 13.
아몰랑.com           => Creation Date: 15-may-2015
아몰랑.org           => No match
아몰랑.net           => Creation Date: 15-may-2015


아몰랑.com, 아몰랑.net은 도메인 정보가 블라인드 처리되어 있다. 도메인 정보가 모두 등록기관 정보로 되어 있고, 메일주소도 admin_AT_whoisblind.com 로 되어 있다. 의심은 간다. '아~몰라~몰라~몰랑~~~'


Registrant Name: Whois Domain Admin.
Registrant Organization: Whois Domain Admin.
Registrant Email: admin_AT_whoisblind.com


* 관련글

2011/08/13 - [IT이야기] 쥐박이와 명박이 도메인 (현재는 이 도메인들 모두 등록되어 있지 않음)

Posted by 좋은진호
시스템이야기2015. 6. 19. 12:17

zabbix 를 오래 운영하면 zabbix DB가 무럭무럭 자라서 용량이 상당히 커지고 속도도 느려진다.
수집한 데이터는 오래될수록 필요가 없으므로 이 데이터는 제외하고, 'zabbix 설정값만' 뽑아서 zabbix DB를 새로 구축하려고 한다.


[ 조건 ]
- 수집한 데이터는 버린다.
- 설정값(호스트, 템블릿, ...)만 받는다.
- zabbix DB를 새롭게 시작한다.

zabbix


1. 설정값만 백업하기

Zabbiz 2.0, 2.2, 2.4를 지원하는 zabbix-mysql-dump 라는 간단한 스크립트가 있다.
https://github.com/maxhq/zabbix-backup/wiki 에서 셀스크립트를 다운 받는다.

스크립트에서 zabbix DB 접속 정보와 mysqldump 경로(스크립트내에서는 /usr/bin/mysqldump로 되어 있음)를 확인한다.


DBHOST="127.0.0.1"
DBNAME="zabbix"
DBUSER="..."
DBPASS="..."


스크립트를 실행하면 현재디렉토리 dump 파일이 생겼을 것이다.


# sh zabbix-mysql-dump
# ls
zabbix_localhost_20150526-1347.sql.gz


스크립트로 dump 받은 것 외에 trigger에 의해 발생한 event정보를 옮기고 싶다면, zabbix 데이터 중에 2가지가 추가로 필요하다.


1) trigger에 의해 발생한 event를 담고 있는 'events' 테이블 데이터
2) 각 event에 대해 코멘트가 담긴 'acknowledges' 테이블 데이터


[ zabbix : trigger에 의해 발생한 event 정보 ]


# mysqldump --opt --single-transaction --skip-lock-tables --extended-insert=FALSE -u zabbix -p zabbix \
  acknowledges events > zabbix_acknowledges_events.sql



2. zabbix DB를 새롭게 구축하기


1) zabbix server 데몬을 내린다.
2) MySQL 서버를 내린다.
3) 기존 zabbix innodb파일을 다른 이름으로 임시 백업해둔다.
   zabbix 스키마( MySQL DATA DIR/zabbix/) 는 그대로 둔다.


4) MySQL 서버를 실행한다.
5) 조금 전에 dump받은 셋팅값을 넣어준다.
   gunzip zabbix_localhost_20150526-1347.sql
   mysql -u zabbix -p zabbix < zabbix_localhost_20150526-1347.sql


   기존에 있던 zabbix 테이블을 drop하고 -> 새로 create -> 셋팅값 insert


6) 별도로 백업받은 acknowledges 테이블의 데이터를 insert한다.
   acknowledges 테이블의 데이터를 기준으로 해당된 event만 뽑아 insert한다.


7) zabbix server를 올린다.

Posted by 좋은진호
IT이야기2015. 5. 25. 11:00

'실리콘밸리 견문록'의 저자 이동휘씨는 구글 본사 검색팀에서 소프트웨어 엔지니어로 일하고 있다. 구글 본사에 몇 분의 한국인이 있는지는 모르겠다. 그러나 구글 본사 한국인이 쓴 구글 경험담 책은 몇 권인 줄 안다. 이 한 권 뿐이다. (찾아보니 더 있었다. '이준영'씨가 쓴 '구글은 SKY를 모른다')


책 '실리콘밸리 견문록'


어떤 남자가 자기 집의 보일러가 고장나 서비스를 요청했다. 서비스센터 기술자는 몇 분 만에 그 문제를 해결했다. 수리비를 청구하자 서비스 요청한 사람은 몇 분 수리한 것도 없는데 왜 이리 비싸냐고 따졌다. 그 기술자는 이렇게 말했다.

"이 수리비는 몇 분 걸린 것에 대한 비용이 아니라 몇 년 간의 경험을 통해 알게 된 시간에 대한 비용입니다."


이 책이 바로 그런 책 같다. 이동휘씨는 이 책을 몇 달 동안 썼다고 한다. 몇 년간의 경험을 몇 달 동안 썼고 독자는 몇 시간 만에 읽는다. 그러니깐 몇 년 간의 경험을 몇 시간에 얻을 수 있는 책이다. 책이 가벼운 건 사실이다. IT인이라면 앞 몇 십페이지의 실리콘밸리 역사, 마지막 몇 십페이지를 읽으면 아쉬울 수도 있다. 하지만 실리콘밸리 역사는 체계적으로 정리하는 계기가 되었다. 그리고 어디서 구글 엔지니어의 몇 년 간의 경험을 들을 수 있겠는가?


이 책은 3부로 구성되어 있다.

1부 ‘왜 실리콘밸리인가?’는 실리콘밸리의 역사와 문화를,

2부 ‘구글은 어떻게 일하는가?’는 구글 문화를,

3부 ‘좌충우돌 미국생활 적응기’는 저자가 느낀 미국 문화를 다룬다.




1부는 IT인이라면 아는 내용이 많이 등장한다. 실리콘밸리의 대표적 아이콘인 스티브 잡스의 일화를 시작으로 실리콘밸리가 어떻게 탄생했는지 역사를 살펴본다.


잡스의 일화 중 하나만 살펴보자.

"서서히 기력을 잃어가던 어느날 스티브 잡스가 아들을 창고로 부른다. 아꼈던 그의 오토바이를 아들에게 선물한다. 아들이 빚을 갚겠다고 말한다. 이 때 스티브 잡스가 아들에게 말한다. '넌 빚이 없어. 내 핏줄이니까.' "

아~ 감동이다.


HP에서 탄생한 ‘옆자리증후군’이라는 말이 있다. 옆자리 동료에게 도움이 될 기술이면 개발할 가치가 있다는 뜻인데, 휴대용계산기는 이렇게 탄생했다. 기술 개발의 시작은 멀리 있는 게 아니라, 바로 내 옆사람에게 도움이 된다면 그 걸 만드는 것부터 시작한다.




실리콘밸리 역사와 함께한 인텔과 AMD는 어떻게 탄생했을까?


이 회사들의 탄생하기 2단계를 거슬러 올라가면,

벨연구소에서 트랜지스터를 발명한 ‘쇼클리’라는 인물이 있다. 그는 ‘쇼클리 반도체 연구소’를 설립한다. 벨연구소 시절에 그는 자기 밑에 있던 연구자들의 연구 논문과 특허에 자기 이름을 공동으로 올렸다. 그리고 이 회사를 설립하고 로버트 로이스, 고든 무어 등 최고의 인재들을 유치원생 다루듯이 했고 허드렛일을 맡기기도 했다. 노벨물리학상까지 받았으니 분명히 최고의 과학자인 것은 맞지만 인물 됨됨이는 낙제점이다. (개인적으로 쇼클리를 상당히 싫어한다. 그는 ‘우생학’ 지지자다. 심리학자 아서 젠슨이 흑인이 백인보다 선천적으로 IQ가 낮다는 주장했다. 그 기사를 본 후 쇼클리는 흑인과 백인의 상대적 IQ를 대대적인 조사를 시행하자고 촉구했다.)


결국 이 연구소의 8명은 회사를 그만둔다. 이들이 바로 ‘배신자 8인’이라고 불리는 인물들이다. 셔먼 페어차일드와 배신자 8인(로버트 로이스, 고든 무어, ...)은 페어차일드 반도체를 만들면서 실리콘밸리 역사는 시작되었다. 그 이후 로버트 로이스와 고든 무어, 그리고 페어차일드 직원인 앤디 그로브는 인텔을 창업한다. 페어차일드의 제리 샌더스 등은 AMD를 창업했다. 그러니깐 인텔과 AMD의 공통 조상은 바로 페어차일드 반도체가 되는 셈이다. 그리고, 페어차일드 반도체를 만들게 된 것은 배신자 8인이 쇼클리 반도체 연구소를 뛰쳐나오게 만든 악역(?) ‘쇼클리’ 박사가 있었다.


쇼클리 반도체 연구소 -> 페어차일드 반도체 -> 인텔, AMD



1부의 가장 핵심 부분은 실리콘밸리의 정신이다. 사회환원 정신인 ‘Pay it forward’문화가 있다. 되돌려준다는 뜻이다. 내가 다른 사람에게 도움을 받았으니 나는 또 다른 사람을 도와주는 것이다.

100만권이 팔린 ‘강아지 똥’, 그리고 ‘몽실언니’의 작가 ‘권정생’님은 이런 말씀을 하셨다. “가진 것을 '준다고' 하지 말고, '되돌려준다고' 해야 할 것입니다." 권정생 작가님이 말씀하신 것이 실리콘밸리 정신과 일치할 것이다.

사회환원정신, 오픈소스 문화가 없었다면 실리콘밸리는 지금의 모습은 몇 년, 몇 십년 뒤에나 볼 수 있었을지도 모른다.



실리콘밸리의 사회환원 정신


하지만 실리콘밸리의 어두운 면도 있다. 소득 불평등이 이렇게 심한지는 이 책을 통해 처음 알았다.

실리콘밸리에서 유일하게 24시간 운행하는 22번 버스가 있다. 이 버스는 노숙자에게는 단돈 2달러로 하룻밤을 묵을 수 있는 곳이다. 거리를 떠돌 수 밖에 없는 노숙자들은 잠자는 동안에도 사실상 거리를 떠돌고 있는 셈이다.  너무 가슴 찡했다.

나는 22번 버스 대목을 읽으면서, 윌 스미스 주연의 '행복을 찾아서'이 떠올랐다. 주인공과 그의 아들이 화장실 등에서 노숙했다. 실화를 바탕으로 한 영화인데, 영화 전반부에 해당되는 부분이 여전히 세계 최고의 기술이 모인 실리콘밸리에서는 진행형이다.



[ 영화 '행복을 찾아서' ]


(※ 2부가 핵심인데, 1부를 너무 길게 썼다. 여긴 간단히 쓰려고 했는데)




2부를 통해 구글 내부로 들어가보자.


실리콘밸리 회사들은 직원은 가려뽑고 한번 뽑으면 신뢰한다(실리콘밸리 모든 회사가 그런 것은 아닐테지만). 구글의 채용의 핵심은 좋은 사람을 떨어뜨리는 한이 있어도 나중에 후회할 사람을 뽑지 않는다고 한다. 채용 과정에서 조금이라도 의심스럽다면 뽑지 말아야 한다는 뜻이다.


  • 현실화는 어렵지만 성공하면 세상을 바꿀 일에 골몰할 인재를 찾는다.

  • 사람이 모자라더라도 기준을 낮춰서 뽑지 않는다. 반대로 좋은 인재라면 자리에 관계없이 모두 뽑는다.


저자가 구글 입사 후 초기에 받는 훈련 중 하나가 ‘면접 훈련’이었다. 그러니깐 직원 모두가 스스로 훌륭한 면접관이 되도록 훈련시키는 것이다.

상당히 놀랬다. 우리 나라에서도 이런 문화가 필요할 것 같다. 면접관 능력이 부족한 사람이, 사람 볼 줄 모르는 사람들이 새로운 사람들을 뽑다보니 제대로 뽑지를 못한다. 그러니깐 직원을 가려뽑지도 못하고 한번 뽑고 나서도 의심을 하게 된다. 면접관이 된 자신도 신입 때 그렇게 뽑혀 들어왔을 것이다. 내 자신이 면접관이 되는 훈련을 한다면, 보다 나은 회사 문화와 기술을 만들어나갈 수 있지 않을까?


슈퍼 인턴과의 만남은 흥미롭다. 이 부분은 책을 읽는게 나을 것 같다. 여기에 조각내서 옮겨 놓는 것보다 온전한 상태로, 날 것 그대로 읽는게 나을 것 같아서.


구글 인터뷰팁도 흥미롭다. 그 중 면접관이 하지 않는 질문 부분만 얘기해보겠다.

“앞으로 10년 후 자신은?”, “구글에서 어떤 일을 하고 싶은가?”같은 부류의 질문은 하지 않는다. 후보자의 진목면을 알 수도 없고 변별력도 없다. “미국에서 주유소가 몇 개 있습니까?” “골프공의 홈은 몇 개 입니까?”같은 질문도 하지 않는다. 번뜩이는 재치를 평가할 수는 있겠지만 좋은 엔지니어를 드러내는 평가로 보기 힘들다.

난 '돈오점수(頓悟漸修)'라는 말을 좋아한다. 내 폰의 바탕 메모에 써 둘 만큼. ‘문득 깨달음을 얻고, 점점적으로 수행한다.’라는 뜻이다. 저자는 돈오(頓悟)보다는 점수(漸修) 질문이 좋다고 말한다. 즉, 번뜩이는 재치를 평가하는 질문보다 꾸준히 수행한 사항을 평가할 수 있는 질문을 던지라는 말일 것이다


구글 직원은 회의 약속이나 다른이와 약속을 구글 캘린더로 조정한다고 한다. 본인이 집중하고 싶을 때는 구글 캘린더에 ‘Do not schedule’이라고 적어둔다. 그러면 상대는 이 때를 피해서 일정을 잡는다.

우리는 이런 문화가 약하다. 일정은 통보다. 일정을 선택하는 할 수 있는 경우는 '조율 가능한 사소한 일정'이거나 '자신이 상사일 때 뿐'이다.


사고발생시 실패을 통해 교훈을 얻도록 ‘사후보고서’를 쓴다고 한다. 보고서 내용 중에 ‘제대로 동작하지 않았던 사항’이나 ‘개선 의견’은 보편적으로 적는데, ‘제대로 동작했던 사항’은 특이했다. 사고는 났지만 분명 잘 동작한 부분도 있을 것이고 더 큰 사고를 막았던 이유도 있을 것이다. 이런 부분도 사후보고서에 쓰는 것이다.

사후보고서는 모든 실무자, 책임자가 공유하고 검토하다. 이들이 보고서를 인정하면 사내 모든 사람이 볼 수 있도록 공유(구글 닥스로 작성함)한다. 실패의 교훈은 모든 직원이 함께 나눌 수 있는 것이다.

반면 우리 나라는 '실패의 교훈'보다는 '실패의 고통'을 함께 당한다. 그리고 책임자를 찾아 '실패의 책임'을 묻는다. 실패를 인정하지 않는 문화에서는 발전도 어렵다.


저자는 개발자로서 성장하는 좋은 방법으로 ‘코드 리뷰’를 추천했다.

코드 체크인하기 전에 동료들의 승인을 받아야 한다. 구글의 뛰어난 동료들이 얼마나 많겠는가. 그 동료들이 코드를 검토하고, 코멘트를 달아준다. 더 나은 코드를 배울 수 있게 되고, 본인이 발견 못한 문제점도 알게 될 것이다. 리뷰한 사람은 함께 책임을 지기 때문에 절대 대충 보지는 않는다.
또한 원 개발자가 휴가를 떠나거나 퇴사를 하더라도 이미 리뷰한 동료가 있기 때문에 공백을 최소화할 수 있을 것이다.



※ 나화영님의 댓글을 보고 도서 검색을 해봤더니 '미키 김'씨가 쓴 '꿈을 설계하는 힘' 외에 엔지니어로 근무하시는 '이준영'씨가 쓴 책이 한권 있었습니다. '구글은 SKY를 모른다'(자기계발서)라는 책입니다. 엔지니어가 쓴 책은 없는 줄 알았습니다. (5.27(수) 09:00 추가)

Posted by 좋은진호
일상2015. 5. 13. 18:56

그림자 찍는 것을 좋아한다.

그림자는 장비를 탓하지 않는다. 좋은 카메라가 아니어도 그림자는 제 모습을 충실히 보여준다.

지금까지 샀던 카메라는 똑딱이 뿐이다. 평상시에 스마트폰으로 그림자를 찍는다.

가까운 곳에 여행갈 때만 똑딱이 카메라로 찍는다.


정약용은 국화의 빼어난 점 5가지를 얘기했다.
늦게 꽃을 피우는 것, 오래 견디는 것, 향기로운 것, 어여쁘지만 요염하지 않고 깨끗하지만 차갑지 않은 것 그리고,
마지막 하나가 등불 앞의 국화 그림자를 꼽았다.

정조시대의 간서치(看書痴) 이덕무는 흰국화 꽃이 창호지에 그림자를 만들자,
묽은 먹을 묻혀 창호지 위에 베꼈다. 한 쌍의 나비가 꽃 가운데 앉자, 꽃 그림에 나비도 그렸다.
또 참새 한 마리에 가지를 잡고 매달리길래 참새가 놀라 날아갈까봐 급히 참새까지 보탰다.
그리고 붓을 던져버리고 한마디 말을 던졌다. “나비를 얻었는데 참새를 또 얻었구나”

그림자는 매 분마다 조금씩 변한다.
그림자의 하루 생활은 기울어졌다가 똑바로 섰다가 또다시 다른 쪽으로 기울기도 하고,
줄어들었다가 다시 자라나기도 한다. 바람이 불면 그림자는 바닥을 따라 이리 갔다 저리 갔다 한다.
그림자의 사진은 그래서 순간이 중요한 것 같다.
이덕무가 참새를 그릴 때 급히 그렸던 것처럼 그림자에게는 가장 좋은 자세를 취할 때 사진을 찍어줘야 한다.
그림자는 말한다. “지금이 내 자세가 가장 좋은 것 같아. 빨리 찍어줘”

그래서 찍었다. 그림자가 사진을 찍어달라고 해서.

5살 아이가 어른을 그린다면 (2015.5.)



개발자는 개발을. 그림자는 그림을. 그림이 그려지는 계절. 수묵화. (2015.4., 2014년에도 같은 나무 아래에서 비슷한 사진을 찍었다)



수묵담채화 (2015.5.)



햇볕이 강하게 내리 쬐네. 선캡 하나만 내 머리 위에 올려놓고 한낮을 버티라고 하기엔 너무 가혹해. 나도 더울 땐 그늘에서 쉬고 싶다. - 신호등 7형제 올림 - (2015.5., 2014년에 같은 사진을 찍었다)


펜싱중 (2015.4.)


그림자도 여름 준비. 시원하게 포즈를 취한 그림자 여인 (2015.5.)


Posted by 좋은진호
시스템이야기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 좋은진호