… must be overridden by subclasses. go_async.py: Modified `AsyncRunner.shutdown()` to use the `running` property instead of an explicit check that looks for the executor. go_async.py: The executor is now set to `None` inside `AsyncRunner.__init__()` with the expectation that it will be properly assigned in subclasses. This means we no longer need explicit checks for the presence of the executor attribute. go_async.py: Renamed `MultiprocessRunner.instance` to `MultiprocessRunner.executor_instance` to better reflect how it is used. go_async.py: The `MultiprocessRunner` will no longer shut down the executor if there are other instances in use. go_async.py: Added some useful debug logging here and there. sso.py: Added the ability to specify a keytab (path). gateone.py: Added 'sso_keytab' to the list of authentication options when generating a new 20authentication.conf. terminal.py: Reduced the default timeout for the `HTML_CACHE` (which is an `AutoExpireDict`) from 5 minutes to 1. There's really no need to keep lines around in memory that long.
…from Google's web fonts directory. If you want to use a font that's installed on your computer just set the terminal font to 'monospace' and change your browser's monospace font to whatever you like. I'll be adding font size control that's independent from Gate One's global font size setting next. Added a new Python script: woff_info.py. It will be used by app_terminal.py to get metadata from .woff fonts. It can also be used on the command line to output .woff font metadata ("name table data", specifically) in JSON format. app_terminal.js: Added a new WebSocket action and associated function: "terminal:enumerate_fonts". it returns a list of fonts installed in the terminal/static/fonts directory (only works with .woff fonts). terminal.js: Added a new user preference: GateOne.prefs.font. It will hold the currently-selected font. terminal.js: Added GateOne.Terminal.enumerateFontsAction() and registered it to the "terminal:enumerate_fonts" WebSocket action. terminal.js: Fixed a bug in GateOne.Terminal.enumerateColors() where it was not remembering which text color scheme you last selected. terminal.js: Renamed GateOne.Terminal.enumerateColors() to GateOne.Terminal.enumerateColorsAction() to better reflect what it does (and for consistency: most WebSocket action functions end in 'action'). terminal.js: GateOne.Terminal.Input.capture() and GateOne.Terminal.setActive() are now attached to the "go:toggle_panel:out" event. This should make it so you don't have to click on the terminal after closing a panel to re-activate it. Note: Only applies if *not* in embedded mode. app_terminal.py: Fixed a bug with the print stylesheet where it wasn't being rendered properly. gateone.py: Fixed a bug in ApplicationWebSocket.render_and_send_css() where it wasn't passing through the 'media' and 'element_id' keyword arguments to send_css() which would result in all CSS elements being created with the "media" set to "screen" and randomly-assigned element IDs. gateone.py: Added a shortcut to ApplicationWebSocket.render_style() inside of all GOApplication() classes. So you can now use self.render_style() instead of self.ws.render_style() gateone.py: Added a "force" option to ApplicationWebSocket.render_style() as a mechanism to force re-caching of the style at the client. utils.py: Added a "mimetype" keyword argument to the create_data_uri() function for those times when you already know the mimetype or want to force it. gateone.js: Fixed a bug in GateOne.Visual.togglePanel() where it was firing "toggle_panel:out" instead of "go:panel_toggle:out" (missing the go:) when toggling all panels out (before toggling a new one in). Themes: Removed the width value from ✈paneltablelabel since it isn't necessary and was making preference panels wider than they needed to be. Other: Updated a bunch of copyright strings to reflect the current year.
…cts if a given module is an application and registers it accordingly in GateOne.loadedApplications. gateone.js: Renamed the 'NAME' variable that gets attached to all objects created with GateOne.Base.update() to '__name__' to clarify that it is meant to be a special-use variable. gateone.js: Renamed the 'parent' variable to '__parent__' for the same reason as above. gateone.js: Renamed the 'VERSION' variable to '__version__' for the same reason as above (and consistency). gateone.js: Added 'viewBox="0 0 18 18"' to all SVG icons so they will scale-to-fit better in certain situations. gateone.js: Fixed a bug where GateOne.Visual.slideLeft() would sometimes slide up too. gateone.js: Alphabetized GateOne.prefs defaults at the top of the script because I'm a freak like that. gateone.js: Implemented a keepalive mechanism that uses GateOne.Net.ping() to determine if the connection to the Gate One server has been lost. gateone.js: Added two new preferences: GateOne.prefs.pingTimeout and GateOne.prefs.keepaliveInterval. They're both set in milliseconds and control the new keepalive/ping timeout mechanism. The defaults are 5000 (5 seconds) and 15000 (15 seconds), respectively. This should resolve issue #217 gateone.js: Fixed a bug in GateOne.Utils.isVisible() where it would fail to make a correct determination in certain situations (and sometimes cause an exception). gateone.js: Made some changes to GateOne.Utils.getEmDimensions() in order to make it more reliable in certain situations. gateone.js: Made some changes to GateOne.Utils.getRowsAndColumns() in order to make it work on elements that are not (currently) visible. gateone.js: Fixed a bug in GateOne.Events.off() where it was referencing an undefined variable (self) causing an exception (most commonly happened in conjunction with once()). terminal.js: newTerminal() now passes a 'termUndefined' variable when triggering the 'terminal:new_terminal' event so functions attached to that event can tell if this terminal is new or was merely re-created from an existing session (e.g. user reloads the page or reconnects). e.g. trigger("terminal:new_terminal", term, termUndefined). Themes: Just a few tweaks here and there to the new prefs panel stuff. SSH Plugin: Fixed the bug where autoConnectURL was not working. This should close issue #226.
…enable_unix_socket' setting was missing. It is no longer mandatory. sso.py: Improved error handling/logging when there's a Kerberos-specific problem. Bookmarks plugin: Fixed a bug where 't' was undefined. setup.py (and others): Moved terminal.py into its own separate module. Apps and plugins had to have their imports corrected to reflect this.
…rt the terminal module when running Gate One out of the download/git directory. gateone.py: Fixed a bug where an exception would be thrown trying to read a 'theme.css' file that does not exist (in a first-run situation or if the user cleared their gateone_cache directory). gateone.py: Fixed a bug in ApplicationWebSocket.broadcast_file_update() where it was using 'notice' instead of 'go:notice'. gateone.py: Fixed a bug in ApplicationWebSocket.file_checker() where it wasn't resetting the 'watched_files' modification time after calling a registered file watching function. gateone.py: Fixed a bug where a number of functions were not using the correct 'session_dir' variable (they were using the 10server.conf and ignoring what was given on the command line). gateone.py: Fixed a bug where Applications' init() functions were not being passed 'settings' that had been overridden on the command line. gateone.py: Fixed a bug where you'd get an exception while converting old-style server.conf API keys to the new 20api_keys.conf file format. gateone.py: Added some additional debugging information to ApplicationWebSocket.file_checker() when an exception is encountered.
…o the 'prefix' variable being set incorrectly. gateone.py: Fixed a bug where themes were not being synchronized with the client properly (it was using the modification time of the wrong file). gateone.py: You can run Gate One out of the git clone directory again. Installing via setup.py is not necessary. This should close issue #214 (#214). gateone.py: Changed the way 'gateone' settings are detected so as to avoid accidentally overwriting a 10server.conf that may simply have a syntax error (related to issue #213). app_terminal.py: Fixed a bug where if you had a syntax error in your 50terminal.conf it would overwrite the file. This should close issue #213 (#213). Themes: Just a few tweaks here and there to make stuff look better.
…ust. sso.py: Ditto. authpam.py: Ditto. go_process.js: Before loading lines on the screen the Web Worker will now strip trailing whitespace. This should make copying & pasting easier when dealing with multiple lines. hello_embedded: All calls to GateOne.init() inside the tutorial now automatically set GateOne.Logging.level to 'DEBUG'.
…one.py surrounding the Tornado imports. If we get an error importing tornado we won't have the _() function available so there's no point in wrapping it. I guess this one error message won't support internationalization--not much I can do about it. Removed some unused imports in a few places to (hopefully) save some memory. Also removed some unused variables found by pylint. Added authpam.py to setup.py. Apparently it has been missing this whole time! Moved __reduce_renditions() outside of terminal.Terminal since there's nothing referencing 'self' inside of it (and having the function in the global scope makes it slightly faster). Fixed a bug where you couldn't click on a terminal to switch to it when in grid view. Made it so that the playback controls are hidden when in grid view.
…s is already accounted for inside of auth.py.
…annot be found. Made it so that multiprocessing gets disabled if you're running Gate One using Python 2.6. Apparently the version of functools.partial in 2.6 isn't pickleable but in 2.7 it is. Without that capability I don't know if it would be possible to support multiprocessing in Gate One (any ideas?). For reference, the new rate limiter/autokill logic doesn't work as well without multiprocessing. Fixed the bug where newlines weren't working properly (removed the tilda in front of termios.ONLCR in termio.py). The rate limiter/autokill logic has been improved considerably. No longer will a runaway process force you to restart Gate One (well, it shouldn't anyway if you're running Python 2.7+). It takes a little while to kick in but it seems to work pretty good for killing things like "yes" and "while true; do echo foo; done". I'll make it more sophisticated with fallbacks to killing a PID in the future. Reverted my changes to --address. Apparently they weren't necessary.
…. More is likely on the way as well.