FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Redhat > Fedora Development

 
 
LinkBack Thread Tools
 
Old 09-18-2010, 02:22 AM
Eric Moret
 
Default Url handler for telnet and ssh schemas

Hi fedora-devel,

I would like to contribute a piece of bash code that handles url in
gnome for ssh and telnet schemas. The idea being that whenever a user
clicks a link the proper client opens up in the default terminal
window configured in the user's "Preferred Applications" dialog.
examples of links:
telnet://my.telnet.server/
ssh://root@my.home.server:2222/

I am not quite sure what upstream should look like for such a script.
I took some of my code from launchmail which is a somewhat similar
script for email but has no upstream (that I can tell). The xdg-open
script from the portland/xdg-utils package is a wrapper that only
calls the corresponding Desktop startup tool. In the case of gnome it
calls gnome-open with the url passed to xdg-open. Only issue is that
gnome-open does not support telnet or ssh.

I appreciate any direct feedback on the below script and suggestions
for upstream location.
__
Eric


$ cat terminal-url-handler
#!/bin/bash

# to enable URL handling in FF, open the about:config page and add a new string:
# network.protocol-handler.app.telnet with value:
/path/to/handler/terminal-url-handler
# then add 2 new boolean:
# network.protocol-handler.external.telnet and set to true
# network.protocol-handler.external.ssh and set to true
# last, select "always ask" for content type telnet in Firefox
Preferences | Applications dialog
# the first time you use the handler manually select the script file
and check the remember option
#
# to enable this handler in gnome make sure you create the following
values in gconf:
# gconftool-2 -s /desktop/gnome/url-handlers/ssh/command
'/path/to/terminal-url-handler %s' --type String
# gconftool-2 -s /desktop/gnome/url-handlers/ssh/enabled --type Boolean true
# gconftool-2 -s /desktop/gnome/url-handlers/ssh/needs_terminal --type
Boolean false
# gconftool-2 -s /desktop/gnome/url-handlers/telnet/command
'/path/to/terminal-url-handler %s' --type String
# gconftool-2 -s /desktop/gnome/url-handlers/telnet/enabled --type Boolean true
# gconftool-2 -s /desktop/gnome/url-handlers/telnet/needs_terminal
--type Boolean false

#
# URI parsing function
# taken from http://valeriu.palos.ro/537/uri-parsing-using-bash-built-in-features/
#
# The function creates global variables with the parsed results.
# It returns 0 if parsing was successful or non-zero otherwise.
#
# [schema://][user[assword]@]host[ort][/path][?[param=value]...][#fragment]
#
uri_parser () {
*# uri capture
*uri="$@"

*# safe escaping
*uri="${uri//`/%60}"
*uri="${uri//"/%22}"

*# top level parsing
*pattern='^(([a-z]{3,6})://)?((([^:/]+)([^@/]*))?@)?([^:/?]+)([0-9]+))?)(/[^?]*)?(?[^#]*)?(#.*)?$'
*[[ "$uri" =~ $pattern ]] || return 1;

*# component extraction
*uri=${BASH_REMATCH[0]}
*uri_schema=${BASH_REMATCH[2]}
*uri_address=${BASH_REMATCH[3]}
*uri_user=${BASH_REMATCH[5]}
*uri_password=${BASH_REMATCH[7]}
*uri_host=${BASH_REMATCH[8]}
*uri_port=${BASH_REMATCH[10]}
*uri_path=${BASH_REMATCH[11]}
*uri_query=${BASH_REMATCH[12]}
*uri_fragment=${BASH_REMATCH[13]}

*# path parsing
*count=0
*path="$uri_path"
*pattern='^/+([^/]+)'
*while [[ $path =~ $pattern ]]; do
* *eval "uri_parts[$count]="${BASH_REMATCH[1]}""
* *path="${path:${#BASH_REMATCH[0]}}"
* *let count++
*done

*# query parsing
*count=0
*query="$uri_query"
*pattern='^[?&]+([^= ]+)(=([^&]*))?'
*while [[ $query =~ $pattern ]]; do
* *eval "uri_args[$count]="${BASH_REMATCH[1]}""
* *eval "uri_arg_${BASH_REMATCH[1]}="${BASH_REMATCH[3]}""
* *query="${query:${#BASH_REMATCH[0]}}"
* *let count++
*done

*# return success
*return 0
}

error_dialog () {
*echo "$1"
*if [ -x /usr/bin/zenity ]; then
* */usr/bin/zenity --error --text="$1"
*else
* *xmessage "$1"
*fi
}

sanity_check () {
*unset INVALID
*echo "$1" | grep -q "terminal-url-handler" && INVALID="yes"
*echo "$1" | grep -q "gnome-open" && INVALID="yes"
*if [ "$INVALID" == "yes" ]; then
* *error_dialog "Error: $1 is an invalid terminal. *Please reconfigure."
* *[ -x /usr/bin/gnome-default-applications-properties ] && exec
/usr/bin/gnome-default-applications-properties
* *exit 1
*fi
}

exists () {
*which "${1%% *}" 2> /dev/null > /dev/null
*return $?
}

if [ $# != 1 ]; then
*error_dialog "Usage: $0 <url>"
*exit 1
fi

uri_parser $1
if [ "$?" != 0 ]; then
*error_dialog "Error: Invalid URL"
*exit 1
fi

if [ "$uri_schema" == 'telnet' ]; then
*CLI="$uri_schema $uri_host $uri_port"
elif [ "$uri_schema" == 'ssh' ]; then
*CLI="$uri_schema -p ${uri_port:-22} ${uri_user:-$USER}@$uri_host"
else
*error_dialog "Error: telnet and ssh are the only supported url schemas"
*exit 1
fi

# Attempt to use GNOME Preferred Terminal
if [ -x /usr/bin/gconftool-2 -a -x
/usr/bin/gnome-default-applications-properties ]; then
*# Pull key from gconf, trim leading & trailing spaces
*PREFTERM=$(gconftool-2 -g /desktop/gnome/applications/terminal/exec
2>/dev/null | sed -e 's/^ *//; s/ *$//')
*TERMARGS=$(gconftool-2 -g
/desktop/gnome/applications/terminal/exec_arg 2>/dev/null | sed -e
's/^ *//; s/ *$//')

*# Remove arguments
*PREFTERM="`echo $PREFTERM | cut -f1 -d" "`"

*# sanity check (prevent infinite loops)
*sanity_check "$PREFTERM"

*if [ ! -z $DISPLAY ] && *[ -x /usr/bin/gnome-open ]; then
* *if ! exists "$PREFTERM"; then
* * *error_dialog "Error: The terminal $PREFTERM does not exist.
Please reconfigure."
* * *[ -x /usr/bin/gnome-default-applications-properties ] && exec
/usr/bin/gnome-default-applications-properties
* * *exit 1
* *fi
*fi
else
*TERMINALS="gnome-terminal konsole urxvt rxvt aterm xterm"
*for PREFTERM in $TERMINALS; do
* *exists "$terminal" && break
*done
fi

exec $PREFTERM $TERMARGS $CLI
--
devel mailing list
devel@lists.fedoraproject.org
https://admin.fedoraproject.org/mailman/listinfo/devel
 
Old 09-23-2010, 06:36 PM
Eric Moret
 
Default Url handler for telnet and ssh schemas

Could you please review this email and answer questions listed below.

Thanks,
__
Eric

On Fri, Sep 17, 2010 at 7:22 PM, Eric Moret <eric.moret@gmail.com> wrote:
> Hi fedora-devel,
>
> I would like to contribute a piece of bash code that handles url in
> gnome for ssh and telnet schemas. The idea being that whenever a user
> clicks a link the proper client opens up in the default terminal
> window configured in the user's "Preferred Applications" dialog.
> examples of links:
> telnet://my.telnet.server/
> ssh://root@my.home.server:2222/
>
> I am not quite sure what upstream should look like for such a script.
> I took some of my code from launchmail which is a somewhat similar
> script for email but has no upstream (that I can tell). The xdg-open
> script from the portland/xdg-utils package is a wrapper that only
> calls the corresponding Desktop startup tool. In the case of gnome it
> calls gnome-open with the url passed to xdg-open. Only issue is that
> gnome-open does not support telnet or ssh.
>
> I appreciate any direct feedback on the below script and suggestions
> for upstream location.
> __
> Eric
>
>
> $ cat terminal-url-handler
> #!/bin/bash
>
> # to enable URL handling in FF, open the about:config page and add a new string:
> # network.protocol-handler.app.telnet with value:
> /path/to/handler/terminal-url-handler
> # then add 2 new boolean:
> # network.protocol-handler.external.telnet and set to true
> # network.protocol-handler.external.ssh and set to true
> # last, select "always ask" for content type telnet in Firefox
> Preferences | Applications dialog
> # the first time you use the handler manually select the script file
> and check the remember option
> #
> # to enable this handler in gnome make sure you create the following
> values in gconf:
> # gconftool-2 -s /desktop/gnome/url-handlers/ssh/command
> '/path/to/terminal-url-handler %s' --type String
> # gconftool-2 -s /desktop/gnome/url-handlers/ssh/enabled --type Boolean true
> # gconftool-2 -s /desktop/gnome/url-handlers/ssh/needs_terminal --type
> Boolean false
> # gconftool-2 -s /desktop/gnome/url-handlers/telnet/command
> '/path/to/terminal-url-handler %s' --type String
> # gconftool-2 -s /desktop/gnome/url-handlers/telnet/enabled --type Boolean true
> # gconftool-2 -s /desktop/gnome/url-handlers/telnet/needs_terminal
> --type Boolean false
>
> #
> # URI parsing function
> # taken from http://valeriu.palos.ro/537/uri-parsing-using-bash-built-in-features/
> #
> # The function creates global variables with the parsed results.
> # It returns 0 if parsing was successful or non-zero otherwise.
> #
> # [schema://][user[assword]@]host[ort][/path][?[param=value]...][#fragment]
> #
> uri_parser () {
> **# uri capture
> **uri="$@"
>
> **# safe escaping
> **uri="${uri//`/%60}"
> **uri="${uri//"/%22}"
>
> **# top level parsing
> **pattern='^(([a-z]{3,6})://)?((([^:/]+)([^@/]*))?@)?([^:/?]+)([0-9]+))?)(/[^?]*)?(?[^#]*)?(#.*)?$'
> **[[ "$uri" =~ $pattern ]] || return 1;
>
> **# component extraction
> **uri=${BASH_REMATCH[0]}
> **uri_schema=${BASH_REMATCH[2]}
> **uri_address=${BASH_REMATCH[3]}
> **uri_user=${BASH_REMATCH[5]}
> **uri_password=${BASH_REMATCH[7]}
> **uri_host=${BASH_REMATCH[8]}
> **uri_port=${BASH_REMATCH[10]}
> **uri_path=${BASH_REMATCH[11]}
> **uri_query=${BASH_REMATCH[12]}
> **uri_fragment=${BASH_REMATCH[13]}
>
> **# path parsing
> **count=0
> **path="$uri_path"
> **pattern='^/+([^/]+)'
> **while [[ $path =~ $pattern ]]; do
> ** *eval "uri_parts[$count]="${BASH_REMATCH[1]}""
> ** *path="${path:${#BASH_REMATCH[0]}}"
> ** *let count++
> **done
>
> **# query parsing
> **count=0
> **query="$uri_query"
> **pattern='^[?&]+([^= ]+)(=([^&]*))?'
> **while [[ $query =~ $pattern ]]; do
> ** *eval "uri_args[$count]="${BASH_REMATCH[1]}""
> ** *eval "uri_arg_${BASH_REMATCH[1]}="${BASH_REMATCH[3]}""
> ** *query="${query:${#BASH_REMATCH[0]}}"
> ** *let count++
> **done
>
> **# return success
> **return 0
> }
>
> error_dialog () {
> **echo "$1"
> **if [ -x /usr/bin/zenity ]; then
> ** */usr/bin/zenity --error --text="$1"
> **else
> ** *xmessage "$1"
> **fi
> }
>
> sanity_check () {
> **unset INVALID
> **echo "$1" | grep -q "terminal-url-handler" && INVALID="yes"
> **echo "$1" | grep -q "gnome-open" && INVALID="yes"
> **if [ "$INVALID" == "yes" ]; then
> ** *error_dialog "Error: $1 is an invalid terminal. *Please reconfigure."
> ** *[ -x /usr/bin/gnome-default-applications-properties ] && exec
> /usr/bin/gnome-default-applications-properties
> ** *exit 1
> **fi
> }
>
> exists () {
> **which "${1%% *}" 2> /dev/null > /dev/null
> **return $?
> }
>
> if [ $# != 1 ]; then
> **error_dialog "Usage: $0 &lt;url&gt;"
> **exit 1
> fi
>
> uri_parser $1
> if [ "$?" != 0 ]; then
> **error_dialog "Error: Invalid URL"
> **exit 1
> fi
>
> if [ "$uri_schema" == 'telnet' ]; then
> **CLI="$uri_schema $uri_host $uri_port"
> elif [ "$uri_schema" == 'ssh' ]; then
> **CLI="$uri_schema -p ${uri_port:-22} ${uri_user:-$USER}@$uri_host"
> else
> **error_dialog "Error: telnet and ssh are the only supported url schemas"
> **exit 1
> fi
>
> # Attempt to use GNOME Preferred Terminal
> if [ -x /usr/bin/gconftool-2 -a -x
> /usr/bin/gnome-default-applications-properties ]; then
> **# Pull key from gconf, trim leading & trailing spaces
> **PREFTERM=$(gconftool-2 -g /desktop/gnome/applications/terminal/exec
> 2>/dev/null | sed -e 's/^ *//; s/ *$//')
> **TERMARGS=$(gconftool-2 -g
> /desktop/gnome/applications/terminal/exec_arg 2>/dev/null | sed -e
> 's/^ *//; s/ *$//')
>
> **# Remove arguments
> **PREFTERM="`echo $PREFTERM | cut -f1 -d" "`"
>
> **# sanity check (prevent infinite loops)
> **sanity_check "$PREFTERM"
>
> **if [ ! -z $DISPLAY ] && *[ -x /usr/bin/gnome-open ]; then
> ** *if ! exists "$PREFTERM"; then
> ** * *error_dialog "Error: The terminal $PREFTERM does not exist.
> Please reconfigure."
> ** * *[ -x /usr/bin/gnome-default-applications-properties ] && exec
> /usr/bin/gnome-default-applications-properties
> ** * *exit 1
> ** *fi
> **fi
> else
> **TERMINALS="gnome-terminal konsole urxvt rxvt aterm xterm"
> **for PREFTERM in $TERMINALS; do
> ** *exists "$terminal" && break
> **done
> fi
>
> exec $PREFTERM $TERMARGS $CLI
>
--
devel mailing list
devel@lists.fedoraproject.org
https://admin.fedoraproject.org/mailman/listinfo/devel
 

Thread Tools




All times are GMT. The time now is 04:26 PM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org