Files
ncpfs/contrib/tcl/ndsutils.tcl
ncpfs archive import 82706139bf Import ncpfs 2.2.1
2026-04-28 20:39:59 +02:00

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}