반응형

이번 포스팅은 opensips.cfg 내부에서 사용하는 Local Flag에 대해 알아보려고 합니다.

아래 2가지 포스팅과 유사한 점과 차이점이 있습니다.

아래 두 가지 포스팅을 참고하시면 좋을 것 같습니다.

1. Global Flag 

OpenSIPS - Global Flag (gflags Module)

 

OpenSIPS - Global Flag (gflags Module)

이번 포스팅은 OpenSIPS에 Global 한 Flag를 제어할 수 있는 gflags Module에 대한 내용입니다. 이 곳에 gflags를 검색하셔서 들어오신 거라면 이미 VoIP와 OpenSIPS에 대한 전반적인 내용은 알고 계실 거라고 생..

dragonchan.tistory.com

2. Global Value

OpenSIPS - cfgutils Module (shvget, shvset) opensips.cfg 에서 변수 세팅

 

OpenSIPS - cfgutils Module (shvget, shvset) opensips.cfg 에서 변수 세팅

이번 포스팅은 OpenSIPS의 Global Flag(OpenSIPS - Global Flag (gflags Module))에 이어서 cfgutils Module입니다. 둘 간 약간은 유사하다고 볼 수 있겠네요. Global Flag는 서비스에서 무언가 분기 처리를 하기..

dragonchan.tistory.com

먼저 이번 주제인 Local Flag 는 기존 포스팅인 Global Flag 와의 공통점은 Flag라는 점이고, 차이점은 Local 이냐 Global 이냐입니다.

기존의 Flag는 Global 하게 Flag 를 세팅하고, module interface 에서 외부에서 서비스 중단없이 Flag 를 세팅했다면, Local Flag 는 opensips.cfg 스크립트 내부에서 필요한 분기 처리를 간단하게 하기 위한 Flag라고 보시면 될 것 같습니다.

제가 운영하는 VoIP 서비스는 OpenSIPS 2.4를 포팅하였으므로, 2.4 문서 기준으로 설명드리겠습니다.

https://www.opensips.org/Documentation/Script-Flags-2-4

 

openSIPS | Documentation / Script Flags - 2.4

Documentation -> Manuals -> Manual 2.4 -> Script Flags Pages for other versions: devel 3.0 2.4 Older versions: 2.3 2.2 2.1 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.  Types of flags message flags (or transaction flags) these flags are transaction persistent. The

www.opensips.org


1. 분기에 따른 Flag SET

  • 분기문에 따라 Flag 값을 다음과 같이 세팅합니다.
  • setflag(flag_name);


2. 세팅한 Flag에 따른 분기 처리 구현

  • 위에서 세팅한 Flag 이름으로 새로운 분기를 구현할 수 있습니다
  • isflagset(flag_name)


3. 기존 Flag RESET & 새로운 Flag SET

  • 새로운 Flag를 SET 하기 위해선 반드시 기존에 세팅하였던 Flag 를 RESET 해주어야 합니다. (RESET 해주지 않았을 경우에는 새로운 Flag로 Overwrite 되지 않습니다.
  • resetflag(flag_name);
  • setflag(new_flag_name);


4. 새로운 Flag에 따른 분기 처리 구현

  • 2번과 동일합니다.
  • 새로이 세팅한 Flag로 분기 처리를 구현할 수 있습니다.


정리

기존 Global Flag와 다르게 Local Flag 는 opensips.cfg 에서 사용할 수 있습니다.

따라서, Global Flag 와 같이 module interface로 서비스 중단 없이 Flag를 변경할 수 없고, opensips.cfg 스크립트 내부에서 수정하고 다시 빌드하여 데몬을 재시작해야 합니다.

장단점이 있지만, 상황에 맞게 Global Flag를 쓸 것인지, Local Flag 를 쓸 것인지 잘 판단하여 사용하면 될 것으로 보입니다.

끝.

반응형
블로그 이미지

yesnomark

이것저것 개발하며 애매하게 경력쌓고 있는 중니어 개발자

,
반응형

이번 포스팅은 OpenSIPS의 Global Flag(OpenSIPS - Global Flag (gflags Module))에 이어서 cfgutils Module입니다.

둘 간 약간은 유사하다고 볼 수 있겠네요.

Global Flag는 서비스에서 무언가 분기 처리를 하기 위한 Flag 값 선언이라면,

이번 cfguilts 모듈에서 shvget, shvset 은 변숫값 선언을 할 수 있는 것이 차이점입니다.

단순 변숫값을 세팅하는 거라면 이 모듈을 사용하지 않아도 되지만, 세팅하고자 하는 변수가 가변적이어서 상황에 맞게 변수값 세팅을 변경해야 한다면 이 모듈을 사용하는 것을 추천드립니다.

다시 말해서, opensips.cfg 에서 X값을 통해 분기 처리를 할 경우,

X값이 가변적이라서 100으로 세팅하던 것을 (서비스 중지 없이) 상황에 따라 200, 300으로 바꿔야 한다면 가장 적합한 상황이라는 것입니다.

 

cfgutils Module 문서입니다.

https://opensips.org/html/docs/modules/2.4.x/cfgutils.html

 

cfgutils Module

Last edited by: Liviu Chircu (@liviuchircu), Bogdan-Andrei Iancu (@bogdan-iancu), Razvan Crainea (@razvancrainea), Anca Vamanu, Sergio Gutierrez, Henning Westerholt (@henningw), Daniel-Constantin Mierla (@miconda), Elena-Ramona Modroiu, Konstantin Bokarius

opensips.org

제가 운영하고 있는 VoIP 서비스에 포팅한 OpenSIPS의 버전이 2.4 여서 이 문서의 모듈 기준으로 설명드리도록 하겠습니다.


1. cfgutils Module 선언 및 value 초기값 세팅

  • cfgutils.so 모듈 로드
  • 초기값 1500으로 선언


 

2. value 값 GET

  • cfgutils Module에서 제공하는 Interface를 통해 현재 value 값을 구합니다.
  • $ opensipsctl fifo shv_get debug


 

3. value 값 SET

  • GET과 마찬가지로 MI를 통해 현재 value 값을 세팅해줍니다. (서비스 중지 없이)
  • $ opensipsctl fifo shv_set debug int 2000
  • value 값 세팅이 제대로 되었는지 확인을 위해 다시 GET을 합니다.


 

4. 세팅한 value 값으로 opensips.cfg 에서 구현 및 제어

  • 위에서 SET 한 value는 $shv(debug) 안에 세팅되어있습니다.
  • $var(test)라는 임의의 데이터를 다음과 같이 분기 처리를 해주고, 상황에 따라 데이터를 변경해야 한다면 위 3번으로 변경을 시켜주어 제어하면 됩니다.


 

정리

gflags Module과 마찬가지로 Flag 값 제어에 이어서 Value 값 제어까지 알아보았습니다.

핵심은 분기 처리에서 제어할 데이터가 있는데, 제어할 데이터가 상황에 따라 가변적이다 할 경우에 이 모듈을 사용하시면 가장 적합합니다.

누군가에겐 도움이 되었기를...

반응형
블로그 이미지

yesnomark

이것저것 개발하며 애매하게 경력쌓고 있는 중니어 개발자

,
반응형

VoIP 프레임워크로 잘 알려져 있는 OpenSIPS에서 발신자 기준 동시통화를 제한할 수 있는 Profile에 대해서 정리하려고 합니다.

OpenSIPS 사이트

https://opensips.org/

 

openSIPS | Main / HomePage

» OpenSIPS Summit 2020 - 18th of March 2020IMPORTANT! In the context of the COVID-19 pandemic, by the community poll, we decided to postpone for beginning of September 2020 » Introducing OpenSIPS 3.1 - 19th of December 2019Take a glimpse into the roadmap o

opensips.org

먼저 get_profile_size를 검색하고 오신 거라 가정하고, VoIP 및 SIP에 대한 설명은 생략하도록 하겠습니다.

OpenSIPS에서 제공하는 API 중에 get_profile_size를 활용하여 발신자 기준(caller) 동시통화를 제한해보려고 합니다.

동시통화를 제한하는 이유는 실제 서비스에서 시스템적으로 악의적인 콜 시도(예를 들면 DOS Attack 같은 거라고 보면 되지요)로 인해 서버 과부하 및 서비스에 문제가 될 수 있기 때문입니다.

저희 서비스는 OpenSIPS 2.4를 기반으로 되어 있어서 OpenSIPS Documentation 2.4를 참고하였습니다.

https://opensips.org/docs/modules/2.4.x/dialog.html

 

dialog Module

 

opensips.org


OpenSIPS 2.4 Documentation 의 Dialog 모듈

get_profile_size

프로파일에 속하는 Dialog 수를 리턴합니다. 프로파일이 값을 지원하는 경우 특정 값 (특정 값을 가진 프로파일에 삽입된 Dialog 갯수)을 고려하여 검사를 강화할 수 있습니다. 값이 전달되지 않으면 Dialog 가 프로필에 속하는 것만 확인됩니다. 프로파일은 값을 지원하지 않으므로이 값은 자동으로 삭제됩니다.

매개 변수의 의미는 다음과 같습니다.
profile - 크기를 가져올 프로파일의 이름, 의사 변수가 지원됩니다.
value (선택 사항) - 점검을 강화하기위한 문자열 값. 의사 변수가 지원됩니다.
size - 프로파일 크기를 반환하는 AVP 또는 스크립트 변수.


스크립트 작성

위와 같이 진행하면 되는데요.

먼저 modparam 두 가지 (profile_no_value, profiles_with_value) 중에서 우리는 발신자 기준을 정해야 하므로 profiles_with_value로 설정해주고, profilecaller로 설정해줍니다.

1. dialog 모듈 설정

modparam("dialog", "profiles_with_value", "caller")

dialog module


2. INVITE 일 경우,  get_profile_size

  • profile - 크기를 가져올 프로파일의 이름, 의사 변수가 지원됩니다. caller
  • value (선택 사항) - 점검을 강화하기위한 문자열 값. 의사 변수가 지원됩니다. $fU
  • size - 프로파일 크기를 반환하는 AVP 또는 스크립트 변수. $var(caller)

get_profile_size

1번에서 설정한 profile 이름caller첫 번째 파라미터로 들어가고,

두 번째 파라미터$fU, from Username으로 발신자의 전화번호입니다.(자세한 건 OpenSIPS Documentation 확인)

세 번째 파라미터는 발신자 기준 profile size를 할당할 변수를 세팅해줍니다.

그 밑은 발신자 기준으로 0콜 이상일 경우에 대한 예외처리를 해준 코드입니다.


3. set_dlg_profile("caller", "$fU")

set_dlg_profile

다이얼로그 마지막에 profile 에 대한 set을 해주면 끝

다시 말해 set_dlg_profile 이 있어야, get_profile_sizeprofile의 크기가 누적이 되는 것입니다.


정리.

동시통화 제한을 두기 위해서 OpenSIPS API 중에 get_profile_size를 이용해보았는데요,

profile 은 여러개 사용 가능하여, 콜마다 다양한 설정을 해줄 수 있습니다.

예를 들어 get_profile_size 의 두 번째 파라미터의 값을 비워두게 되면 전체 콜에 대한 profile 이 되어, 전체 콜에 대한 사이즈를 구할 수 있을 것이고,

callee로 지정해주면 수신자의 개수를 구할 수 있겠지요. 물론 callee를 구할 경우에는 $fU 대신 $rU 가 들어가야 할 것 같습니다.

누군가에겐 도움이 되었기를...

반응형
블로그 이미지

yesnomark

이것저것 개발하며 애매하게 경력쌓고 있는 중니어 개발자

,