From 90a11c4ae7cb0eb963bdd18c081c308baf34d1ba Mon Sep 17 00:00:00 2001
From: Corey Farrell <git@cfware.com>
Date: Wed, 10 Oct 2018 08:09:15 -0400
Subject: [PATCH] chan_sip deprecation.

This officially deprecates chan_sip in Asterisk 17+.  A warning is
printed upon startup or module load to tell users that they should
consider migrating.  chan_sip is still built by default but the default
modules.conf skips loading it at startup.

Very important to note we are not scheduling a time where chan_sip will
be removed.  The goal of this change is to accurately inform end users
of the current state of chan_sip and encourage movement to the fully
supported chan_pjsip.

Change-Id: Icebd8848f63feab94ef882d36b2e99d73155af93
---
 CHANGES                             | 11 ++++++++
 UPGRADE.txt                         |  6 +++++
 channels/chan_sip.c                 | 41 +++++++++++++++++++++++++++--
 channels/sip/config_parser.c        |  2 +-
 channels/sip/dialplan_functions.c   |  2 +-
 channels/sip/reqresp_parser.c       |  2 +-
 channels/sip/route.c                |  2 +-
 channels/sip/security_events.c      |  2 +-
 channels/sip/utils.c                |  2 +-
 configs/samples/modules.conf.sample |  4 ++-
 10 files changed, 65 insertions(+), 9 deletions(-)

diff --git a/CHANGES b/CHANGES
index bd1a7a794f..5bfdc5411c 100644
--- a/CHANGES
+++ b/CHANGES
@@ -8,6 +8,17 @@
 ===
 ==============================================================================
 
+------------------------------------------------------------------------------
+--- Functionality changes from Asterisk 16 to Asterisk 17 --------------------
+------------------------------------------------------------------------------
+
+chan_sip
+------------------
+ * The chan_sip module is now deprecated, users should migrate to the
+   replacement module chan_pjsip.  See guides at the Asterisk Wiki:
+     https://wiki.asterisk.org/wiki/x/tAHOAQ
+     https://wiki.asterisk.org/wiki/x/hYCLAQ
+
 ------------------------------------------------------------------------------
 --- Functionality changes from Asterisk 16.0.0 to Asterisk 16.1.0 ------------
 ------------------------------------------------------------------------------
diff --git a/UPGRADE.txt b/UPGRADE.txt
index 7506af2e2f..3cf8e2784f 100644
--- a/UPGRADE.txt
+++ b/UPGRADE.txt
@@ -27,6 +27,12 @@
 
 New in 17.0.0:
 
+chan_sip:
+ - The chan_sip module is now deprecated, users should migrate to the
+   replacement module chan_pjsip.  See guides at the Asterisk Wiki:
+     https://wiki.asterisk.org/wiki/x/tAHOAQ
+     https://wiki.asterisk.org/wiki/x/hYCLAQ
+
 func_callerid:
  - The CALLERPRES() dialplan function, deprecated in Asterisk 1.8, has been
    removed.
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 5097d46860..3aae905bf8 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -176,7 +176,7 @@
 /*** MODULEINFO
 	<use type="module">res_crypto</use>
 	<use type="module">res_http_websocket</use>
-	<support_level>extended</support_level>
+	<support_level>deprecated</support_level>
  ***/
 
 /*!  \page sip_session_timers SIP Session Timers in Asterisk Chan_sip
@@ -35321,6 +35321,37 @@ static const struct ast_sip_api_tech chan_sip_api_provider = {
 	.sipinfo_send = sipinfo_send,
 };
 
+static void deprecation_notice(void)
+{
+	ast_log(LOG_WARNING, "chan_sip has no official maintainer and is deprecated.  Migration to\n");
+	ast_log(LOG_WARNING, "chan_pjsip is recommended.  See guides at the Asterisk Wiki:\n");
+	ast_log(LOG_WARNING, "https://wiki.asterisk.org/wiki/x/tAHOAQ\n");
+	ast_log(LOG_WARNING, "https://wiki.asterisk.org/wiki/x/hYCLAQ\n");
+}
+
+/*! \brief Event callback which indicates we're fully booted */
+static void startup_event_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message)
+{
+	struct ast_json_payload *payload;
+	const char *type;
+
+	if (stasis_message_type(message) != ast_manager_get_generic_type()) {
+		return;
+	}
+
+	payload = stasis_message_data(message);
+	type = ast_json_string_get(ast_json_object_get(payload->json, "type"));
+
+	if (strcmp(type, "FullyBooted")) {
+		return;
+	}
+
+	deprecation_notice();
+
+	stasis_unsubscribe(sub);
+}
+
+
 static int unload_module(void);
 
 /*!
@@ -35534,6 +35565,12 @@ static int load_module(void)
 		ast_websocket_add_protocol("sip", sip_websocket_callback);
 	}
 
+	if (ast_fully_booted) {
+		deprecation_notice();
+	} else {
+		stasis_subscribe_pool(ast_manager_get_topic(), startup_event_cb, NULL);
+	}
+
 	return AST_MODULE_LOAD_SUCCESS;
 }
 
@@ -35751,7 +35788,7 @@ static int unload_module(void)
 }
 
 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Session Initiation Protocol (SIP)",
-	.support_level = AST_MODULE_SUPPORT_CORE,
+	.support_level = AST_MODULE_SUPPORT_DEPRECATED,
 	.load = load_module,
 	.unload = unload_module,
 	.reload = reload,
diff --git a/channels/sip/config_parser.c b/channels/sip/config_parser.c
index 211f600167..64cb66af59 100644
--- a/channels/sip/config_parser.c
+++ b/channels/sip/config_parser.c
@@ -20,7 +20,7 @@
  */
 
 /*** MODULEINFO
-	<support_level>extended</support_level>
+	<support_level>deprecated</support_level>
  ***/
 
 #include "asterisk.h"
diff --git a/channels/sip/dialplan_functions.c b/channels/sip/dialplan_functions.c
index 09804ce8a2..7c34fc9023 100644
--- a/channels/sip/dialplan_functions.c
+++ b/channels/sip/dialplan_functions.c
@@ -20,7 +20,7 @@
  */
 
 /*** MODULEINFO
-	<support_level>extended</support_level>
+	<support_level>deprecated</support_level>
  ***/
 
 /*** DOCUMENTATION
diff --git a/channels/sip/reqresp_parser.c b/channels/sip/reqresp_parser.c
index 4d91446004..b43bed61e9 100644
--- a/channels/sip/reqresp_parser.c
+++ b/channels/sip/reqresp_parser.c
@@ -20,7 +20,7 @@
  */
 
 /*** MODULEINFO
-	<support_level>extended</support_level>
+	<support_level>deprecated</support_level>
  ***/
 
 #include "asterisk.h"
diff --git a/channels/sip/route.c b/channels/sip/route.c
index 584b46b704..916c3afe43 100644
--- a/channels/sip/route.c
+++ b/channels/sip/route.c
@@ -20,7 +20,7 @@
  */
 
 /*** MODULEINFO
-	<support_level>extended</support_level>
+	<support_level>deprecated</support_level>
  ***/
 
 #include "asterisk.h"
diff --git a/channels/sip/security_events.c b/channels/sip/security_events.c
index 86ba413d3c..eabc9045f4 100644
--- a/channels/sip/security_events.c
+++ b/channels/sip/security_events.c
@@ -25,7 +25,7 @@
  */
 
 /*** MODULEINFO
-	<support_level>extended</support_level>
+	<support_level>deprecated</support_level>
  ***/
 
 #include "asterisk.h"
diff --git a/channels/sip/utils.c b/channels/sip/utils.c
index 45a41283b4..d53316cf15 100644
--- a/channels/sip/utils.c
+++ b/channels/sip/utils.c
@@ -22,7 +22,7 @@
  */
 
 /*** MODULEINFO
-	<support_level>extended</support_level>
+	<support_level>deprecated</support_level>
  ***/
 
 #include "asterisk.h"
diff --git a/configs/samples/modules.conf.sample b/configs/samples/modules.conf.sample
index c6c0dbc2b6..793245dc9b 100644
--- a/configs/samples/modules.conf.sample
+++ b/configs/samples/modules.conf.sample
@@ -41,4 +41,6 @@ noload => chan_console.so
 noload => res_hep.so
 noload => res_hep_pjsip.so
 noload => res_hep_rtcp.so
-;
+
+; Do not load chan_sip by default, it may conflict with res_pjsip.
+noload => chan_sip.so
-- 
GitLab