-
Notifications
You must be signed in to change notification settings - Fork 727
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Variable TCP Telnet ports via web interface #205
base: master
Are you sure you want to change the base?
Changes from 22 commits
563957f
143eb24
eb7fde7
5cb0350
fb1bbd3
93ca100
02197a9
8919ff6
f315385
59edf88
6054496
a230f42
4bddea7
04bbccb
936951d
0009d8f
bead65f
c3a3b06
67a05de
1cf190a
6fb97bd
a01db32
157569e
fe95b4b
ffd13c6
3cb3804
a9f583e
7a93821
00d8b9f
973e4fb
b79a6d6
d887feb
e25d896
30658c5
8cd915f
1da3ce7
6a730e7
7d60520
338f983
3fdfe93
3f16121
2458e11
27e6b5d
36f15c9
59a4707
654f2ef
4b3293e
547540d
589158e
f3060e6
286e886
6596883
0b8368a
b8404a1
bda82de
623f7b4
5e346a3
b5243b0
6fd5938
25feca5
23a904f
1df972b
153f470
9fcee90
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,3 @@ | ||
|
||
#include <esp8266.h> | ||
#include "cgi.h" | ||
#include "espfs.h" | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
#include <esp8266.h> | ||
#include "cgi.h" | ||
#include "config.h" | ||
#include "serbridge.h" | ||
|
||
// Cgi to return choice of Telnet ports | ||
int ICACHE_FLASH_ATTR cgiTelnetGet(HttpdConnData *connData) { | ||
if (connData->conn==NULL) return HTTPD_CGI_DONE; // Connection aborted | ||
|
||
char buff[1024]; | ||
int len; | ||
|
||
len = os_sprintf(buff, | ||
"{ \"telnet-port1\":%d, \"telnet-port2\":%d }", | ||
flashConfig.telnet_port1, flashConfig.telnet_port2); | ||
|
||
jsonHeader(connData, 200); | ||
httpdSend(connData, buff, len); | ||
return HTTPD_CGI_DONE; | ||
} | ||
|
||
// Cgi to change choice of Telnet ports | ||
int ICACHE_FLASH_ATTR cgiTelnetSet(HttpdConnData *connData) { | ||
if (connData->conn==NULL) { | ||
return HTTPD_CGI_DONE; // Connection aborted | ||
} | ||
|
||
int8_t ok = 0; | ||
uint8_t port1, port2; | ||
ok |= getUInt16Arg(connData, "port1", &port1); | ||
ok |= getUInt16Arg(connData, "port2", &port2); | ||
if (ok < 0) return HTTPD_CGI_DONE; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You can't just return here, you have to send some HTTP response back. A 304 not modified or a 200 OK would be reasonable choices. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ill modify it to include the responses. |
||
|
||
char *coll; | ||
if (ok > 0) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I heaven't dealt with the ajax stuff in a while and forgotten everything (oops), but I think you're gonna get one port at a time when you fill out one input field and hit enter. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think you're right. Ill modify to have it check the flashconfig variables. |
||
// check whether ports are different | ||
if (port1 == port2) { coll = "Ports cannot be the same!"; goto collision; } | ||
|
||
// we're good, set flashconfig | ||
flashConfig.telnet_port1 = port1; | ||
flashConfig.telnet_port2 = port2; | ||
os_printf("Ports changed: port1=%d port2=%d\n", | ||
port1, port2); | ||
|
||
// apply the changes | ||
//serbridgeReinit(); | ||
serbridgeInit(flashConfig.telnet_port1, flashConfig.telnet_port2); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please apply change after saving otherwise you might apply the changes, fail to save and return an error, but then things are inconsistent. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good point |
||
|
||
// save to flash | ||
if (configSave()) { | ||
httpdStartResponse(connData, 204); | ||
httpdEndHeaders(connData); | ||
} else { | ||
httpdStartResponse(connData, 500); | ||
httpdEndHeaders(connData); | ||
httpdSend(connData, "Failed to save config", -1); | ||
} | ||
} | ||
return HTTPD_CGI_DONE; | ||
|
||
collision: { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please put this inline since there is only one "goto" to here. |
||
char buff[128]; | ||
os_sprintf(buff, "Ports assignment for %s collides with another assignment", coll); | ||
errorResponse(connData, 400, buff); | ||
return HTTPD_CGI_DONE; | ||
} | ||
} | ||
|
||
int ICACHE_FLASH_ATTR cgiTelnet(HttpdConnData *connData) { | ||
if (connData->conn==NULL) return HTTPD_CGI_DONE; // Connection aborted. Clean up. | ||
if (connData->requestType == HTTPD_METHOD_GET) { | ||
return cgiTelnetGet(connData); | ||
} else if (connData->requestType == HTTPD_METHOD_POST) { | ||
return cgiTelnetSet(connData); | ||
} else { | ||
jsonHeader(connData, 404); | ||
return HTTPD_CGI_DONE; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
#ifndef CGITELNET_H | ||
#define CGITELNET_H | ||
|
||
#include "httpd.h" | ||
|
||
int cgiTelnet(HttpdConnData *connData); | ||
// int8_t telnet_port1, telnet_port2; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. you can delete this comment... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Will do. |
||
|
||
#endif // CGITELNET_H |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -35,6 +35,8 @@ FlashConfig flashDefault = { | |
.data_bits = EIGHT_BITS, | ||
.parity = NONE_BITS, | ||
.stop_bits = ONE_STOP_BIT, | ||
.telnet_port1 = 23, | ||
.telnet_port2 = 2323, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Something that seems to be missing is to take care of the upgrade path. When someone upgrades the telnet_portN fields in flash will be 0, so something needs to detect that when loading from flash and set the defaults explicitly. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ill take a look to see how that was done in some other code and proceed appropriately. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @tve So I looked into this a bit - as the code stands now, if I erase the flash... Then flash my current build, the default ports of 23 & 2323 are set(as they are set in this file). How is it accomplishing this? As far as I can tell, the configRestore() function is where checks for "0" values are checked. |
||
}; | ||
|
||
typedef union { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -32,6 +32,7 @@ | |
#include "gpio.h" | ||
#include "cgiservices.h" | ||
#include "web-server.h" | ||
#include "cgitelnet.h" | ||
|
||
#ifdef SYSLOG | ||
#include "syslog.h" | ||
|
@@ -96,6 +97,8 @@ HttpdBuiltInUrl builtInUrls[] = { | |
{ "/services/info", cgiServicesInfo, NULL }, | ||
{ "/services/update", cgiServicesSet, NULL }, | ||
{ "/pins", cgiPins, NULL }, | ||
{ "/telnet/info", cgiTelnet, NULL}, | ||
{ "/telnet/update", cgiTelnet, NULL}, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You only need one since you distinguish using GET and POST. Not sure why there are two for services, something for me to check. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yea, I picked up on this. However I wanted to attempt to avoid someone making an easy mistake of sending a PUT request via '/telnet' & accidently modifying it. Services uses two because this & pins cgi use a single method to call back set or get. They determine which to use based on the header received(or GET or PUT) |
||
#ifdef MQTT | ||
{ "/mqtt", cgiMqtt, NULL }, | ||
#endif | ||
|
@@ -179,7 +182,7 @@ user_init(void) { | |
WEB_Init(); | ||
|
||
// init the wifi-serial transparent bridge (port 23) | ||
serbridgeInit(23, 2323); | ||
serbridgeInit(flashConfig.telnet_port1, flashConfig.telnet_port1); | ||
uart_add_recv_cb(&serbridgeUartCb); | ||
#ifdef SHOW_HEAP_USE | ||
os_timer_disarm(&prHeapTimer); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -50,6 +50,28 @@ <h1>Info</h1> | |
<a href="https://github.com/jeelabs/esp-link/blob/master/README.md">the online README</a> | ||
for up-to-date help.</p> | ||
</div> | ||
<div class="card"> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. looks like the indent is off... |
||
<h1>Telnet Serial-Bridge</h1> | ||
<p style="margin-bottom:0;">There are two ports available for telnet to use by default: 23 2323</p> | ||
<div id="telnet-spinner" class="spinner spinner-small"></div> | ||
<table id="telnet-table" class="pure-table pure-table-horizontal" hidden><tbody> | ||
<tr><td>Current Telnet ports</td><td class="telnet-info"></td></tr> | ||
<tr><td colspan=2 class="popup-target">Telnet port 1:<br> | ||
<div class="click-to-edit telnet-port1"> | ||
<span class="edit-off" style="display:block; width:auto;"></span> | ||
<textarea class="edit-on" rows=1 maxlength=5 hidden> </textarea> | ||
<div class="popup">Click to edit!<br>Default port: 23</div> | ||
</div> | ||
</td></tr> | ||
<tr><td colspan=2 class="popup-target">Telnet port 2:<br> | ||
<div class="click-to-edit telnet-port2"> | ||
<span class="edit-off" style="display:block; width:auto;"></span> | ||
<textarea class="edit-on" rows=1 maxlength=5 hidden> </textarea> | ||
<div class="popup">Click to edit!<br>Default port: 2323</div> | ||
</div> | ||
</td></tr> | ||
</tbody></table> | ||
</div> | ||
</div> | ||
<!-- RIGHT COLUMN --> | ||
<div class="pure-u-1 pure-u-md-1-2"> | ||
|
@@ -152,9 +174,12 @@ <h1>System details</h1> | |
onLoad(function() { | ||
makeAjaxInput("system", "description"); | ||
makeAjaxInput("system", "name"); | ||
makeAjaxInput("telnet", "port1"); | ||
makeAjaxInput("telnet", "port2"); | ||
fetchPins(); | ||
getWifiInfo(); | ||
getSystemInfo(); | ||
getTelnetInfo(); | ||
bnd($("#pinform"), "submit", setPins); | ||
}); | ||
</script> | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -469,6 +469,8 @@ serbridgeInitPins() | |
} | ||
|
||
// Start transparent serial bridge TCP server on specified port (typ. 23) | ||
// Here is where we need to change the ports. But how do we do this from the Ajax call? | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Delete left-over comment? You have that here https://github.com/jeelabs/esp-link/pull/205/files#diff-b6cc56038011d1226a2ee85cb280b897R47 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yup, old comment. Left it for me to find while working on this. |
||
void ICACHE_FLASH_ATTR | ||
serbridgeInit(int port1, int port2) | ||
{ | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ports are 16 bits: 0..65535
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Of course! I got the thought of a short int = 8bit stuck in my head yesterday.
Once I realized that... unsigned 16bit should get me there.