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

  1.  
  2. set currentDir [file dirname [file join [pwd] [info script]]]
  3.  
  4. mesg::processMesgCatalogDir [file join $currentDir messages]
  5. #source [file join $currentDir specialCases.tcl]
  6. source [file join $currentDir apache.tcl]
  7. source [file join $currentDir apacheModuleManager.tcl]
  8. source [file join $currentDir moduleManagement.tcl]
  9. source [file join $currentDir apacheParser.tcl]
  10. source [file join $currentDir apacheParserUtils.tcl]
  11. #source [file join $currentDir dumper.tcl]
  12. source [file join $currentDir apacheDumper.tcl]
  13. #source [file join $currentDir prettyDumper.tcl]
  14. source [file join $currentDir setup/apacheInstallDialog.tcl]
  15. source [file join $currentDir setup/apacheInstallConfig.tcl]
  16.  
  17. namespace eval ::apacheplugin:: {
  18.     variable modules
  19.     variable propertypages
  20.     array set modules {}
  21.     array set propertypages {}
  22.     variable disabledModules
  23.     variable disabledModulesFile
  24. }
  25.  
  26. # XXX This is a quick hack since it is done globally for all Apache intallations
  27. # Change so it is per-installation
  28.  
  29. set ::apacheplugin::disabledModulesFile [file join $currentDir disabledModules.conf]
  30. set f [open $::apacheplugin::disabledModulesFile]
  31. set ::apacheplugin::disabledModules [read $f]
  32. close $f
  33.  
  34. proc apache_init {args} {
  35.  
  36.     array set options $args
  37.     xuiBuilder ::xuiB [list \
  38.         boolean [booleanCreator ::#auto] \
  39.         string [stringCreator ::#auto] \
  40.         structure [structureCreator ::#auto] \
  41.         alternate [alternateCreator ::#auto] \
  42.         choice [choiceCreator ::#auto] \
  43.         list [listCreator ::#auto] \
  44.         group [groupCreator ::#auto] \
  45.         propertyPage [propertyPageCreator ::#auto] \
  46.         propertyPages [propertyPagesCreator ::#auto] \
  47.         dirDefinition [dirDefinitionCreator ::#auto] \
  48.         label [labelCreator ::#auto] \
  49.         number [numberCreator ::#auto] \
  50.         ]
  51.  
  52.     # Read the apache plugin configuration, to figure out where the 
  53.     # Apache servers to be configured are. In Windows, we can
  54.     # to do it via the registry.
  55.     
  56.     set apacheConfFile [file join $options(-moduledirectory) apache.conf]
  57.  
  58.     # What is going on here:
  59.     #  Am I in Windows?
  60.     #         Y  -> Do I have any version in the registry?
  61.     #                   Y -> Configure them
  62.     #                        Is there any apache.conf file?
  63.     #                        Y -> continue
  64.     #                        N -> return
  65.     #                   N -> Continue
  66.     #         N -> continue
  67.     # Is there any apache.conf file? If not create
  68.     
  69.     # Instead of having an if-else here for Windows and Unix, it is better
  70.     # To detect the Windows Web Servers when adding servers (to allow 
  71.     # configuration of servers that are not in the registry)
  72.     # Still the problem of creating a management plugIn that manages the rest
  73.     # Should we abstract this in the plugIn management?
  74.     # Not for 1.0
  75.     # For this release, we will create a function that creates plugIns
  76.  
  77.     # If Windows, look into registry + apache.conf
  78.     # Apache, just apache.conf
  79.     
  80.     global tcl_platform
  81.     set apacheRootNode [[::plugInUtils::getChildByClass $options(-namespace) \
  82.     root networkServices] getId]
  83.     
  84.     if {$tcl_platform(platform) == "windows"} {
  85.     
  86.     # Apache docs say only one version can be installed at any given time
  87.     # We consider however multiple version
  88.     
  89.     package require registry
  90.     if [catch {registry keys [file nativename [file join \
  91.         HKEY_LOCAL_MACHINE SOFTWARE {Apache Group} Apache]]} \
  92.         versionNumbers] {
  93.  
  94.         
  95.     } else {
  96.         foreach version $versionNumbers {
  97.         set commandList {}
  98.         set httpd {}
  99.         set configurationFiles {}
  100.         set serverDescription "Windows"
  101.         set base [registry get [file nativename [file join \
  102.             HKEY_LOCAL_MACHINE SOFTWARE {Apache Group}\
  103.             Apache $version ]] ServerRoot]
  104.         set serverRoot $base
  105.         set httpd [file nativename [file join $base apache.exe]]
  106.         set configurationFiles [file nativename [file join $base \
  107.             conf httpd.conf]]
  108.         if ![file exists $configurationFiles] {
  109.             puts "Configuration file $configurationFiles \
  110.               could not be found. Server ignored"
  111.              break
  112.            }            
  113.            set commented {
  114.         set commandList    [list start \
  115.                 \"$env(COMSPEC) /c \
  116.             [file join $currentDir windows cmd.bat] \
  117.             [file join $base apache.exe] \
  118.             -k start\" \
  119.             smallWheel]
  120.         lappend commandlist [list stop \
  121.                 \"$env(COMSPEC) /c \
  122.             [file join $currentDir windows cmd.bat] \
  123.             [file join $base apache.exe] \
  124.             -k shutdown\" \
  125.             smallWheel]
  126.         lappend commandlist [list restart \
  127.                 \"$env(COMSPEC) /c \
  128.             [file join $currentDir windows cmd.bat] \
  129.             [file join $base apache.exe] \
  130.             -k restart\" \
  131.             smallWheel]            
  132.         }
  133.            
  134.         set commandList [list \
  135.             [list start [file join $base apache.exe] smallWheel] \
  136.             [list stop "[file join $base \
  137.             apache.exe] -k shutdown" smallWheel] \
  138.             [list restart "[file join $base \
  139.             apache.exe] -k restart" smallWheel] \
  140.             ]
  141.         apache_create_plugin -commandList $commandList \
  142.             -serverRoot $serverRoot \
  143.             -configurationFiles $configurationFiles \
  144.             -httpd $httpd -serverDescription $serverDescription\
  145.             -moduledirectory $options(-moduledirectory)\
  146.             -namespace $options(-namespace) -rootNode $apacheRootNode
  147.         }
  148.         
  149.         # If version in registry and no apache.conf file, we are done
  150.         # If version in registry and there is a apacheConf, do it
  151.  
  152.         if ![file exists $apacheConfFile] { return }
  153.     }
  154.     }
  155.     
  156.     if ![file exists $apacheConfFile] {
  157.     # First time, we ought to create a new one
  158.     # XXX 
  159.     global apacheIDInstance
  160.     set apacheIDInstance  [ apacheInstallConfig ::#auto \
  161.         [file join $options(-moduledirectory) \
  162.         setup propertyPage.xml] [file join $options(-moduledirectory) \
  163.         apache.conf ]]
  164.     if {[$apacheIDInstance configure] == -1} {
  165.     
  166.         # No hosts configured
  167.     
  168.         return
  169.     }
  170.     }
  171.     
  172.     if [catch { set f [open $apacheConfFile]}] {
  173.     
  174.     # If problem reading apache.conf file, just ignore it
  175.  
  176.     return
  177.     }
  178.     set apacheConf [dom::DOMImplementation parse [read $f]]
  179.     close $f
  180.     set servers [dom::getElements [dom::getElements $apacheConf]] 
  181.     foreach serverElement $servers {
  182.     set commandList {}
  183.     set httpd {}
  184.     set configurationfiles {}
  185.     set serverRoot {}
  186.     set serverDescription [dom::getAttribute $serverElement name]
  187.     foreach infoElement [dom::getElements $serverElement] {
  188.         switch [dom::getTagName $infoElement] {
  189.         command {
  190.             lappend commandList [list \
  191.                 [dom::getAttribute $infoElement name] \
  192.                 [dom::getText $infoElement] \
  193.                 [dom::getAttribute $infoElement icon]]
  194.         } httpd {
  195.             set httpd [dom::getText $infoElement]
  196.         } configurationFiles {
  197.             set configurationFiles [dom::getText $infoElement]         
  198.         } serverRoot {
  199.             set serverRoot [dom::getText $infoElement]         
  200.         }
  201.         }
  202.     }
  203.  
  204.         if ![file exists $configurationFiles] {
  205.         puts "Configuration file $configurationFiles could not be found. \
  206.                 Server ignored"
  207.         break
  208.     }
  209.         if ![file exists $serverRoot] {
  210.         puts "directory $serverRoot could not be found. \
  211.                 Server ignored"
  212.         break
  213.     }
  214.     
  215.     # Apache module manager
  216.     
  217.     apache_create_plugin -commandList $commandList \
  218.         -serverRoot $serverRoot \
  219.         -configurationFiles $configurationFiles \
  220.         -httpd $httpd -serverDescription $serverDescription\
  221.         -moduledirectory $options(-moduledirectory)\
  222.         -namespace $options(-namespace) -rootNode $apacheRootNode
  223.     }
  224. }
  225.  
  226.  
  227. proc apache_info {} {
  228.     array set info [list description [mesg::get apache_description]]
  229.     array set info {name {apache}}
  230.     array set info {version {1.0}}
  231.     array set info {icon apache}
  232.     return [array get info]
  233. }
  234.              
  235.              
  236.                           
  237. proc apache_create_plugin {args} {
  238.  
  239.     # We are going to create plugins for different Apache installations
  240.     # To speed up the process, we can share some information between plugins,
  241.     # specially if they belong to the same Apache version, etc.
  242.     # If the location of the module definition is the same, it is safe to assume
  243.     # they are the same version
  244.  
  245.     # There are some problems, by now do not share
  246.  
  247.     # We can reuse:
  248.     # directiveDefinition
  249.     # ppDefinition
  250.     # parser
  251.     # dumper
  252.     #
  253.     # Cannot reuse:
  254.     # confDoc
  255.  
  256.  
  257.  
  258.     array set options $args
  259.     set confDoc [confDocument ::#auto]
  260.     set dirDef [dirDefinition ::#auto ]
  261.     xuiB addCreator directiveInclude \
  262.         [includeCreator ::#auto $dirDef]
  263.     set ppdef [pPDefinition ::#auto ]    
  264.     set ppM [ppManager ::#auto ]  
  265.     set myPg [apachePlugIn ::#auto ]
  266.     set nm [nodeManagement ::#auto $options(-namespace) $myPg]    
  267.     set apModuleManager [apacheModuleManager ::#auto]
  268.     $myPg configure -serverDescription $options(-serverDescription) \
  269.              -rootNode $options(-rootNode)
  270.     foreach command $options(-commandList) {
  271.     foreach {name execCommand icon} $command break;
  272.     $myPg addNewManagementCommand $name $execCommand $icon
  273.     }
  274.     $myPg configure -httpd  $options(-httpd)
  275.     $myPg configure -configurationFiles $options(-configurationFiles)
  276.     $myPg configure -serverRoot $options(-serverRoot)
  277.     set ap [apacheParser ::#auto $dirDef $confDoc]
  278.     $ap configure -moduleManager $apModuleManager
  279.     set apacheDump [apachePrettyDumper ::#auto]
  280.     $apacheDump configure -moduleManager $apModuleManager
  281.     #set apacheDump [apacheDumper ::#auto]
  282.     
  283.     foreach module [glob [file join $options(-moduledirectory) modules *]] {
  284.     
  285.     # TO-DO replace this to see if moduleDescription exists
  286.     # catch is for Raven, CVS
  287.     
  288.     splash::add "Loading Apache module [file tail $module]"
  289.     catch { mesg::processMesgCatalogDir [file join $module messages] }
  290.     #puts $kk
  291.     catch { addModule [file join $module moduleDescription.xml] \
  292.         $dirDef $ppdef $apModuleManager $ap $apacheDump  } kk
  293.     #puts "$module $kk"
  294.     
  295.     foreach module $::apacheplugin::disabledModules {
  296.         $apModuleManager disableModule $module
  297.     }
  298.     }
  299.     $ap configure -mainConfFile $options(-configurationFiles)
  300.     $ap configure -includeroot $options(-serverRoot)
  301.     if [catch {$ap init} kk] {
  302.         MessageDlg .d -message "Error parsing config file.\n$kk" -title Error -type ok -icon error
  303.     exit
  304.     }
  305.     $myPg configure -moduleManager $apModuleManager
  306.     $myPg configure -namespace $options(-namespace) -nodeManagement $nm \
  307.         -confDoc $confDoc -ppManager $ppM -ppDef $ppdef \
  308.         -dumper $apacheDump
  309.     $myPg _registerWithNamespace
  310.     $myPg init
  311. }
  312.