IT이야기2015. 12. 3. 12:30

IRC와 요즘 대세인 slack을 연동할 수 있다. slack에서 메시지를 쓰면 IRC에서 볼 수 있고, 반대도 마찬가지로 주고 받을 수 있다. 아주 간단하다. slack-irc( https://github.com/ekmartin/slack-irc )을 설치하면 끝난다.





node.js로 만들어져있으므로, node.js부터 설치힌다.


# curl -sL https://rpm.nodesource.com/setup | bash -

# yum install -y nodejs


$ npm install -g slack-irc


JSON형식의 config파일을 만든다. 확장자는 반드시 .json으로 한다.


[ config.json ]

{

  "server": "aoa.hanirc.org",

  "nickname": "coffeenix-slack",

  "token": "????-??????????-...생략...",

  "channelMapping": {

    "#irc": "#cnx"

  }

}


server는 IRC서버명, nickname은 IRC에서 사용할 닉네임이다. token은 https://api.slack.com/web 에서 확인할 수 있다. 만약 token이 외부에 유출되었다면 'Re-issue token'버튼을 클릭하여 새로 만든다. channelMapping에서 "#irc"는 slack의 채널명이고, "#cnx"는 IRC 방이름이다. slack 채널명은 일반 채널이면 '#채널명' 형태로, 비공개 채널(Private channel)이면 '채널명'으로 설정하면 된다.



Slack API 호출에 사용할 Token[ Slack API 호출에 사용할 Token ( https://api.slack.com/web ) ]



실행해보자. IRC에는 coffeenix-slack이라는 유저가 접속될 것이다.


$ slack-irc --config config.json



Slack과 IRC 연동[ Slack과 IRC 연동 ]


이상없다면, 스크립트를 만들어 백그라운드로 돌린다.


#!/bin/bash


nohup /usr/bin/slack-irc --config config.json &



Posted by 좋은진호
시스템이야기2015. 12. 2. 18:29


logstash


logstash를 통해 수집된 데이터를 elasticsearch에 쌓고 있다. 수집된 데이터를 elasticsearch에 넣지 않고 로그파일로 저장할 필요가 생겼다. lnav 같은 쉘용 로그분석툴을 사용하기 위해서.


output {

    file {

         path => "/data/log/%{+YYYY_MM_dd}.log"

         message_format => "%{message}"

    }

}


위와 같이 설정했을 때 2015_10_13.log 파일명으로 로그를 쌓는다. 그런데 한가지 문제가 있다. logstash 시간은 UTC기준이라서, 우리나라 시간 AM 9시 이전은 2015_10_12.log 파일명에 쌓고, 9시 이후는 2015_10_13.log 파일명에 쌓는다.


다음과 같이 설명하면 서버의 timezone 기준(KST)으로 날짜 파일명에 로그를 쌓을 수 있다.

filter {

    ruby {

        code => "event['date_index'] = event.timestamp.time.localtime.strftime('%Y_%m_%d')"

    }

}


output {

    file {

        path => "/data/log/%{date_index}.log"

        message_format => "%{message}"

    }

}



Posted by 좋은진호
시스템이야기2015. 6. 29. 13:16

왜 FreeBSD는 2015년 7월의 윤초(Leap Second)에 대한 얘기가 없을까 싶을 것이다. 얼마전에 쓴 '2015년 윤초(Leap second) 삽입 관련 서버 점검사항'(2015.6.22.)에서도 리눅스(Linux)만 언급했다. 얘기가 없는 건 문제가 없기 때문이다.



2012년 윤초 삽입 때, 저는 FreeBSD서버에서 아무 것도 한 것이 없다.

윤초로 발생하는 문제가 없기 때문에 서버는 단지 1초의 시간차만 맞춰주면 된다.
이미 서버들은 시간동기화가 셋팅되어 있기 때문에 1초는 자동으로 맞춰진다. 따로 할 것이 없는 것이다.


(1) 상위 NTP 서버들(당신의 서버 아님) <-> (2) 내부 NTP서버 (당신이 관리하는 서버) <-> (3) ntpdate를 실행하는 다수의 서버들


위에서 나와 관련된 서버는 2번과 3번.


(2) ntpd 데몬을 돌리는 서버는 자동으로 상위 NTP 서버로 부터 윤초 삽입이 되어 시간동기화된다.
(3) 나머지 서버들은 내부 NTP서버를 통해 자동 동기화된다. (ntpdate 명령)


FreeBSD에서 윤초는 신경쓰지 말고, 편히 운영하세요.

FreeBSD 문서에 윤초를 다룬 'FreeBSD Support for Leap Seconds' 글이 하나 있는데 참고로 읽어보세요.


We believe and expect that FreeBSD, if provided correct and stable NTP service, will work as designed during this leap second, as it did during the previous ones.
... 생략 ...
In practice, leap seconds are usually not a problem on FreeBSD. We hope that this overview helps clarify what to expect and how to make the leap second event proceed more smoothly.



Posted by 좋은진호
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 좋은진호
시스템이야기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 좋은진호
시스템이야기2014. 4. 9. 15:19

OpenSSL 1.0.1버전에 TLS heartbeat 취약점(일명 Heartbleed Bug라고 부름. CVE-2014-0160, openssl: information disclosure in handling of TLS heartbeat extension packets)이 있습니다. 

공격자가 https서버의 메모리 64KB 데이터를 볼 수 있습니다. 메모리에는 https서버와 유저간에 주고 받은 데이터들(ID/PW, ... 등의 정보)이 있는데, 공격자는 plain text형태로 볼 수 있습니다. 그리고,SSL 개인키를 얻을 수 있습니다. 반드시 업데이트하세요.


http://a4.aurynj.net/post/82075898166/heartbleed (Heartbleed 이슈에 관해 정리)

http://yisangwook.tumblr.com/post/82056087918/openssl-heartbeat-heartbleed (OpenSSL 취약점 발견. Heartbleed)

http://heartbleed.com/


1. 취약한 버전


OpenSSL 1.0.0과 0.9.8 버전은 취약하지 않으며,

1.0.1은 1.0.1f까지 취약합니다. 1.0.1g에서 패치되었구요.


http://www.openssl.org/news/secadv_20140407.txt



2. RHEL, CentOS


# yum update openssl*

... 생략 ...

=====================================================================

 Package              Arch      Version               Repository        Size

=====================================================================

Updating:

 openssl              x86_64    1.0.1e-16.el6_5.7     updates          1.5 M

 openssl-devel        x86_64    1.0.1e-16.el6_5.7     updates          1.2 M



3. FreeBSD


# freebsd-update fetch

# freebsd-update install

# ls -la /usr/lib*/libssl*

-r--r--r--  1 root  wheel  685846 Apr  9 12:28 /usr/lib/libssl.a

lrwxr-xr-x  1 root  wheel      11 Feb 25 09:24 /usr/lib/libssl.so -> libssl.so.7

-r--r--r--  1 root  wheel  430352 Apr  9 12:28 /usr/lib/libssl.so.7

-r--r--r--  1 root  wheel  713782 Apr  9 12:28 /usr/lib/libssl_p.a

-r--r--r--  1 root  wheel  470850 Apr  9 12:28 /usr/lib32/libssl.a

lrwxr-xr-x  1 root  wheel      11 Feb 25 09:26 /usr/lib32/libssl.so -> libssl.so.7

-r--r--r--  1 root  wheel  363552 Apr  9 12:28 /usr/lib32/libssl.so.7

-r--r--r--  1 root  wheel  480306 Apr  9 12:28 /usr/lib32/libssl_p.a


업데이트 후 openssl사용하는 데몬은 재실행해주세요.



Posted by 좋은진호
IT이야기2013. 10. 4. 19:27

갤럭시 기어(Galaxy Gear)와 갤럭시 노트 3(Galaxy Note3)가 전시되어 있어서 잠깐 사용해봤다.

  • 문자 확인, SNS 확인 등 보조 수단으로 편리할 것 같다.

  • 스피커와 마이크가 내장되어 있어, 통화가 가능하다. 그러나 혼자 있는게 아니라면 통화하기에는 좋지 않을 것 같다. '너희~ 목소리가 들려...'
    이어폰잭을 제공하면 어떨까. 이어폰은 옷에 끼울 수 있는 아주 작은 클립을 제공해주고.

  • 스마트폰의 Back버튼에 해당되는게 '위에서 아래로' 터치하는 것이다. 직관적이지 않다. 익숙함이 필요.
  • 생각보다 무겁다. 나도 모르게 '묵직하네'라는 말이 나왔다.

  • 남자, 여자 중 누구에게 더 맞을까?
    남자? 디자인이나 무게를 생각하면 남자에게 더 어울린다.
    여자? 스마트폰을 손에 들고 있지 않는 성비를 따지면 여자 많을 것 같다. 스마트폰을 핸드백에 넣고 다니는 여자분이 많으니까.

  • 갤럭시 기어를 활용한 게임들이 등이 나오지 않을까. 헬스용 어플도 다양해질 것 같고.


갤럭시 기어갤럭시 기어


갤럭시 기어의 만보계 기능갤럭시 기어의 만보계 기능


갤럭시 기어 카메라시계줄에 달린 카메라로 사진 찍기. 시계를 두번 다닥 처치해주면 된다.


갤러리갤러리


갤러리페이지에서 터치를 길게 하고 있으면 선택 & 싱크할 수 있는 화면이 나온다. 사진을 선택 후 시계 하단의 싱크 아이콘을 터치하면 갤럭시노트3로 사진이 싱크된다.


갤럭시노트3의 갤러리 페이지. 'Galay_Gear' 페이지를 열어두면 싱크되는 사진을 바로 확인할 수 있다.


갤럭시 노트 3의 'Gear manager' 화면. 이 어플을 통해서 갤럭시 기어와 연동 및 제어를 할 수 있다. 시계 화면 변경, 갤럭시 기어 정보 확인, 새로운 어플 설치, 환경 설정 등


Gear manager에서 '내 Gear 찾기'


연결된 Gear 정보


갤럭시 기어 -> 환경설정에서 기어 정보를 확인


Gear manager에서 '나의 애플리케이션'


Gear manager에서 '나의 애플리케이션'


Gear manager에서 'Samsung Apps'. 갤럭시 기어용 어플이 몇십개 정도는 되는 것 같다. 적어 아쉬움이 있다.


Gear manager에서 '설정'


Gear manager에서 '설정' -> '전원 버튼 두 번 누르기'. 설정에 따라서 갤럭시 기어의 전원 버튼의 기능이 달라진다.






Posted by 좋은진호
IT이야기2013. 9. 17. 13:07

'[국정원]내란음모로 인한 소환서 발부되었습니다 내용확인 rort.??/???'이라는 '스미싱 문자 기사'를 봤다.



apk파일을 받아보려고 'PC 브라우저'에서 접속해봤다. 그런데, '[olleh]스미싱 감염 예방 안내'라는 페이지( http://175.196.95.228/smishing.htm )로 바로 이동해버린다. KT가 스미싱 차단 서비스를 얼마전에 시작했는데, 이게 이통망만 적용한게 아니었다.


[olleh]스미싱 감염 예방 안내

1. 문자에 포함된 인터넷주소가 확실하지 않은 것이면 누르지 마십시오. 다양한 방법으로 유해어플이 설치되어 문자 수신이 안될 수 있습니다.

2. 올레마켓에서 알약(http://olleh.kr/alyac) 또는 올레스미싱차단 앱 등 백신을 다운받아 검사하시면 감염확인 및 치료를 할수 있습니다.

* 휴대폰을 최상의 상태로 유지하기 위하여는 하루에 한번 정도 전원을 껐다 켜 주세요.

다른망을 통해 PC에서 접속해봤는데, 악성 apk 배포 서버가 내려갔는지 접속은 안된다.


아무튼 안드로이드 사용자는 문자에 URL이 포함될 때 주의해야 한다.

1. 스마트폰에서 SMS문자의 URL을 누르지 않는다.
2. 실수로 URL을 눌렀을 때, 어플 설치하라는 메시지가 나오면 절대 설치하지 않는다.
3. URL을 '반드시' 확인해보고 싶다면(실제 지인이 보낸 문자일 가능성이 있을 때) 폰이 아닌 백신이 설치된 PC에서 크롬, 파폭 브라우저로 확인한다.

Posted by 좋은진호