daterangepicker.js

<div class="form-group">
    <div class="input-group input-group-sm" id="default-daterange">
        <input type="text" name="default-daterange" class="form-control" value="<?php echo date("Y-m-d", strtotime("-7 day")) ?> ~ <?php echo date("Y-m-d") ?>" placeholder="기간선택" style="width:200px">
        <span class="input-group-append">
            <span class="input-group-text"><i class="fa fa-calendar"></i></span>
        </span>
    </div>
</div>
<link href="/assets/plugins/bootstrap-daterangepicker/daterangepicker.css" rel="stylesheet" />
<script src="/assets/plugins/bootstrap-daterangepicker/moment.js"></script>
<script src="/assets/plugins/bootstrap-daterangepicker/daterangepicker.js"></script>
<script>
$('#default-daterange').daterangepicker({
	opens: 'right',
	format: 'YYYY-MM-DD',
	separator: ' ~ ',
	startDate: moment().subtract('days', 7),
	endDate: moment(),
	minDate: '<?php echo date("Y-m-d", strtotime("-3 year")) ?>',
	maxDate: '<?php echo date("Y-m-d") ?>',
	locale: {
        "format": "YYYY-MM-DD",
        "separator": " ~ ",
        "applyLabel": "적용",
        "cancelLabel": "취소",
        "fromLabel": "부터",
        "toLabel": "까지",
        "customRangeLabel": "사용자",
        "daysOfWeek": [
            "일",
            "월",
            "화",
            "수",
            "목",
            "금",
            "토"
        ],
        "monthNames": [
            "1월",
            "2월",
            "3월",
            "4월",
            "5월",
            "6월",
            "7월",
            "8월",
            "9월",
            "10월",
            "11월",
            "12월"
        ],
        "firstDay": 1
    }
}, function (start, end) {
	$('#default-daterange input').val(start.format('YYYY-MM-DD') + ' ~ ' + end.format('YYYY-MM-DD'));
});
</script>

jQuery Datepicker – 특정요일만 선택할 수 있도록 제한

<link rel="stylesheet" href="http://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="http://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<script>
jQuery(function($) {
	$.datepicker.regional['ko'] = {
		closeText : '닫기',
		prevText : '이전달',
		nextText : '다음달',
		currentText : '오늘',
		monthNames : ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],
		monthNamesShort : ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],
		dayNames : ['일', '월', '화', '수', '목', '금', '토'],
		dayNamesShort : ['일', '월', '화', '수', '목', '금', '토'],
		dayNamesMin : ['일', '월', '화', '수', '목', '금', '토'],
		weekHeader : 'Wk',
		dateFormat : 'yy-mm-dd',
		firstDay : 0,
		isRTL : false,
		showMonthAfterYear : true,
		yearSuffix : '년'
	};

	$.datepicker.setDefaults($.datepicker.regional['ko']);
});

function onlyMonday(date){
	var day = date.getDay();
	return [(day == 1), ''];
};

$(document).ready(function(){
	$(".datepicker").datepicker({
		beforeShowDay: onlyMonday
	});
});
</script>

Apache Traffic Server 시작오류

Apache Traffic Server를 apt로 설치하고

systemctl start trafficserver로 시작하려면 정상적으로 시작을 하지 않는 경우가 있다.

 

이런경우 아래처럼 디렉토리를 생성시켜주면 정상적으로 시작이 된다

$ mkdir /var/run/trafficserver

$ chown trafficserver:trafficserver /var/run/trafficserver

 

systemctl status trafficserver로 확인해보면

/var/run/trafficserver 를 생성시켜주지 못해서 오류가 나면서 종료되는 문제이다.

 

서버 시작시 서비스가 실행되도록 하려면 아래처럼 한다

$ systemctl enable trafficserver

 

이렇게 시작 서비스에 등록을 하더라도 재부팅하면 /var/run/trafficserver 디렉토리가 없어지면서

서비스가 정상적으로 시작되지 않는다.

 

서비스 시작 스크립트를 수정해서 해결한다

$ vim /lib/systemd/system/trafficserver.service

 

아래코드를 삽입해준다.

서비스 시작전에 실행하는 커맨드를 이용해서 폴더를 생성시켜준다.

ExecStartPre=/bin/mkdir /var/run/trafficserver
ExecStartPre=/bin/chown trafficserver:trafficserver /var/run/trafficserver

 

전체파일내용은 아래와 같다

[Unit]
Description=Apache Traffic Server is a fast, scalable and extensible caching proxy server.
Documentation=man:traffic_server(8)
After=network.target

[Service]
Type=simple
EnvironmentFile=-/etc/default/trafficserver
PIDFile=/var/run/trafficserver/cop.pid
ExecStartPre=/bin/mkdir /var/run/trafficserver
ExecStartPre=/bin/chown trafficserver:trafficserver /var/run/trafficserver
ExecStart=/usr/bin/traffic_cop $TC_DAEMON_ARGS
ExecReload=/usr/bin/traffic_ctl config reload

[Install]
WantedBy=multi-user.target

우분투 12.04 iptables + geoip

우분투 12.04에서 iptables와 geoip를 이용해서 국가단위로 접근을 제한하는 방법을 안내합니다.

 

설치

필요한 패키지 설치

# sudo apt-get install xtables-addons-common
# sudo apt-get install libtext-csv-xs-perl

 

GEOIP 데이터베이스 다운로드

# sudo /usr/lib/xtables-addons/xt_geoip_dl

 

다운로드한 데이터베이스 압축해제

# sudo mkdir /usr/share/xt_geoip
# sudo /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv

 

사용방법

특정 국가만 차단

# iptables -A INPUT -m geoip –src-cc CN,IN,RU,JP -j DROP

 

특정 국가를 제외한 나머지 차단

# iptables -A INPUT -m geoip ! –src-cc KR -j DROP

 

오류처리

상황

-m geoip 사용시 아래와 같은 오류발생

iptables: No chain/target/match by that name.

 

처리

xtables-addons-1.47.1 소스코드 다운로드

최신버전인 3.x는 우분투 12.04의 커널버전이 낮아서 사용할 수 없으니 1.x  버전을 사용해야 한다

 

# wget https://sourceforge.net/projects/xtables-addons/files/Xtables-addons/xtables-addons-1.47.1.tar.xz/download
# xz -d xtables-addons-1.47.1.tar.xz
# tar xf xtables-addons-1.47.1.tar
# cd xtables-addons-1.47
# ./configure
# make && make install

 

확인

아래명령을 실행해서 ‘geoip’ 가 있는지 확인

#cat /proc/net/ip_tables_matches

conntrack
conntrack
conntrack
state
geoip
udplite
udp
tcp
multiport
icmp

 

Asterisk 수신거부 코드 – DB연동

asterisk 11 버전에서 특정번호를 수신거부하는 코드입니다.

수신거부하는 번호를 DB테이블에 저장하고 관리합니다.

 

테이블스키마

CREATE TABLE `ban` (
`phone` VARCHAR(32) NOT NULL COMMENT '전화번호',
`reg_date` DATETIME NOT NULL COMMENT '등록일',
INDEX `phone` (`phone`)
)
COMMENT='수신거부 전화번호'
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

 

extensions.conf

[inbound]
exten => 07010002000,1,Answer
exten => 07010002000,n,NoOp("caller id: ${CALLERID(number)}")
exten => 07010002000,n,MYSQL(Connect connid 호스트 유저 비밀번호 데이터베이스명)
exten => 07010002000,n,MYSQL(Query resultid ${connid} SELECT COUNT(*) AS cnt_blockcaller FROM ban WHERE phone='${CALLERID(number)}')
exten => 07010002000,n,MYSQL(Fetch fetchid ${resultid} cnt_blockcaller)
exten => 07010002000,n,MYSQL(Clear ${resultid})
exten => 07010002000,n,MYSQL(Disconnect ${connid});

exten => 07010002000,n,GotoIf($["${cnt_blockcaller}" != "0"]?inbound,07010002000,blockcaller)

.
.
.

exten => 07010002000,n(blockcaller),NoOp("blockcaller!!!")
exten => 07010002000,n,Hangup()

 

 

도로명주소 API 서비스

도로명 주소 API 서비스

행정자치부에서 제공하는 OPEN API 서비스

 

API 신청페이지

https://www.juso.go.kr/addrlink/devAddrLinkRequestWrite.do?returnFn=write&cntcMenu=URL

 

PHP + Snoopy로 주소찾기 예제

코드


<?php
require_once 'Snoopy.class.php';

$params = array(
    'currentPage' => 1,
    'countPerPage' => 5,
    'resultType' => 'json',
    'confmKey' => '{발급받은 키문자열}',
    'keyword' => '서울시 마포구 합정동 10'
);

$snoopy = new Snoopy();
$snoopy->httpmethod = "POST";
$snoopy->submit("http://www.juso.go.kr/addrlink/addrLinkApiJsonp.do", $params);
$response = $snoopy->results;

// 앞뒤에 '(', ')' 문자를 제거한 뒤 json_decode()를 이용해 변환
$json = substr($response, 1, -1);
$obj = json_decode($json);

 

출력결과


stdClass Object
(
    [results] => stdClass Object
        (
            [common] => stdClass Object
                (
                    [errorMessage] => 정상
                    [countPerPage] => 5
                    [totalCount] => 73
                    [errorCode] => 0
                    [currentPage] => 1
                )

            [juso] => Array
                (
                    [0] => stdClass Object
                        (
                            [detBdNmList] => 
                            [engAddr] => 56, Tojeong-ro, Mapo-gu, Seoul
                            [rn] => 토정로
                            [emdNm] => 합정동
                            [zipNo] => 04082
                            [roadAddrPart2] =>  (합정동)
                            [sggNm] => 마포구
                            [jibunAddr] => 서울특별시 마포구 합정동  55-1
                            [siNm] => 서울특별시
                            [roadAddrPart1] => 서울특별시 마포구 토정로 56
                            [bdNm] => 
                            [admCd] => 1144012200
                            [udrtYn] => 0
                            [lnbrMnnm] => 55
                            [roadAddr] => 서울특별시 마포구 토정로 56 (합정동)
                            [lnbrSlno] => 1
                            [buldMnnm] => 56
                            [bdKdcd] => 0
                            [liNm] => 
                            [rnMgtSn] => 114403113023
                            [mtYn] => 0
                            [bdMgtSn] => 1144011800100010000009632
                            [buldSlno] => 0
                        )

                    [1] => stdClass Object
                        (
                            [detBdNmList] => 
                            [engAddr] => 35, Tojeong-ro 4-gil, Mapo-gu, Seoul
                            [rn] => 토정로4길
                            [emdNm] => 합정동
                            [zipNo] => 04085
                            [roadAddrPart2] =>  (합정동, 신성빌라)
                            [sggNm] => 마포구
                            [jibunAddr] => 서울특별시 마포구 합정동  75-10 신성빌라
                            [siNm] => 서울특별시
                            [roadAddrPart1] => 서울특별시 마포구 토정로4길 35
                            [bdNm] => 신성빌라
                            [admCd] => 1144012200
                            [udrtYn] => 0
                            [lnbrMnnm] => 75
                            [roadAddr] => 서울특별시 마포구 토정로4길 35 (합정동, 신성빌라)
                            [lnbrSlno] => 10
                            [buldMnnm] => 35
                            [bdKdcd] => 1
                            [liNm] => 
                            [rnMgtSn] => 114404139606
                            [mtYn] => 0
                            [bdMgtSn] => 1144012200100750010024923
                            [buldSlno] => 0
                        )

                    [2] => stdClass Object
                        (
                            [detBdNmList] => 
                            [engAddr] => 13-5, Tojeong-ro 4an-gil, Mapo-gu, Seoul
                            [rn] => 토정로4안길
                            [emdNm] => 합정동
                            [zipNo] => 04085
                            [roadAddrPart2] =>  (합정동)
                            [sggNm] => 마포구
                            [jibunAddr] => 서울특별시 마포구 합정동  82-10
                            [siNm] => 서울특별시
                            [roadAddrPart1] => 서울특별시 마포구 토정로4안길 13-5
                            [bdNm] => 
                            [admCd] => 1144012200
                            [udrtYn] => 0
                            [lnbrMnnm] => 82
                            [roadAddr] => 서울특별시 마포구 토정로4안길 13-5 (합정동)
                            [lnbrSlno] => 10
                            [buldMnnm] => 13
                            [bdKdcd] => 0
                            [liNm] => 
                            [rnMgtSn] => 114404139607
                            [mtYn] => 0
                            [bdMgtSn] => 1144012200100820010012210
                            [buldSlno] => 5
                        )

                    [3] => stdClass Object
                        (
                            [detBdNmList] => 
                            [engAddr] => 19, Tojeong-ro 4an-gil, Mapo-gu, Seoul
                            [rn] => 토정로4안길
                            [emdNm] => 합정동
                            [zipNo] => 04085
                            [roadAddrPart2] =>  (합정동)
                            [sggNm] => 마포구
                            [jibunAddr] => 서울특별시 마포구 합정동  82-10
                            [siNm] => 서울특별시
                            [roadAddrPart1] => 서울특별시 마포구 토정로4안길 19
                            [bdNm] => 
                            [admCd] => 1144012200
                            [udrtYn] => 0
                            [lnbrMnnm] => 82
                            [roadAddr] => 서울특별시 마포구 토정로4안길 19 (합정동)
                            [lnbrSlno] => 10
                            [buldMnnm] => 19
                            [bdKdcd] => 0
                            [liNm] => 
                            [rnMgtSn] => 114404139607
                            [mtYn] => 0
                            [bdMgtSn] => 1144012200100820010024925
                            [buldSlno] => 0
                        )

                    [4] => stdClass Object
                        (
                            [detBdNmList] => 
                            [engAddr] => 13-4, Tojeong-ro 4an-gil, Mapo-gu, Seoul
                            [rn] => 토정로4안길
                            [emdNm] => 합정동
                            [zipNo] => 04085
                            [roadAddrPart2] =>  (합정동)
                            [sggNm] => 마포구
                            [jibunAddr] => 서울특별시 마포구 합정동  82-10
                            [siNm] => 서울특별시
                            [roadAddrPart1] => 서울특별시 마포구 토정로4안길 13-4
                            [bdNm] => 
                            [admCd] => 1144012200
                            [udrtYn] => 0
                            [lnbrMnnm] => 82
                            [roadAddr] => 서울특별시 마포구 토정로4안길 13-4 (합정동)
                            [lnbrSlno] => 10
                            [buldMnnm] => 13
                            [bdKdcd] => 0
                            [liNm] => 
                            [rnMgtSn] => 114404139607
                            [mtYn] => 0
                            [bdMgtSn] => 1144012200100820010012213
                            [buldSlno] => 4
                        )

                )

        )

)

게이트웨이 핑체크

Gateway ping 확인하는 스크립트

eth0 – 192.168.100.1
eth1 – 192.168.200.1

default gateway는  192.168.100.1 로 등록되어 있는 상태에서 192.168.100.1로 핑을 계속 보내면서 네트워크를 확인한다.

최대 실패횟수가 초과하면 현재 default gateway를 제거하고 eth1의 게이트웨이를 등록하고 관리자에게 이메일을 발송한다.

 


#!/bin/sh

#####################################################################
# edit config
GW1="192.168.100.1"
GW2="192.168.200.1"
MAX_FAIL_COUNT=5
ERROR_MAILTO="me@jongwan.com"

#####################################################################
# path exec
EXEC_PING="/bin/ping"
EXEC_ROUTE="/sbin/route"
EXEC_MAIL="/usr/bin/mail"

#####################################################################
# prevent duplicate run
ME=`basename "$0"`
CHK_RUN=`pgrep -o $ME`
if [ $CHK_RUN -ne $$ ]; then
    exit
fi

#####################################################################
# checking
FAIL_COUNT=0
while(true) do
    # check ping
    CHK=`$EXEC_PING -c1 $GW1 > /dev/null; echo $?`

    # 0 is reachable, 2 is unreachable
    if [ $CHK -ne "0" ]; then
        FAIL_COUNT=$(($FAIL_COUNT+1))
    else
        FAIL_COUNT=0 # init fail_count if success ping
    fi

    # check fail count
    if [ $FAIL_COUNT -ge $MAX_FAIL_COUNT ]; then
        # add/del gateway
        echo "Gateway connection failed : $GW1"
        CMD1=`$EXEC_ROUTE del default gw $GW1`
        CMD2=`$EXEC_ROUTE add default gw $GW2`

        # send email
        CMD3=`echo "Gateway connection failed : $GW1" | $EXEC_MAIL -s "Gateway connection failed : $GW1" $ERROR_MAILTO`

        # exit shell
        break
    fi

    sleep 1
done