11. Helper Applications

Multi Gnome Terminal comes with two supplemental programs to help extend its functionality into other areas.

11.1. mgt-helper

mgt-helper is a bash script meant to be used in conjunction with Multi Gnome Terminal to extend Multi Gnome Terminal's usefulness in a shell environment. Which is where a lot of what we do at the command line winds up -- in bash, since this is the default shell for Linux, and common on many Unices.

The script itself is a collection of subroutines that can be invoked from within Multi Gnome Terminal's Edit Commands or Keybindings features, and in some cases, used on the command line with other Multi Gnome Terminal options. These subroutines are essentially independent of each other, and should be invoked individually.

Some of the more interesting features are: the ability to have a custom bash history file defined specifically for a Tab (what you get with the UpArrow key); the use of text based applications as GNOME "Document" (URL) handlers in a split or self-contained Tab; and the ability to run complex, compound commands from Edit Commands to initialze Tabs and terminals.

There are some known limitations: mgt-helper is very much bash-centric, and most of the routines will probably not work with other shells without modification (please send patch :). The URL Handlers only work on Linux.

11.1.1. Configuration

There are a number of variables that can be defined to alter mgt-helper's behavior and set user preferences. These are all listed in the script itself, though some may be commented out.

It is highly recommended that such user or site preferences be put in another file. This can be /etc/mgt-helper.rc for site-wide preferences, or $HOME/.mgt-helper.rc for individual user preferences. Both of these files are checked by mgt-helper automatically, with the latter taking precedence over other files, and the defaults as set in the script itself.

In addition, since these configuration files will be sourced by Bash, any other variables, or manipulation of the bash environment, can be added at your discretion. For instance, you could set Bash's TMOUT (time out) variable, and even base this action conditionally on other environment factors, or the contents of the command line. Or you could check the command line contents, see if a url handler is being invoked, then check the URL itself, and alter the default handler dynamically based on certain conditions. For instance, use Mozilla for your favorite multi-media sites, and w3m for less interesting HTTP sites. Or perhaps use the document extension to determine the choice of browsers, e.g. Mozilla for shockwave, or wget for web-hosted RPMs.

11.1.2. Document (URL) Handlers

This feature is provided so that text based applications may be used with GNOME "document" handling inside Multi Gnome Terminal. Presumably so that such documents can be opened in a split terminal or Tab.

This is basically a feature of GNOME that allows user defined applications for different "document" types. Typically, these are GUI apps. When the mouse is over a type of URL that Multi Gnome Terminal can identify, the URL is highlighted by an underscore. It can then be "launched" with CTRL-MiddleMouse. Which application is used, is typically configured in GNOME.

To change the default GNOME behavior, you will first have to set mgt-helper with the appropriate command line option (e.g. -u) as the handler for GNOME (see below). This can be done through the GNOME menu interface, or by directly editing $HOME/.gnome/Gnome with a text editor (carefully!).

Secondly, be aware that now, any GNOME application that tries to access this feature, will be using mgt-helper as the application of choice, even if it is some other application altogether. This means that there must be alternate handlers set up, preferably in either $HOME/.mgt-helper.rc or /etc/mgt-helper.rc, since other applications don't know about Multi Gnome Terminal and its features. In short, that just will not work at all (unless alternate applications are provided for). Defaults are provided, but probably won't work on some systems. See the script for appropriate variable names, and re-define as needed.

Tip

mgt-helper will use sane defaults for all URL handlers, but you can over-ride these by setting user or site preferences in the configuration files.

Note: This feature only works on Linux at this time.

11.1.3. Command Line Options

This is a list of available mgt-helper command line options. See examples in next section. The basic syntax is:

  mgt-helper [option] CMD_OPTION [arguments]

The following general options may be combined.

  • -D

    Turn on "verbose", debugging mode, which writes some debug type output to the screen and also to /tmp/mgt-helper.debug.

  • -r RC_FILE

    Specify this RC_FILE, which is parsed after any other config files, and will over-ride any previously defined settings.

  • -T

    Force this Command to use a full Tab.

  • -H

    Force this Command to a horizontally split Tab.

  • -V

    Force this Command to a vertically split Tab.

  • -W

    Force this Command to a "New Window".

  • -WT

    Force this Command to a "New Window" with appropriate start-up Tabs for the current Class.

  • -A ACTION

    Use this Multi Gnome Terminal ACTION for output of the Command. Example: --add-tab, or --add-tab --tclass myclass. Don't get carried away with this, as all actions will not work. Notably, -x, which is used by CMD_OPTIONS listed below. And, may not be appropriate for all CMD_OPTIONS. Be sure to quote if there is any whitespace.



Use only one CMD_OPTION option at a time (but can be combined with general options above).

  • -h, --history EXTENSION

    Specify a user defined, custom bash history file for this terminal/Tab, where EXTENSION is a user-defined, unique string. This probably only works with bash right now. Use with Edit Commands.

  • -u, --url-handler, --http-handler

    Set mgt-helper as the GNOME URL Handler for HTTP (WWW) URLs. Also can be used for HTTPS URLS. See full example syntax below. You will have to either define this in the GNOME menus as the "Document" handler. Or, hand edit your $HOME/.gnome/Gnome file and set accordingly. The idea here is to open a new Tab (or split terminal), with a text client running. There is no default HTTP handler set; mgt-helper will look for w3m, links, and lynx and use whatever it finds first. Though you can set a preference for this (and other handlers too).

  • -f, --ftp-handler

    Set mgt-helper as the GNOME URL Handler for FTP URLs, similar to above. Default handler is whatever is used for HTTP above.

  • -m, --mailto-handler

    Set mgt-helper as the GNOME URL Handler for mailto style URLs (i.e. email addresses), similar to above. Default handler is mutt.

  • -F, --file-handler

    Set mgt-helper as the URL Handler for files, similar to above. Depending on what mgt-helper thinks of the file, it will either provide some information itself, or spawn a file manager (default is Midnight Commander).

  • -x, --execute

    Use this option to run complex, compound commands from within Multi Gnome Terminal, e.g. as an Edit Commands command. For example, a command like ps | less does not work from Edit Commands. But by wrapping this in mgt-helper (or another script), it does work, since now the shell is handling the parsing of the command string (which happens to be shell constructs).

  • -U, --user-guide

    Open this User Guide in a Tab (or split terminal). Use with Edit Commands, or from the command line.

  • -s, --ssh [ssh args] HOST [command]

    Use mgt-helper as a ssh wrapper. This is probably only useful where the sshd daemon may be running as another user, and thus breaks our GNOME URL Handling tricks. Use with Edit Commands, if needed (ie URL Handlers don't work).

  • -S, --su

    Use mgt-helper as a su wrapper. Su will also break the Multi Gnome Terminal URL Handling extensions. Use this instead of the Multi Gnome Terminal Root menu selection, or with Edit Commands.

  • -g, --google

    Search Google from Edit Commands.

  • -lg, --lin-google

    Same as above but searches on google.com/linux only.

  • -l, --lookup [WORD]

    Look up a word in an on-line dictionary. This will use the dict command if availalbe, otherwise the Merriam Webster on-line dictionary is used. Provided as a convenience feature only. If WORD is omitted, then user is prompted for word to look up.

  • -d, --debug COMMAND [args]

    This is a simple troubleshooting aid to capture error output from shell commands (not Multi Gnome Terminal internals) that might vanish quickly otherwise. For instance, you have a "command" to open a Tab, but there is some error and the Tab closes too quickly to see what happened. For use with Edit Commands.

  • --show-all

    This dumps all bash variables from the mgt-helper environment to STDOUT, and also writes the same data to /tmp/mgt-helper.debug. For simple troubleshooting purposes.



11.1.4. Examples

A few quick examples of mgt-helper usage, of no particular value other than to illustrate the kinds of things that can be done. By and large, these examples are meant to be used with Edit Commands.

Example 1. Create a custom bash history file

  mgt-helper -h my_tab


This will create, and subsequently use, a bash history file named .bash_history-my_tab, whenever this Tab is opened. So what you get with the UpArrow will only be command history that is used in this Tab. It also uses the mgt-helper variable SHELL_CMD to start the shell. Use with Edit Commands.

Example 2. Read my mail on another system, in such a way that URL Handling works like we want

  mgt-helper -s -t some_host.org   mutt


This essentially translates out to: ssh -t some_host.org mutt, and is only useful to make sure that URL Handling extensions are sure to work. Use with Edit Commands.

Example 3. Create a shell/Tab that times out in 15 minutes

  mgt-helper -x export TMOUT=900; bash --login


Bash's TMOUT feature only works for interactive shells, and while the user is sitting at the bash prompt. Use with Edit Commands.

Example 4. Show who is logged in and what they are up to

  mgt-helper -x w |  sed 's/   //' |  /usr/bin/less -Ps"`hostname -s`\: who is that"


We trimmed a little gratuitous whitespace with sed here too, just so it fits better. Use with Edit Commands.

Example 5. Show file listing with current directory

  mgt-helper -x ls  -laF  | /usr/bin/less -P "All files for\: `pwd` `date`"


Use with Edit Commands.

Example 6. Create a "New Mail" Tab for mutt

  mgt-helper  -x while : ; do mutt -H /dev/null ; clear ; done


This will create a Tab just for composing new mail in mutt. (It is not useful for replying, just starting a new mail from scratch.)

Example 7. Setting GNOME Document Handlers

If you want to hand edit your ~/.gnome/Gnome file to set up URL Handling for use in Multi Gnome Terminal:

    [URL Handlers]
    file-show=mgt-helper -F "%s"
    mailto-show=mgt-helper -m "%s" 
    http-show=mgt-helper -u "%s"
    https-show=mgt-helper -u "%s"
    ftp-show=mgt-helper -f "%s"
  


We are just showing the relevant ones here. The handlers that Multi Gnome Terminal will use are defined in the script as:

    HTTP_HANDLER (undefined, script will look for w3m, links, or lynx)
    FTP_HANDLER (undefined, and uses same as above by default)
    MAILTO_HANDLER=mutt
    FILE_HANDLER=mc (though some files are handled by mgt-helper itself)
  

And you must set alternate handlers for non-Multi Gnome Terminal applications (if you use them elsewhere):

    GNOME_HTTP_HANDLER
    GNOME_FTP_HANDLER
    GNOME_MAILTO_HANDLER
    GNOME_FILE_HANDLER
  

Again, it is best to set these in $HOME/.mgt-helper.rc.

Example 8. Advanced usage: Customizing URL Handlers

OK, let's assume all this makes sense, and we have URL handling set up in GNOME, and mgt-helper has been configured enough to know it works OK, including Document handlers in GNOME. Now, let's do something a little more interesting. Let's look for specific file types, and dynamically alter our Handler, and mgt-helper's behavior based on the URL's file type.

Let's say we often download source tarballs, that are gzipped tar archives. We don't need a web browser to download this. And what do we do right after downloading? We unpack it! So we make a custom handler for this situation. Put this in ~/.mgt-helper.rc, and you are there:

 
 # Check the incoming command line to see if we are handling, and if it is a tgz, etc.
 if [ "$1" = "-f" -o "$1" = "-u" ] && [ -f $PTS_FILE ] && echo $2 |grep "\.tgz$\|\.tar\.gz$\|\.Z$" >/dev/null;
  then
    
    # Make a temporary directory using the base filename. Must be exported.
    export dldir=/tmp/`basename $2 |sed 's,\(\.tar\.gz\|\.tgz\|\.Z\)$,,'`
    mkdir -p $dldir 
    
    # Get our current /dev/pts info from MGT (special file created 
    # during handling) that is necessary. $PTS_FILE is defined in mgt-helper
    # already as ~/.mgt_tty.
    pts=`cat $PTS_FILE`
    
    # Make sure to remove it now so it does not cause trouble later!!!
    rm -f $PTS_FILE
    
    # Now do the voodoo.
    exec /usr/bin/multi-gnome-terminal --nowait --add-tab --tname `basename $dldir` -x \
    "mgt-helper -x cd $dldir && wget -P . $2 && tar zvfx `basename $2` && (bash ;:) ||\
     read -p \"Failed, press ENTER to continue...\"" >$pts || exit 1
 fi
  


The first part is just shell stuff to get ready. First find if we are going to be the handler here, and that we have the file type we want, and then create a tmp directory to download into. Next, get our /dev/pts info (important!) that Multi Gnome Terminal feeds us just for this purpose so Multi Gnome Terminal will know where to open a new terminal, then remove the file to keep things clean for the next application that might come calling. This is the trigger we need, to know if the calling program is Multi Gnome Terminal or not. If not, we need to provide an alternate application (this is done elsewhere in mgt-helper).

Now our final command does this: We will be creating a new Tab that will be home to all our command line voodoo. Which is: change to our new directory, use wget to download our file, if successful then unpack it, and if all is still well, start a new shell running in our newly created Tab. If anything fails, we get notified with the original error message still displayed on screen.

Note we made a recursive call to mgt-helper -x in the command passed to Multi Gnome Terminal. It is much better to let a shell expand compound commands like we are using here and interpret metacharacters (though it certainly does not have to be mgt-helper that does this). Also, mgt-helper uses certain variables we might have wanted to take advantage of here: $MGT in case there is more than one version installed, or its not in the $PATH, and $URL_ACTION which can be used to set a preference for how the new terminal is created, e.g. a split, a new tab, or a new window.

One final note ... this only works on a fully qualified URL, e.g. http://someplace.org/somepath/some.tgz.

Similar customized handlers could conceivably be designed for other file types, or for specific sites.

11.2. mgt-pty-helper

mgt-pty-helper is a simple, one dimensional program that facilitates proper updating of the utmp (wtmp) log database. This records who is logged in, and what they are doing, and is used by other programs like who. mgt-pty-helper does this so that Multi Gnome Terminal itself does not have to be suid root, and thus is a more secure way of doing things.

For this to function properly, mgt-pty-helper should have permissions set chmod g+s, and the group owner should be the same as the group owner of the utmp logs (possibly /var/log/utmp or /var/log/wtmp). The correct group ID could be "tty", or "utmp", or something else altogether, depending on platform and packager. If you have installed from raw source, you will have to do this yourself. RPM packages should be doing this for you, though you may want to check and make sure it is working correctly.

If tracking this information is not important, then not to worry ;-) Once installed, there is no user inter-action with mgt-pty-helper.