Skip to content
Snippets Groups Projects
Commit 953fb85b authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Create the "Servers" configuration sub-menu, currently read-only

I'm surprised more people haven't wondered aloud: why are all the Synchronet
server settings in this huge sbbs.ini file? Well... this kind of answers that
question: it's a hell of a lot of settings! And this isn't even everything
(several advanced/rarely-used/borderline-deprecated settings aren't included)!

As part of this change, I've replaced the old date/time display with the
current config file path/name that's being edited (more or less). This will
help when a sysop has multiple sbbs.*.ini files and makes it clear if you have
multiple sbbs installs (like me), which one you're editing at any given time.

I have not implemented any of the server setting edits (other than a couple
simple toggles) or help text yet and this does not detect changes or save them
to the sbbs.ini file, but I wanted to get this committed at this stage anyway.
If you're running sbbsctrl.exe (or maybe even gtkmonitor), then maybe this is
completely redundant and unnecessary, but I figured it was good to have these
settings in one edit find/edit platform-agnostic location anyway. Hoepfully
this will (when its done) make SBBS for *nix just that much easier for a newbie
sysop/sysadmin.
parent ffe092b6
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
Pipeline #3973 failed
...@@ -9,6 +9,7 @@ OBJS = $(MTOBJODIR)/scfg$(OFILE)\ ...@@ -9,6 +9,7 @@ OBJS = $(MTOBJODIR)/scfg$(OFILE)\
$(MTOBJODIR)/scfgmsg$(OFILE)\ $(MTOBJODIR)/scfgmsg$(OFILE)\
$(MTOBJODIR)/scfgnet$(OFILE)\ $(MTOBJODIR)/scfgnet$(OFILE)\
$(MTOBJODIR)/scfgnode$(OFILE)\ $(MTOBJODIR)/scfgnode$(OFILE)\
$(MTOBJODIR)/scfgsrvr$(OFILE)\
$(MTOBJODIR)/scfgsub$(OFILE)\ $(MTOBJODIR)/scfgsub$(OFILE)\
$(MTOBJODIR)/scfgsys$(OFILE)\ $(MTOBJODIR)/scfgsys$(OFILE)\
$(MTOBJODIR)/scfgxfr1$(OFILE)\ $(MTOBJODIR)/scfgxfr1$(OFILE)\
...@@ -18,6 +19,7 @@ OBJS = $(MTOBJODIR)/scfg$(OFILE)\ ...@@ -18,6 +19,7 @@ OBJS = $(MTOBJODIR)/scfg$(OFILE)\
$(MTOBJODIR)/scfglib1$(OFILE)\ $(MTOBJODIR)/scfglib1$(OFILE)\
$(MTOBJODIR)/scfglib2$(OFILE)\ $(MTOBJODIR)/scfglib2$(OFILE)\
$(MTOBJODIR)/getctrl$(OFILE)\ $(MTOBJODIR)/getctrl$(OFILE)\
$(MTOBJODIR)/sbbs_ini$(OFILE)\
$(MTOBJODIR)/load_cfg$(OFILE)\ $(MTOBJODIR)/load_cfg$(OFILE)\
$(MTOBJODIR)/readtext$(OFILE)\ $(MTOBJODIR)/readtext$(OFILE)\
$(MTOBJODIR)/text_defaults$(OFILE)\ $(MTOBJODIR)/text_defaults$(OFILE)\
......
...@@ -362,12 +362,19 @@ void cfg_wizard(void) ...@@ -362,12 +362,19 @@ void cfg_wizard(void)
free_msgs_cfg(&cfg); free_msgs_cfg(&cfg);
} }
void display_filename(const char* fname)
{
if(strlen(fname) + 30 > uifc.scrn_width)
fname = getfname(fname);
uifc.printf(29, 1, uifc.bclr|(uifc.cclr<<4), "%*s", uifc.scrn_width - 30, fname);
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
char **mopt,*p; char **mopt,*p;
char errormsg[MAX_PATH*2]; char errormsg[MAX_PATH*2];
int i,j,main_dflt=0,chat_dflt=0; int i,j,main_dflt=0,chat_dflt=0;
char str[MAX_PATH+1]; char cfg_fname[MAX_PATH+1];
BOOL door_mode=FALSE; BOOL door_mode=FALSE;
int ciolib_mode=CIOLIB_MODE_AUTO; int ciolib_mode=CIOLIB_MODE_AUTO;
char compiler[32]; char compiler[32];
...@@ -647,20 +654,21 @@ int main(int argc, char **argv) ...@@ -647,20 +654,21 @@ int main(int argc, char **argv)
if((mopt[i]=(char *)malloc(64))==NULL) if((mopt[i]=(char *)malloc(64))==NULL)
allocfail(64); allocfail(64);
uifc.timedisplay = NULL;
SAFEPRINTF2(title,"Synchronet for %s v%s",PLATFORM_DESC,VERSION); SAFEPRINTF2(title,"Synchronet for %s v%s",PLATFORM_DESC,VERSION);
if(uifc.scrn(title)) { if(uifc.scrn(title)) {
printf(" USCRN (len=%d) failed!\n",uifc.scrn_len+1); printf(" USCRN (len=%d) failed!\n",uifc.scrn_len+1);
bail(1); bail(1);
} }
SAFEPRINTF(str,"%smain.ini",cfg.ctrl_dir); SAFEPRINTF(cfg_fname, "%smain.ini", cfg.ctrl_dir);
if(!fexist(str)) { if(!fexist(cfg_fname)) {
SAFEPRINTF(errormsg, "Main configuration file (%s) missing!",str); SAFEPRINTF(errormsg, "Main configuration file (%s) missing!", cfg_fname);
uifc.msg(errormsg); uifc.msg(errormsg);
} }
FILE* fp = iniOpenFile(str, /* for_modify */TRUE); FILE* fp = iniOpenFile(cfg_fname, /* for_modify */TRUE);
if(fp == NULL) { if(fp == NULL) {
SAFEPRINTF2(errormsg, "Error %d opening configuration file: %s", errno, str); SAFEPRINTF2(errormsg, "Error %d opening configuration file: %s", errno, cfg_fname);
uifc.msg(errormsg); uifc.msg(errormsg);
} else { } else {
cfg.new_install = iniReadBool(fp, ROOT_SECTION, "new_install", TRUE); cfg.new_install = iniReadBool(fp, ROOT_SECTION, "new_install", TRUE);
...@@ -672,10 +680,10 @@ int main(int argc, char **argv) ...@@ -672,10 +680,10 @@ int main(int argc, char **argv)
if(run_wizard) if(run_wizard)
bail(0); bail(0);
} }
i=0; i=0;
strcpy(mopt[i++],"Nodes"); strcpy(mopt[i++],"Nodes");
strcpy(mopt[i++],"System"); strcpy(mopt[i++],"System");
strcpy(mopt[i++],"Servers");
strcpy(mopt[i++],"Networks"); strcpy(mopt[i++],"Networks");
strcpy(mopt[i++],"File Areas"); strcpy(mopt[i++],"File Areas");
strcpy(mopt[i++],"File Options"); strcpy(mopt[i++],"File Options");
...@@ -689,6 +697,7 @@ int main(int argc, char **argv) ...@@ -689,6 +697,7 @@ int main(int argc, char **argv)
i = cryptInit(); i = cryptInit();
(void)i; (void)i;
while(1) { while(1) {
display_filename(cfg_fname);
uifc.helpbuf= uifc.helpbuf=
"`Main Configuration Menu:`\n" "`Main Configuration Menu:`\n"
"\n" "\n"
...@@ -697,6 +706,7 @@ int main(int argc, char **argv) ...@@ -697,6 +706,7 @@ int main(int argc, char **argv)
"\n" "\n"
" `Nodes ` Add, delete, or configure nodes\n" " `Nodes ` Add, delete, or configure nodes\n"
" `System ` System-wide configuration options\n" " `System ` System-wide configuration options\n"
" `Servers ` TCP/IP Servers and Services\n"
" `Networks ` Networking configuration\n" " `Networks ` Networking configuration\n"
" `File Areas ` File area configuration\n" " `File Areas ` File area configuration\n"
" `File Options ` File area options\n" " `File Options ` File area options\n"
...@@ -736,9 +746,12 @@ int main(int argc, char **argv) ...@@ -736,9 +746,12 @@ int main(int argc, char **argv)
free_main_cfg(&cfg); free_main_cfg(&cfg);
break; break;
case 2: case 2:
net_cfg(); server_cfg();
break; break;
case 3: case 3:
net_cfg();
break;
case 4:
if(!load_main_cfg(&cfg, error, sizeof(error))) { if(!load_main_cfg(&cfg, error, sizeof(error))) {
SAFEPRINTF(errormsg,"ERROR: %s",error); SAFEPRINTF(errormsg,"ERROR: %s",error);
uifc.msg(errormsg); uifc.msg(errormsg);
...@@ -753,7 +766,7 @@ int main(int argc, char **argv) ...@@ -753,7 +766,7 @@ int main(int argc, char **argv)
free_file_cfg(&cfg); free_file_cfg(&cfg);
free_main_cfg(&cfg); free_main_cfg(&cfg);
break; break;
case 4: case 5:
if(!load_main_cfg(&cfg, error, sizeof(error))) { if(!load_main_cfg(&cfg, error, sizeof(error))) {
SAFEPRINTF(errormsg,"ERROR: %s",error); SAFEPRINTF(errormsg,"ERROR: %s",error);
uifc.msg(errormsg); uifc.msg(errormsg);
...@@ -768,7 +781,7 @@ int main(int argc, char **argv) ...@@ -768,7 +781,7 @@ int main(int argc, char **argv)
free_file_cfg(&cfg); free_file_cfg(&cfg);
free_main_cfg(&cfg); free_main_cfg(&cfg);
break; break;
case 5: case 6:
if(!load_chat_cfg(&cfg, error, sizeof(error))) { if(!load_chat_cfg(&cfg, error, sizeof(error))) {
SAFEPRINTF(errormsg,"ERROR: %s",error); SAFEPRINTF(errormsg,"ERROR: %s",error);
uifc.msg(errormsg); uifc.msg(errormsg);
...@@ -814,7 +827,7 @@ int main(int argc, char **argv) ...@@ -814,7 +827,7 @@ int main(int argc, char **argv)
} }
free_chat_cfg(&cfg); free_chat_cfg(&cfg);
break; break;
case 6: case 7:
if(!load_main_cfg(&cfg, error, sizeof(error))) { if(!load_main_cfg(&cfg, error, sizeof(error))) {
SAFEPRINTF(errormsg, "ERROR: %s",error); SAFEPRINTF(errormsg, "ERROR: %s",error);
uifc.msg(errormsg); uifc.msg(errormsg);
...@@ -829,7 +842,7 @@ int main(int argc, char **argv) ...@@ -829,7 +842,7 @@ int main(int argc, char **argv)
free_msgs_cfg(&cfg); free_msgs_cfg(&cfg);
free_main_cfg(&cfg); free_main_cfg(&cfg);
break; break;
case 7: case 8:
if(!load_main_cfg(&cfg, error, sizeof(error))) { if(!load_main_cfg(&cfg, error, sizeof(error))) {
SAFEPRINTF(errormsg, "ERROR: %s",error); SAFEPRINTF(errormsg, "ERROR: %s",error);
uifc.msg(errormsg); uifc.msg(errormsg);
...@@ -844,7 +857,7 @@ int main(int argc, char **argv) ...@@ -844,7 +857,7 @@ int main(int argc, char **argv)
free_msgs_cfg(&cfg); free_msgs_cfg(&cfg);
free_main_cfg(&cfg); free_main_cfg(&cfg);
break; break;
case 8: case 9:
if(!load_main_cfg(&cfg, error, sizeof(error))) { if(!load_main_cfg(&cfg, error, sizeof(error))) {
SAFEPRINTF(errormsg, "ERROR: %s",error); SAFEPRINTF(errormsg, "ERROR: %s",error);
uifc.msg(errormsg); uifc.msg(errormsg);
...@@ -853,7 +866,7 @@ int main(int argc, char **argv) ...@@ -853,7 +866,7 @@ int main(int argc, char **argv)
shell_cfg(); shell_cfg();
free_main_cfg(&cfg); free_main_cfg(&cfg);
break; break;
case 9: case 10:
if(!load_main_cfg(&cfg, error, sizeof(error))) { if(!load_main_cfg(&cfg, error, sizeof(error))) {
SAFEPRINTF(errormsg, "ERROR: %s",error); SAFEPRINTF(errormsg, "ERROR: %s",error);
uifc.msg(errormsg); uifc.msg(errormsg);
...@@ -868,7 +881,7 @@ int main(int argc, char **argv) ...@@ -868,7 +881,7 @@ int main(int argc, char **argv)
free_xtrn_cfg(&cfg); free_xtrn_cfg(&cfg);
free_main_cfg(&cfg); free_main_cfg(&cfg);
break; break;
case 10: case 11:
if(!load_main_cfg(&cfg, error, sizeof(error))) { if(!load_main_cfg(&cfg, error, sizeof(error))) {
SAFEPRINTF(errormsg, "ERROR: %s",error); SAFEPRINTF(errormsg, "ERROR: %s",error);
uifc.msg(errormsg); uifc.msg(errormsg);
......
...@@ -115,6 +115,7 @@ extern char* area_sort_desc[AREA_SORT_TYPES+1]; ...@@ -115,6 +115,7 @@ extern char* area_sort_desc[AREA_SORT_TYPES+1];
/* Function Prototypes */ /* Function Prototypes */
/***********************/ /***********************/
void display_filename(const char*);
void bail(int code); void bail(int code);
void errormsg(int line, const char* function, const char *source, const char* action, const char *object, ulong access); void errormsg(int line, const char* function, const char *source, const char* action, const char *object, ulong access);
void clearptrs(int subnum); void clearptrs(int subnum);
...@@ -146,6 +147,7 @@ void init_mdms(void); ...@@ -146,6 +147,7 @@ void init_mdms(void);
void guru_cfg(void); void guru_cfg(void);
void actsets_cfg(void); void actsets_cfg(void);
void chan_cfg(void); void chan_cfg(void);
void server_cfg(void);
void mdm_cfg(int mdmnum); void mdm_cfg(int mdmnum);
void wizard_msg(int page, int total, const char* text); void wizard_msg(int page, int total, const char* text);
int edit_sys_name(int page, int total); int edit_sys_name(int page, int total);
......
...@@ -36,6 +36,7 @@ void node_menu() ...@@ -36,6 +36,7 @@ void node_menu()
static int node_menu_dflt, node_bar; static int node_menu_dflt, node_bar;
while(1) { while(1) {
display_filename("");
for(i=0;i<cfg.sys_nodes;i++) for(i=0;i<cfg.sys_nodes;i++)
sprintf(opt[i],"Node %d",i+1); sprintf(opt[i],"Node %d",i+1);
opt[i][0]=0; opt[i][0]=0;
...@@ -155,6 +156,9 @@ void node_menu() ...@@ -155,6 +156,9 @@ void node_menu()
cfg.node_num = i + 1; /* so fix it */ cfg.node_num = i + 1; /* so fix it */
save_node_cfg(&cfg, backup_level); /* and write it back */ save_node_cfg(&cfg, backup_level); /* and write it back */
} }
char cfg_fname[MAX_PATH + 1];
SAFEPRINTF(cfg_fname, "%snode.ini", cfg.node_dir);
display_filename(cfg_fname);
node_cfg(); node_cfg();
free_node_cfg(&cfg); free_node_cfg(&cfg);
......
/****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright Rob Swindell - http://www.synchro.net/copyright.html *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* See the GNU General Public License for more details: gpl.txt or *
* http://www.fsf.org/copyleft/gpl.html *
* *
* For Synchronet coding style and modification guidelines, see *
* http://www.synchro.net/source.html *
* *
* Note: If this box doesn't appear square, then you need to fix your tabs. *
****************************************************************************/
#include "scfg.h"
#include "sbbs_ini.h"
#include "netwrap.h"
const char* strDisabled = "<disabled>";
static const char* threshold(uint val)
{
static char str[128];
if(val == 0)
return strDisabled;
SAFEPRINTF(str, "%u", val);
return str;
}
static const char* duration(uint val)
{
static char str[128];
if(val == 0)
return strDisabled;
return duration_to_vstr(val, str, sizeof(str));
}
static const char* maximum(uint val)
{
static char str[128];
if(val == 0)
return "Unlimited";
SAFEPRINTF(str, "%u", val);
return str;
}
static void global_cfg(global_startup_t* startup)
{
static int cur;
char tmp[256];
while(1) {
int i = 0;
sprintf(opt[i++], "%-40s%s", "Log Level", iniLogLevelStringList()[startup->log_level]);
sprintf(opt[i++], "%-40s%s", "TLS Error Level", iniLogLevelStringList()[startup->tls_error_level]);
sprintf(opt[i++], "%-40s%s", "Network Interfaces (IPv4/6)", strListCombine(startup->interfaces, tmp, sizeof(tmp), ", "));
sprintf(opt[i++], "%-40s%s", "Outbound Interface (IPv4)", IPv4AddressToStr(startup->outgoing4.s_addr, tmp, sizeof(tmp)));
sprintf(opt[i++], "%-40s%s", "Bind Retry Count", threshold(startup->bind_retry_count));
sprintf(opt[i++], "%-40s%s", "Bind Retry Delay", duration(startup->bind_retry_delay));
sprintf(opt[i++], "%-40s%u ms", "Failed Login Delay", startup->login_attempt.delay);
sprintf(opt[i++], "%-40s%u ms", "Failed Login Throttle", startup->login_attempt.throttle);
sprintf(opt[i++], "%-40s%s", "Failed Login Hack Log Threshold", threshold(startup->login_attempt.hack_threshold));
sprintf(opt[i++], "%-40s%s", "Failed Login Temporary Ban Threshold", threshold(startup->login_attempt.tempban_threshold));
sprintf(opt[i++], "%-40s%s", "Failed Login Temporary Ban Duration"
,duration_to_vstr(startup->login_attempt.tempban_duration, tmp, sizeof(tmp)));
sprintf(opt[i++], "%-40s%s", "Failed Login Auto-Filter Threshold", threshold(startup->login_attempt.filter_threshold));
sprintf(opt[i++], "%-40s%s bytes", "JavaScript Heap Size", byte_count_to_str(startup->js.max_bytes, tmp, sizeof(tmp)));
sprintf(opt[i++], "%-40s%u ticks", "JavaScript Time Limit", startup->js.time_limit);
sprintf(opt[i++], "%-40s%u ticks", "JavaScript GC Interval ", startup->js.gc_interval);
sprintf(opt[i++], "%-40s%u ticks", "JavaScript Yield Interval", startup->js.yield_interval);
sprintf(opt[i++], "%-40s%s", "JavaScript Load Path", startup->js.load_path);
sprintf(opt[i++], "%-40s%s", "Semaphore File Check Interval", duration(startup->sem_chk_freq));
opt[i][0] = '\0';
uifc.helpbuf=
"`Global Server Settings:`\n"
"\n"
;
switch(uifc.list(WIN_ACT|WIN_CHE|WIN_RHT|WIN_SAV, 0, 0, 0, &cur, 0
,"Global Server Setttings",opt)) {
default:
return;
}
}
}
static void termsrvr_cfg(BOOL* enabled, bbs_startup_t* startup)
{
static int cur, bar;
char tmp[256];
while(1) {
int i = 0;
sprintf(opt[i++], "%-30s%s", "Enabled", *enabled ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "Log Level", iniLogLevelStringList()[startup->log_level]);
sprintf(opt[i++], "%-30s%u", "First Node", startup->first_node);
sprintf(opt[i++], "%-30s%u", "Last Node", startup->last_node);
sprintf(opt[i++], "%-30s%s", "DOS Program Support", startup->options & BBS_OPT_NO_DOS ? "No" : "Yes");
sprintf(opt[i++], "%-30s%s", "SSH Support", startup->options & BBS_OPT_ALLOW_SSH ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "SSH Interfaces", startup->options & BBS_OPT_ALLOW_SSH ? strListCombine(startup->ssh_interfaces, tmp, sizeof(tmp), ", ") : "N/A");
sprintf(opt[i++], "%-30s%u", "SSH Port", startup->ssh_port);
sprintf(opt[i++], "%-30s%s", "SSH Connect Timeout", startup->options & BBS_OPT_ALLOW_SSH ? duration(startup->ssh_connect_timeout) : "N/A");
sprintf(opt[i++], "%-30s%s", "Telnet Support", startup->options & BBS_OPT_NO_TELNET ? "No" : "Yes");
sprintf(opt[i++], "%-30s%s", "Telnet Interfaces", startup->options & BBS_OPT_NO_TELNET ? "N/A" : strListCombine(startup->telnet_interfaces, tmp, sizeof(tmp), ", "));
sprintf(opt[i++], "%-30s%u", "Telnet Port", startup->telnet_port);
sprintf(opt[i++], "%-30s%s", "Telnet Command Debug", startup->options & BBS_OPT_NO_TELNET ? "N/A" : startup->options & BBS_OPT_DEBUG_TELNET ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "Telnet Send Go-Aheads", startup->options & BBS_OPT_NO_TELNET ? "N/A" : startup->options & BBS_OPT_NO_TELNET_GA ? "No" : "Yes");
sprintf(opt[i++], "%-30s%s", "RLogin Support", startup->options & BBS_OPT_ALLOW_RLOGIN ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "RLogin Interfaces", startup->options & BBS_OPT_ALLOW_RLOGIN ? strListCombine(startup->rlogin_interfaces, tmp, sizeof(tmp), ", ") : "N/A");
sprintf(opt[i++], "%-30s%u", "RLogin Port", startup->rlogin_port);
sprintf(opt[i++], "%-30s%u", "40 Column PETSCII Port", startup->pet40_port);
sprintf(opt[i++], "%-30s%u", "80 Column PETSCII Port", startup->pet80_port);
sprintf(opt[i++], "%-30s%s", "Max Concurrent Connections", maximum(startup->max_concurrent_connections));
sprintf(opt[i++], "%-30s%s", "Max Login Inactivity", duration(startup->max_login_inactivity));
sprintf(opt[i++], "%-30s%s", "Max New User Inactivity", duration(startup->max_newuser_inactivity));
sprintf(opt[i++], "%-30s%s", "Max User Inactivity", duration(startup->max_session_inactivity));
sprintf(opt[i++], "%-30s%u ms", "Output Buffer Drain Timeout", startup->outbuf_drain_timeout);
sprintf(opt[i++], "%-30s%s", "Execute Timed Events", startup->options & BBS_OPT_NO_EVENTS ? "No" : "Yes");
sprintf(opt[i++], "%-30s%s", "Execute QWK-relatd Events", startup->options & BBS_OPT_NO_EVENTS ? "N/A" : startup->options & BBS_OPT_NO_QWK_EVENTS ? "No" : "Yes");
sprintf(opt[i++], "%-30s%s", "Lookup Client Hostname", startup->options & BBS_OPT_NO_HOST_LOOKUP ? "No" : "Yes");
if(!*enabled)
i = 1;
opt[i][0] = '\0';
uifc.helpbuf=
"`Terminal Server Configuration:`\n"
"\n"
;
switch(uifc.list(WIN_ACT|WIN_CHE|WIN_RHT|WIN_SAV, 0, 0, 0, &cur, &bar
,"Terminal Server",opt)) {
case 0:
*enabled = !*enabled;
break;
case 1:
startup->options ^= BBS_OPT_NO_TELNET;
break;
case 2:
startup->options ^= BBS_OPT_ALLOW_SSH;
break;
case 3:
startup->options ^= BBS_OPT_ALLOW_RLOGIN;
break;
default:
return;
}
}
}
static void websrvr_cfg(BOOL* enabled, web_startup_t* startup)
{
static int cur, bar;
char tmp[256];
while(1) {
int i = 0;
sprintf(opt[i++], "%-30s%s", "Enabled", *enabled ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "Log Level", iniLogLevelStringList()[startup->log_level]);
sprintf(opt[i++], "%-30s%s", "HTTP Interfaces", strListCombine(startup->interfaces, tmp, sizeof(tmp), ", "));
sprintf(opt[i++], "%-30s%u", "HTTP Port", startup->port);
sprintf(opt[i++], "%-30s%s", "HTTPS Support", startup->options & WEB_OPT_ALLOW_TLS ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "HTTPS Interfaces", startup->options & WEB_OPT_ALLOW_TLS ? strListCombine(startup->tls_interfaces, tmp, sizeof(tmp), ", ") : "N/A");
sprintf(opt[i++], "%-30s%u", "HTTPS Port", startup->tls_port);
sprintf(opt[i++], "%-30s%s", "SSJS File Extension", startup->ssjs_ext);
sprintf(opt[i++], "%-30s%s", "Index Filenames", strListCombine(startup->index_file_name, tmp, sizeof(tmp), ", "));
sprintf(opt[i++], "%-30s%s", "Content Root Directory", startup->root_dir);
sprintf(opt[i++], "%-30s%s", "Error Sub-directory", startup->error_dir);
sprintf(opt[i++], "%-30s%s", "Strict Transport Security", startup->options & WEB_OPT_HSTS_SAFE ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "Virtual Host Support", startup->options & WEB_OPT_VIRTUAL_HOSTS ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "Access Logging", startup->options & WEB_OPT_HTTP_LOGGING ? startup->logfile_base : strDisabled);
sprintf(opt[i++], "%-30s%s", "Max Clients", maximum(startup->max_clients));
sprintf(opt[i++], "%-30s%s", "Max Inactivity", duration(startup->max_inactivity));
sprintf(opt[i++], "%-30s%s", "Filebase Index Script", startup->file_index_script);
sprintf(opt[i++], "%-30s%s", "Filebase VPath Prefix", startup->file_vpath_prefix);
sprintf(opt[i++], "%-30s%s", "Filebase VPath for VHosts", startup->file_vpath_for_vhosts ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "Authentication Methods", startup->default_auth_list);
sprintf(opt[i++], "%-30s%u ms", "Output Buffer Drain Timeout", startup->outbuf_drain_timeout);
sprintf(opt[i++], "%-30s%s", "Lookup Client Hostname", startup->options & BBS_OPT_NO_HOST_LOOKUP ? "No" : "Yes");
bool cgi_enabled = !(startup->options & WEB_OPT_NO_CGI);
sprintf(opt[i++], "%-30s%s", "CGI Support", cgi_enabled ? "Yes" : "No");
if(cgi_enabled) {
sprintf(opt[i++], "%-30s%s", "CGI Directory", startup->cgi_dir);
sprintf(opt[i++], "%-30s%s", "CGI File Extensions", strListCombine(startup->cgi_ext, tmp, sizeof(tmp), ", "));
sprintf(opt[i++], "%-30s%s", "CGI Default Content-Type", startup->default_cgi_content);
sprintf(opt[i++], "%-30s%s", "CGI Max Inactivity", duration(startup->max_cgi_inactivity));
}
if(!*enabled)
i = 1;
opt[i][0] = '\0';
uifc.helpbuf=
"`Web Server Configuration:`\n"
"\n"
;
switch(uifc.list(WIN_ACT|WIN_CHE|WIN_RHT|WIN_SAV, 0, 0, 0, &cur, &bar
,"Web Server",opt)) {
case 0:
*enabled = !*enabled;
break;
case 2:
startup->options ^= WEB_OPT_ALLOW_TLS;
break;
default:
return;
}
}
}
static void ftpsrvr_cfg(BOOL* enabled, ftp_startup_t* startup)
{
static int cur, bar;
char tmp[256];
while(1) {
int i = 0;
sprintf(opt[i++], "%-30s%s", "Enabled", *enabled ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "Log Level", iniLogLevelStringList()[startup->log_level]);
sprintf(opt[i++], "%-30s%s", "Network Interfaces", strListCombine(startup->interfaces, tmp, sizeof(tmp), ", "));
sprintf(opt[i++], "%-30s%u, Data: %u", "Control Port", startup->port, startup->port - 1);
sprintf(opt[i++], "%-30s%s", "Passive Interface (IPv4)", startup->options & FTP_OPT_LOOKUP_PASV_IP ? "<automatic>" : IPv4AddressToStr(startup->pasv_ip_addr.s_addr, tmp, sizeof(tmp)));
sprintf(opt[i++], "%-30s%u - %u", "Passive Port Range", startup->pasv_port_low, startup->pasv_port_high);
sprintf(opt[i++], "%-30s%s", "Auto-generate Index File", startup->options & FTP_OPT_INDEX_FILE ? startup->index_file_name : strDisabled);
sprintf(opt[i++], "%-30s%s", "QWK Message Packet Transfers", startup->options & FTP_OPT_ALLOW_QWK ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "QWK Message Packet Timeout", startup->options & FTP_OPT_ALLOW_QWK ? duration(startup->qwk_timeout) : "N/A");
sprintf(opt[i++], "%-30s%s", "Max Clients", maximum(startup->max_clients));
sprintf(opt[i++], "%-30s%s", "Max Inactivity", duration(startup->max_inactivity));
sprintf(opt[i++], "%-30s%s", "Max Concurrent Connections", maximum(startup->max_concurrent_connections));
sprintf(opt[i++], "%-30s%s", "Sysop Filesystem Access", startup->options & FTP_OPT_NO_LOCAL_FSYS ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "Allow Bounce Transfers", startup->options & FTP_OPT_ALLOW_BOUNCE ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "Lookup Client Hostname", startup->options & BBS_OPT_NO_HOST_LOOKUP ? "No" : "Yes");
if(!*enabled)
i = 1;
opt[i][0] = '\0';
uifc.helpbuf=
"`FTP Server Configuration:`\n"
"\n"
;
switch(uifc.list(WIN_ACT|WIN_CHE|WIN_RHT|WIN_SAV, 0, 0, 0, &cur, &bar
,"FTP Server",opt)) {
case 0:
*enabled = !*enabled;
break;
default:
return;
}
}
}
static void mailsrvr_cfg(BOOL* enabled, mail_startup_t* startup)
{
static int cur, bar;
char tmp[256];
const char* p;
while(1) {
int i = 0;
sprintf(opt[i++], "%-30s%s", "Enabled", *enabled ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "Log Level", iniLogLevelStringList()[startup->log_level]);
sprintf(opt[i++], "%-30s%s", "SMTP Interfaces", strListCombine(startup->interfaces, tmp, sizeof(tmp), ", "));
sprintf(opt[i++], "%-30s%u", "SMTP Port", startup->smtp_port);
sprintf(opt[i++], "%-30s%s", "Submission Support", startup->options & MAIL_OPT_USE_SUBMISSION_PORT ? "Yes" : "No");
sprintf(opt[i++], "%-30s%u", "Submission Port", startup->submission_port);
sprintf(opt[i++], "%-30s%s", "Submission/TLS Support", startup->options & MAIL_OPT_TLS_SUBMISSION ? "Yes" : "No");
sprintf(opt[i++], "%-30s%u", "Submission/TLS Port", startup->submissions_port);
sprintf(opt[i++], "%-30s%s", "POP3 Support", startup->options & MAIL_OPT_ALLOW_POP3 ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "POP3 Interfaces"
,startup->options & (MAIL_OPT_ALLOW_POP3 | MAIL_OPT_TLS_POP3)
? strListCombine(startup->pop3_interfaces, tmp, sizeof(tmp), ", ") : "N/A");
sprintf(opt[i++], "%-30s%u", "POP3 Port", startup->pop3_port);
sprintf(opt[i++], "%-30s%s", "POP3/TLS Support", startup->options & MAIL_OPT_TLS_POP3 ? "Yes" : "No");
sprintf(opt[i++], "%-30s%u", "POP3/TLS Port", startup->pop3s_port);
sprintf(opt[i++], "%-30s%s", "Max Clients", maximum(startup->max_clients));
sprintf(opt[i++], "%-30s%s", "Max Inactivity", duration(startup->max_inactivity));
sprintf(opt[i++], "%-30s%s", "Max Concurrent Connections", maximum(startup->max_concurrent_connections));
sprintf(opt[i++], "%-30s%s", "Max Recipients Per Message", maximum(startup->max_recipients));
sprintf(opt[i++], "%-30s%s", "Max Messages Waiting", maximum(startup->max_msgs_waiting));
sprintf(opt[i++], "%-30s%s bytes", "Max Receive Message Size", byte_count_to_str(startup->max_msg_size, tmp, sizeof(tmp)));
sprintf(opt[i++], "%-30s%s", "Allow Users to Relay Mail", startup->options & MAIL_OPT_ALLOW_RELAY ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "Receive By Sysop Aliases", startup->options & MAIL_OPT_ALLOW_SYSOP_ALIASES ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "Notify Local Recipients", startup->options & MAIL_OPT_NO_NOTIFY ? "No" : "Yes");
sprintf(opt[i++], "%-30s%s", "Lookup Client Hostname", startup->options & BBS_OPT_NO_HOST_LOOKUP ? "No" : "Yes");
sprintf(opt[i++], "%-30s%s", "Check Headers against DNSBL", startup->options & MAIL_OPT_DNSBL_CHKRECVHDRS ? "Yes" : "No");
if(startup->options & MAIL_OPT_DNSBL_REFUSE)
p = "Refuse Session";
else if(startup->options & MAIL_OPT_DNSBL_IGNORE)
p = "Silently Ignore";
else if(startup->options & MAIL_OPT_DNSBL_BADUSER)
p = "Refuse Mail";
else if(startup->options)
p = "Tag Mail";
sprintf(opt[i++], "%-30s%s%s", "Blacklisted Servers", startup->options & MAIL_OPT_DNSBL_THROTTLE ? "Throttle and " : "", p);
sprintf(opt[i++], "%-30s%s", "Hash Blacklisted Messages", startup->options & MAIL_OPT_DNSBL_SPAMHASH ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "Auto-exempt Recipients", startup->options & MAIL_OPT_NO_AUTO_EXEMPT ? "No" : "Yes");
sprintf(opt[i++], "%-30s%s", "Kill SPAM When Read", startup->options & MAIL_OPT_KILL_READ_SPAM ? "Yes": "No");
sprintf(opt[i++], "%-30s%s", "SendMail Support", startup->options & MAIL_OPT_NO_SENDMAIL ? "No" : "Yes");
if(!(startup->options & MAIL_OPT_NO_SENDMAIL)) {
bool applicable = startup->options & MAIL_OPT_RELAY_TX;
sprintf(opt[i++], "%-30s%s", "SendMail Delivery", applicable ? "Relay" : "Direct");
sprintf(opt[i++], "%-30s%s", "SendMail Relay Server", applicable ? startup->relay_server : "N/A");
sprintf(opt[i++], "%-30s%u", "SendMail Relay Port", startup->relay_port);
sprintf(opt[i++], "%-30s%s", "SendMail Relay User", applicable ? startup->relay_user : "N/A");
sprintf(opt[i++], "%-30s%s", "SendMail Relay Password", applicable ? startup->relay_pass : "N/A");
if(startup->options & MAIL_OPT_RELAY_AUTH_PLAIN)
p = "Plain";
else if(startup->options & MAIL_OPT_RELAY_AUTH_LOGIN)
p = "Login";
else if(startup->options & MAIL_OPT_RELAY_AUTH_CRAM_MD5)
p = "CRAM-MD5";
else
p = "None";
sprintf(opt[i++], "%-30s%s", "SendMail Relay Auth", applicable ? p : "N/A");
sprintf(opt[i++], "%-30s%u", "SendMail Max Attempts", startup->max_delivery_attempts);
sprintf(opt[i++], "%-30s%s", "SendMail Rescan Interval", duration(startup->rescan_frequency));
sprintf(opt[i++], "%-30s%s", "SendMail Connect Timeout", duration(startup->connect_timeout));
}
if(!*enabled)
i = 1;
opt[i][0] = '\0';
uifc.helpbuf=
"`Mail Server Configuration:`\n"
"\n"
;
switch(uifc.list(WIN_ACT|WIN_CHE|WIN_RHT|WIN_SAV, 0, 0, 0, &cur, &bar
,"Mail Server",opt)) {
case 0:
*enabled = !*enabled;
break;
default:
return;
}
}
}
static void services_cfg(BOOL* enabled, services_startup_t* startup)
{
static int cur, bar;
char tmp[256];
while(1) {
int i = 0;
sprintf(opt[i++], "%-30s%s", "Enabled", *enabled ? "Yes" : "No");
sprintf(opt[i++], "%-30s%s", "Log Level", iniLogLevelStringList()[startup->log_level]);
sprintf(opt[i++], "%-30s%s", "Network Interfaces", strListCombine(startup->interfaces, tmp, sizeof(tmp), ", "));
sprintf(opt[i++], "%-30s%s", "Lookup Client Hostname", startup->options & BBS_OPT_NO_HOST_LOOKUP ? "No" : "Yes");
sprintf(opt[i++], "%-30s%s", "Configuration File", startup->services_ini);
if(!*enabled)
i = 1;
opt[i][0] = '\0';
uifc.helpbuf=
"`Services Server Configuration:`\n"
"\n"
;
switch(uifc.list(WIN_ACT|WIN_CHE|WIN_RHT|WIN_SAV, 0, 0, 0, &cur, &bar
,"Services Server",opt)) {
case 0:
*enabled = !*enabled;
break;
default:
return;
}
}
}
void server_cfg(void)
{
static int srvr_dflt;
BOOL run_bbs, run_ftp, run_web, run_mail, run_services;
global_startup_t global_startup = {0};
bbs_startup_t bbs_startup = {0};
ftp_startup_t ftp_startup = {0};
web_startup_t web_startup = {0};
mail_startup_t mail_startup = {0};
services_startup_t services_startup = {0};
char ini_fname[MAX_PATH + 1];
sbbs_get_ini_fname(ini_fname, cfg.ctrl_dir);
FILE* fp = fopen(ini_fname, "r");
if(fp == NULL) {
uifc.msgf("Error opening %s", ini_fname);
return;
}
display_filename(ini_fname);
sbbs_read_ini(
fp
,ini_fname
,&global_startup
,&run_bbs
,&bbs_startup
,&run_ftp
,&ftp_startup
,&run_web
,&web_startup
,&run_mail
,&mail_startup
,&run_services
,&services_startup
);
fclose(fp);
while(1) {
int i = 0;
strcpy(opt[i++], "Global Settings");
sprintf(opt[i++], "%-27s%s", "Terminal Server", run_bbs ? "Enabled" : strDisabled);
sprintf(opt[i++], "%-27s%s", "Web Server", run_web ? "Enabled" : strDisabled);
sprintf(opt[i++], "%-27s%s", "FTP Server", run_ftp ? "Enabled" : strDisabled);
sprintf(opt[i++], "%-27s%s", "Mail Server", run_mail ? "Enabled" : strDisabled);
sprintf(opt[i++], "%-27s%s", "Services Server", run_services ? "Enabled" : strDisabled);
opt[i][0] = '\0';
uifc.helpbuf=
"`Server Configuration:`\n"
"\n"
"Here you can configure initialization settings of the various TCP/IP\n"
"servers that are integrated into Synchronet BBS Software.\n"
"\n"
"For additinal advanced Synchronet server initialization settings, see\n"
"the `ctrl/sbbs.ini` file and `https://wiki.synchro.net/config:sbbs.ini`\n"
"for reference.\n"
;
switch(uifc.list(WIN_ORG|WIN_ACT|WIN_CHE,0,0,0,&srvr_dflt,0
,"Server Configuration",opt)) {
case 0:
global_cfg(&global_startup);
break;
case 1:
termsrvr_cfg(&run_bbs, &bbs_startup);
break;
case 2:
websrvr_cfg(&run_web, &web_startup);
break;
case 3:
ftpsrvr_cfg(&run_ftp, &ftp_startup);
break;
case 4:
mailsrvr_cfg(&run_mail, &mail_startup);
break;
case 5:
services_cfg(&run_services, &services_startup);
break;
default:
return;
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment