310 lines
8.3 KiB
Tcl
Executable File
310 lines
8.3 KiB
Tcl
Executable File
# NDSutils library
|
|
# common to all nds*.tcl applications
|
|
# authenticated.
|
|
# Copyright (C) 2001 by Patrick Pollet
|
|
#
|
|
# 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.
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
|
|
# Revision history:
|
|
|
|
# 1.00 January 1999 Patrick Pollet
|
|
# Initial version using Caldera NDS client
|
|
# 1.1 February 2001 Patrick Pollet
|
|
# adapted for ncpfs NDS client
|
|
# 1.2 May 2002 Patrick Pollet
|
|
# added support for the new -l option of ncplogin/ncpmap
|
|
# if option mount_locally is 1 in /etc/ndsclient.conf
|
|
|
|
|
|
|
|
proc NDS:init {{tree ""}} {
|
|
global env NDS
|
|
|
|
set NDS(username) {}
|
|
set NDS(tree) {}
|
|
set NDS(context) {}
|
|
set NDS(usernameDN) {}
|
|
set NDS(homepath) {}
|
|
set NDS(default_tree) {}
|
|
set NDS(default_context) {}
|
|
set NDS(logged) "false"
|
|
set NDS(homevolume) {}
|
|
set NDS(mnt_point) {}
|
|
|
|
#these three are possible env variables for the Caldera & ncpfs client
|
|
if {$tree =="" } {
|
|
if {[info exists env(NWCLIENT_PREFERRED_TREE)] } {
|
|
set NDS(default_tree) $env(NWCLIENT_PREFERRED_TREE)
|
|
}
|
|
if {[info exists env(NWCLIENT_DEFAULT_NAME_CONTEXT)]} {
|
|
set NDS(default_context) $env(NWCLIENT_DEFAULT_NAME_CONTEXT)
|
|
}
|
|
if {[info exists env(NWCLIENT_DEFAULT_USER)]} {
|
|
set NDS(username) $env(NWCLIENT_DEFAULT_USER)
|
|
}
|
|
#this one is an extra by PP for a possible autologon
|
|
if {[info exists env(NWCLIENT_DEFAULT_PASSWORD)]} {
|
|
set NDS(password) $env(NWCLIENT_DEFAULT_PASSWORD)
|
|
}
|
|
} else {
|
|
set NDS(default_tree) $tree
|
|
}
|
|
NDS:whoami $tree
|
|
}
|
|
|
|
|
|
proc NDS:login {tree user password context} {
|
|
global NDS
|
|
global mount_locally; # from /etc/ndsclient.conf
|
|
puts "login on $tree as $user.$context"
|
|
if {$context!="" } {
|
|
if ($mount_locally) {
|
|
catch [ exec ncplogin -T $tree -U $user.$context -P $password -l] status
|
|
} else {
|
|
catch [ exec ncplogin -T $tree -U $user.$context -P $password] status
|
|
}
|
|
} else {
|
|
if ($mount_locally) {
|
|
catch [ exec ncplogin -T $tree -U $user -P $password -l] status
|
|
} else {
|
|
catch [ exec ncplogin -T $tree -U $user -P $password] status
|
|
}
|
|
}
|
|
puts $status
|
|
if {[llength $status] ==0 } {
|
|
NDS:whoami $tree
|
|
return 1
|
|
} else {
|
|
NDS:dialog [join $status " " ] OK
|
|
return 0
|
|
}
|
|
}
|
|
|
|
proc NDS:login_nopwd {tree user {context ""} } {
|
|
global NDS
|
|
global mount_locally; # from /etc/ndsclient.conf
|
|
|
|
# pb avec catch blocage si mot de passe requis et aucun fourni
|
|
puts "login on $tree as $user.$context"
|
|
if {$context !="" } {
|
|
if ($mount_locally) {
|
|
catch [ exec ncplogin -T $tree -U $user.$context -n -l] status
|
|
} else {
|
|
catch [ exec ncplogin -T $tree -U $user.$context -n ] status
|
|
}
|
|
} else {
|
|
if ($mount_locally) {
|
|
catch [ exec ncplogin -T $tree -U $user -n -l] status
|
|
} else {
|
|
catch [ exec ncplogin -T $tree -U $user -n ] status
|
|
}
|
|
}
|
|
puts $status
|
|
if {[llength $status] ==0 } {
|
|
NDS:whoami $tree
|
|
return 1
|
|
} else {
|
|
NDS:dialog [join $status " " ] OK
|
|
return 0
|
|
}
|
|
}
|
|
|
|
proc NDS:logout { {tree ""} } {
|
|
global NDS
|
|
if { $NDS(logged)=="true"} {
|
|
if {$tree==""} {
|
|
catch [exec ncplogout -a]
|
|
} else {
|
|
catch [exec ncplogout -T $tree]
|
|
}
|
|
NDS:init
|
|
set NDS(logged) "false"
|
|
return 1
|
|
} else {
|
|
return 0
|
|
}
|
|
}
|
|
|
|
proc NDS:whoami { {tree ""} } {
|
|
global NDS
|
|
|
|
if {$tree == "" } {
|
|
set tmp [exec ncpwhoami -fTcUMVS -s:]
|
|
} else {
|
|
set tmp [exec ncpwhoami -T $tree -fTcUMVS -s:]
|
|
}
|
|
#puts $tmp
|
|
if {! [ string match "*no ncp*" $tmp]} {
|
|
set tmpl1 [split $tmp \n]
|
|
set tmpl [split [lindex $tmpl1 0] :]
|
|
set NDS(tree) [lindex $tmpl 0]
|
|
set NDS(context) [lindex $tmpl 1]
|
|
set NDS(username) [lindex $tmpl 2]
|
|
if {[string match {*\.*} $NDS(username)]} {
|
|
set NDS(usernameDN) $NDS(username)
|
|
} else {
|
|
set NDS(usernameDN) $NDS(username).$NDS(context)
|
|
}
|
|
set NDS(mnt_point) [lindex $tmpl 3]
|
|
set NDS(volume) [lindex $tmpl 4]
|
|
set NDS(server) [lindex $tmpl 5]
|
|
set NDS(logged) "true"
|
|
# NDS:showinfos
|
|
return $tmpl
|
|
} else {
|
|
set NDS(username) {}
|
|
set NDS(tree) {}
|
|
set NDS(context) {}
|
|
set NDS(usernameDN) {}
|
|
set NDS(homepath) {}
|
|
set NDS(logged) "false"
|
|
set NDS(homevolume) {}
|
|
set NDS(mnt_point) {}
|
|
return {}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
proc NDS:showinfos {} {
|
|
global NDS
|
|
foreach item [array names NDS *] {
|
|
puts "set NDS($item) $NDS($item)"
|
|
}
|
|
}
|
|
|
|
|
|
proc NDS:openhome { {tree} } {
|
|
global NDS
|
|
global mount_locally; # from /etc/ndsclient.conf
|
|
|
|
if { $NDS(logged) == "true"} {
|
|
set result [NDS:gethome $tree ]
|
|
if { $result == "1" } {
|
|
if ($mount_locally) {
|
|
#catch {exec ncpmap -T $tree -V $NDS(homevol) -R $NDS(homepath) -X "\[Root\]" -a -E -l} result
|
|
catch {exec ncpmap -T $tree -V $NDS(homevol) -R $NDS(homepath) -a -E -l} result
|
|
} else {
|
|
#catch {exec ncpmap -T $tree -V $NDS(homevol) -R $NDS(homepath) -X "\[Root\]" -a -E} result
|
|
catch {exec ncpmap -T $tree -V $NDS(homevol) -R $NDS(homepath) -a -E} result
|
|
}
|
|
puts $result
|
|
if [regexp "(.*)mounted(.*):(.*)$" $result aux1 aux2 aux3 path] {
|
|
puts $path
|
|
#KDE 2
|
|
exec kfmclient openURL $path
|
|
return 1
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0
|
|
}
|
|
|
|
proc NDS:gethome {{tree}} {
|
|
global NDS
|
|
catch {exec ncpwhoami -T $tree -fh -1} tmp
|
|
if { $tmp !="" & ![string match "*failed*" $tmp] } {
|
|
set tmpl [split $tmp ,]
|
|
puts $tmp
|
|
set NDS(homevol) [lindex $tmpl 0]
|
|
set homepath [lindex $tmpl 3]
|
|
#dos antislash to unisx slashes
|
|
set NDS(homepath) [join [split $homepath \\] /]
|
|
return 1
|
|
} else {
|
|
puts "error: $tmp"
|
|
return 0
|
|
}
|
|
|
|
}
|
|
|
|
proc NDS:listtrees {{ authent ""}} {
|
|
global NDS
|
|
if {$authent ==""} {
|
|
return [exec ncplisttrees]
|
|
} else {
|
|
#due bug in NWDSScanConnsForTrees that add a non authenticated connexions
|
|
# return [exec ncplisttrees -a]
|
|
return [exec ncpwhoami -fT | uniq ]
|
|
}
|
|
}
|
|
|
|
proc NDS:listcontexts { tree {context ""}} {
|
|
global NDS
|
|
puts "List contexts on $tree :contexte is $context"
|
|
if { $context !="" } {
|
|
catch {exec ncplist -Q -A -T $tree -v 4 -o $context -c $context -l "Org*"} result
|
|
} else {
|
|
catch {exec ncplist -Q -A -T $tree -v 4 -Q "Org*"} result
|
|
}
|
|
puts $result
|
|
return $result
|
|
}
|
|
|
|
|
|
proc NDS:dialog {mesg {options Ok}} {
|
|
set x_mesg ""
|
|
set base .ndsmsg
|
|
set sw [winfo screenwidth .]
|
|
set sh [winfo screenheight .]
|
|
if {![winfo exists $base]} {
|
|
toplevel $base -class Toplevel
|
|
wm title $base "NDS client Message"
|
|
wm transient $base .
|
|
frame $base.f -bd 2 -relief groove
|
|
label $base.f.t -bd 0 -relief flat -text $mesg -justify left
|
|
frame $base.o -bd 1 -relief sunken
|
|
foreach i $options {
|
|
set n [string tolower $i]
|
|
button $base.o.$n -text $i -width 5 \
|
|
-command "
|
|
set x_mesg $i
|
|
destroy $base
|
|
"
|
|
pack $base.o.$n -side left -expand 1 -fill x
|
|
}
|
|
pack $base.f.t -side top -expand 1 -fill both -ipadx 5 -ipady 5
|
|
pack $base.f -side top -expand 1 -fill both -padx 2 -pady 2
|
|
pack $base.o -side top -fill x -padx 2 -pady 2
|
|
}
|
|
wm withdraw $base
|
|
update idletasks
|
|
set w [winfo reqwidth $base]
|
|
set h [winfo reqheight $base]
|
|
set x [expr ($sw - $w)/2]
|
|
set y [expr ($sh - $h)/2]
|
|
wm geometry $base +$x+$y
|
|
wm deiconify $base
|
|
grab $base
|
|
tkwait window $base
|
|
grab release $base
|
|
return x_mesg
|
|
}
|
|
|
|
|
|
#NDS:dialog "hello" {Ok Ko}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|