1
0
Files
irix-657m-src/eoe/cmd/dhcp_server/ProclaimRelayMgr
2022-09-29 17:59:04 +03:00

496 lines
14 KiB
Plaintext
Executable File

#!/usr/sgitcl/bin/sgitcl -n
#
#all Widgets have a capital W at end
#
#
#falback resources get these from the .Xdefaults file
#
set fbacks {
{*sgiMode: true}
{*useSchemes: all}
{ProclaimRelay*title: Proclaim Relay: Server Database}
}
#
# messages
#
set ILLEGAL_OPTIONS_MSG "Illegal Option in File"
set BAD_SERVER_ENTRY "Format is a.b.c.d \[# hostname\]"
set IS_DUPLICATE "Entry exists already , replacing"
set ENTER_A_SERVER "Enter a server address to add"
set ENTER_A_SERVER_DEL "Enter a server address to delete"
set ENTRY_NOT_FOUND "This entry does not exist"
set SERVER_ON_WARNING "chkconfig proclaim_server is on"
set HELP_MESSAGE "Please see the man pages for dhcp_relay"
set HOST_LOOKUP_ERROR "Host Lookup Error"
set DELETE_SERVER_QTN "Confirm Delete"
#
#global defines
#
set defaultOptionsDir /etc/config
set defaultOptionsMask \*.options
set defaultOptionsFile $defaultOptionsDir/dhcp_relay.options
set defaultProclaimConfigDir /var/dhcp/config
set serversFile dhcp_relay.servers
#
#global variables
#
set optionsFile $defaultOptionsFile
set proclaimConfigDir $defaultProclaimConfigDir ;# -c
set serversFileList {}
#
#global widgets
#
set dialW ""; #is a global used for small popup messages
set qdialW ""
set fileSDWokCB "" ; # callback for file selection widget
set qdialOkCB ""
set qdialCanCB ""
#
#general routines used in several places
#
proc createCPanel {parent nbuttons cbList } {
xmForm $parent.cpForm
$parent.cpForm setValues -fractionBase [expr 20*$nbuttons-1]\
-leftOffset 10 -rightOffset 10
set retW $parent.cpForm
set oldw 0
for {set i 0} {$i < $nbuttons} {set i [expr $i+1]} {
xmPushButton $retW.btn$i managed
$retW.btn$i getValues -width w
if {$w > $oldw} {
set oldw $w
}
$retW.btn$i activateCallback [lindex $cbList $i]
$retW.btn$i setValues -topAttachment attach_form\
-bottomAttachment attach_form\
-showAsDefaults [expr $i==0] -defaultButtonShadowThickness 1
if {$i == [expr $nbuttons-1]} {
$retW.btn$i setValues -rightAttachment attach_form
}
# else {
# $retW.btn$i setValues -rightAttachment attach_position -rightPosition [expr 20*$i+19]
# }
if {$i != 0} {
if {$i != [expr $nbuttons-1]} {
$retW.btn$i setValues -leftAttachment attach_position\
-leftPosition [expr 20*$i]
}
} else {
$retW.btn$i setValues -leftAttachment attach_form
$parent.cpForm getValues -marginHeight h
$parent.cpForm.btn$i getValues -height ht
set ht [expr $ht + 2*$h]
$parent.cpForm setValues -paneMaximum $ht -paneMinimum $ht\
-defaultButton $retW.btn0
}
}
for {set i 0} {$i < $nbuttons} {incr i} {
$retW.btn$i setValues -width $oldw
}
$retW manageChild
return $retW
}
proc postDialog {widget type msg} {
global dialW
if {[lempty $widget]} {
set dialW .dialW
set widget .dialW
xmMessageDialog .$widget
.$widget.Cancel unmanageChild
.$widget.Help unmanageChild
}
.$widget setValues -dialogType $type -messageString $msg
.$widget manageChild
}
#
# read and update the Options Form
#
proc readOptionsFile {} {
global optionsFile
global serversList proclaimConfigDir
global dialW ILLEGAL_OPTIONS_MSG
if {[catch {set fd [open $optionsFile r]} msg]} {
postDialog $dialW dialog_error [list $msg]
return -1
}
while {[gets $fd line] >= 0} {
if {[lempty $line] || [cequal [cindex $line 0] #]} {
continue
}
split $line "\ \t\n"
set len [llength $line]
for {set index 0} {$index < $len} {set index [expr $index+1]} {
switch -- [lindex $line $index] {
-c { set proclaimConfigDir [lindex $line [set index [expr $index+1]]]
.main.mPaneW.serversFormW.paneW.rcW.dirTextW setValues\
-value $proclaimConfigDir}
default { postDialog $dialW dialog_error $ILLEGAL_OPTIONS_MSG }
}
}
}
close $fd
}
#
#callbacks for the server form
#
proc getServersList {} {
global serversFile dialW proclaimConfigDir
set sFileList {}
if {[catch {set fd [open $proclaimConfigDir/$serversFile r]} msg]} {
postDialog $dialW dialog_error [list $msg]
return {}
}
while {[gets $fd line] >= 0} {
if {[lempty $line] || [cequal [cindex $line 0] #]} {
continue
}
lappend sFileList $line
}
return $sFileList
}
proc maintainServersList {} {
global serversFileList proclaimConfigDir
set serversFileList [getServersList]
.main.mPaneW.serversFormW.paneW.listW setValues -items $serversFileList\
-itemCount [llength $serversFileList]
}
proc updateConfigDir {} {
global serversFileList
global proclaimConfigDir defaultProclaimConfigDir
.main.mPaneW.serversFormW.paneW.rcW.dirTextW getValues -value \
proclaimConfigDir
if {![string compare [string trim $proclaimConfigDir] ""]} {
set proclaimConfigDir $defaultProclaimConfigDir
.main.mPaneW.serversFormW.paneW.rcW.dirTextW setValues -value\
$proclaimConfigDir
}
set serversFileList [getServersList]
.main.mPaneW.serversFormW.paneW.listW setValues -items $serversFileList\
-itemCount [llength $serversFileList]
}
proc doSelectFromList {} {
.main.mPaneW.serversFormW.paneW.listW getValues -selectedItems items
}
proc optionsSave {} {
global dialW
global optionsFile defaultProclaimConfigDir
global serversList proclaimConfigDir
set buf ""
.main.mPaneW.serversFormW.paneW.rcW.dirTextW getValues\
-value proclaimConfigDir
if {[string compare [string trim $proclaimConfigDir] ""]} {
if {[string compare $proclaimConfigDir $defaultProclaimConfigDir]} {
set buf [format "%s-c %s" $buf $proclaimConfigDir]
}
}
if {[catch {set fd [open $optionsFile w]} msg]} {
postDialog $dialW dialog_error [list $msg]
return
}
puts $fd $buf
close $fd
}
proc serversSaveCB {} {
global proclaimConfigDir serversFile serversFileList dialW \
defaultProclaimConfigDir
optionsSave
if {![string compare [string trim $proclaimConfigDir] ""]} {
set proclaimConfigDir $defaultProclaimConfigDir
.main.mPaneW.serversFormW.paneW.rcW.dirTextW setValues -value\
$proclaimConfigDir
}
if {[catch {set fd [open $proclaimConfigDir/$serversFile w]} msg]} {
postDialog $dialW dialog_error [list $msg]
return
}
foreach l $serversFileList {
puts $fd $l
}
close $fd
}
proc addServerOkCB {} {
global stillModal answer serversFileList
set stillModal 0
set answer 1
.main.mPaneW.serversFormW.paneW.rc1W.textW getValues -value entry
.main.mPaneW.serversFormW.paneW.listW addItem $entry 0
lappend serversFileList $entry
}
proc addServerCanCB {} {
global stillModal answer
set stillModal 0
set answer 0
return;
}
proc serversAddCB {} {
global dialW BAD_SERVER_ENTRY IS_DUPLICATE serversFileList ENTER_A_SERVER\
qdialW
.main.mPaneW.serversFormW.paneW.rc1W.textW getValues -value entry
if {[string compare $entry ""]} {
#get the address part of the list
if {[scan $entry "%s %s" a s] < 1} {
postDialog $dialW dialog_error $BAD_SERVER_ENTRY
return
}
# check that it is not already in the list
set pos 1
foreach l $serversFileList {
if {[scan $l "%s %s" aa ss] >= 1} {
if {([expr ![string compare $a $aa]])} {
postDialog $dialW dialog_message $IS_DUPLICATE
.main.mPaneW.serversFormW.paneW.listW deletePosition $pos
set serversFileList [lreplace $serversFileList [expr $pos-1] [expr $pos-1]]
break
}
}
incr pos
}
if {[catch {gethostbyname hostent $entry} msg]} {
set msg [format "%s %s Add?" $entry: $msg]
ask $qdialW $msg addServerOkCB addServerCanCB
} else {
.main.mPaneW.serversFormW.paneW.listW addItem $entry 0
lappend serversFileList $entry
}
.main.mPaneW.serversFormW.paneW.rc1W.textW setValues -value ""
} else {
postDialog $dialW dialog_error $ENTER_A_SERVER
}
}
proc delServerOkCB {} {
global stillModal answer serversFileList
set stillModal 0
set answer 1
.main.mPaneW.serversFormW.paneW.listW getValues -selectedItems entry
set pos [lsearch $serversFileList $entry]
set serversFileList [lreplace $serversFileList $pos $pos]
.main.mPaneW.serversFormW.paneW.listW setValues -items $serversFileList\
-itemCount [llength $serversFileList]
}
proc delServerCanCB {} {
global stillModal answer
set stillModal 0
set answer 0
return;
}
proc serversDelCB {} {
global serversFileList dialW ENTRY_NOT_FOUND ENTER_A_SERVER_DEL\
qdialW DELETE_SERVER_QTN
.main.mPaneW.serversFormW.paneW.listW getValues -selectedItems entry
if {[string compare $entry ""]} {
set pos [lsearch $serversFileList $entry]
if {$pos == -1} {
postDialog $dialW dialog_error $ENTRY_NOT_FOUND
return
} else {
set msg [format "%s: %s" $DELETE_SERVER_QTN $entry]
ask $qdialW $msg delServerOkCB delServerCanCB
}
.main.mPaneW.serversFormW.paneW.rc1W.textW setValues -value ""
} else {
postDialog $dialW dialog_error $ENTER_A_SERVER_DEL
}
}
#
# runtime callbacks
#
proc setRelayOnOff {} {
global dialW
.main.mPaneW.serversFormW.paneW.rc2W.chkconfigROnOffW getValues \
-set relayOnOffStatus
if {$relayOnOffStatus} {
if {[catch {exec chkconfig proclaim_relayagent on} msg]} {
postDialog $dialW dialog_error [list $msg]
.main.mPaneW.serversFormW.paneW.rc2W.chkconfigROnOffW setValues \
-set False
} else {
catch {exec chkconfig proclaim_server off}
}
} else {
if {[catch {exec chkconfig proclaim_relayagent off} msg]} {
postDialog $dialW dialog_error [list $msg]
.main.mPaneW.serversFormW.paneW.rc2W.chkconfigROnOffW setValues \
-set True
}
}
}
#
# question dialog
#
proc ask {widget msg okCB canCB} {
global stillModal answer qdialOkCB qdialCanCB qdialW
if {![lempty $widget]} {
xmQuestionDialog .qdialW\
-dialogStyle dialog_full_application_modal
set qdialW qdialW
set widget qdialW
.$widget.Help unmanageChild
}
if {[string compare $qdialOkCB ""]} {
.$widget removeCallback okCallback $qdialOkCB
}
if {[string compare $qdialOkCB ""]} {
.$widget removeCallback cancelCallback $qdialCanCB
}
set qdialOkCB $okCB
set qdialCanCB $canCB
.$widget okCallback $qdialOkCB
.$widget cancelCallback $qdialCanCB
.$widget setValues -messageString $msg
.$widget manageChild
set stillModal 1
while {$stillModal} {
. processEvent
}
.$widget unmanageChild
}
#
# main program begins here
#
xtAppInitialize -class ProclaimRelay\
-fallbackResources $fbacks
xmMainWindow .main
#
# create a menu bar
#
xmMenuBar .main.barW managed
xmPanedWindow .main.mPaneW managed\
-sashWidth 1 -sashHeight 1 -separatorOn false
.main setValues -menuBar .main.barW \
-workWindow .main.mPaneW
#
# create servers List form
#
xmForm .main.mPaneW.serversFormW
xmPanedWindow .main.mPaneW.serversFormW.paneW\
-sashWidth 1 -sashHeight 1\
-leftAttachment attach_form -rightAttachment attach_form \
-topAttachment attach_form -bottomAttachment attach_form
xmRowColumn .main.mPaneW.serversFormW.paneW.rcW managed\
-orientation horizontal -isaligned true
xmLabel .main.mPaneW.serversFormW.paneW.rcW.dirLabelW managed
xmText .main.mPaneW.serversFormW.paneW.rcW.dirTextW managed\
-columns 30\
-value [expr {[string compare $proclaimConfigDir ""]? \
$proclaimConfigDir: $defaultProclaimConfigDir}]
.main.mPaneW.serversFormW.paneW.rcW.dirTextW activateCallback {updateConfigDir}
xmScrolledList .main.mPaneW.serversFormW.paneW.listW managed\
-selectionPolicy single_select -scrollBarDisplayPolicy static
.main.mPaneW.serversFormW.paneW.listW singleSelectionCallback {doSelectFromList}
xmRowColumn .main.mPaneW.serversFormW.paneW.rc1W managed\
-orientation horizontal -isaligned true
xmLabel .main.mPaneW.serversFormW.paneW.rc1W.selLabelW managed
xmText .main.mPaneW.serversFormW.paneW.rc1W.textW managed \
-columns 30
.main.mPaneW.serversFormW.paneW.rc1W.textW activateCallback\
serversAddCB
.main.mPaneW.serversFormW.paneW.rc1W.textW getValues -height h -marginHeight mh
.main.mPaneW.serversFormW.paneW.rc1W setValues -paneMaximum [expr $h+2*$mh]\
-paneMinimum [expr $h+2*$mh]
#
# create the control panel for the dialog
#
set cpanel [createCPanel .main.mPaneW.serversFormW.paneW 2 {serversAddCB serversDelCB }]
set relayOnOffStatus [expr ![catch {exec chkconfig proclaim_relayagent}]]
if {$relayOnOffStatus} {
if {[expr ![catch {exec chkconfig proclaim_server}]]} {
postDialog $dialW dialog_warning $SERVER_ON_WARNING
}
}
xmRowColumn .main.mPaneW.serversFormW.paneW.rc2W managed
xmToggleButton .main.mPaneW.serversFormW.paneW.rc2W.chkconfigROnOffW managed\
-highlightThickness 0\
-alignment alignment_beginning -set $relayOnOffStatus
.main.mPaneW.serversFormW.paneW.rc2W.chkconfigROnOffW valueChangedCallback {setRelayOnOff}
.main.mPaneW.serversFormW.paneW.rc2W.chkconfigROnOffW getValues -height h
.main.mPaneW.serversFormW.paneW.rc2W getValues -marginHeight mh
.main.mPaneW.serversFormW.paneW.rc2W setValues -paneMinimum [expr $h+2*$mh]\
-paneMaximum [expr $h+2*$mh]
.main.mPaneW.serversFormW.paneW manageChild
.main.mPaneW.serversFormW manageChild
readOptionsFile
maintainServersList
#
# create "file" pull-down menu
#
xmPulldownMenu .main.barW.fileMenuW
xmPushButton .main.barW.fileMenuW.saveW managed
xmPushButton .main.barW.fileMenuW.syslogW managed
xmPushButton .main.barW.fileMenuW.quitW managed
.main.barW.fileMenuW.saveW activateCallback {serversSaveCB}
.main.barW.fileMenuW.syslogW activateCallback {catch {exec sysmon &}}
.main.barW.fileMenuW.quitW activateCallback {exit 0}
#
# create cascade buttons
#
xmCascadeButton .main.barW.fileW managed \
-subMenuId .main.barW.fileMenuW
xmCascadeButton .main.barW.helpW managed
.main.barW setValues -menuHelpWidget .main.barW.helpW
.main.barW.helpW activateCallback {catch {exec /usr/sbin/insight -v IA_NetwkMail -a 'query(DHCP)' &}}
.main manageChild
set stillModal 0
set answer 0
dlopen libsautil.so init SAUtil_Init
. realizeWidget
. mainLoop