quit clients via webinterface
This commit is contained in:
parent
2e21d27d10
commit
4709dd9f6d
38
connection.c
38
connection.c
@ -219,7 +219,7 @@ int ctcs_accept_handler(int fd, void *privdata)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ctcs_httpd_handler(struct httpd_con *con, void *privdata)
|
int ctcs_httpd_show(struct httpd_con *con, void *privdata)
|
||||||
{
|
{
|
||||||
struct linebuffer *lbuf = create_linebuffer(16384);
|
struct linebuffer *lbuf = create_linebuffer(16384);
|
||||||
if (lbuf == NULL) {
|
if (lbuf == NULL) {
|
||||||
@ -235,9 +235,9 @@ int ctcs_httpd_handler(struct httpd_con *con, void *privdata)
|
|||||||
if (list_empty(&torrent->client_list))
|
if (list_empty(&torrent->client_list))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
linebuffer_printf(lbuf, "<table border=\"1\">\n<tr><td colspan=\"5\" align=\"center\">%s</td></tr>\n", torrent->name);
|
linebuffer_printf(lbuf, "<table border=\"1\">\n<tr><td colspan=\"6\" align=\"center\">%s</td></tr>\n", torrent->name);
|
||||||
linebuffer_printf(lbuf, "<tr></td><td><b>Client IP:Port</b></td><td><b>Chunks (have/total/avail)</b></td>");
|
linebuffer_printf(lbuf, "<tr></td><td><b>Client IP:Port</b></td><td><b>Chunks (have/total/avail)</b></td><td><b>Download total(current)</b></td>");
|
||||||
linebuffer_printf(lbuf, "<td><b>Download total(current)</b></td><td><b>Upload total(current)</b></td><td><b>Completed since</b></td></tr>\n");
|
linebuffer_printf(lbuf, "<td><b>Upload total(current)</b></td><td><b>Completed since</b></td><td><b>Quit</b></td></tr>\n");
|
||||||
|
|
||||||
struct client_con *tmp;
|
struct client_con *tmp;
|
||||||
list_for_each_entry(tmp, &torrent->client_list, list) {
|
list_for_each_entry(tmp, &torrent->client_list, list) {
|
||||||
@ -245,9 +245,11 @@ int ctcs_httpd_handler(struct httpd_con *con, void *privdata)
|
|||||||
get_sockaddr_buf(&tmp->addr),
|
get_sockaddr_buf(&tmp->addr),
|
||||||
(double)tmp->chunk_have / (double)tmp->chunk_total * 100.0, tmp->chunk_have, tmp->chunk_total, tmp->chunk_avail);
|
(double)tmp->chunk_have / (double)tmp->chunk_total * 100.0, tmp->chunk_have, tmp->chunk_total, tmp->chunk_avail);
|
||||||
|
|
||||||
linebuffer_printf(lbuf, "<td align=\"right\">%llu (%d)</td><td align=\"right\">%llu (%d)</td><td align=\"right\">%s</td></tr>\n",
|
linebuffer_printf(lbuf, "<td align=\"right\">%llu (%d)</td><td align=\"right\">%llu (%d)</td><td align=\"right\">%s</td>",
|
||||||
tmp->total_dn, tmp->bw_dn, tmp->total_up, tmp->bw_up,
|
tmp->total_dn, tmp->bw_dn, tmp->total_up, tmp->bw_up,
|
||||||
(tmp->completed != 0) ? ctime(&tmp->completed) : "-");
|
(tmp->completed != 0) ? ctime(&tmp->completed) : "-");
|
||||||
|
|
||||||
|
linebuffer_printf(lbuf, "<td><a href=\"/quit?client=%s\">Quit</td></tr>\n", get_sockaddr_buf(&tmp->addr));
|
||||||
}
|
}
|
||||||
linebuffer_printf(lbuf, "</table>\n<br><br>\n");
|
linebuffer_printf(lbuf, "</table>\n<br><br>\n");
|
||||||
}
|
}
|
||||||
@ -257,3 +259,29 @@ int ctcs_httpd_handler(struct httpd_con *con, void *privdata)
|
|||||||
linebuffer_free(lbuf);
|
linebuffer_free(lbuf);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ctcs_httpd_quit(struct httpd_con *con, void *privdata)
|
||||||
|
{
|
||||||
|
if (con->req_arg_cnt == 2 && strncmp(con->req_args[1], "client=", 7) == 0) {
|
||||||
|
struct sockaddr_in addr;
|
||||||
|
if (parse_sockaddr(con->req_args[1] +7, &addr) == 0) {
|
||||||
|
struct torrent_file *torrent;
|
||||||
|
list_for_each_entry(torrent, &torrent_list, list) {
|
||||||
|
struct client_con *search;
|
||||||
|
list_for_each_entry(search, &torrent->client_list, list) {
|
||||||
|
if (search->addr.sin_addr.s_addr != addr.sin_addr.s_addr)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (search->addr.sin_port != addr.sin_port)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
write(event_get_fd(search->event), "CTQUIT\n", 7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char *text = "HTTP/1.0 302 OK\r\nContent-Type: text/html\r\nConnection: close\r\nLocation: /\r\n\r\n";
|
||||||
|
write(con->fd, text, strlen(text));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
int ctcs_trigger_status(void *privdata);
|
int ctcs_trigger_status(void *privdata);
|
||||||
int ctcs_accept_handler(int fd, void *privdata);
|
int ctcs_accept_handler(int fd, void *privdata);
|
||||||
int ctcs_httpd_handler(struct httpd_con *con, void *privdata);
|
int ctcs_httpd_show(struct httpd_con *con, void *privdata);
|
||||||
|
int ctcs_httpd_quit(struct httpd_con *con, void *privdata);
|
||||||
|
|
||||||
#endif /* _CONNECTION_H_ */
|
#endif /* _CONNECTION_H_ */
|
||||||
|
@ -39,7 +39,8 @@ int main(int argc, char *argv[])
|
|||||||
config_get_strings("global", "listen", listen_cb, ctcs_accept_handler);
|
config_get_strings("global", "listen", listen_cb, ctcs_accept_handler);
|
||||||
config_get_strings("global", "listen-http", listen_cb, httpd_accept_handler);
|
config_get_strings("global", "listen-http", listen_cb, httpd_accept_handler);
|
||||||
|
|
||||||
httpd_add_cb("/", 1, ctcs_httpd_handler, NULL);
|
httpd_add_cb("/quit", 0, ctcs_httpd_quit, NULL);
|
||||||
|
httpd_add_cb("/", 1, ctcs_httpd_show, NULL);
|
||||||
|
|
||||||
struct timeval tv = { .tv_sec = 10, .tv_usec = 0 };
|
struct timeval tv = { .tv_sec = 10, .tv_usec = 0 };
|
||||||
event_add_timeout(&tv, ctcs_trigger_status, NULL);
|
event_add_timeout(&tv, ctcs_trigger_status, NULL);
|
||||||
|
Loading…
Reference in New Issue
Block a user