home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 December / PCWorld_2000-12_cd.bin / Komunikace / Comanche / plugins / apache / apache.tcl < prev    next >
Text File  |  2000-11-02  |  25KB  |  789 lines

  1. # apache.tcl
  2.  
  3. # apachePlugIn --
  4. #    Provides functionality for configuring the Apache webserver
  5. #
  6. # TO-DO: Convert public variables to parameters passed at construction time
  7.  
  8. class apachePlugIn {
  9.     inherit basePlugIn
  10.     
  11.     # Object used to convert property pages -> httpd.conf format
  12.     
  13.     public variable dumper
  14.  
  15.     # Object used to store/load values from property pages
  16.     
  17.     public variable ppManager
  18.     
  19.     # Object carrying definition of  property pages. We can ask it a
  20.     # property page by its name and it will answer.
  21.     
  22.     public variable ppDef
  23.  
  24.     # This is not used as of now. It will be used to access configuration files
  25.  
  26.     public variable configurationFilesManager
  27.  
  28.     # Namespace we are hooking to
  29.  
  30.     public variable namespace
  31.     
  32.     # Used to keep track of which nodes
  33.  
  34.     public variable nodeManagement
  35.  
  36.     # Configuration document
  37.  
  38.     public variable confDoc
  39.  
  40.     # Assigns ppages to nodes 
  41.     
  42.     public variable moduleManager
  43.  
  44.     # Comments describing the server
  45.  
  46.     public variable serverDescription
  47.  
  48.     # Location of the httpd binary (to get version)
  49.  
  50.     public variable httpd
  51.  
  52.     # Location of the configuration files
  53.  
  54.     public variable configurationFiles
  55.  
  56.     # Location of the server root
  57.  
  58.     public variable serverRoot
  59.     
  60.     # Property pages for enabling/disabling modules
  61.  
  62.     variable modulePP
  63.  
  64.     public variable rootNode
  65.     variable mainServer
  66.     variable apacheconf
  67.     
  68.     variable commands
  69.     variable commandResult
  70.     variable commandPP
  71.     constructor {} {
  72.         array set commands {}
  73.     set commandPP [xuiPropertyPage ::#auto]
  74.     set commandResult [xuiLabel ::#auto]
  75.     $commandPP addComponent $commandResult
  76.     set modulePP [ ::libgui::createXuiFromText {
  77.         <propertyPage name="modulePP" label="module_management">
  78.             <choice name="moduleConf" label="module_conf_PP" 
  79.                         classes="multipleChoice">
  80.             <syntax><option name="bla" value="bla" /></syntax>
  81.             <default>bla</default>
  82.             </choice>
  83.         </propertyPage>
  84.     } ]
  85.     #puts "modulePP $modulePP"
  86.     }
  87.  
  88.     method _registerWithNamespace {}
  89.     method _inquiryForPropertyPages  { node }
  90.     method _inquiryForMenu { node }
  91.     method _inquiryForWizard { type node }
  92.     method _inquiryForRightPaneContent { node }
  93.     method _receivedPropertyPages { node xuiPropertyPages }
  94.     method _receivedWizard { node xuiPropertyPages }
  95.     method _executeCommand { node command }
  96.     
  97.     method init
  98.     method _createNodes { node } 
  99.     method _addNode { node container }
  100.     method _saveConfig { }
  101.     
  102.     method addNewManagementCommand {command action icon} 
  103.     
  104.     method _deleteNodeRequest
  105. }
  106.  
  107. # apachePlugIn::addNewManagementCommand --
  108. #   Used to add new management commands that will get displayed in the right
  109. # pane when the server management node is selected
  110.  
  111. body apachePlugIn::addNewManagementCommand {command action icon} {
  112.     set commands($command) [list $action $icon]
  113. }
  114.  
  115. body  apachePlugIn::_receivedPropertyPages { node xuiPropertyPages } {
  116.     set container [ $nodeManagement getContainer $node ]
  117.     set name [ $nodeManagement getNodeName $node ]
  118.     switch $name {
  119.     moduleconf {
  120.         set a [$xuiPropertyPages getComponents] 
  121.  
  122.         foreach one [$moduleManager getEnabledModuleList] {
  123.         $moduleManager disableModule $one
  124.         
  125.         }
  126.         $moduleManager enableModule coredirs
  127.         foreach one [$a.moduleConf getSelected] {
  128.         $moduleManager enableModule $one
  129.         }
  130.  
  131.         set f [open $::apacheplugin::disabledModulesFile w]
  132.         foreach one [$moduleManager getDisabledModuleList] {
  133.         puts $f $one
  134.         }
  135.         close $f
  136.  
  137.  
  138.     } default {
  139.         if [string length $container] {
  140.         foreach pp [$xuiPropertyPages getComponents] {
  141.             $ppManager savePropertyPage $pp $confDoc $container      
  142.         }
  143.         }
  144.     }
  145.     }
  146.     _saveConfig
  147. }
  148.  
  149. body apachePlugIn::_saveConfig {} {
  150.  
  151.     # TO-DO: Add the capability to have templates. We need a configuration
  152.     # files manager to get rid of this.
  153.     
  154.     $dumper configure -includeroot [file dirname $configurationFiles]
  155.     $dumper dump $confDoc $configurationFiles
  156.  
  157. }
  158.  
  159. body  apachePlugIn::_receivedWizard { node xuiPropertyPages } {
  160.     set container [ $nodeManagement getContainer $node ]
  161.     set name [ $nodeManagement getNodeName $node ]
  162.     switch $name {
  163.         rootNode {
  164.         set name [[[$xuiPropertyPages getComponents] \
  165.             getComponentByName virtualHostName] getValue]          
  166.         _addNode $rootNode   [$confDoc addContainer \
  167.             [$confDoc getRootContainer] $name virtualhost]
  168.     }  mainServer - virtualhost {
  169.         set type [[[$xuiPropertyPages getComponents] \
  170.             getComponentByName sectionType] getSelected]
  171.         set name [[[$xuiPropertyPages getComponents] \
  172.             getComponentByName sectionName] getValue]
  173.         _addNode $node \
  174.             [$confDoc addContainer $container $name $type]
  175.     } directory - location  {    
  176.         set type [[[$xuiPropertyPages getComponents] \
  177.             getComponentByName sectionType] getSelected]
  178.         set name [[[$xuiPropertyPages getComponents] \
  179.             getComponentByName sectionName] getValue]
  180.         _addNode $node \
  181.             [$confDoc addContainer $container $name $type]
  182.         } default {
  183.        error "Container named $name not recognized"
  184.     }
  185.     }
  186.     _saveConfig
  187. }
  188.  
  189. body apachePlugIn::init {} {
  190.     _createNodes $rootNode
  191. }
  192.  
  193. body apachePlugIn::_inquiryForPropertyPages { node } {
  194.     set result {}
  195.     set name [$nodeManagement getNodeName $node]
  196.     set container [$nodeManagement getContainer $node]
  197.     switch $name {
  198.     moduleconf {
  199.         set result ""
  200.         set moduleConf [$modulePP getComponentByName moduleConf]
  201.         $moduleConf clear
  202.         foreach mod [$moduleManager getEnabledModuleList] {
  203.         set text [string toupper \
  204.             [string range $mod 0 0]][string range $mod 1 end]
  205.         
  206.         if ![string match coredirs $mod] {
  207.             $moduleConf addChoice     $mod $text    
  208.             append result " $mod"
  209.         }
  210.         }
  211.         foreach mod [$moduleManager getDisabledModuleList] {
  212.         set text [string toupper \
  213.             [string range $mod 0 0]][string range $mod 1 end]
  214.         if ![string match coredirs $mod] {
  215.             $moduleConf addChoice $mod $text    
  216.         }
  217.         }
  218.         $moduleConf selectItem $result
  219.         return $modulePP
  220.     } default {
  221.         # Check which property pages are associated with this type of node
  222.         
  223.         foreach pp [$moduleManager getPropertyPagesByNodetypeList $name] {
  224.         # PP is a list that contains: pp page name, skill, hookUnder
  225.         set mypp [$ppDef getPPByName [lindex $pp 0]]
  226.         $mypp configure -hookUnder [lindex $pp 2]
  227.         lappend result $mypp
  228.  
  229.         # We fill the property page with the values that 
  230.         # we may already have
  231.         
  232.         $ppManager loadPropertyPage $mypp $confDoc $container
  233.         }
  234.     }
  235.     }
  236.     return $result
  237. }
  238.  
  239. body apachePlugIn::_inquiryForWizard { type node } {
  240.     set result {}
  241.     set name [$nodeManagement getNodeName $node]
  242.     set container [$nodeManagement getContainer $node]
  243.     switch $name {
  244.     mainServer - virtualhost {
  245.         set mypp [$ppDef getPPByName directoryAndLocationAddWizard]
  246.         return $mypp
  247.     } directory - location {
  248.         set mypp [$ppDef getPPByName filesAndLimitAddWizard]
  249.         return $mypp
  250.     } rootNode {
  251.         set mypp [$ppDef getPPByName virtualHostAddWizard]
  252.         return $mypp
  253.     }
  254.     }
  255.     return $result
  256. }
  257.  
  258. body apachePlugIn::_executeCommand { node commandName} {
  259.     global tcl_platform
  260.     set result {}
  261.     set name [$nodeManagement getNodeName $node]
  262.     set container [$nodeManagement getContainer $node]
  263.     switch $tcl_platform(platform) {
  264.     unix {
  265.         catch {eval exec [lindex $commands($commandName) 0]} result
  266.     } windows {
  267.         set result {Commands for starting/stopping, etc do not work yet \
  268.                 on Windows. Use the ones included with Apache}
  269.         #global env
  270.         #catch {exec $env(COMSPEC) /c \
  271.             [lindex $commands($commandName) 0]} result
  272.     }
  273.     }
  274.     $commandResult setLabel $result
  275.     return $commandPP
  276. }
  277.  
  278. # This has to be taken to an external file to be easy to translate.
  279.  
  280. body apachePlugIn::_inquiryForRightPaneContent { node } {
  281.     set result ""    
  282.     set container [$nodeManagement getContainer $node]
  283.     set name [$nodeManagement getNodeName $node]
  284.     switch $name {
  285.        serverinfo {
  286.        append result {<img src="apache_logo">}
  287.        append result "<h1>[mesg::get apache_server_info]</h1>"
  288.        global tcl_platform
  289.        switch $tcl_platform(platform) {
  290.     unix {
  291.        if ![catch {eval exec $httpd -v} info] {
  292.               append result "<pre>$info</pre>"
  293.            } else {
  294.         append result [mesg::get apache_server_info_version_error]
  295.             append result "<pre>$info</pre>"    
  296.            }
  297.               if ![catch {eval exec $httpd -l} info] {
  298.               append result "<pre>$info</pre>"
  299.            } else {
  300.         append result [mesg::get apache_server_info_modules_error]
  301.             append result "<pre>$info</pre>"    
  302.            }
  303.     } windows {
  304.         set result {Commands for starting/stopping, etc do not work yet \
  305.                 on Windows. Use the ones included with Apache}
  306.         #global env
  307.         #catch {exec $env(COMSPEC) /c \
  308.             [lindex $commands($commandName) 0]} result
  309.     }
  310.        }
  311.        }
  312.        moduleconf {
  313.        append result {<img src="apache_logo">}
  314.        append result "<h1>[mesg::get module_management]</h1>"
  315.        append result [mesg::get apache_available_modules]<br>
  316.        append result "<a href=\"command propertyPages\">[mesg::get apache_edit_available_modules]</a>"
  317.        append result "<h2>[mesg::get apache_available_modules_bundled]</h2>"
  318.        foreach mod [$moduleManager getEnabledModuleList] {
  319.       if [expr [lsearch -exact  {access actions alias asis auth auth_anon auth_db auth_dbm
  320.       auth_digest autoindex browser cern_meata cgi cookies digest dir dld dll env 
  321.           expires headers imap include info isapi log_agent log_common log_config log_referer 
  322.           mime mime_magic mmap_static negotiation proxy rewrite setenvif so speling status userdir 
  323.           unique_id usertrack vhost_alias } $mod] != -1] {
  324.           set name [string toupper [string range $mod 0 0]][string range $mod 1 end]
  325.           append result "<br> <img src=\"[$moduleManager getModuleIcon $mod]\"> <b>$name</b>: [$moduleManager getModuleDescription $mod]  "
  326.        }
  327.        }
  328.        append result "<h2>[mesg::get apache_available_modules_thirdparty]</h2>"
  329.        foreach mod [$moduleManager getEnabledModuleList] {
  330.       if [expr [lsearch -exact {coredirs access actions alias asis auth auth_anon auth_db auth_dbm 
  331.       auth_digest autoindex browser cern_meata cgi cookies digest dir dld dll env 
  332.           expires headers imap include info isapi log_agent log_common log_config log_referer 
  333.           mime mime_magic mmap_static negotiation proxy rewrite setenvif so speling status userdir
  334.           unique_id usertrack vhost_alias } $mod ] == -1] {
  335.           set name [string toupper [string range $mod 0 0]][string range $mod 1 end]
  336.           append result "<br> <img src=\"[$moduleManager getModuleIcon $mod]\"> <b>$name</b>: [$moduleManager getModuleDescription $mod]  "
  337.        }
  338.        }
  339.        } apacheconf {
  340.         set result [mesg::get apache_server_management_right_pane]
  341.    foreach {name value} [array get commands] {
  342.        append result "<button image=\"[lindex $value 1]\" \
  343.        command=\"command $name\" > $name<br>"
  344.    }
  345.         
  346.     } rootNode {
  347.         set result {
  348.  <img src="apache_logo">
  349.  <h1>Apache</h1><br>}
  350.  append result [mesg::get apache_server_root_right_pane_1]
  351.  append result { <b>}
  352.  append result [mesg::get apache_web_server]
  353.  append result {</b>. <br><br>}
  354.  append result [mesg::get apache_you_can]
  355.  append result {:<br> <br> <img src="www"> <a href="command selectNode -namespaceNode }
  356.  append result $mainServer
  357.  append result { ">}
  358.  append result [mesg::get configure]
  359.  append result {</a> }
  360.  append result [mesg::get the_main_web_site]
  361.  append result {<br><br> <img src="wheel"> <a href="command addNewNode">}
  362.  append result [mesg::get Create]
  363.  append result {</a> }
  364.  append result [mesg::get a_new_virtual_host]
  365.  
  366.  if [string length [set list [$nodeManagement \
  367.      getPlugInNodeChildrenByNodeName $node virtualhost]]] {
  368.      append result  {<br><br>}
  369.      append result [mesg::get or_configure_an_existing_one]
  370.      append result {<br>}
  371.  } else {
  372.      append result {<br><br> }
  373.      append result [mesg::get apache_no_virtualhosts]
  374.      append result {<br>}
  375.      }
  376.      foreach host $list {
  377.      append result {<br> <img src="www"> }
  378.      append result { <a href="command selectNode -namespaceNode }
  379.      append result $host
  380.      append result  { " >}
  381.      append result [join [[$nodeManagement getContainer $host] getName]]
  382.      append result {
  383.         </a>
  384.         <br>
  385.     }
  386.     }
  387. } mainServer {
  388.     append result {
  389.         <img src="apache_logo">
  390.         <h1>}
  391.     append result [mesg::get default_web_server]
  392.     append result {</h1>}
  393.     append result {<br>}
  394.     append result [mesg::get apache_here_you_can_configure_the]
  395.     append result { <a href="command propertyPages">}
  396.     append result [mesg::get default_web_site_properties]
  397.     append result {</a>, }
  398.     append result [mesg::get {which are also the default for all other virtual servers.}]
  399.     append result {<br>}
  400.     append result [mesg::get apache_different_sections]
  401.     append result { <a href="command addNewNode">}
  402.     append result [mesg::get create_a_new_section]
  403.     append result {</a>    <br> <img src="folderBig"><b>}
  404.     append result [mesg::get Directories]
  405.     append result {</b>    <br>}
  406.     if [string length [set list [$nodeManagement \
  407.         getPlugInNodeChildrenByNodeName $node directory]]] {
  408.         append result  {<br><br>}
  409.         append result [mesg::get or_configure_an_existing_one]
  410.         append result {<br>}
  411.         } else {
  412.         append result {<br><br>} 
  413.         append result [mesg::get apache_no_directories_defined]
  414.         append result {<br>}
  415.         }
  416.     foreach dir $list {
  417.         append result {<br> <img src="closedFolder"> }
  418.     append result { <a href="command selectNode -namespaceNode }
  419.         append result $dir
  420.     append result  { " >}
  421.     append result [join [[$nodeManagement getContainer $dir] getName]]
  422.     append result {
  423.             </a>      } 
  424.     append result {    <br>
  425.     }
  426.     }
  427.     append result {
  428.     <br>
  429.     <img src="locationBig"><b>}
  430.     append result [mesg::get Locations]
  431.     append result {</b><br>}
  432.     if [string length [set list [$nodeManagement \
  433.         getPlugInNodeChildrenByNodeName $node location]]] {
  434.         append result  {<br><br>}
  435.         append result [mesg::get configure_an_existing_one]
  436.         append result {<br>} 
  437.         } else {
  438.         append result {<br><br> }
  439.         append result [mesg::get apache_no_locations]
  440.         append result {<br>}
  441.         }
  442.     foreach loc $list {
  443.         append result {<br> <img src="location"> }
  444.     append result { <a href="command selectNode -namespaceNode }
  445.         append result $loc
  446.     append result  { " >}
  447.     append result [join [[$nodeManagement getContainer $loc] getName]]
  448.     append result {
  449.         </a> }
  450. append result {        <br>
  451.     }
  452.  
  453.     } 
  454.     append result {
  455.     <br>
  456.     <img src="filesBig"><b>}
  457.     append result [mesg::get Files]
  458.     append result {</b><br>}
  459.     if [string length [set list [$nodeManagement \
  460.         getPlugInNodeChildrenByNodeName $node files]]] {
  461.         append result  {<br><br>}
  462.             append result [mesg::get configure_an_existing_one]
  463.         append result {<br>} 
  464.         } else {
  465.         append result {<br><br> }
  466.         append result [mesg::get apache_no_files]
  467.         append result {<br>}
  468.         }
  469.     foreach loc $list {
  470.         append result {<br> <img src="files"> }
  471.     append result { <a href="command selectNode -namespaceNode }
  472.         append result $loc
  473.     append result  { " >}
  474.     append result [join [[$nodeManagement getContainer $loc] getName]]
  475.     append result {
  476.         </a> }
  477. append result {        <br>
  478.     }
  479.  
  480.     }     
  481. }  directory {
  482.         append result {
  483.         <img src="apache_logo"><br>
  484.         <h1>}
  485.         append result [mesg::get Directory]
  486.         append result { }
  487.         append result  [ $container getName ]
  488.         append result {</h1>
  489.         <br><br>
  490.         <img src="folderBig">}
  491.         append result [mesg::get directory_right_pane]
  492.         append result { <a href="command propertyPages" >}
  493.         append result [mesg::get here]
  494.         append result {</a>}
  495. }  files {
  496.         append result {
  497.         <img src="apache_logo"><br>
  498.         <h1>}
  499.         append result { } 
  500.         append result [mesg::get Files]
  501.         append result  [ $container getName ]
  502.         append result {</h1>
  503.         <br><br>
  504.         <img src="filesBig">}
  505.         append result [mesg::get files_right_pane]
  506.             append result { <a href="command propertyPages" >}
  507.             append result [mesg::get here]  
  508.         append result {</a>}
  509.  
  510. } location {
  511.         append result {
  512.         <img src="apache_logo"><br>
  513.         <h1>}
  514.         append result [mesg::get Location]
  515.         append result { }
  516.         append result  [ $container getName ]
  517.         append result {</h1>
  518.         <br><br>
  519.         <img src="locationBig">}
  520.         append result [mesg::get location_right_pane]
  521.         append result { <a href="command propertyPages" >}
  522.             append result [mesg::get here]
  523.             append result {</a>}         
  524. } virtualhost {
  525.     set result {
  526.         <img src="apache_logo">
  527.         <h1>}
  528.     append result [mesg::get Virtual_host]
  529.     append result { }
  530.     append    result [$container getName]
  531.     append result    {</h1>
  532.         <br>}
  533.         append result [mesg::get apache_here_you_can_configure_the]
  534.     append result { <a href="command propertyPages">}
  535.     append result [mesg::get properties]
  536.     append result {</a>}
  537.     append result [mesg::get for_this_virtual_host]
  538.     append result {.<br>}
  539.     append result [mesg::get apache_different_sections]
  540.         append result { <a href="command addNewNode">}
  541.     append result [mesg::get create_a_new_section]
  542.     append result {</a><br>}
  543.     append result {<img src="folderBig"><b>}
  544.     append result [mesg::get Directories]
  545.     append result {</b> <br>}
  546.     if [string length [set list [$nodeManagement \
  547.         getPlugInNodeChildrenByNodeName $node directory]]] {
  548.         append result  {<br><br>}
  549.         append result [mesg::get configure_an_existing_one]
  550.         append result {<br>} 
  551.         } else {
  552.         append result {<br><br>}
  553.         append result [mesg::get apache_no_directories_defined]
  554.         append result {<br>}
  555.         }
  556.     foreach dir $list {
  557.         append result {<br> <img src="closedFolder"> }
  558.     append result { <a href="command selectNode -namespaceNode }
  559.         append result $dir
  560.     append result  { " >}
  561.     append result [join [[$nodeManagement getContainer $dir] getName]]
  562.     append result {
  563.         </a>  }
  564.     }
  565. append result {
  566.         <br>
  567. }
  568.     append result {
  569.     <br>
  570.     <img src="locationBig"><b>}
  571.     append result [mesg::get Locations]
  572.     append result {</b><br>}
  573.     if [string length [set list [$nodeManagement \
  574.         getPlugInNodeChildrenByNodeName $node location]]] {
  575.         append result  {<br><br>}
  576.         append result [mesg::get configure_an_existing_one]
  577.         append result {<br>} 
  578.         } else {
  579.         append result {<br><br> }
  580.         append result [mesg::get apache_no_locations]
  581.         append result {<br>}
  582.         }
  583.     foreach loc $list {
  584.         append result {<br> <img src="location"> }
  585.     append result { <a href="command selectNode -namespaceNode }
  586.         append result $loc
  587.     append result  { " >}
  588.     append result [join [[$nodeManagement getContainer $loc] getName]]
  589.     append result { </a> <br> }
  590.     }
  591.     append result {    <br><img src="filesBig"><b>}
  592.     append result [mesg::get Files]
  593.     append result {</b><br>}
  594.     if [string length [set list [$nodeManagement \
  595.         getPlugInNodeChildrenByNodeName $node files]]] {
  596.         append result  {<br><br>}
  597.             append result [mesg::get configure_an_existing_one]
  598.         append result {<br>} 
  599.         } else {
  600.         append result {<br><br> }
  601.         append result [mesg::get apache_no_files]
  602.         append result {<br>}
  603.         }
  604.     foreach loc $list {
  605.         append result {<br> <img src="files"> }
  606.     append result { <a href="command selectNode -namespaceNode }
  607.         append result $loc
  608.     append result  { " >}
  609.     append result [join [[$nodeManagement getContainer $loc] getName]]
  610.     append result {</a> <br>}
  611.     }
  612.    
  613.   } default {
  614.         set result kkk
  615.     }
  616.     }
  617.     return $result
  618. }
  619.  
  620. # apachePlugIn::_createNodes --
  621. #   Recursive method that explores a configuration document and creates the
  622. # appropriate nodes.
  623.  
  624. body apachePlugIn::_createNodes { node } {
  625.     switch [ $nodeManagement getNodeName $node] {
  626.     rootNode {
  627.         set moduleconf [ $nodeManagement addNode  $node\
  628.             -label [mesg::get server_management] \
  629.             -openIcon wheelSmall\
  630.             -classes {container apache} \
  631.             -closedIcon wheelSmall\
  632.             -container [$confDoc getRootContainer]\
  633.             -nodeName apacheconf ]
  634.         set apacheconf [ $nodeManagement addNode  $moduleconf\
  635.             -label [mesg::get module_management] \
  636.             -openIcon moduleManager\
  637.             -classes {leaf apache} \
  638.             -closedIcon moduleManager\
  639.             -container [$confDoc getRootContainer]\
  640.             -nodeName moduleconf ]
  641.         set serverinfo [ $nodeManagement addNode  $moduleconf\
  642.             -label [mesg::get server_info] \
  643.             -openIcon information\
  644.             -classes {leaf apache} \
  645.             -closedIcon information\
  646.             -container [$confDoc getRootContainer]\
  647.             -nodeName serverinfo ]
  648.           
  649.         _createNodes [set mainServer [ $nodeManagement addNode  $node\
  650.             -label [mesg::get default_web_server] \
  651.             -openIcon mainserver\
  652.             -classes {container apache} \
  653.             -closedIcon mainserver\
  654.             -container [$confDoc getRootContainer]\
  655.             -nodeName mainServer ]]
  656.     } mainServer {
  657.         foreach container \
  658.             [$confDoc getContainers [$confDoc getRootContainer]] {
  659.         switch [ $container getClasses ] {
  660.             directory - location - files {
  661.             _addNode $node $container
  662.             } virtualhost {
  663.             _createNodes [_addNode $rootNode $container]
  664.             }
  665.         }
  666.         }
  667.     } virtualhost {
  668.         foreach container  [$confDoc getContainers \
  669.             [$nodeManagement getContainer $node]] {
  670.         _addNode $node $container
  671.         }
  672.     } directory - location {
  673.         foreach container  [$confDoc getContainers \
  674.         [$nodeManagement getContainer $node]] {
  675.         _addNode $node $container
  676.         }
  677.     } limit - apacheconf - files {
  678.         return
  679.     } default {
  680.         error "Attempted createNodes unrecognized $node \
  681.             node name [ $nodeManagement getNodeName $node] "
  682.     }
  683.     }
  684. }
  685.  
  686.  
  687. body apachePlugIn::_addNode { node container } {
  688.     switch [$container getClasses] {
  689.     location {
  690.         $nodeManagement addNode $node\
  691.                 -label [join [$container getName]] \
  692.             -openIcon location\
  693.             -closedIcon location\
  694.             -classes {container apache} \
  695.             -container $container\
  696.             -nodeName location
  697.     } directory {
  698.         $nodeManagement addNode $node\
  699.                 -label [join [$container getName]] \
  700.             -openIcon closedFolder\
  701.             -classes {container apache} \
  702.             -closedIcon closedFolder\
  703.             -container $container\
  704.             -nodeName directory
  705.     } files {
  706.         $nodeManagement addNode $node\
  707.                 -label [join [$container getName]] \
  708.             -openIcon files\
  709.             -classes {leaf apache} \
  710.             -closedIcon files\
  711.             -container $container\
  712.             -nodeName files            
  713.     } virtualhost {
  714.         $nodeManagement addNode $node\
  715.                 -label [join [$container getName]] \
  716.             -openIcon virtualhost\
  717.             -classes {container apache} \
  718.             -closedIcon virtualhost\
  719.             -container $container\
  720.             -nodeName virtualhost
  721.     }
  722.     }
  723. }
  724.  
  725.  
  726. body apachePlugIn::_registerWithNamespace {} {
  727.     global tcl_platform
  728.     set node $rootNode
  729.     set version $serverDescription
  730.     switch $tcl_platform(platform) {
  731.     unix {
  732.         if [catch {append version " [lrange  [exec $httpd -v] 2 2]"}] {
  733.         append version " Apache/unknown"
  734.         }
  735.     } windows {
  736.         global env
  737.         if [catch {append version " [lrange  \
  738.             [exec $env(COMSPEC) /c  $httpd -v] 2 2]"}] {
  739.         append version " Apache/unknown"
  740.         }
  741.     }
  742.     }         
  743.     
  744.     # Now rootNode is no longer root but apache root node
  745.     
  746.     set rootNode [$nodeManagement addNode $node\
  747.         -label $version \
  748.         -openIcon apache\
  749.         -closedIcon apache\
  750.         -container {}\
  751.         -nodeName rootNode]
  752. }
  753.  
  754.  
  755. body apachePlugIn::_deleteNodeRequest { node } {
  756.      set container [$nodeManagement getContainer $node]
  757.      if ![llength $container] {
  758.        #either main plugin node or mangement
  759.        return
  760.      }
  761.      switch [$container getClasses] {
  762.        virtualhost {
  763.            $confDoc removeContainer [$confDoc getRootContainer]\
  764.               $container
  765.            $nodeManagement removeNode $node
  766.        _saveConfig         
  767.        } directory - location - files {
  768.            $confDoc removeContainer [$nodeManagement getContainer \
  769.               [$nodeManagement getParentNode $node]] $container
  770.            $nodeManagement removeNode $node
  771.        _saveConfig
  772.        }
  773.        default {}
  774.      }
  775. }
  776.  
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.