Skip to content
Snippets Groups Projects
  1. Mar 25, 2023
    • Rob Swindell's avatar
    • Rob Swindell's avatar
      Create the "Servers" configuration sub-menu, currently read-only · 00f971d7
      Rob Swindell authored
      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.
      00f971d7
  2. Mar 24, 2023
    • Rob Swindell's avatar
      Set initial state of 'data_event' and 'highwater_event' to *not* signaled · 834d89ea
      Rob Swindell authored
      Since commit fd90eec6 (2 months ago), the Synchronet Web Server on
      my Windows systems has occasionally gone into a state where every HTTP session
      thread was causing 100% CPU utilization and each new HTTP session thread
      would just exacerbate the problem eventually leading to complete system
      instability/unresponsiveness until the sbbs instance was terminated. This was
      more readily reproducible on a Win7-32 VM, but would occasionally, though
      much less frequently, happen in a native instance on Win10-64 as well.
      
      Using the VisualStudio debugger, I was able to narrow it down to this:
      
      Each new HTTP thread (eventually, hundreds of such threads) would get stuck
      in this loop in http_output_thread():
      
          while(session->socket!=INVALID_SOCKET) {
      
      		/* Wait for something to output in the RingBuffer */
      		if((avail=RingBufFull(obuf))==0) {	/* empty */
      			if(WaitForEvent(obuf->data_event, 1000) != WAIT_OBJECT_0)
      				continue;
      			/* Check for spurious sem post... */
      			if((avail=RingBufFull(obuf))==0)
      				continue; // <--- data_event signaled, but never cleared
      		}
      
      There appears to be a race condition where this logic could be executed
      immediately after the output ringbuf was created, but before writebuf() was
      ever called (which would have actually placed data in the output buffer),
      causing a potential high-utilization infinite loop: the data_event is signaled
      but there is no data and the event is never reset and nothing can ever add
      data to the ringbuf due to starvation of CPU cycles.
      
      Uses of ringbuf's data_event elsewhere in Synchronet don't seem to be subject
      to this issue since they always call RingBufRead after, which will clear the
      data_event when the ringbuf is actually empty (no similar loops to this one).
      
      The root cause just appears to be a simple copy/paste issue in the code added
      to RingBufInit(): the preexisting 'empty_event' was initialized with a
      correct initiate state of 'signaled' (because by default a ringbuf is empty)
      but the newly added events (data_event and highwater_event) should *not* be
      initially-signaled because... the ringbuf is empty. So I added some parameter
      comments to these calls to CreateEvent() to hopefully make that more clear
      and prevent similar mistakes in the future.
      
      Relieved to have this one resolved finally.
      834d89ea
    • Rob Swindell's avatar
  3. Mar 21, 2023
  4. Mar 20, 2023
    • Rob Swindell's avatar
      Support duration notation (e.g. 10M for 10 minutes) in "*Inactivity" .ini keys · b587e5f8
      Rob Swindell authored
      The recently updated ctrl/sbbs.ini had MaxLoginInactivity = 10M in
      the [BBS] section, which was parsed as 10 seconds rather than the
      intended 10 minutes. This fixes that issue and also will now store all
      of these inactivity values in duration notation. Existing values stored
      in seconds will work fine since that is always the assumed/fallback unit
      of time in duration keys.
      
      Thanks for the report!
      b587e5f8
  5. Mar 19, 2023
  6. Mar 18, 2023
    • Rob Swindell's avatar
      A few help text fixups. · b48da1c0
      Rob Swindell authored
      b48da1c0
    • Rob Swindell's avatar
      Add terminal-client socket inactivity detection/disconnection · 53b26318
      Rob Swindell authored
      - New keys in [BBS] section of sbbs.ini:
        MaxLoginInactivity (default: 10 minutes)
        MaxNewUserInactivity (default: 60 minutes)
        MaxSessionInactivity (default: none/unlimited)
      - Each configured external program/door in SCFG can have its own maximum inactivity setting (or else the session max inactivity is applied)
      - moved node-specific sec_hangup to system-wide/shared max_getkey_inactivity (configured in SCFG->System->Advanced)
      - moved node-specific sec_warn (seconds of inactivity before sending warning) to inactivity_warn (a percentage of elapsed max inactivity before sending warning), also configured in SCFG->System->Advanced and used for both socket and getkey inactivity detection
      - Renamed JS console.inactivity_hangup to console.max_getkey_inactivity (old name remains as alias)
      - Renamed JS console.timeout to console.last_getkey_activity (old name remains as alias)
      - Removed JS console.inactivity_warning
      - Added JS console.max_socket_inactivity (current input_thread inactivity threshold)
      - New text.dat string: InactivityAlert (just contains 3 ^G/BELLs by default) used for non-visual inactive-user warning
      
      The MaxLoginInactivity setting in particular solves the problem of custom scripts (e.g. animated pause prompts) that just poll indefinitely for user input and never time-out  - these will no longer cause nodes to be tied-up with inactive/bot users at login.
      
      You may ask yourself, how did I get here? No, you may ask yourself: why configure these socket inactivity max values in sbbs.ini? The reason is consistency: sbbs.ini is where the MaxInactivity is configured for all the other TCP servers and services.
      
      This fixes issue #534 for Krueger in #synchronet
      53b26318
  7. Mar 16, 2023
    • Rob Swindell's avatar
      Rename system.last* to system.last_*, leaving old names as aliases · a9e9c970
      Rob Swindell authored
      ... to make property names more consistent (e.g. with bbs.last_node).
      The old names (without the underscores) are still usable but won't appear
      in JSDOCS (i.e. jsobjs.html).
      a9e9c970
    • Rob Swindell's avatar
      Add 'first_node' and 'last_node' properties to JS bbs object · a0e7c4ee
      Rob Swindell authored
      This allows scripts (e.g. login.js) to have custom behavior (e.g. shortening
      the maximum inactivity timeout) based on how close the current node is to the
      configured last node number. There may be other uses too, but for the vast
      majority of Synchronet systems, first_node will always be 1 and last_node the
      same as system.nodes/lastnode. Ugh, inconsistent naming. :-(
      a0e7c4ee
  8. Mar 14, 2023
  9. Mar 13, 2023
  10. Mar 12, 2023
  11. Mar 11, 2023
  12. Mar 10, 2023
    • Rob Swindell's avatar
      [telnet|rlogin]_gate now returns bool (false if failed to connect) · 21429128
      Rob Swindell authored
      Previously, there was no real way to tell if the call to telnet_gate() or rlogin_gate() was successful (e.g. to display or an error message to the user), though there were error/warning messages logged for the sysop. Equivalent JS bbs object methods now return Boolean too.
      
      Include ":port" part of address argument to bbs.[telnet|rlogin]_gate methods in JSDOCS.
      
      Removed a bunch of extraneous (copy-pasted?) JS_SET_RVAL() calls from js_bbs.cpp. This just makes the code a little easier to grok.
      21429128
  13. Mar 06, 2023
    • Rob Swindell's avatar
      Add JS bbs methods: save_msg_scan() and reload_msg_scan() · 450c8040
      Rob Swindell authored
      These methods aren't normally needed (msg scan config/ptrs are
      automatically loaded upon logon and saved upon logoff), but for users
      (e.g. sysops) that can be logged-in concurrently or experimenting with
      scans, these methods can be useful and I plan to expose in a loadable
      module next.
      450c8040
Loading