Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Icecast-Server
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
94
Issues
94
List
Boards
Labels
Service Desk
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
External Wiki
External Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Xiph.Org
Icecast-Server
Commits
d782eb4c
Commit
d782eb4c
authored
Jul 09, 2018
by
Philipp Schafft
🦁
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Feature: Allow admin commands to have embedded parameters
parent
046bfb9c
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
55 additions
and
34 deletions
+55
-34
src/admin.c
src/admin.c
+52
-34
src/admin.h
src/admin.h
+3
-0
No files found.
src/admin.c
View file @
d782eb4c
...
...
@@ -118,37 +118,37 @@ static void command_updatemetadata (client_t *client, source_t *source, adm
static
void
command_buildm3u
(
client_t
*
client
,
source_t
*
source
,
admin_format_t
response
);
static
const
admin_command_handler_t
handlers
[]
=
{
{
"*"
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_HTML
,
NULL
},
/* for ACL framework */
{
FALLBACK_RAW_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_RAW
,
command_fallback
},
{
FALLBACK_HTML_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_HTML
,
command_fallback
},
{
METADATA_RAW_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_RAW
,
command_metadata
},
{
METADATA_HTML_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_HTML
,
command_metadata
},
{
SHOUTCAST_METADATA_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_HTML
,
command_shoutcast_metadata
},
{
LISTCLIENTS_RAW_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_RAW
,
command_show_listeners
},
{
LISTCLIENTS_HTML_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_HTML
,
command_show_listeners
},
{
STATS_RAW_REQUEST
,
ADMINTYPE_HYBRID
,
ADMIN_FORMAT_RAW
,
command_stats
},
{
STATS_HTML_REQUEST
,
ADMINTYPE_HYBRID
,
ADMIN_FORMAT_HTML
,
command_stats
},
{
"stats.xml"
,
ADMINTYPE_HYBRID
,
ADMIN_FORMAT_RAW
,
command_stats
},
{
QUEUE_RELOAD_RAW_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_RAW
,
command_queue_reload
},
{
QUEUE_RELOAD_HTML_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_HTML
,
command_queue_reload
},
{
LISTMOUNTS_RAW_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_RAW
,
command_list_mounts
},
{
LISTMOUNTS_HTML_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_HTML
,
command_list_mounts
},
{
STREAMLIST_RAW_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_RAW
,
command_list_mounts
},
{
STREAMLIST_PLAINTEXT_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_PLAINTEXT
,
command_list_mounts
},
{
STREAMLIST_HTML_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_HTML
,
command_list_mounts
},
{
MOVECLIENTS_RAW_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_RAW
,
command_move_clients
},
{
MOVECLIENTS_HTML_REQUEST
,
ADMINTYPE_HYBRID
,
ADMIN_FORMAT_HTML
,
command_move_clients
},
{
KILLCLIENT_RAW_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_RAW
,
command_kill_client
},
{
KILLCLIENT_HTML_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_HTML
,
command_kill_client
},
{
KILLSOURCE_RAW_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_RAW
,
command_kill_source
},
{
KILLSOURCE_HTML_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_HTML
,
command_kill_source
},
{
MANAGEAUTH_RAW_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_RAW
,
command_manageauth
},
{
MANAGEAUTH_HTML_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_HTML
,
command_manageauth
},
{
UPDATEMETADATA_RAW_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_RAW
,
command_updatemetadata
},
{
UPDATEMETADATA_HTML_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_HTML
,
command_updatemetadata
},
{
BUILDM3U_RAW_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_RAW
,
command_buildm3u
},
{
DEFAULT_HTML_REQUEST
,
ADMINTYPE_HYBRID
,
ADMIN_FORMAT_HTML
,
command_stats
},
{
DEFAULT_RAW_REQUEST
,
ADMINTYPE_HYBRID
,
ADMIN_FORMAT_HTML
,
command_stats
}
{
"*"
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_HTML
,
NULL
,
NULL
},
/* for ACL framework */
{
FALLBACK_RAW_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_RAW
,
command_fallback
,
NULL
},
{
FALLBACK_HTML_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_HTML
,
command_fallback
,
NULL
},
{
METADATA_RAW_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_RAW
,
command_metadata
,
NULL
},
{
METADATA_HTML_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_HTML
,
command_metadata
,
NULL
},
{
SHOUTCAST_METADATA_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_HTML
,
command_shoutcast_metadata
,
NULL
},
{
LISTCLIENTS_RAW_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_RAW
,
command_show_listeners
,
NULL
},
{
LISTCLIENTS_HTML_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_HTML
,
command_show_listeners
,
NULL
},
{
STATS_RAW_REQUEST
,
ADMINTYPE_HYBRID
,
ADMIN_FORMAT_RAW
,
command_stats
,
NULL
},
{
STATS_HTML_REQUEST
,
ADMINTYPE_HYBRID
,
ADMIN_FORMAT_HTML
,
command_stats
,
NULL
},
{
"stats.xml"
,
ADMINTYPE_HYBRID
,
ADMIN_FORMAT_RAW
,
command_stats
,
NULL
},
{
QUEUE_RELOAD_RAW_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_RAW
,
command_queue_reload
,
NULL
},
{
QUEUE_RELOAD_HTML_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_HTML
,
command_queue_reload
,
NULL
},
{
LISTMOUNTS_RAW_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_RAW
,
command_list_mounts
,
NULL
},
{
LISTMOUNTS_HTML_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_HTML
,
command_list_mounts
,
NULL
},
{
STREAMLIST_RAW_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_RAW
,
command_list_mounts
,
NULL
},
{
STREAMLIST_PLAINTEXT_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_PLAINTEXT
,
command_list_mounts
,
NULL
},
{
STREAMLIST_HTML_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_HTML
,
command_list_mounts
,
NULL
},
{
MOVECLIENTS_RAW_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_RAW
,
command_move_clients
,
NULL
},
{
MOVECLIENTS_HTML_REQUEST
,
ADMINTYPE_HYBRID
,
ADMIN_FORMAT_HTML
,
command_move_clients
,
NULL
},
{
KILLCLIENT_RAW_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_RAW
,
command_kill_client
,
NULL
},
{
KILLCLIENT_HTML_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_HTML
,
command_kill_client
,
NULL
},
{
KILLSOURCE_RAW_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_RAW
,
command_kill_source
,
NULL
},
{
KILLSOURCE_HTML_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_HTML
,
command_kill_source
,
NULL
},
{
MANAGEAUTH_RAW_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_RAW
,
command_manageauth
,
NULL
},
{
MANAGEAUTH_HTML_REQUEST
,
ADMINTYPE_GENERAL
,
ADMIN_FORMAT_HTML
,
command_manageauth
,
NULL
},
{
UPDATEMETADATA_RAW_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_RAW
,
command_updatemetadata
,
NULL
},
{
UPDATEMETADATA_HTML_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_HTML
,
command_updatemetadata
,
NULL
},
{
BUILDM3U_RAW_REQUEST
,
ADMINTYPE_MOUNT
,
ADMIN_FORMAT_RAW
,
command_buildm3u
,
NULL
},
{
DEFAULT_HTML_REQUEST
,
ADMINTYPE_HYBRID
,
ADMIN_FORMAT_HTML
,
command_stats
,
NULL
},
{
DEFAULT_RAW_REQUEST
,
ADMINTYPE_HYBRID
,
ADMIN_FORMAT_HTML
,
command_stats
,
NULL
}
};
static
admin_command_table_t
command_tables
[
ADMIN_MAX_COMMAND_TABLES
]
=
{
...
...
@@ -247,7 +247,7 @@ admin_command_id_t admin_get_command(const char *command)
}
for
(
i
=
0
;
i
<
table
->
length
;
i
++
)
if
(
strcmp
(
table
->
handlers
[
i
].
route
,
suffix
)
==
0
)
if
(
resourcematch_match
(
table
->
handlers
[
i
].
route
,
suffix
,
NULL
)
==
RESOURCEMATCH_MATCH
)
return
admin_get_command_by_table_and_index
(
table
,
i
);
return
COMMAND_ERROR
;
...
...
@@ -480,7 +480,7 @@ void admin_handle_request(client_t *client, const char *uri)
handler
=
admin_get_handler
(
client
->
admin_command
);
/* Check if admin command is valid */
if
(
handler
==
NULL
||
handler
->
function
==
NULL
)
{
if
(
handler
==
NULL
||
(
handler
->
function
==
NULL
&&
handler
->
function_with_parameters
==
NULL
)
)
{
ICECAST_LOG_ERROR
(
"Error parsing command string or unrecognised command: %H"
,
uri
);
client_send_error_by_id
(
client
,
ICECAST_ERROR_ADMIN_UNRECOGNISED_COMMAND
);
...
...
@@ -545,7 +545,25 @@ void admin_handle_request(client_t *client, const char *uri)
switch
(
client
->
parser
->
req_type
)
{
case
httpp_req_get
:
case
httpp_req_post
:
handler
->
function
(
client
,
source
,
format
);
if
(
handler
->
function
)
{
handler
->
function
(
client
,
source
,
format
);
}
else
{
resourcematch_extract_t
*
extract
=
NULL
;
const
char
*
suffix
=
strchr
(
uri
,
'/'
);
if
(
!
suffix
)
{
client_send_error_by_id
(
client
,
ICECAST_ERROR_ADMIN_UNRECOGNISED_COMMAND
);
}
else
{
suffix
++
;
if
(
resourcematch_match
(
handler
->
route
,
suffix
,
&
extract
)
==
RESOURCEMATCH_MATCH
)
{
handler
->
function_with_parameters
(
client
,
source
,
format
,
extract
);
resourcematch_extract_free
(
extract
);
}
else
{
client_send_error_by_id
(
client
,
ICECAST_ERROR_ADMIN_UNRECOGNISED_COMMAND
);
}
}
}
break
;
case
httpp_req_options
:
client_send_204
(
client
);
...
...
src/admin.h
View file @
d782eb4c
...
...
@@ -19,6 +19,7 @@
#include "icecasttypes.h"
#include "compat.h"
#include "resourcematch.h"
/* types */
#define ADMINTYPE_ERROR (-1)
...
...
@@ -31,12 +32,14 @@
#define ADMIN_COMMAND_ANY ((admin_command_id_t)0)
/* for ACL framework */
typedef
void
(
*
admin_request_function_ptr
)(
client_t
*
client
,
source_t
*
source
,
admin_format_t
format
);
typedef
void
(
*
admin_request_function_with_parameters_ptr
)(
client_t
*
client
,
source_t
*
source
,
admin_format_t
format
,
resourcematch_extract_t
*
parameters
);
typedef
struct
admin_command_handler
{
const
char
*
route
;
const
int
type
;
const
int
format
;
const
admin_request_function_ptr
function
;
const
admin_request_function_with_parameters_ptr
function_with_parameters
;
}
admin_command_handler_t
;
void
admin_handle_request
(
client_t
*
client
,
const
char
*
uri
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment