[ Index ] |
|
Code source de CakePHP 1.1.13.4450 |
1 #!/usr/bin/php -q 2 <?php 3 /* SVN FILE: $Id: acl.php 4409 2007-02-02 13:20:59Z phpnut $ */ 4 /** 5 * Short description for file. 6 * 7 * Long description for file 8 * 9 * PHP versions 4 and 5 10 * 11 * CakePHP(tm) : Rapid Development Framework <http://www.cakephp.org/> 12 * Copyright 2005-2007, Cake Software Foundation, Inc. 13 * 1785 E. Sahara Avenue, Suite 490-204 14 * Las Vegas, Nevada 89104 15 * 16 * Licensed under The MIT License 17 * Redistributions of files must retain the above copyright notice. 18 * 19 * @filesource 20 * @copyright Copyright 2005-2007, Cake Software Foundation, Inc. 21 * @link http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project 22 * @package cake 23 * @subpackage cake.cake.scripts 24 * @since CakePHP(tm) v 0.10.0.1232 25 * @version $Revision: 4409 $ 26 * @modifiedby $LastChangedBy: phpnut $ 27 * @lastmodified $Date: 2007-02-02 07:20:59 -0600 (Fri, 02 Feb 2007) $ 28 * @license http://www.opensource.org/licenses/mit-license.php The MIT License 29 */ 30 /** 31 * Enter description here... 32 */ 33 ini_set('display_errors', '1'); 34 ini_set('error_reporting', '7'); 35 define ('DS', DIRECTORY_SEPARATOR); 36 $app = 'app'; 37 $core = null; 38 $root = dirname(dirname(dirname(__FILE__))); 39 $here = $argv[0]; 40 $dataSource = 'default'; 41 $unset = array(); 42 for ($i = 1; $i < count($argv); $i++) { 43 // Process command-line modifiers here 44 switch (strtolower($argv[$i])) { 45 case '-app': 46 $app = $argv[$i + 1]; 47 $unset[$i] = $argv[$i]; 48 $unset[$i + 1] = $argv[$i + 1]; 49 break; 50 case '-core': 51 $core = $argv[$i + 1]; 52 $unset[$i] = $argv[$i]; 53 $unset[$i + 1] = $argv[$i + 1]; 54 break; 55 case '-root': 56 $root = $argv[$i + 1]; 57 $unset[$i] = $argv[$i]; 58 $unset[$i + 1] = $argv[$i + 1]; 59 break; 60 case '-datasource': 61 $dataSource = $argv[$i + 1]; 62 $unset[$i] = $argv[$i]; 63 $unset[$i + 1] = $argv[$i + 1]; 64 break; 65 } 66 } 67 68 if (strlen($app) && $app[0] == DS) { 69 $cnt = substr_count($root, DS); 70 $app = str_repeat('..' . DS, $cnt) . $app; 71 } 72 define ('ROOT', $root.DS); 73 define ('APP_DIR', $app); 74 define ('DEBUG', 1);; 75 define('CAKE_CORE_INCLUDE_PATH', ROOT); 76 define('DATASOURCE', $dataSource); 77 78 if(function_exists('ini_set')) { 79 ini_set('include_path',ini_get('include_path'). 80 PATH_SEPARATOR.CAKE_CORE_INCLUDE_PATH.DS. 81 PATH_SEPARATOR.CORE_PATH.DS. 82 PATH_SEPARATOR.ROOT.DS.APP_DIR.DS. 83 PATH_SEPARATOR.APP_DIR.DS. 84 PATH_SEPARATOR.APP_PATH); 85 define('APP_PATH', null); 86 define('CORE_PATH', null); 87 } else { 88 define('APP_PATH', ROOT . DS . APP_DIR . DS); 89 define('CORE_PATH', CAKE_CORE_INCLUDE_PATH . DS); 90 } 91 92 require ('cake'.DS.'basics.php'); 93 require ('cake'.DS.'config'.DS.'paths.php'); 94 require (CONFIGS.'core.php'); 95 uses ('object', 'configure', 'neat_array', 'session', 'security', 'inflector', 'model'.DS.'connection_manager', 96 'model'.DS.'datasources'.DS.'dbo_source', 'model'.DS.'model'); 97 require(CAKE.'app_model.php'); 98 uses ('controller'.DS.'components'.DS.'acl', 'controller'.DS.'components'.DS.'dbacl'.DS.'models'.DS.'aclnode', 99 'controller'.DS.'components'.DS.'dbacl'.DS.'models'.DS.'aco', 'controller'.DS.'components'.DS.'dbacl'.DS.'models'.DS.'acoaction', 100 'controller'.DS.'components'.DS.'dbacl'.DS.'models'.DS.'aro'); 101 //Get and format args: first arg is the name of the script. 102 $serverArgs = $argv; 103 if(!empty($unset)) { 104 $serverArgs = array_values(array_diff($argv, $unset)); 105 } 106 107 $wasted = array_shift($serverArgs); 108 $command = array_shift($serverArgs); 109 $args = $serverArgs; 110 $aclCLI = new AclCLI ($command, $args); 111 /** 112 * @package cake 113 * @subpackage cake.cake.scritps 114 */ 115 class AclCLI { 116 /** 117 * Enter description here... 118 * 119 * @var unknown_type 120 */ 121 var $stdin; 122 /** 123 * Enter description here... 124 * 125 * @var unknown_type 126 */ 127 var $stdout; 128 /** 129 * Enter description here... 130 * 131 * @var unknown_type 132 */ 133 var $stderr; 134 /** 135 * Enter description here... 136 * 137 * @var unknown_type 138 */ 139 var $acl; 140 /** 141 * Enter description here... 142 * 143 * @var unknown_type 144 */ 145 var $args; 146 /** 147 * Enter description here... 148 * 149 * @var unknown_type 150 */ 151 var $dataSource = 'default'; 152 /** 153 * Enter description here... 154 * 155 * @param unknown_type $command 156 * @param unknown_type $args 157 * @return AclCLI 158 */ 159 function AclCLI($command, $args) { 160 $this->__construct($command, $args); 161 } 162 /** 163 * Enter description here... 164 * 165 * @param unknown_type $command 166 * @param unknown_type $args 167 */ 168 function __construct ($command, $args) { 169 $this->stdin = fopen('php://stdin', 'r'); 170 $this->stdout = fopen('php://stdout', 'w'); 171 $this->stderr = fopen('php://stderr', 'w'); 172 173 if (ACL_CLASSNAME != 'DB_ACL'){ 174 $out = "--------------------------------------------------\n"; 175 $out .= "Error: Your current Cake configuration is set to \n"; 176 $out .= "an ACL implementation other than DB. Please change \n"; 177 $out .= "your core config to reflect your decision to use \n"; 178 $out .= "DB_ACL before attempting to use this script.\n"; 179 $out .= "--------------------------------------------------\n"; 180 $out .= "Current ACL Classname: " . ACL_CLASSNAME . "\n"; 181 $out .= "--------------------------------------------------\n"; 182 fwrite($this->stderr, $out); 183 exit(); 184 } 185 186 if(!in_array($command, array('help'))) { 187 if(!file_exists(CONFIGS.'database.php')) { 188 $this->stdout(''); 189 $this->stdout('Your database configuration was not found.'); 190 $this->stdout('Take a moment to create one:'); 191 $this->doDbConfig(); 192 } 193 require_once (CONFIGS.'database.php'); 194 195 if(!in_array($command, array('initdb'))) { 196 $this->dataSource = DATASOURCE; 197 $this->Acl = new AclComponent(); 198 $this->args = $args; 199 $this->db =& ConnectionManager::getDataSource($this->dataSource); 200 } 201 } 202 203 switch ($command) { 204 case 'create': 205 $this->create(); 206 break; 207 case 'delete': 208 $this->delete(); 209 break; 210 case 'setParent': 211 $this->setParent(); 212 break; 213 case 'getPath': 214 $this->getPath(); 215 break; 216 case 'grant': 217 $this->grant(); 218 break; 219 case 'deny': 220 $this->deny(); 221 break; 222 case 'inherit': 223 $this->inherit(); 224 break; 225 case 'view': 226 $this->view(); 227 break; 228 case 'initdb': 229 $this->initdb(); 230 break; 231 case 'upgrade': 232 $this->upgradedb(); 233 break; 234 case 'help': 235 $this->help(); 236 break; 237 default: 238 fwrite($this->stderr, "Unknown ACL command '$command'.\nFor usage, try 'php acl.php help'.\n\n"); 239 break; 240 } 241 } 242 /** 243 * Enter description here... 244 * 245 */ 246 function create() { 247 $this->checkArgNumber(4, 'create'); 248 $this->checkNodeType(); 249 extract($this->__dataVars()); 250 251 $parent = (is_numeric($this->args[2])) ? intval($this->args[2]) : $this->args[2]; 252 if(!$this->Acl->{$class}->create(intval($this->args[1]), $parent, $this->args[3])){ 253 $this->displayError("Parent Node Not Found", "There was an error creating the ".$class.", probably couldn't find the parent node.\n If you wish to create a new root node, specify the <parent_id> as '0'."); 254 } 255 $this->stdout("New $class '".$this->args[3]."' created.\n\n"); 256 } 257 /** 258 * Enter description here... 259 * 260 */ 261 function delete() { 262 $this->checkArgNumber(2, 'delete'); 263 $this->checkNodeType(); 264 extract($this->__dataVars()); 265 if(!$this->Acl->{$class}->delete($this->args[1])) { 266 $this->displayError("Node Not Deleted", "There was an error deleting the ".$class.". Check that the node exists.\n"); 267 } 268 $this->stdout("{$class} deleted.\n\n"); 269 } 270 271 /** 272 * Enter description here... 273 * 274 */ 275 function setParent() { 276 $this->checkArgNumber(3, 'setParent'); 277 $this->checkNodeType(); 278 extract($this->__dataVars()); 279 if (!$this->Acl->{$class}->setParent($this->args[2], $this->args[1])){ 280 $this->stdout("Error in setting new parent. Please make sure the parent node exists, and is not a descendant of the node specified.\n"); 281 } else { 282 $this->stdout("Node parent set to ".$this->args[2]."\n\n"); 283 } 284 } 285 /** 286 * Enter description here... 287 * 288 */ 289 function getPath() { 290 $this->checkArgNumber(2, 'getPath'); 291 $this->checkNodeType(); 292 extract($this->__dataVars()); 293 $id = (is_numeric($this->args[2])) ? intval($this->args[1]) : $this->args[1]; 294 $nodes = $this->Acl->{$class}->getPath($id); 295 if (empty($nodes)) { 296 $this->displayError("Supplied Node '".$this->args[1]."' not found", "No tree returned."); 297 } 298 for ($i = 0; $i < count($nodes); $i++) { 299 $this->stdout(str_repeat(' ', $i) . "[" . $nodes[$i][$class]['id'] . "]" . $nodes[$i][$class]['alias'] . "\n"); 300 } 301 } 302 /** 303 * Enter description here... 304 * 305 */ 306 function grant() { 307 $this->checkArgNumber(3, 'grant'); 308 //add existence checks for nodes involved 309 $aro = (is_numeric($this->args[0])) ? intval($this->args[0]) : $this->args[0]; 310 $aco = (is_numeric($this->args[1])) ? intval($this->args[1]) : $this->args[1]; 311 $this->Acl->allow($aro, $aco, $this->args[2]); 312 $this->stdout("Permission granted.\n"); 313 } 314 /** 315 * Enter description here... 316 * 317 */ 318 function deny() { 319 $this->checkArgNumber(3, 'deny'); 320 //add existence checks for nodes involved 321 $aro = (is_numeric($this->args[0])) ? intval($this->args[0]) : $this->args[0]; 322 $aco = (is_numeric($this->args[1])) ? intval($this->args[1]) : $this->args[1]; 323 $this->Acl->deny($aro, $aco, $this->args[2]); 324 $this->stdout("Requested permission successfully denied.\n"); 325 } 326 /** 327 * Enter description here... 328 * 329 */ 330 function inherit() { 331 $this->checkArgNumber(3, 'inherit'); 332 $aro = (is_numeric($this->args[0])) ? intval($this->args[0]) : $this->args[0]; 333 $aco = (is_numeric($this->args[1])) ? intval($this->args[1]) : $this->args[1]; 334 $this->Acl->inherit($aro, $aco, $this->args[2]); 335 $this->stdout("Requested permission successfully inherited.\n"); 336 } 337 /** 338 * Enter description here... 339 * 340 */ 341 function view() { 342 $this->checkArgNumber(1, 'view'); 343 $this->checkNodeType(); 344 extract($this->__dataVars()); 345 if (!is_null($this->args[1])) { 346 $conditions = $this->Acl->{$class}->_resolveID($this->args[1]); 347 } else { 348 $conditions = null; 349 } 350 $nodes = $this->Acl->{$class}->findAll($conditions, null, 'lft ASC'); 351 if (empty($nodes)) { 352 $this->displayError($this->args[1]." not found", "No tree returned."); 353 } 354 $right = array(); 355 356 $this->stdout($class . " tree:\n"); 357 $this->stdout("------------------------------------------------\n"); 358 359 for($i = 0; $i < count($nodes); $i++){ 360 if (count($right) > 0){ 361 while ($right[count($right)-1] < $nodes[$i][$class]['rght']){ 362 if ($right[count($right)-1]){ 363 array_pop($right); 364 } else { 365 break; 366 } 367 } 368 } 369 $this->stdout(str_repeat(' ',count($right)) . "[" . $nodes[$i][$class]['id'] . "]" . $nodes[$i][$class]['alias']."\n"); 370 $right[] = $nodes[$i][$class]['rght']; 371 } 372 $this->stdout("------------------------------------------------\n"); 373 } 374 /** 375 * Enter description here... 376 * 377 */ 378 function initdb() { 379 $db =& ConnectionManager::getDataSource($this->dataSource); 380 $this->stdout("Initializing Database...\n"); 381 $this->stdout("Creating access control objects table (acos)...\n"); 382 $sql = " CREATE TABLE ".$db->fullTableName('acos')." ( 383 ".$db->name('id')." ".$db->column($db->columns['primary_key']).", 384 ".$db->name('object_id')." ".$db->column($db->columns['integer'])." default NULL, 385 ".$db->name('alias')." ".$db->column($db->columns['string'])." NOT NULL default '', 386 ".$db->name('lft')." ".$db->column($db->columns['integer'])." default NULL, 387 ".$db->name('rght')." ".$db->column($db->columns['integer'])." default NULL, 388 PRIMARY KEY (".$db->name('id').") 389 );"; 390 if ($db->query($sql) === false) { 391 die("Error: " . $db->lastError() . "\n\n"); 392 } 393 394 $this->stdout("Creating access request objects table (aros)...\n"); 395 $sql2 = "CREATE TABLE ".$db->fullTableName('aros')." ( 396 ".$db->name('id')." ".$db->column($db->columns['primary_key']).", 397 ".$db->name('foreign_key')." ".$db->column($db->columns['integer'])." default NULL, 398 ".$db->name('alias')." ".$db->column($db->columns['string'])." NOT NULL default '', 399 ".$db->name('lft')." ".$db->column($db->columns['integer'])." default NULL, 400 ".$db->name('rght')." ".$db->column($db->columns['integer'])." default NULL, 401 PRIMARY KEY (".$db->name('id').") 402 );"; 403 if ($db->query($sql2) === false) { 404 die("Error: " . $db->lastError() . "\n\n"); 405 } 406 407 $this->stdout("Creating relationships table (aros_acos)...\n"); 408 $sql3 = "CREATE TABLE ".$db->fullTableName('aros_acos')." ( 409 ".$db->name('id')." ".$db->column($db->columns['primary_key']).", 410 ".$db->name('aro_id')." ".$db->column($db->columns['integer'])." default NULL, 411 ".$db->name('aco_id')." ".$db->column($db->columns['integer'])." default NULL, 412 ".$db->name('_create')." ".$db->column($db->columns['integer'])." NOT NULL default '0', 413 ".$db->name('_read')." ".$db->column($db->columns['integer'])." NOT NULL default '0', 414 ".$db->name('_update')." ".$db->column($db->columns['integer'])." NOT NULL default '0', 415 ".$db->name('_delete')." ".$db->column($db->columns['integer'])." NOT NULL default '0', 416 PRIMARY KEY (".$db->name('id').") 417 );"; 418 if ($db->query($sql3) === false) { 419 die("Error: " . $db->lastError() . "\n\n"); 420 } 421 422 $this->stdout("\nDone.\n"); 423 } 424 425 /** 426 * Enter description here... 427 * 428 */ 429 function upgradedb() { 430 $db =& ConnectionManager::getDataSource($this->dataSource); 431 $this->stdout("Initializing Database...\n"); 432 $this->stdout("Upgrading table (aros)...\n"); 433 $sql = "ALTER TABLE ".$db->fullTableName('aros')." 434 CHANGE ".$db->name('user_id')." 435 ".$db->name('foreign_key')." 436 INT( 10 ) UNSIGNED NULL DEFAULT NULL;"; 437 $sql .= "ALTER TABLE " . $db->name('aros_acos') . " CHANGE " . $db->name('_create') 438 . " " . $db->name('_create') . " CHAR(2) NOT NULL DEFAULT '0';"; 439 $sql .= "ALTER TABLE " . $db->name('aros_acos') . " CHANGE " . $db->name('_update') 440 . " " . $db->name('_update') . " CHAR(2) NOT NULL DEFAULT '0';"; 441 $sql .= "ALTER TABLE " . $db->name('aros_acos') . " CHANGE " . $db->name('_read') 442 . " " . $db->name('_read') . " CHAR(2) NOT NULL DEFAULT '0';"; 443 $sql .= "ALTER TABLE " . $db->name('aros_acos') . " CHANGE " . $db->name('_delete') 444 . " " . $db->name('_delete') . " CHAR(2) NOT NULL DEFAULT '0';"; 445 if ($db->query($sql) === false) { 446 die("Error: " . $db->lastError() . "\n\n"); 447 } 448 $this->stdout("\nDatabase upgrade is complete.\n"); 449 } 450 451 /** 452 * Enter description here... 453 * 454 */ 455 function help() { 456 $out = "Usage: php acl.php <command> <arg1> <arg2>...\n"; 457 $out .= "-----------------------------------------------\n"; 458 $out .= "Commands:\n"; 459 $out .= "\n"; 460 $out .= "\tcreate aro|aco <link_id> <parent_id> <alias>\n"; 461 $out .= "\t\tCreates a new ACL object under the parent specified by <parent_id>, an id/alias (see\n"; 462 $out .= "\t\t'view'). The link_id allows you to link a user object to Cake's\n"; 463 $out .= "\t\tACL structures. The alias parameter allows you to address your object\n"; 464 $out .= "\t\tusing a non-integer ID. Example: \"\$php acl.php create aro 57 0 John\"\n"; 465 $out .= "\t\twould create a new ARO object at the root of the tree, linked to 57\n"; 466 $out .= "\t\tin your users table, with an internal alias 'John'."; 467 $out .= "\n"; 468 $out .= "\n"; 469 $out .= "\tdelete aro|aco <id>\n"; 470 $out .= "\t\tDeletes the ACL object with the specified ID (see 'view').\n"; 471 $out .= "\n"; 472 $out .= "\n"; 473 $out .= "\tsetParent aro|aco <id> <parent_id>\n"; 474 $out .= "\t\tUsed to set the parent of the ACL object specified by <id> to the ID\n"; 475 $out .= "\t\tspecified by <parent_id>.\n"; 476 $out .= "\n"; 477 $out .= "\n"; 478 $out .= "\tgetPath aro|aco <id>\n"; 479 $out .= "\t\tReturns the path to the ACL object specified by <id>. This command is\n"; 480 $out .= "\t\tis useful in determining the inhertiance of permissions for a certain\n"; 481 $out .= "\t\tobject in the tree.\n"; 482 $out .= "\n"; 483 $out .= "\n"; 484 $out .= "\tgrant <aro_id> <aco_id> <aco_action>\n"; 485 $out .= "\t\tUse this command to grant ACL permissions. Once executed, the ARO\n"; 486 $out .= "\t\tspecified (and its children, if any) will have ALLOW access to the\n"; 487 $out .= "\t\tspecified ACO action (and the ACO's children, if any).\n"; 488 $out .= "\n"; 489 $out .= "\n"; 490 $out .= "\tdeny <aro_id> <aco_id> <aco_action>\n"; 491 $out .= "\t\tUse this command to deny ACL permissions. Once executed, the ARO\n"; 492 $out .= "\t\tspecified (and its children, if any) will have DENY access to the\n"; 493 $out .= "\t\tspecified ACO action (and the ACO's children, if any).\n"; 494 $out .= "\n"; 495 $out .= "\n"; 496 $out .= "\tinherit <aro_id> <aco_id> <aco_action> \n"; 497 $out .= "\t\tUse this command to force a child ARO object to inherit its\n"; 498 $out .= "\t\tpermissions settings from its parent.\n"; 499 $out .= "\n"; 500 $out .= "\n"; 501 $out .= "\tview aro|aco [id]\n"; 502 $out .= "\t\tThe view command will return the ARO or ACO tree. The optional\n"; 503 $out .= "\t\tid/alias parameter allows you to return only a portion of the requested\n"; 504 $out .= "\t\ttree.\n"; 505 $out .= "\n"; 506 $out .= "\n"; 507 $out .= "\tinitdb\n"; 508 $out .= "\t\tUse this command to create the database tables needed to use DB ACL.\n"; 509 $out .= "\n"; 510 $out .= "\n"; 511 $out .= "\thelp\n"; 512 $out .= "\t\tDisplays this help message.\n"; 513 $out .= "\n"; 514 $out .= "\n"; 515 $this->stdout($out); 516 } 517 /** 518 * Enter description here... 519 * 520 * @param unknown_type $title 521 * @param unknown_type $msg 522 */ 523 function displayError($title, $msg) { 524 $out = "\n"; 525 $out .= "Error: $title\n"; 526 $out .= "$msg\n"; 527 $out .= "\n"; 528 $this->stdout($out); 529 exit(); 530 } 531 532 /** 533 * Enter description here... 534 * 535 * @param unknown_type $expectedNum 536 * @param unknown_type $command 537 */ 538 function checkArgNumber($expectedNum, $command) { 539 if (count($this->args) < $expectedNum) { 540 $this->displayError('Wrong number of parameters: '.count($this->args), 'Please type \'php acl.php help\' for help on usage of the '.$command.' command.'); 541 } 542 } 543 /** 544 * Enter description here... 545 * 546 */ 547 function checkNodeType() { 548 if ($this->args[0] != 'aco' && $this->args[0] != 'aro') { 549 $this->displayError("Missing/Unknown node type: '".$this->args[0]."'", 'Please specify which ACL object type you wish to create.'); 550 } 551 } 552 /** 553 * Enter description here... 554 * 555 * @param unknown_type $type 556 * @param unknown_type $id 557 * @return unknown 558 */ 559 function nodeExists($type, $id) { 560 //$this->stdout("Check to see if $type with ID = $id exists...\n"); 561 extract($this->__dataVars($type)); 562 $conditions = $this->Acl->{$class}->_resolveID($id); 563 $possibility = $this->Acl->{$class}->findAll($conditions); 564 return $possibility; 565 } 566 567 /** 568 * Enter description here... 569 * 570 * @param unknown_type $type 571 * @return unknown 572 */ 573 function __dataVars($type = null) { 574 if ($type == null) { 575 $type = $this->args[0]; 576 } 577 578 $vars = array(); 579 $class = ucwords($type); 580 $vars['secondary_id'] = ($class == 'aro' ? 'foreign_key' : 'object_id'); 581 $vars['data_name'] = $type; 582 $vars['table_name'] = $type . 's'; 583 $vars['class'] = $class; 584 return $vars; 585 } 586 /** 587 * Database configuration setup. 588 * 589 */ 590 function doDbConfig() { 591 $this->hr(); 592 $this->stdout('Database Configuration:'); 593 $this->hr(); 594 595 $driver = ''; 596 597 while ($driver == '') { 598 $driver = $this->getInput('What database driver would you like to use?', array('mysql','mysqli','mssql','sqlite','postgres', 'odbc'), 'mysql'); 599 if ($driver == '') { 600 $this->stdout('The database driver supplied was empty. Please supply a database driver.'); 601 } 602 } 603 604 switch($driver) { 605 case 'mysql': 606 $connect = 'mysql_connect'; 607 break; 608 case 'mysqli': 609 $connect = 'mysqli_connect'; 610 break; 611 case 'mssql': 612 $connect = 'mssql_connect'; 613 break; 614 case 'sqlite': 615 $connect = 'sqlite_open'; 616 break; 617 case 'postgres': 618 $connect = 'pg_connect'; 619 break; 620 case 'odbc': 621 $connect = 'odbc_connect'; 622 break; 623 default: 624 $this->stdout('The connection parameter could not be set.'); 625 break; 626 } 627 628 $host = ''; 629 630 while ($host == '') { 631 $host = $this->getInput('What is the hostname for the database server?', null, 'localhost'); 632 if ($host == '') { 633 $this->stdout('The host name you supplied was empty. Please supply a hostname.'); 634 } 635 } 636 $login = ''; 637 638 while ($login == '') { 639 $login = $this->getInput('What is the database username?', null, 'root'); 640 641 if ($login == '') { 642 $this->stdout('The database username you supplied was empty. Please try again.'); 643 } 644 } 645 $password = ''; 646 $blankPassword = false; 647 648 while ($password == '' && $blankPassword == false) { 649 $password = $this->getInput('What is the database password?'); 650 if ($password == '') { 651 $blank = $this->getInput('The password you supplied was empty. Use an empty password?', array('y', 'n'), 'n'); 652 if($blank == 'y') 653 { 654 $blankPassword = true; 655 } 656 } 657 } 658 $database = ''; 659 660 while ($database == '') { 661 $database = $this->getInput('What is the name of the database you will be using?', null, 'cake'); 662 663 if ($database == '') { 664 $this->stdout('The database name you supplied was empty. Please try again.'); 665 } 666 } 667 668 $prefix = ''; 669 670 while ($prefix == '') { 671 $prefix = $this->getInput('Enter a table prefix?', null, 'n'); 672 } 673 if(low($prefix) == 'n') { 674 $prefix = ''; 675 } 676 677 $this->stdout(''); 678 $this->hr(); 679 $this->stdout('The following database configuration will be created:'); 680 $this->hr(); 681 $this->stdout("Driver: $driver"); 682 $this->stdout("Connection: $connect"); 683 $this->stdout("Host: $host"); 684 $this->stdout("User: $login"); 685 $this->stdout("Pass: " . str_repeat('*', strlen($password))); 686 $this->stdout("Database: $database"); 687 $this->stdout("Table prefix: $prefix"); 688 $this->hr(); 689 $looksGood = $this->getInput('Look okay?', array('y', 'n'), 'y'); 690 691 if (low($looksGood) == 'y' || low($looksGood) == 'yes') { 692 $this->bakeDbConfig($driver, $connect, $host, $login, $password, $database, $prefix); 693 } else { 694 $this->stdout('Bake Aborted.'); 695 } 696 } 697 /** 698 * Creates a database configuration file for Bake. 699 * 700 * @param string $host 701 * @param string $login 702 * @param string $password 703 * @param string $database 704 */ 705 function bakeDbConfig( $driver, $connect, $host, $login, $password, $database, $prefix) { 706 $out = "<?php\n"; 707 $out .= "class DATABASE_CONFIG {\n\n"; 708 $out .= "\tvar \$default = array(\n"; 709 $out .= "\t\t'driver' => '{$driver}',\n"; 710 $out .= "\t\t'connect' => '{$connect}',\n"; 711 $out .= "\t\t'host' => '{$host}',\n"; 712 $out .= "\t\t'login' => '{$login}',\n"; 713 $out .= "\t\t'password' => '{$password}',\n"; 714 $out .= "\t\t'database' => '{$database}', \n"; 715 $out .= "\t\t'prefix' => '{$prefix}' \n"; 716 $out .= "\t);\n"; 717 $out .= "}\n"; 718 $out .= "?>"; 719 $filename = CONFIGS.'database.php'; 720 $this->__createFile($filename, $out); 721 } 722 /** 723 * Prompts the user for input, and returns it. 724 * 725 * @param string $prompt Prompt text. 726 * @param mixed $options Array or string of options. 727 * @param string $default Default input value. 728 * @return Either the default value, or the user-provided input. 729 */ 730 function getInput($prompt, $options = null, $default = null) { 731 if (!is_array($options)) { 732 $print_options = ''; 733 } else { 734 $print_options = '(' . implode('/', $options) . ')'; 735 } 736 737 if($default == null) { 738 $this->stdout(''); 739 $this->stdout($prompt . " $print_options \n" . '> ', false); 740 } else { 741 $this->stdout(''); 742 $this->stdout($prompt . " $print_options \n" . "[$default] > ", false); 743 } 744 $result = trim(fgets($this->stdin)); 745 746 if($default != null && empty($result)) { 747 return $default; 748 } else { 749 return $result; 750 } 751 } 752 /** 753 * Outputs to the stdout filehandle. 754 * 755 * @param string $string String to output. 756 * @param boolean $newline If true, the outputs gets an added newline. 757 */ 758 function stdout($string, $newline = true) { 759 if ($newline) { 760 fwrite($this->stdout, $string . "\n"); 761 } else { 762 fwrite($this->stdout, $string); 763 } 764 } 765 /** 766 * Outputs to the stderr filehandle. 767 * 768 * @param string $string Error text to output. 769 */ 770 function stderr($string) { 771 fwrite($this->stderr, $string); 772 } 773 /** 774 * Outputs a series of minus characters to the standard output, acts as a visual separator. 775 * 776 */ 777 function hr() { 778 $this->stdout('---------------------------------------------------------------'); 779 } 780 /** 781 * Creates a file at given path. 782 * 783 * @param string $path Where to put the file. 784 * @param string $contents Content to put in the file. 785 * @return Success 786 */ 787 function __createFile ($path, $contents) { 788 $path = str_replace('//', '/', $path); 789 echo "\nCreating file $path\n"; 790 if (is_file($path) && $this->interactive === true) { 791 fwrite($this->stdout, "File exists, overwrite?" . " {$path} (y/n/q):"); 792 $key = trim(fgets($this->stdin)); 793 794 if ($key=='q') { 795 fwrite($this->stdout, "Quitting.\n"); 796 exit; 797 } elseif ($key == 'a') { 798 $this->dont_ask = true; 799 } elseif ($key == 'y') { 800 } else { 801 fwrite($this->stdout, "Skip" . " {$path}\n"); 802 return false; 803 } 804 } 805 806 if ($f = fopen($path, 'w')) { 807 fwrite($f, $contents); 808 fclose($f); 809 fwrite($this->stdout, "Wrote" . "{$path}\n"); 810 return true; 811 } else { 812 fwrite($this->stderr, "Error! Could not write to" . " {$path}.\n"); 813 return false; 814 } 815 } 816 } 817 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sun Feb 25 19:27:47 2007 | par Balluche grâce à PHPXref 0.7 |