#!/usr/bin/wish
#!/usr/local/bin/wish
#!/usr/local/bin/wish8.0
#!/usr/local/bin/wish4.1

# Set port to the value of the port you have chosen for MAT (default 2345)
# If you change it remember to update the /etc/services file for MAT agent
set port 2345

# Set this to 20 for a single host MAT configuration
set level 10


# -------------------------- Do Not edit below this line ---------------
set DEBUG 1

# The currentdomain variable is for the DNS master 
set currentdomain "-"
 
set retain 0
set ttype 9999
set current 9999
set currentlineno 9999

# Hosts info for the management console
set mb_hosts "../hosts"
set active_hosts {}

# Archive host
set tapeserv {}
set feature_list_file "../lib/features"
set feature_list {}

if { $argc == 0 } {
    set currenthost "localhost"
} else {
    set currenthost [ lindex $argv 0 ]
}
set stask " "
set browse 5
set SelectorLine 9999
set box 0

# Font Declarations 
set os [lindex [array get tcl_platform os ] 1 ]
if { [string range $os 0 2 ] == "Win" } {
    # ---------  These fronts are good for Win95/NT  ----------
    set norm { Helvitica 10 bold }
    set textd { Courier 10 }
} else {
    # ---------  These fronts are good for UNIX's  ----------
    set norm {-*-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*}
    set textd {-*-courier-*-r-*-*-12-*-*-*-*-*-*-*}
}

# Network Error status flag
set errno 0
set errorm {}

# Default password data
set username "root"
# Do NOT set your own default password here.  It is too dangerous
# A password should be typed in when the consols is started
set passwd "bye"
set new 0

# This is the authentication flag
set authenticated 0

# This is the upgrade buffer
set upgrade_buff {}

# This is the master list.  It's use depends on the context.
# Cron uses master to hold the file
# DNS uses the master variable
# File edit uses it as well
set master ""

lappend auto_path "../lib"

# This for auto-probing the hosts
set currentProbe 0

# Variables for searching
set searchfor {}
set searchfrom 0.0


proc ReadHosts {} {
    global mb_hosts
    global active_hosts
    set active_hosts {}
    catch "open $mb_hosts r" retval
    if { [string range $retval 0 3 ] == "file" } {
	while { [ gets $retval fout ] > 0 } {
	    lappend active_hosts $fout
	}
	close $retval
    } else {
	licen
    }
}


# Read-in the hosts file
ReadHosts

#
#---------------- Main Code Start ---------------------------
#
wm title . "MAT on: $currenthost"
set sc [getDefault colorScheme ]
if { $sc != {} } {
    tk_setPalette $sc
} else {
    tk_setPalette SlateGray3
}


frame .menu -relief raised -bd 2 
menubutton .menu.opt0 -text "File" -menu .menu.opt0.file -font $norm
menubutton .menu.opt5 -text "Agent" -menu .menu.opt5.file -font $norm 
menubutton .menu.opt10 -text "Browse" -menu .menu.opt10.menu -font $norm
menubutton .menu.opt15 -text "MAT" -menu .menu.opt15.menu -font $norm 
menubutton .menu.opt100 -text "Help" -menu .menu.opt100.menu -font $norm 

menu .menu.opt0.file
.menu.opt0.file add command -label "Save hosts location" -command "saveHostLoc .tp.host.canvas ;set active_hosts {} ;ReadHosts"
.menu.opt0.file add command -label "Properties" -command "setColor"
.menu.opt0.file add separator
.menu.opt0.file add command -label "Quit" -command "destroy . " -foreground red -font $norm

menu .menu.opt5.file
.menu.opt5.file add command -label "Login" -command "getPasswd \$currenthost 0" -font $norm -foreground blue
.menu.opt5.file add separator
.menu.opt5.file add command -label "Upgrade" -command "upgrade \$currenthost" -font $norm -foreground red
.menu.opt5.file add separator
.menu.opt5.file add command -label "MAT Hosts" -command "set browse 90 ;repack 90" -font $norm
.menu.opt5.file add command -label "Probe" -command "set currentProbe 0 ;AutoProbe ;set level 10 ;fillCan 10" -font $norm

menu .menu.opt10.menu
.menu.opt10.menu add radiobutton -label "Users" -variable browse -value 5 -font $norm -command { repack 5 }
.menu.opt10.menu add radiobutton -label "Groups" -variable browse -value 2 -font $norm -command { repack 2 }
.menu.opt10.menu add radiobutton -label "Hosts" -variable browse -value 1 -font $norm -command { 
    repack 1     
    set currentlineno 9999  }
.menu.opt10.menu add radiobutton -label "Mail Aliases" -variable browse -value 8 -font $norm -command { repack 8 }
.menu.opt10.menu add radiobutton -label "Mounts" -variable browse -value 3 -font $norm -command { repack 3 }
.menu.opt10.menu add radiobutton -label "Motd" -variable browse -value 7 -font $norm -command { repack 7 }
.menu.opt10.menu add radiobutton -label "DNS Client" -variable browse -font $norm -value 6 -command { repack 6 }
.menu.opt10.menu add radiobutton -label "Inittab" -variable browse -value 4 -font $norm -command { repack 4 }
.menu.opt10.menu add radiobutton -label "Services" -variable browse -value 13 -font $norm -command { repack 13 }
#.menu.opt10.menu add radiobutton -label "Samba Shares" -variable browse -value 9 -font $norm -command { repack 9 }
#.menu.opt10.menu add radiobutton -label "Sudo'ers" -variable browse -value 11 -font $norm -command { repack 11 }
.menu.opt10.menu add radiobutton -label "Crontab" -variable browse -value 12 -font $norm -command { repack 12 }
#.menu.opt10.menu add radiobutton -label "Test" -variable browse -value 9000 -font $norm -command "stackadm"

menu .menu.opt15.menu
#.menu.opt10.menu add separator
.menu.opt15.menu add radiobutton -label "MAT Hosts" -variable browse -value 90 -font $norm -command { repack 90 }
.menu.opt15.menu add radiobutton -label "MAT User" -variable browse -value 91 -font $norm -command { repack 91 }
.menu.opt15.menu add radiobutton -label "MAT Logs" -variable browse -value 92 -font $norm -command { repack 92 }

menu .menu.opt100.menu
.menu.opt100.menu add command -label "About" -font $norm -command "about"
.menu.opt100.menu add command -label "MAT" -font $norm -command "help help"

pack .menu.opt0 .menu.opt5 .menu.opt10 .menu.opt15 -side left -fill x 
pack .menu.opt100 -anchor e
pack .menu -side top -fill x

frame .tp -relief raised -bd 2 
label .tp.title -text "Host" -font $norm
pack .tp.title
# The canvas is defined in fillcan
frame .tp.host -relief sunken -bd 2 
scrollbar .tp.host.vscroll -orient vertical -command ".tp.host.canvas yview"
pack .tp.host.vscroll -side right -fill y
pack .tp.host -expand 1 -fill both
pack .tp -fill both -expand 1


# Generic frame user for everything 
frame .general -relief raised -bd 2
# Generic text window
label .general.label -text "-"  -font $norm
pack .general.label -side top -fill x
text .general.textlabel -width 82 -height 1 -relief flat -font $textd
text .general.text -width 82 -height 16 -yscrollcommand {.general.textscroll set } -font $textd
scrollbar .general.textscroll -orient vertical -command ".general.text yview"
pack .general.textlabel -fill x
pack .general.textscroll -side right -fill y
pack .general.text -fill both -expand 1
pack .general -fill both -expand 1
bind .general.text <Button-3> "tclick .general.text"

frame .general.frame 


frame .commonframe -relief raised -bd 2
button .commonframe.new -text "New" -foreground #008000 -activeforeground #004000  -font $norm -command { 
    if { $level == 10 } {
	MatHost 
    } elseif {$browse == 0 } {
	Tasks $currenthost 9999 0 
    } elseif {$browse == 1 } {
	Hosts $currenthost 9999 0 
    } elseif {$browse == 2 } {
	Groups $currenthost 9999 0 
    } elseif {$browse == 3 } {
	Fstab $currenthost 
    } elseif {$browse == 4 } {
	
    } elseif {$browse == 5 } {
	 User $currenthost 9999 0 
    } elseif {$browse == 6 } {
	DnsClient $currenthost 0 0 
    } elseif {$browse == 7 } {
	# Motd updater
	set cmd "put local motd"
	set returnval [queryHost $currenthost $cmd 1 "ext" "put" "t" ".general.text" ]
	if { [lindex [split [lindex $returnval end ] " " ] 0 ] == "ERROR:" } {
	    error 260
	}
    } elseif {$browse == 8 } {
	Mail $currenthost 9999
    } elseif {$browse == 11 } {
	Sudo $currenthost 9999 0 
    } elseif {$browse == 12 } {
	CronEdit $currenthost 9999 0 
    } elseif {$browse == 13 } {		
	services $currenthost 9999 0 
    } elseif {$browse == 19 } {		
	global upgrade_buff
	set cmd "put ascii $upgrade_buff"
	set returnval [queryHost $currenthost $cmd 1 "ext" "put" "t" ".general.text" ]
	if { [lindex [split [lindex $returnval end ] " " ] 0 ] == "ERROR:" } {
	    error 260
	}
    } elseif {$browse == 41 } {
	DnsEdit $currenthost $currentdomain 9999 0 
    } elseif {$browse == 42 } {
	DnsSecEdit $currentdomain 9999 
    } elseif {$browse == 71 } {
	NISUser $currenthost 9999 0 
    } elseif {$browse == 72 } {
	NISGroups $currenthost 9999 0 
    } elseif {$browse == 73 } {
	NISHosts $currenthost 9999 0 
    } elseif {$browse == 74 } {		
	NISMail $currenthost 9999 0 
    } elseif {$browse == 75 } {
	NISNetgroup $currenthost 9999 0 
    } elseif {$browse == 76 } {
	NISEthers $currenthost 9999 0 
    } elseif {$browse == 81 } {	
	NFSexport $currenthost 9999 9999
    } elseif {$browse == 91 } {
	MatUser $currenthost 9999 0 
    } elseif {$browse == 94 } {
	MatLic $currenthost
    } elseif {$browse == 111 } {
	SyslogConf $currenthost 9999 9999 
    } elseif {$browse == 123 } {
	tapeGroup $currenthost 9999 9999
    } elseif {$browse == 125 } {
	tapeJobs $currenthost 9999 9999
    } elseif {$browse == 126 } {
	tapeDevs $currenthost 9999
    } elseif {$browse == 127 } {
	editTape $currenthost 9999
    } elseif {$browse == 151 } {
	matdEdit $currenthost -9999 
    } elseif {$browse == 251 } {
	tapeGroup $currenthost 9999 9999
    } elseif {$browse == 252 } {
	replJobs $currenthost -9999 -9999:::::::::
    }

} 

button .commonframe.del -text "Delete Selected" -foreground red -activeforeground red -font $norm -command {
    if { $SelectorLine != 9999  && $browse != 7 } {
#	set master [ lreplace $master $SelectorLine $SelectorLine "-gone- - - - - -\n" ]
	set returnval {}
	if { $browse == 0 } {

	} elseif { $browse == 1 } {
	puts stdout "Index = 	[expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ]"
	    set tmp [lindex [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] 0]
	    puts stdout "Deleting host $tmp"
	    set returnval [queryHost $currenthost "CON del hosts $tmp" 1 ]
	} elseif { $browse == 2 } {
	    set tmp [lindex [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] 0]
	    puts stdout "Deleting group $tmp"
	    set returnval [queryHost $currenthost "CON del group $tmp" 1 ]
	} elseif { $browse == 3 } {
	    set tmp [lindex [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] 0]
	    puts stdout "Deleting mount $tmp"
	    set returnval [queryHost $currenthost "CON del fstab $tmp" 1 ]
	} elseif { $browse == 4 } {
	    set returnval [queryHost $currenthost "del inittab $SelectorLine" 1 ]
	} elseif { $browse == 5 } {
	    set tmp [lindex [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] 0]
	    puts stdout "Deleting user $tmp"
	    set returnval [queryHost $currenthost "CON del pass $tmp" 1 ]
	} elseif { $browse == 8 } {
	    set tmp [lindex [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] 0]
	    set returnval [queryHost $currenthost "CON del alias $tmp" 1 ]
	} elseif { $browse == 6 } {
	    DnsClient $currenthost 0 0
	    set returnval 0
	} elseif { $browse == 11 } {
	    set returnval [queryHost $currenthost "del sudo $SelectorLine" 1 ]
	} elseif { $browse == 12 } {
	    global master
	    set newcron [ lreplace $master $SelectorLine $SelectorLine {} ]
	    # Update comment if needed
	    set tmp2 [expr $SelectorLine - 1 ] 
	    set tmp [ lindex $master $tmp2 ]
	    if { [string range $tmp 0 1 ] == "#v" } {
		set upgrade_buff [ lreplace $newcron $tmp2 $tmp2 {} ]
	    } else {
		set upgrade_buff $newcron
	    }
	    set cmd "put local crontab"
	    set returnval [queryHost  $currenthost $cmd 1 "ext" "put" "v" "upgrade_buff" ]
	    if { [lindex [split $returnval " " ] 0 ] == "\{ERROR:" } {
		error 361
		puts stdout "ERROR:  Unable to upload the crontab to $currenthost"
	    } else {
		set cmd "croninstall cd"
		set returnval [queryHost  $currenthost $cmd 1 ]
		if { [lindex [split $returnval " " ] 0 ] == "\{ERROR:" } {
		    error 362
		    puts stdout "ERROR:  Unable to update crontab on $currenthost"
		}
	    }
	} elseif { $browse == 13 } {
	    set tmp [lindex [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] 1]
	    puts stdout "Deleting Service on port $tmp"
	    set returnval [queryHost $currenthost "CON del services $tmp" 1 ]
	} elseif { $browse == 41 } {
	    set moddata [split [ lindex $master $SelectorLine ] ":" ]
	    set arg "[ lindex $moddata 0 ]:deletehost:[ lindex $moddata 1 ]:::"
	    puts stdout "Sending $arg"
	    set returnval [queryHost $currenthost "DNS set host $currentdomain $arg" 1 ]
	} elseif { $browse == 71 } {
	    set login [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	    puts stdout "Deleting $login"
	    set returnval [queryHost $currenthost "NIS del pass $login" 1 ]
	} elseif { $browse == 72 } {
	    set delgrp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	    puts stdout "Deleting $delgrp"
	    set returnval [queryHost $currenthost "NIS del group $delgrp" 1 ]
	} elseif { $browse == 73 } {
	    set delhost [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	    puts stdout "Deleting NIS group $delhost"
	    set returnval [queryHost $currenthost "NIS del host $delhost" 1 ]
	} elseif { $browse == 74 } {
	    set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	    puts stdout "Deleting NIS Hosts $tmp"
	    set returnval [queryHost $currenthost "NIS del alias $tmp" 1 ]
	} elseif { $browse == 75 } {
	    set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	    puts stdout "Deleting NIS alias $tmp"
	    set returnval [queryHost $currenthost "NIS del netgroup $tmp" 1 ]
	} elseif { $browse == 76 } {
	    set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	    puts stdout "Deleting NIS Ether $tmp"
	    set returnval [queryHost $currenthost "NIS del ethers $tmp" 1 ]
	} elseif {$browse == 81 } {	
	    set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	    puts stdout "Deleting Export $tmp"
	    set returnval [queryHost $currenthost "NFS del $tmp" 1 ]
	} elseif { $browse == 90 } {
	    set edit_host [ lindex [split [ lindex $master $SelectorLine ] ":" ] 0 ]
	    global mb_hosts
	    global active_hosts
	    # Write out new file
	    set fid [ open $mb_hosts w ]
	    foreach data $active_hosts {
		if { $edit_host == [lindex [ split $data ":" ] 0 ] } {
		    # Write nothing
		} else {
		    puts $fid $data
		}
	    }
	    close $fid
	    ReadHosts
	    fillCan 10
	} elseif { $browse == 91 } {
	    # We do not add 1 to SelectorLine because root is an uneditable line
	    set login [lindex [.general.text get [expr $SelectorLine ].0 [expr $SelectorLine + 1].0 ] 0]
	    puts stdout "Deleting MAT user $login"
	    set returnval [queryHost $currenthost "del matpass $login" 1 ]
	} elseif { $browse == 94 } {
	    set lic [lindex [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 1].3 ] 0]
	    puts stdout "Deleting MAT license $lic"
	    set retval [ actionItem . "Are you sure you want to delete this License.  You may wish to record it." "{Delete it!} Cancel" red ]
	    if { $retval == 0 } {
		set returnval [queryHost $currenthost "CON del matlic $lic" 1 ]
	    }
	} elseif { $browse == 111 } {
	    set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	    puts stdout "Deleting Syslogd entry for $tmp"
	    set returnval [queryHost $currenthost "MON del syslogconf $tmp" 1 ]
    	} elseif { $browse == 123 } {
	    global tapeserv
	    set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	    puts stdout "Deleting Backup Group $tmp"
	    set retval [ actionItem . "Are you sure you want to delete this Backup Group: $tmp" "{Delete it!} Cancel" red ]
	    puts stdout "Retval = $retval"
	    if { $retval == 0 } {
		set returnval [queryHost $currenthost "TAPE del group $tmp" 1 ]
	    }
	} elseif { $browse == 125 } {
	    global tapeserv
	    set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	    puts stdout "Deleting Backup Job $tmp"
	    set retval [ actionItem . "Are you sure you want to delete this Backup Job: $tmp" "{Delete it!} Cancel" red ]
	    puts stdout "Retval = $retval"
	    if { $retval == 0 } {
		set returnval [queryHost $currenthost "TAPE del jobids $tmp" 1 ]
	    }
	} elseif { $browse == 126 } {
	    global tapeserv
	    set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	    puts stdout "Deleting Backup Device $tmp"
	    set retval [ actionItem . "Are you sure you want to delete this Backup Device: $tmp  It will erase all the tape catalogs for this device!" "{Delete it!} Cancel" red ]
	    puts stdout "Retval = $retval"
	    if { $retval == 0 } {
		set returnval [queryHost $currenthost "TAPE del drive $tmp" 1 ]
	    }
	} elseif { $browse == 151 } {
	    set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	    puts stdout "Deleting MATd entry for $tmp"
	    set returnval [queryHost $currenthost "TASK del $tmp" 1 ]
    	} elseif { $browse == 252 } {
	    global tapeserv
	    set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	    puts stdout "Deleting Replication Job $tmp"
	    set retval [ actionItem . "Are you sure you want to delete this Replication Job: $tmp" "{Delete it!} Cancel" red ]
	    puts stdout "Retval = $retval"
	    if { $retval == 0 } {
		set returnval [queryHost $currenthost "TAPE del repids $tmp" 1 ]
	    }
	}  
	if { [lindex [split $returnval " " ] 0 ] == "\{ERROR:" } {
	    error 71
	} else {
	    .general.text configure -state normal
	    .general.text tag configure l$SelectorLine -underline 0
	    set tmp [.general.text tag ranges l$SelectorLine ]
	    if { $tmp != "" } {
		eval ".general.text delete $tmp "
	    }
	    .general.text tag delete l$SelectorLine
	    .general.text configure -state disabled
	    set SelectorLine 9999
	    repack $browse
	}

    } else {
	# These items are NOT single lined
	if { $browse == 6 } {
	    DnsClient $currenthost 0 0
	} else {
	    error 4 
	}
    }
}


button .commonframe.mod -text "Modify Selected" -foreground #a00000 -activeforeground #800000 -font $norm -command { 
    if { $SelectorLine != 9999 && $browse != 6 } {
	set modline $SelectorLine 
	set moddata [ lindex $master $modline ]
    } else {
	set modline 9999 
	set moddata 9999
    }
    if { $browse == 0 } {
	Tasks $currenthost $modline $moddata
    } elseif { $browse == 1 } {
	Hosts $currenthost $modline [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ]
    } elseif { $browse == 2 } {
	Groups $currenthost $modline [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ]
    } elseif { $browse == 3 } {
	Fstab $currenthost $moddata
    } elseif { $browse == 4 } {
	
    } elseif { $browse == 5 } {
	User $currenthost $modline [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ]
    } elseif { $browse == 6 } {
	DnsClient $currenthost 0 0
    } elseif { $browse == 8 } {
	Mail $currenthost $moddata
    } elseif { $browse == 11 } {
	Sudo $currenthost $modline $moddata
    } elseif { $browse == 12 } {
	CronEdit $currenthost $modline $moddata
    } elseif { $browse == 13 } {
	set servs [lindex [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] 1]
	services $currenthost $servs $moddata
    } elseif {$browse == 41 } {
	DnsEdit $currenthost $currentdomain [ lindex $moddata 0 ] $moddata 
    } elseif { $browse == 71 } {
	set login [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	NISUser $currenthost $login $moddata
    } elseif { $browse == 72 } {
	set delgrp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	NISGroups $currenthost $delgrp $moddata
    } elseif { $browse == 73 } {
	set delhost [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	NISHosts $currenthost $delhost $moddata
    } elseif { $browse == 74 } {
	set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	NISMail $currenthost $tmp $moddata
    } elseif { $browse == 75 } {
	set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	NISNetgroup $currenthost $tmp $moddata
    } elseif { $browse == 76 } {
	set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	NISEthers $currenthost $tmp $moddata
    } elseif { $browse == 81 } {
	set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	NFSexport $currenthost $tmp $moddata
    } elseif { $browse == 90 } {
	MatHost $moddata
    } elseif { $browse == 91 } {
	MatUser $currenthost $modline $moddata
    } elseif { $browse == 94 } {
	set tmp [lindex [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] 0]
	MatLic $currenthost $tmp
    } elseif { $browse == 111 } {
	set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	SyslogConf $currenthost $tmp $moddata
    } elseif { $browse == 123 } {
	set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	tapeGroup $currenthost $tmp $moddata
    } elseif { $browse == 125 } {
	set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	tapeJobs $currenthost $tmp $moddata
    } elseif { $browse == 126 } {
	set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	tapeDevs $currenthost $tmp
    } elseif { $browse == 151 } {
	set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	matdEdit $currenthost $tmp
    } elseif { $browse == 252 } {
	set tmp [lindex [split [.general.text get [expr $SelectorLine + 1].0 [expr $SelectorLine + 2].0 ] ] 0]
	replJobs $currenthost $tmp
    } 

    if { $browse != 7 } {	
	repack $browse
    }
}

button .commonframe.search -text "Search for:" -font $norm -command { 
    if { [ .commonframe.what get ] != {} } {
	if { [ .commonframe.what get ] != $searchfor } {
	    set searchfrom 0.0
	    set searchfor [ .commonframe.what get ]
	}
	set match [ .general.text search -nocase -forward [ .commonframe.what get ] $searchfrom end ]
	if { $match != {} } {
	    .general.text see $match
	    set searchfrom [expr $match + 1.0 ]
	} else {
	    puts stdout "Search string not found\n"
	}
    }
}
entry .commonframe.what -width 12

bind .commonframe.what <Return> {
    .commonframe.search invoke
}

button .commonframe.b1 
button .commonframe.b2

pack .commonframe.new .commonframe.del .commonframe.mod .commonframe.search .commonframe.what -side left -padx 3
pack .commonframe -fill x

fillCan $level



#------------------ Bindings ---------------------------
bind .tp.host.canvas <Button-1> {
    set curX %x
    set curY %y
}

#
# -------------- Display host info ----------------------
#
proc hostinfo { host } {
    set returndata [queryHost $host hostinfo 0 ]
    HostInfo $host $returndata
}
    
#
# saveHostLoc - Save the location of the hosts on the main screen
#
proc saveHostLoc { can } {
    global mb_hosts
    set host_list {}
    set fid [ open $mb_hosts r ]
    while { [ gets $fid fout ] > 0 } {
	lappend host_list $fout
    }
    close $fid
    set fid [ open $mb_hosts w ]
    foreach data $host_list {
	set t [ split $data ":" ]
	set loc [ $can coords [lindex $t 0 ] ]
	if { $loc == {} } {
	    set d "[lindex $t 0 ]:[lindex $t 1 ]:[lindex $t 2 ]:[lindex $t 3 ]:"
	    append d "[lindex $t 4 ]:[lindex $t 5 ]:[lindex $t 6 ]:"
	} else {
	    set d "[lindex $t 0 ]:[lindex $t 1 ]:[lindex $t 2 ]:[lindex $t 3 ]:"
	    append d "[lindex $t 4 ]:[lindex $loc 0 ]:[lindex $loc 1 ]:"
	}
	puts $fid $d
    }
    close $fid
}
    