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

  1.  
  2. # Set of procedures for management of Apache modules
  3.  
  4.  
  5. # addModule --
  6. # Given a module:
  7. #     add directives
  8. #     add property pages
  9. #     add association property pages  <--> nodes
  10. # Arguments:
  11. #     filename   Filename with the module definition
  12. #     dirDef     Object where to store the directives
  13. #     ppDef      Object where to store the Property pages  
  14. #     moduleManager Object where to store which property pages
  15. #                 correspond to which node, etc
  16. #     parser    Apache parser 
  17. #     dumper    Apache dumper (to add parsing and dumping procedures)
  18.  
  19. proc addModule {filename dirDef ppDef moduleManager parser dumper} {
  20.     set baseDirectory [file dirname $filename]
  21.     set f [open $filename]
  22.     set xmlDoc [dom::document cget \
  23.         [dom::DOMImplementation parse [read $f]] -documentElement]
  24.     close $f
  25.  
  26.     # Get info about the module (name, description, etc)
  27.  
  28.     set moduleName [ dom::getAttribute $xmlDoc name ]
  29.     $moduleManager addModuleDescription $moduleName [ dom::getAttribute $xmlDoc description ]
  30.     $moduleManager addModuleIcon $moduleName [ dom::getAttribute $xmlDoc icon ]
  31.     set directivesXMLDefinition \
  32.         [ dom::getAttribute $xmlDoc directivesXMLDefinition ]
  33.     set f [open [file join $baseDirectory $directivesXMLDefinition]]
  34.     set doc [xuiB renderDocument [dom::DOMImplementation \
  35.     parse [read $f]]]
  36.     close $f
  37.     set xuiDirectiveList [$dirDef addDirectiveDefinition $doc]
  38.  
  39.     set propertyPagesXMLDefinition \
  40.         [ dom::getAttribute $xmlDoc propertyPagesXMLDefinition ]
  41.     set f [open [file join $baseDirectory $propertyPagesXMLDefinition]]
  42.     set domDoc [dom::DOMImplementation \
  43.     parse [read $f]]
  44.     close $f
  45.     set doc [xuiB renderDocument $domDoc]
  46.     dom::DOMImplementation destroy $domDoc
  47.     $ppDef addPPDefinition $doc
  48.     
  49.  
  50.     # Iterate 
  51.     #   <nodesInterested> 
  52.     #     <node type="mainserver">
  53.     #       <propertyPage name="newbieBasicMainServer" skillLevel="newbie" />
  54.     #     ...
  55.     
  56.     foreach node [dom::getElements [dom::rp $xmlDoc nodesInterested]] {
  57.     
  58.         # To allow directory,location
  59.     
  60.     foreach nodeType [split [dom::getAttribute $node type] , ] {
  61.     
  62.     foreach ppage [dom::getElements $node] {
  63.         set ppName [dom::getAttribute $ppage name]
  64.         set skillLevel [dom::getAttribute $ppage skillLevel]
  65.         set hookUnder [dom::getAttribute $ppage hookUnder]
  66.         
  67.         # If they are empty, do not add them (they will add the 
  68.         # default)
  69.         set options {}
  70.         foreach option {skillLevel hookUnder} {
  71.         if [string length [set $option]] {
  72.             append options " -$option [set $option] "
  73.         }
  74.         }
  75.         eval $moduleManager addPropertyPageNodeRelationship \
  76.             $moduleName $ppName $nodeType $options
  77.     }
  78.     }
  79.     }
  80.     # Iterate 
  81.     #   <specialCases file="specialCase.tcl">
  82.     #     <specialCase confDir="errorlog"
  83.     #                  xmlDir="errorLog"
  84.     #                  dumper="apache1.3::parseErrorLog"
  85.     #                  parser="apache1.3::dumpErrorLog" />
  86.     #     ...
  87.  
  88.     set specialCaseNameHttpdConfList {}
  89.     set specialCaseNameXuiDirList {}
  90.     if ![catch {set specialCase [dom::rp $xmlDoc specialCases]} kk] {
  91.     source  [file join $baseDirectory [dom::getAttribute $specialCase file ]]
  92.     foreach node [dom::getElements [dom::rp $xmlDoc specialCases]] {
  93.         $parser setSpecialCase [dom::getAttribute $node parser] \
  94.             [dom::getAttribute $node confDir]
  95.         lappend specialCaseNameHttpdConfList [dom::getAttribute $node parser]
  96.         $dumper setSpecialCase [dom::getAttribute $node dumper] \
  97.             [dom::getAttribute $node xmlDir]
  98.         lappend specialCaseNameXuiDirList [dom::getAttribute $node dumper]
  99.         
  100.         if [info exists specialCasesArray([dom::getAttribute $node xmlDir])] {
  101.         append specialCasesArray([dom::getAttribute $node xmlDir]) \
  102.             ,[dom::getAttribute $node confDir]
  103.         } else {
  104.         set specialCasesArray([dom::getAttribute $node xmlDir]) \
  105.             [dom::getAttribute $node confDir]
  106.         }
  107.  
  108.         # Map httpd.conf directive to the xmlDirective to process it
  109.         # This is necessary for pretty dumping so when we find allow
  110.         # directives for example we know we have to dump xuiDirective access
  111.         
  112.         $dumper setSpecialCaseDirectiveMapping [dom::getAttribute $node xmlDir] \
  113.             [dom::getAttribute $node confDir]
  114.         
  115.     }
  116.     } else {
  117.         #puts $kk
  118.     }
  119.  
  120.  
  121.  
  122.     # We need to add the directives that will appear in config file
  123.     # This is all special cases httpdconfig + all xuidirs names - xuidirs of special cases
  124.     # (i.e xuiDir access not, allow and deny yes)
  125.  
  126.     set directiveList {}
  127.     
  128.     foreach one $xuiDirectiveList {
  129.     lappend directiveList [string tolower [$one getName]]
  130.     }
  131.  
  132.     foreach one $specialCaseNameXuiDirList {
  133.     lremove directiveList [string tolower $one]
  134.     }
  135.     foreach one $specialCaseNameHttpdConfList {
  136.     lappend directiveList $one
  137.     }           
  138.  
  139.     $moduleManager addModuleDirectivesRelationship $moduleName $directiveList
  140.  
  141.     # XXX Quick Hack to support module / dirname of all directives
  142.     # Then for each special case we also change (see below)
  143.  
  144.     foreach xuiDir $xuiDirectiveList {
  145.  
  146.     # Para cada una pregunta sus special cases y switch 0-> poner nombre
  147.     # mas de uno, separarlo por comas
  148.     
  149.     set xuiDirName [$xuiDir getName]
  150.     if [info exists specialCasesArray($xuiDirName)] {
  151.         $xuiDir configure -helpReference \
  152.             "$moduleName=[string tolower $specialCasesArray($xuiDirName)]"
  153.     } else {
  154.         #puts "$moduleName=[string tolower $xuiDirName]" 
  155.         $xuiDir  configure -helpReference "$moduleName=[string tolower $xuiDirName]"
  156.     }
  157.     }
  158. }
  159.  
  160.  
  161.