File indexing completed on 2024-06-16 05:30:26

0001 <?php
0002 /**
0003  * Zend Framework
0004  *
0005  * LICENSE
0006  *
0007  * This source file is subject to the new BSD license that is bundled
0008  * with this package in the file LICENSE.txt.
0009  * It is also available through the world-wide-web at this URL:
0010  * http://framework.zend.com/license/new-bsd
0011  * If you did not receive a copy of the license and are unable to
0012  * obtain it through the world-wide-web, please send an email
0013  * to license@zend.com so we can send you a copy immediately.
0014  *
0015  * @category   Zend
0016  * @package    Zend_Service_Console
0017  * @subpackage Exception
0018  * @version    $Id$
0019  * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
0020  * @license    http://framework.zend.com/license/new-bsd     New BSD License
0021  */
0022 
0023 /** @see Zend_Xml_Security */
0024 // require_once 'Zend/Xml/Security.php';
0025 
0026 /**
0027 * @see Zend_Service_Console_Command
0028 */
0029 // require_once 'Zend/Service/Console/Command.php';
0030 
0031 /**
0032  * Package commands
0033  *
0034  * @category   Zend
0035  * @package    Zend_Service_WindowsAzure_CommandLine
0036  * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
0037  * @license    http://framework.zend.com/license/new-bsd     New BSD License
0038  *
0039  * @command-handler package
0040  * @command-handler-description Windows Azure Package commands
0041  * @command-handler-header Windows Azure SDK for PHP
0042  * @command-handler-header Copyright (c) 2009 - 2011, RealDolmen (http://www.realdolmen.com)
0043  * @command-handler-footer
0044  * @command-handler-footer All commands support the --ConfigurationFile or -F parameter.
0045  * @command-handler-footer The parameter file is a simple INI file carrying one parameter
0046  * @command-handler-footer value per line. It accepts the same parameters as one can
0047  * @command-handler-footer use from the command line command.
0048  */
0049 class Zend_Service_WindowsAzure_CommandLine_Package
0050   extends Zend_Service_Console_Command
0051 {
0052   /**
0053    * Scaffolds a Windows Azure project structure which can be customized before packaging.
0054    *
0055    * @command-name Scaffold
0056    * @command-description Scaffolds a Windows Azure project structure which can be customized before packaging.
0057    *
0058    * @command-parameter-for $path Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Path|-p Required. The path to create the Windows Azure project structure.
0059    * @command-parameter-for $scaffolder Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Scaffolder|-s Optional. The path to the scaffolder to use. Defaults to Scaffolders/DefaultScaffolder.phar
0060    */
0061   public function scaffoldCommand($path, $scaffolder, $argv)
0062   {
0063     // Default parameter value
0064     if ($scaffolder == '') {
0065       $scaffolder = dirname(__FILE__) . '/Scaffolders/DefaultScaffolder.phar';
0066     }
0067     $scaffolder = realpath($scaffolder);
0068 
0069     // Verify scaffolder
0070     if (!is_file($scaffolder)) {
0071       // require_once 'Zend/Service/Console/Exception.php';
0072       throw new Zend_Service_Console_Exception('Could not locate the given scaffolder: ' . $scaffolder);
0073     }
0074 
0075     // Include scaffolder
0076     $archive = new Phar($scaffolder);
0077     include $scaffolder;
0078     if (!class_exists('Scaffolder')) {
0079       // require_once 'Zend/Service/Console/Exception.php';
0080       throw new Zend_Service_Console_Exception('Could not locate a class named Scaffolder in the given scaffolder: ' . $scaffolder . '. Make sure the scaffolder package contains a file named index.php and contains a class named Scaffolder.');
0081     }
0082 
0083     // Cleanup $argv
0084     $options = array();
0085     foreach ($argv as $arg) {
0086       list($key, $value) = explode(':', $arg, 2);
0087       while (substr($key, 0, 1) == '-') {
0088         $key = substr($key, 1);
0089       }
0090       $options[$key] = $value;
0091     }
0092 
0093     // Run scaffolder
0094     $scaffolderInstance = new Scaffolder();
0095     $scaffolderInstance->invoke($archive, $path, $options);
0096   }
0097 
0098 
0099   /**
0100    * Packages a Windows Azure project structure.
0101    *
0102    * @command-name Create
0103    * @command-description Packages a Windows Azure project structure.
0104    *
0105    * @command-parameter-for $path Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Path|-p Required. The path to package.
0106    * @command-parameter-for $runDevFabric Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --RunDevFabric|-dev Required. Switch. Run and deploy to the Windows Azure development fabric.
0107    * @command-parameter-for $outputPath Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --OutputPath|-out Optional. The output path for the resulting package.
0108    */
0109   public function createPackageCommand($path, $runDevFabric, $outputPath)
0110   {
0111     // Create output paths
0112     if ($outputPath == '') {
0113       $outputPath = realpath($path . '/../');
0114     }
0115     $packageOut = $outputPath . '/' . basename($path) . '.cspkg';
0116 
0117     // Find Windows Azure SDK bin folder
0118     $windowsAzureSdkFolderCandidates = array_merge(
0119       isset($_SERVER['ProgramFiles']) ? glob($_SERVER['ProgramFiles'] . '\Windows Azure SDK\*\bin', GLOB_NOSORT) : array(),
0120       isset($_SERVER['ProgramFiles']) ? glob($_SERVER['ProgramFiles(x86)'] . '\Windows Azure SDK\*\bin', GLOB_NOSORT) : array(),
0121       isset($_SERVER['ProgramFiles']) ? glob($_SERVER['ProgramW6432'] . '\Windows Azure SDK\*\bin', GLOB_NOSORT) : array()
0122     );
0123     if (count($windowsAzureSdkFolderCandidates) == 0) {
0124       throw new Zend_Service_Console_Exception('Could not locate Windows Azure SDK for PHP.');
0125     }
0126     $cspack = '"' . $windowsAzureSdkFolderCandidates[0] . '\cspack.exe' . '"';
0127     $csrun = '"' . $windowsAzureSdkFolderCandidates[0] . '\csrun.exe' . '"';
0128 
0129     // Open the ServiceDefinition.csdef file and check for role paths
0130     $serviceDefinitionFile = $path . '/ServiceDefinition.csdef';
0131     if (!file_exists($serviceDefinitionFile)) {
0132       // require_once 'Zend/Service/Console/Exception.php';
0133       throw new Zend_Service_Console_Exception('Could not locate ServiceDefinition.csdef at ' . $serviceDefinitionFile . '.');
0134     }
0135     $serviceDefinition = Zend_Xml_Security::scanFile($serviceDefinitionFile);
0136     $xmlRoles = array();
0137     if ($serviceDefinition->WebRole) {
0138       if (count($serviceDefinition->WebRole) > 1) {
0139           $xmlRoles = array_merge($xmlRoles, $serviceDefinition->WebRole);
0140       } else {
0141           $xmlRoles = array_merge($xmlRoles, array($serviceDefinition->WebRole));
0142         }
0143     }
0144     if ($serviceDefinition->WorkerRole) {
0145       if (count($serviceDefinition->WorkerRole) > 1) {
0146           $xmlRoles = array_merge($xmlRoles, $serviceDefinition->WorkerRole);
0147       } else {
0148           $xmlRoles = array_merge($xmlRoles, array($serviceDefinition->WorkerRole));
0149         }
0150     }
0151 
0152     // Build '/role:' command parameter
0153     $roleArgs = array();
0154     foreach ($xmlRoles as $xmlRole) {
0155       if ($xmlRole["name"]) {
0156         $roleArgs[] = '/role:' . $xmlRole["name"] . ';' . realpath($path . '/' . $xmlRole["name"]);
0157       }
0158     }
0159 
0160     // Build command
0161     $command = $cspack;
0162     $args = array(
0163       $path . '\ServiceDefinition.csdef',
0164       implode(' ', $roleArgs),
0165       '/out:' . $packageOut
0166     );
0167     if ($runDevFabric) {
0168       $args[] = '/copyOnly';
0169     }
0170     passthru($command . ' ' . implode(' ', $args));
0171 
0172     // Can we copy a configuration file?
0173     $serviceConfigurationFile = $path . '/ServiceConfiguration.cscfg';
0174     $serviceConfigurationFileOut = $outputPath . '/ServiceConfiguration.cscfg';
0175     if (file_exists($serviceConfigurationFile) && !file_exists($serviceConfigurationFileOut)) {
0176       copy($serviceConfigurationFile, $serviceConfigurationFileOut);
0177     }
0178 
0179     // Do we have to start the development fabric?
0180     if ($runDevFabric) {
0181       passthru($csrun . ' /devstore:start /devfabric:start');
0182       passthru($csrun . ' /removeAll');
0183       passthru($csrun . ' /run:"' . $packageOut . ';' . $serviceConfigurationFileOut . '" /launchBrowser');
0184     }
0185   }
0186 
0187   /**
0188    * Creates a scaffolder from a given path.
0189    *
0190    * @command-name CreateScaffolder
0191    * @command-description Creates a scaffolder from a given path.
0192    *
0193    * @command-parameter-for $rootPath Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Path|-p Required. The path to package into a scaffolder.
0194    * @command-parameter-for $scaffolderFile Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --OutFile|-out Required. The filename of the scaffolder.
0195    */
0196   public function createScaffolderCommand($rootPath, $scaffolderFile)
0197   {
0198     $archive = new Phar($scaffolderFile);
0199     $archive->buildFromIterator(
0200       new RecursiveIteratorIterator(
0201         new RecursiveDirectoryIterator(realpath($rootPath))),
0202     realpath($rootPath));
0203   }
0204 }
0205 Zend_Service_Console_Command::bootstrap($_SERVER['argv']);