This commit is contained in:
Simon Vieille 2017-01-09 15:22:00 +01:00
parent e8973f8ebb
commit 5460b2e2fd
11 changed files with 526 additions and 576 deletions

View file

@ -1 +1,2 @@
/etc/wetddump/mysql.yml /etc/wetddump/mysql.yml
/etc/wetddump/mongodb.yml

View file

@ -1,8 +1,8 @@
Package: wetddump Package: wetddump
Version: 0.4 Version: 1.1
Section: base Section: base
Priority: optional Priority: optional
Architecture: all Architecture: all
Depends: php5 (>= 5.3.3-7+squeeze15), mysql-server (>= 5.1.66-0+squeeze1)|percona-xtradb-cluster-56, rsync Depends: php5 (>= 5.3.3-7+squeeze15), rsync
Maintainer: Simon Vieille <simon@webetdesign.com> Maintainer: Simon Vieille <contact@deblan.fr>
Description: Backup manager Description: Backup manager

13
etc/wetddump/mongodb.yml Normal file
View file

@ -0,0 +1,13 @@
settings:
dir: '/var/lib/mongodbdump/'
log: '/var/log/wetddump/mongodb.log'
mongodb: '/var/lib/mongodb/'
complete:
dir: 'complete/'
enabled: false
mongodump:
dir: 'dump/'
username:
password:
enabled: true
options: []

58
usr/bin/wetddump-mongodb Executable file
View file

@ -0,0 +1,58 @@
#!/usr/bin/php5
<?php
require_once '/usr/share/wetddump/functions.php';
mySfYaml::load('/etc/wetddump/mongodb.yml');
$log = mySfYaml::get('settings_log', '/var/log/wetddump/mongodb.log');
$dir = mySfYaml::get('settings_dir', '/var/lib/mongodbdump/');
if (!is_dir($dir)) {
$cmd = sprintf('mkdir -p %s', escapeshellarg($dir));
log_($cmd, $log);
exec_($cmd);
}
$cmd = sprintf('chdir %s', $dir);
log_($cmd, $log);
chdir($dir);
if (mySfYaml::get('settings_complete_enabled')) {
$cdir = mySfYaml::get('settings_complete_dir', 'complete/');
$cmd = sprintf('rm -rf %s', escapeshellarg($cdir));
log_($cmd, $log);
exec_($cmd);
$cmd = sprintf('mkdir -p %s', escapeshellarg($cdir));
log_($cmd, $log);
exec_($cmd);
$cmd = sprintf('rsync -avz --delete %s/* %s', mySfYaml::get('settings_mongodb'), $cdir);
log_($cmd, $log);
exec_($cmd);
}
if (mySfYaml::get('settings_mongodump_enabled')) {
$cdir = mySfYaml::get('settings_mongodump_dir', 'bson/');
$cmd = sprintf('rm -rf %s', escapeshellarg($cdir));
log_($cmd, $log);
exec_($cmd);
$cmd = sprintf('mkdir -p %s', escapeshellarg($cdir));
log_($cmd, $log);
exec_($cmd);
$options = mySfYaml::get('settings_mongodump_options', array());
$cmd = getMongodumpCmd(
mySfYaml::get('settings_mongodump_username', null),
mySfYaml::get('settings_mongodump_password', null),
implode(' ', $options),
$cdir
);
exec_($cmd);
}

View file

@ -60,3 +60,16 @@ function getMysqlPrivilegesDumpCmd($output)
return $cmd; return $cmd;
} }
function getMongodumpCmd($username, $password, $options, $output)
{
$cmd = sprintf(
'mongodump %s %s %s --out %s',
!empty($username) ? '-u '.escapeshellarg($username) : '',
!empty($password) ? '-p '.escapeshellarg($password) : null,
$options,
$output
);
return $cmd;
}

View file

@ -11,9 +11,8 @@
/** /**
* sfYaml offers convenience methods to load and dump YAML. * sfYaml offers convenience methods to load and dump YAML.
* *
* @package symfony
* @subpackage yaml
* @author Fabien Potencier <fabien.potencier@symfony-project.com> * @author Fabien Potencier <fabien.potencier@symfony-project.com>
*
* @version SVN: $Id: sfYaml.class.php 8988 2008-05-15 20:24:26Z fabien $ * @version SVN: $Id: sfYaml.class.php 8988 2008-05-15 20:24:26Z fabien $
*/ */
class sfYaml class sfYaml
@ -71,7 +70,7 @@ class sfYaml
$file = $input; $file = $input;
ob_start(); ob_start();
$retval = include($input); $retval = include $input;
$content = ob_get_clean(); $content = ob_get_clean();
// if an array is returned by the config file assume it's in plain php form else in YAML // if an array is returned by the config file assume it's in plain php form else in YAML
@ -101,7 +100,7 @@ class sfYaml
* to convert the array into friendly YAML. * to convert the array into friendly YAML.
* *
* @param array $array PHP array * @param array $array PHP array
* @param integer $inline The level where you switch to inline YAML * @param int $inline The level where you switch to inline YAML
* *
* @return string A YAML string representing the original PHP array * @return string A YAML string representing the original PHP array
*/ */

View file

@ -11,9 +11,8 @@
/** /**
* sfYamlDumper dumps PHP variables to YAML strings. * sfYamlDumper dumps PHP variables to YAML strings.
* *
* @package symfony
* @subpackage yaml
* @author Fabien Potencier <fabien.potencier@symfony-project.com> * @author Fabien Potencier <fabien.potencier@symfony-project.com>
*
* @version SVN: $Id: sfYamlDumper.class.php 10575 2008-08-01 13:08:42Z nicolas $ * @version SVN: $Id: sfYamlDumper.class.php 10575 2008-08-01 13:08:42Z nicolas $
*/ */
class sfYamlDumper class sfYamlDumper
@ -22,8 +21,8 @@ class sfYamlDumper
* Dumps a PHP value to YAML. * Dumps a PHP value to YAML.
* *
* @param mixed $input The PHP value * @param mixed $input The PHP value
* @param integer $inline The level where you switch to inline YAML * @param int $inline The level where you switch to inline YAML
* @param integer $indent The level o indentation indentation (used internally) * @param int $indent The level o indentation indentation (used internally)
* *
* @return string The YAML representation of the PHP value * @return string The YAML representation of the PHP value
*/ */

View file

@ -11,9 +11,8 @@
/** /**
* sfYamlInline implements a YAML parser/dumper for the YAML inline syntax. * sfYamlInline implements a YAML parser/dumper for the YAML inline syntax.
* *
* @package symfony
* @subpackage yaml
* @author Fabien Potencier <fabien.potencier@symfony-project.com> * @author Fabien Potencier <fabien.potencier@symfony-project.com>
*
* @version SVN: $Id: sfYamlInline.class.php 16177 2009-03-11 08:32:48Z fabien $ * @version SVN: $Id: sfYamlInline.class.php 16177 2009-03-11 08:32:48Z fabien $
*/ */
class sfYamlInline class sfYamlInline
@ -27,23 +26,20 @@ class sfYamlInline
* *
* @return array A PHP array representing the YAML string * @return array A PHP array representing the YAML string
*/ */
static public function load($value) public static function load($value)
{ {
$value = trim($value); $value = trim($value);
if (0 == strlen($value)) if (0 == strlen($value)) {
{
return ''; return '';
} }
if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
{
$mbEncoding = mb_internal_encoding(); $mbEncoding = mb_internal_encoding();
mb_internal_encoding('ASCII'); mb_internal_encoding('ASCII');
} }
switch ($value[0]) switch ($value[0]) {
{
case '[': case '[':
$result = self::parseSequence($value); $result = self::parseSequence($value);
break; break;
@ -54,8 +50,7 @@ class sfYamlInline
$result = self::parseScalar($value); $result = self::parseScalar($value);
} }
if (isset($mbEncoding)) if (isset($mbEncoding)) {
{
mb_internal_encoding($mbEncoding); mb_internal_encoding($mbEncoding);
} }
@ -69,21 +64,17 @@ class sfYamlInline
* *
* @return string The YAML string representing the PHP array * @return string The YAML string representing the PHP array
*/ */
static public function dump($value) public static function dump($value)
{
if ('1.1' === sfYaml::getSpecVersion())
{ {
if ('1.1' === sfYaml::getSpecVersion()) {
$trueValues = array('true', 'on', '+', 'yes', 'y'); $trueValues = array('true', 'on', '+', 'yes', 'y');
$falseValues = array('false', 'off', '-', 'no', 'n'); $falseValues = array('false', 'off', '-', 'no', 'n');
} } else {
else
{
$trueValues = array('true'); $trueValues = array('true');
$falseValues = array('false'); $falseValues = array('false');
} }
switch (true) switch (true) {
{
case is_resource($value): case is_resource($value):
throw new InvalidArgumentException('Unable to dump PHP resources in a YAML file.'); throw new InvalidArgumentException('Unable to dump PHP resources in a YAML file.');
case is_object($value): case is_object($value):
@ -126,18 +117,16 @@ class sfYamlInline
* *
* @return string The YAML string representing the PHP array * @return string The YAML string representing the PHP array
*/ */
static protected function dumpArray($value) protected static function dumpArray($value)
{ {
// array // array
$keys = array_keys($value); $keys = array_keys($value);
if ( if (
(1 == count($keys) && '0' == $keys[0]) (1 == count($keys) && '0' == $keys[0])
|| ||
(count($keys) > 1 && array_reduce($keys, create_function('$v,$w', 'return (integer) $v + $w;'), 0) == count($keys) * (count($keys) - 1) / 2)) (count($keys) > 1 && array_reduce($keys, create_function('$v,$w', 'return (integer) $v + $w;'), 0) == count($keys) * (count($keys) - 1) / 2)) {
{
$output = array(); $output = array();
foreach ($value as $val) foreach ($value as $val) {
{
$output[] = self::dump($val); $output[] = self::dump($val);
} }
@ -146,8 +135,7 @@ class sfYamlInline
// mapping // mapping
$output = array(); $output = array();
foreach ($value as $key => $val) foreach ($value as $key => $val) {
{
$output[] = sprintf('%s: %s', self::dump($key), self::dump($val)); $output[] = sprintf('%s: %s', self::dump($key), self::dump($val));
} }
@ -160,39 +148,30 @@ class sfYamlInline
* @param scalar $scalar * @param scalar $scalar
* @param string $delimiters * @param string $delimiters
* @param array $stringDelimiter * @param array $stringDelimiter
* @param integer $i * @param int $i
* @param boolean $evaluate * @param bool $evaluate
* *
* @return string A YAML string * @return string A YAML string
*/ */
static public function parseScalar($scalar, $delimiters = null, $stringDelimiters = array('"', "'"), &$i = 0, $evaluate = true) public static function parseScalar($scalar, $delimiters = null, $stringDelimiters = array('"', "'"), &$i = 0, $evaluate = true)
{
if (in_array($scalar[$i], $stringDelimiters))
{ {
if (in_array($scalar[$i], $stringDelimiters)) {
// quoted scalar // quoted scalar
$output = self::parseQuotedScalar($scalar, $i); $output = self::parseQuotedScalar($scalar, $i);
} } else {
else
{
// "normal" string // "normal" string
if (!$delimiters) if (!$delimiters) {
{
$output = substr($scalar, $i); $output = substr($scalar, $i);
$i += strlen($output); $i += strlen($output);
// remove comments // remove comments
if (false !== $strpos = strpos($output, ' #')) if (false !== $strpos = strpos($output, ' #')) {
{
$output = rtrim(substr($output, 0, $strpos)); $output = rtrim(substr($output, 0, $strpos));
} }
} } elseif (preg_match('/^(.+?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) {
else if (preg_match('/^(.+?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match))
{
$output = $match[1]; $output = $match[1];
$i += strlen($output); $i += strlen($output);
} } else {
else
{
throw new InvalidArgumentException(sprintf('Malformed inline YAML string (%s).', $scalar)); throw new InvalidArgumentException(sprintf('Malformed inline YAML string (%s).', $scalar));
} }
@ -206,26 +185,22 @@ class sfYamlInline
* Parses a quoted scalar to YAML. * Parses a quoted scalar to YAML.
* *
* @param string $scalar * @param string $scalar
* @param integer $i * @param int $i
* *
* @return string A YAML string * @return string A YAML string
*/ */
static protected function parseQuotedScalar($scalar, &$i) protected static function parseQuotedScalar($scalar, &$i)
{
if (!preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match))
{ {
if (!preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) {
throw new InvalidArgumentException(sprintf('Malformed inline YAML string (%s).', substr($scalar, $i))); throw new InvalidArgumentException(sprintf('Malformed inline YAML string (%s).', substr($scalar, $i)));
} }
$output = substr($match[0], 1, strlen($match[0]) - 2); $output = substr($match[0], 1, strlen($match[0]) - 2);
if ('"' == $scalar[$i]) if ('"' == $scalar[$i]) {
{
// evaluate the string // evaluate the string
$output = str_replace(array('\\"', '\\n', '\\r'), array('"', "\n", "\r"), $output); $output = str_replace(array('\\"', '\\n', '\\r'), array('"', "\n", "\r"), $output);
} } else {
else
{
// unescape ' // unescape '
$output = str_replace('\'\'', '\'', $output); $output = str_replace('\'\'', '\'', $output);
} }
@ -239,21 +214,19 @@ class sfYamlInline
* Parses a sequence to a YAML string. * Parses a sequence to a YAML string.
* *
* @param string $sequence * @param string $sequence
* @param integer $i * @param int $i
* *
* @return string A YAML string * @return string A YAML string
*/ */
static protected function parseSequence($sequence, &$i = 0) protected static function parseSequence($sequence, &$i = 0)
{ {
$output = array(); $output = array();
$len = strlen($sequence); $len = strlen($sequence);
$i += 1; $i += 1;
// [foo, bar, ...] // [foo, bar, ...]
while ($i < $len) while ($i < $len) {
{ switch ($sequence[$i]) {
switch ($sequence[$i])
{
case '[': case '[':
// nested sequence // nested sequence
$output[] = self::parseSequence($sequence, $i); $output[] = self::parseSequence($sequence, $i);
@ -271,15 +244,11 @@ class sfYamlInline
$isQuoted = in_array($sequence[$i], array('"', "'")); $isQuoted = in_array($sequence[$i], array('"', "'"));
$value = self::parseScalar($sequence, array(',', ']'), array('"', "'"), $i); $value = self::parseScalar($sequence, array(',', ']'), array('"', "'"), $i);
if (!$isQuoted && false !== strpos($value, ': ')) if (!$isQuoted && false !== strpos($value, ': ')) {
{
// embedded mapping? // embedded mapping?
try try {
{
$value = self::parseMapping('{'.$value.'}'); $value = self::parseMapping('{'.$value.'}');
} } catch (InvalidArgumentException $e) {
catch (InvalidArgumentException $e)
{
// no, it's not // no, it's not
} }
} }
@ -299,21 +268,19 @@ class sfYamlInline
* Parses a mapping to a YAML string. * Parses a mapping to a YAML string.
* *
* @param string $mapping * @param string $mapping
* @param integer $i * @param int $i
* *
* @return string A YAML string * @return string A YAML string
*/ */
static protected function parseMapping($mapping, &$i = 0) protected static function parseMapping($mapping, &$i = 0)
{ {
$output = array(); $output = array();
$len = strlen($mapping); $len = strlen($mapping);
$i += 1; $i += 1;
// {foo: bar, bar:foo, ...} // {foo: bar, bar:foo, ...}
while ($i < $len) while ($i < $len) {
{ switch ($mapping[$i]) {
switch ($mapping[$i])
{
case ' ': case ' ':
case ',': case ',':
++$i; ++$i;
@ -327,10 +294,8 @@ class sfYamlInline
// value // value
$done = false; $done = false;
while ($i < $len) while ($i < $len) {
{ switch ($mapping[$i]) {
switch ($mapping[$i])
{
case '[': case '[':
// nested sequence // nested sequence
$output[$key] = self::parseSequence($mapping, $i); $output[$key] = self::parseSequence($mapping, $i);
@ -352,8 +317,7 @@ class sfYamlInline
++$i; ++$i;
if ($done) if ($done) {
{
continue 2; continue 2;
} }
} }
@ -369,23 +333,19 @@ class sfYamlInline
* *
* @return string A YAML string * @return string A YAML string
*/ */
static protected function evaluateScalar($scalar) protected static function evaluateScalar($scalar)
{ {
$scalar = trim($scalar); $scalar = trim($scalar);
if ('1.1' === sfYaml::getSpecVersion()) if ('1.1' === sfYaml::getSpecVersion()) {
{
$trueValues = array('true', 'on', '+', 'yes', 'y'); $trueValues = array('true', 'on', '+', 'yes', 'y');
$falseValues = array('false', 'off', '-', 'no', 'n'); $falseValues = array('false', 'off', '-', 'no', 'n');
} } else {
else
{
$trueValues = array('true'); $trueValues = array('true');
$falseValues = array('false'); $falseValues = array('false');
} }
switch (true) switch (true) {
{
case 'null' == strtolower($scalar): case 'null' == strtolower($scalar):
case '' == $scalar: case '' == $scalar:
case '~' == $scalar: case '~' == $scalar:
@ -399,6 +359,7 @@ class sfYamlInline
case ctype_digit($scalar): case ctype_digit($scalar):
$raw = $scalar; $raw = $scalar;
$cast = intval($scalar); $cast = intval($scalar);
return '0' == $scalar[0] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw); return '0' == $scalar[0] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw);
case in_array(strtolower($scalar), $trueValues): case in_array(strtolower($scalar), $trueValues):
return true; return true;
@ -420,7 +381,7 @@ class sfYamlInline
} }
} }
static protected function getTimestampRegex() protected static function getTimestampRegex()
{ {
return <<<EOF return <<<EOF
~^ ~^

View file

@ -8,32 +8,29 @@
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
if (!defined('PREG_BAD_UTF8_OFFSET_ERROR')) if (!defined('PREG_BAD_UTF8_OFFSET_ERROR')) {
{
define('PREG_BAD_UTF8_OFFSET_ERROR', 5); define('PREG_BAD_UTF8_OFFSET_ERROR', 5);
} }
/** /**
* sfYamlParser parses YAML strings to convert them to PHP arrays. * sfYamlParser parses YAML strings to convert them to PHP arrays.
* *
* @package symfony
* @subpackage yaml
* @author Fabien Potencier <fabien.potencier@symfony-project.com> * @author Fabien Potencier <fabien.potencier@symfony-project.com>
*
* @version SVN: $Id: sfYamlParser.class.php 10832 2008-08-13 07:46:08Z fabien $ * @version SVN: $Id: sfYamlParser.class.php 10832 2008-08-13 07:46:08Z fabien $
*/ */
class sfYamlParser class sfYamlParser
{ {
protected protected $offset = 0,
$offset = 0,
$lines = array(), $lines = array(),
$currentLineNb = -1, $currentLineNb = -1,
$currentLine = '', $currentLine = '',
$refs = array(); $refs = array();
/** /**
* Constructor * Constructor.
* *
* @param integer $offset The offset of YAML document (used for line numbers in error messages) * @param int $offset The offset of YAML document (used for line numbers in error messages)
*/ */
public function __construct($offset = 0) public function __construct($offset = 0)
{ {
@ -55,192 +52,142 @@ class sfYamlParser
$this->currentLine = ''; $this->currentLine = '';
$this->lines = explode("\n", $this->cleanup($value)); $this->lines = explode("\n", $this->cleanup($value));
if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
{
$mbEncoding = mb_internal_encoding(); $mbEncoding = mb_internal_encoding();
mb_internal_encoding('UTF-8'); mb_internal_encoding('UTF-8');
} }
$data = array(); $data = array();
while ($this->moveToNextLine()) while ($this->moveToNextLine()) {
{ if ($this->isCurrentLineEmpty()) {
if ($this->isCurrentLineEmpty())
{
continue; continue;
} }
// tab? // tab?
if (preg_match('#^\t+#', $this->currentLine)) if (preg_match('#^\t+#', $this->currentLine)) {
{
throw new InvalidArgumentException(sprintf('A YAML file cannot contain tabs as indentation at line %d (%s).', $this->getRealCurrentLineNb() + 1, $this->currentLine)); throw new InvalidArgumentException(sprintf('A YAML file cannot contain tabs as indentation at line %d (%s).', $this->getRealCurrentLineNb() + 1, $this->currentLine));
} }
$isRef = $isInPlace = $isProcessed = false; $isRef = $isInPlace = $isProcessed = false;
if (preg_match('#^\-((?P<leadspaces>\s+)(?P<value>.+?))?\s*$#u', $this->currentLine, $values)) if (preg_match('#^\-((?P<leadspaces>\s+)(?P<value>.+?))?\s*$#u', $this->currentLine, $values)) {
{ if (isset($values['value']) && preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#u', $values['value'], $matches)) {
if (isset($values['value']) && preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#u', $values['value'], $matches))
{
$isRef = $matches['ref']; $isRef = $matches['ref'];
$values['value'] = $matches['value']; $values['value'] = $matches['value'];
} }
// array // array
if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) {
{
$c = $this->getRealCurrentLineNb() + 1; $c = $this->getRealCurrentLineNb() + 1;
$parser = new sfYamlParser($c); $parser = new self($c);
$parser->refs =& $this->refs; $parser->refs = &$this->refs;
$data[] = $parser->parse($this->getNextEmbedBlock()); $data[] = $parser->parse($this->getNextEmbedBlock());
} } else {
else
{
if (isset($values['leadspaces']) if (isset($values['leadspaces'])
&& ' ' == $values['leadspaces'] && ' ' == $values['leadspaces']
&& preg_match('#^(?P<key>'.sfYamlInline::REGEX_QUOTED_STRING.'|[^ \'"\{].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $values['value'], $matches)) && preg_match('#^(?P<key>'.sfYamlInline::REGEX_QUOTED_STRING.'|[^ \'"\{].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $values['value'], $matches)) {
{
// this is a compact notation element, add to next block and parse // this is a compact notation element, add to next block and parse
$c = $this->getRealCurrentLineNb(); $c = $this->getRealCurrentLineNb();
$parser = new sfYamlParser($c); $parser = new self($c);
$parser->refs =& $this->refs; $parser->refs = &$this->refs;
$block = $values['value']; $block = $values['value'];
if (!$this->isNextLineIndented()) if (!$this->isNextLineIndented()) {
{
$block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + 2); $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + 2);
} }
$data[] = $parser->parse($block); $data[] = $parser->parse($block);
} } else {
else
{
$data[] = $this->parseValue($values['value']); $data[] = $this->parseValue($values['value']);
} }
} }
} } elseif (preg_match('#^(?P<key>'.sfYamlInline::REGEX_QUOTED_STRING.'|[^ \'"].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $this->currentLine, $values)) {
else if (preg_match('#^(?P<key>'.sfYamlInline::REGEX_QUOTED_STRING.'|[^ \'"].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $this->currentLine, $values))
{
$key = sfYamlInline::parseScalar($values['key']); $key = sfYamlInline::parseScalar($values['key']);
if ('<<' === $key) if ('<<' === $key) {
{ if (isset($values['value']) && '*' === substr($values['value'], 0, 1)) {
if (isset($values['value']) && '*' === substr($values['value'], 0, 1))
{
$isInPlace = substr($values['value'], 1); $isInPlace = substr($values['value'], 1);
if (!array_key_exists($isInPlace, $this->refs)) if (!array_key_exists($isInPlace, $this->refs)) {
{
throw new InvalidArgumentException(sprintf('Reference "%s" does not exist at line %s (%s).', $isInPlace, $this->getRealCurrentLineNb() + 1, $this->currentLine)); throw new InvalidArgumentException(sprintf('Reference "%s" does not exist at line %s (%s).', $isInPlace, $this->getRealCurrentLineNb() + 1, $this->currentLine));
} }
} } else {
else if (isset($values['value']) && $values['value'] !== '') {
{
if (isset($values['value']) && $values['value'] !== '')
{
$value = $values['value']; $value = $values['value'];
} } else {
else
{
$value = $this->getNextEmbedBlock(); $value = $this->getNextEmbedBlock();
} }
$c = $this->getRealCurrentLineNb() + 1; $c = $this->getRealCurrentLineNb() + 1;
$parser = new sfYamlParser($c); $parser = new self($c);
$parser->refs =& $this->refs; $parser->refs = &$this->refs;
$parsed = $parser->parse($value); $parsed = $parser->parse($value);
$merged = array(); $merged = array();
if (!is_array($parsed)) if (!is_array($parsed)) {
{ throw new InvalidArgumentException(sprintf('YAML merge keys used with a scalar value instead of an array at line %s (%s)', $this->getRealCurrentLineNb() + 1, $this->currentLine));
throw new InvalidArgumentException(sprintf("YAML merge keys used with a scalar value instead of an array at line %s (%s)", $this->getRealCurrentLineNb() + 1, $this->currentLine)); } elseif (isset($parsed[0])) {
}
else if (isset($parsed[0]))
{
// Numeric array, merge individual elements // Numeric array, merge individual elements
foreach (array_reverse($parsed) as $parsedItem) foreach (array_reverse($parsed) as $parsedItem) {
{ if (!is_array($parsedItem)) {
if (!is_array($parsedItem)) throw new InvalidArgumentException(sprintf('Merge items must be arrays at line %s (%s).', $this->getRealCurrentLineNb() + 1, $parsedItem));
{
throw new InvalidArgumentException(sprintf("Merge items must be arrays at line %s (%s).", $this->getRealCurrentLineNb() + 1, $parsedItem));
} }
$merged = array_merge($parsedItem, $merged); $merged = array_merge($parsedItem, $merged);
} }
} } else {
else
{
// Associative array, merge // Associative array, merge
$merged = array_merge($merged, $parsed); $merged = array_merge($merged, $parsed);
} }
$isProcessed = $merged; $isProcessed = $merged;
} }
} } elseif (isset($values['value']) && preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#u', $values['value'], $matches)) {
else if (isset($values['value']) && preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#u', $values['value'], $matches))
{
$isRef = $matches['ref']; $isRef = $matches['ref'];
$values['value'] = $matches['value']; $values['value'] = $matches['value'];
} }
if ($isProcessed) if ($isProcessed) {
{
// Merge keys // Merge keys
$data = $isProcessed; $data = $isProcessed;
} }
// hash // hash
else if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) elseif (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) {
{
// if next line is less indented or equal, then it means that the current value is null // if next line is less indented or equal, then it means that the current value is null
if ($this->isNextLineIndented()) if ($this->isNextLineIndented()) {
{
$data[$key] = null; $data[$key] = null;
} } else {
else
{
$c = $this->getRealCurrentLineNb() + 1; $c = $this->getRealCurrentLineNb() + 1;
$parser = new sfYamlParser($c); $parser = new self($c);
$parser->refs =& $this->refs; $parser->refs = &$this->refs;
$data[$key] = $parser->parse($this->getNextEmbedBlock()); $data[$key] = $parser->parse($this->getNextEmbedBlock());
} }
} } else {
else if ($isInPlace) {
{
if ($isInPlace)
{
$data = $this->refs[$isInPlace]; $data = $this->refs[$isInPlace];
} } else {
else
{
$data[$key] = $this->parseValue($values['value']); $data[$key] = $this->parseValue($values['value']);
} }
} }
} } else {
else
{
// 1-liner followed by newline // 1-liner followed by newline
if (2 == count($this->lines) && empty($this->lines[1])) if (2 == count($this->lines) && empty($this->lines[1])) {
{
$value = sfYamlInline::load($this->lines[0]); $value = sfYamlInline::load($this->lines[0]);
if (is_array($value)) if (is_array($value)) {
{
$first = reset($value); $first = reset($value);
if ('*' === substr($first, 0, 1)) if ('*' === substr($first, 0, 1)) {
{
$data = array(); $data = array();
foreach ($value as $alias) foreach ($value as $alias) {
{
$data[] = $this->refs[substr($alias, 1)]; $data[] = $this->refs[substr($alias, 1)];
} }
$value = $data; $value = $data;
} }
} }
if (isset($mbEncoding)) if (isset($mbEncoding)) {
{
mb_internal_encoding($mbEncoding); mb_internal_encoding($mbEncoding);
} }
return $value; return $value;
} }
switch (preg_last_error()) switch (preg_last_error()) {
{
case PREG_INTERNAL_ERROR: case PREG_INTERNAL_ERROR:
$error = 'Internal PCRE error on line'; $error = 'Internal PCRE error on line';
break; break;
@ -263,14 +210,12 @@ class sfYamlParser
throw new InvalidArgumentException(sprintf('%s %d (%s).', $error, $this->getRealCurrentLineNb() + 1, $this->currentLine)); throw new InvalidArgumentException(sprintf('%s %d (%s).', $error, $this->getRealCurrentLineNb() + 1, $this->currentLine));
} }
if ($isRef) if ($isRef) {
{
$this->refs[$isRef] = end($data); $this->refs[$isRef] = end($data);
} }
} }
if (isset($mbEncoding)) if (isset($mbEncoding)) {
{
mb_internal_encoding($mbEncoding); mb_internal_encoding($mbEncoding);
} }
@ -280,7 +225,7 @@ class sfYamlParser
/** /**
* Returns the current line number (takes the offset into account). * Returns the current line number (takes the offset into account).
* *
* @return integer The current line number * @return int The current line number
*/ */
protected function getRealCurrentLineNb() protected function getRealCurrentLineNb()
{ {
@ -290,7 +235,7 @@ class sfYamlParser
/** /**
* Returns the current line indentation. * Returns the current line indentation.
* *
* @return integer The current line indentation * @return int The current line indentation
*/ */
protected function getCurrentLineIndentation() protected function getCurrentLineIndentation()
{ {
@ -300,7 +245,7 @@ class sfYamlParser
/** /**
* Returns the next embed block of YAML. * Returns the next embed block of YAML.
* *
* @param integer $indentation The indent level at which the block is to be read, or null for default * @param int $indentation The indent level at which the block is to be read, or null for default
* *
* @return string A YAML string * @return string A YAML string
*/ */
@ -308,28 +253,21 @@ class sfYamlParser
{ {
$this->moveToNextLine(); $this->moveToNextLine();
if (null === $indentation) if (null === $indentation) {
{
$newIndent = $this->getCurrentLineIndentation(); $newIndent = $this->getCurrentLineIndentation();
if (!$this->isCurrentLineEmpty() && 0 == $newIndent) if (!$this->isCurrentLineEmpty() && 0 == $newIndent) {
{
throw new InvalidArgumentException(sprintf('Indentation problem at line %d (%s)', $this->getRealCurrentLineNb() + 1, $this->currentLine)); throw new InvalidArgumentException(sprintf('Indentation problem at line %d (%s)', $this->getRealCurrentLineNb() + 1, $this->currentLine));
} }
} } else {
else
{
$newIndent = $indentation; $newIndent = $indentation;
} }
$data = array(substr($this->currentLine, $newIndent)); $data = array(substr($this->currentLine, $newIndent));
while ($this->moveToNextLine()) while ($this->moveToNextLine()) {
{ if ($this->isCurrentLineEmpty()) {
if ($this->isCurrentLineEmpty()) if ($this->isCurrentLineBlank()) {
{
if ($this->isCurrentLineBlank())
{
$data[] = substr($this->currentLine, $newIndent); $data[] = substr($this->currentLine, $newIndent);
} }
@ -338,23 +276,16 @@ class sfYamlParser
$indent = $this->getCurrentLineIndentation(); $indent = $this->getCurrentLineIndentation();
if (preg_match('#^(?P<text> *)$#', $this->currentLine, $match)) if (preg_match('#^(?P<text> *)$#', $this->currentLine, $match)) {
{
// empty line // empty line
$data[] = $match['text']; $data[] = $match['text'];
} } elseif ($indent >= $newIndent) {
else if ($indent >= $newIndent)
{
$data[] = substr($this->currentLine, $newIndent); $data[] = substr($this->currentLine, $newIndent);
} } elseif (0 == $indent) {
else if (0 == $indent)
{
$this->moveToPreviousLine(); $this->moveToPreviousLine();
break; break;
} } else {
else
{
throw new InvalidArgumentException(sprintf('Indentation problem at line %d (%s)', $this->getRealCurrentLineNb() + 1, $this->currentLine)); throw new InvalidArgumentException(sprintf('Indentation problem at line %d (%s)', $this->getRealCurrentLineNb() + 1, $this->currentLine));
} }
} }
@ -367,8 +298,7 @@ class sfYamlParser
*/ */
protected function moveToNextLine() protected function moveToNextLine()
{ {
if ($this->currentLineNb >= count($this->lines) - 1) if ($this->currentLineNb >= count($this->lines) - 1) {
{
return false; return false;
} }
@ -394,32 +324,25 @@ class sfYamlParser
*/ */
protected function parseValue($value) protected function parseValue($value)
{ {
if ('*' === substr($value, 0, 1)) if ('*' === substr($value, 0, 1)) {
{ if (false !== $pos = strpos($value, '#')) {
if (false !== $pos = strpos($value, '#'))
{
$value = substr($value, 1, $pos - 2); $value = substr($value, 1, $pos - 2);
} } else {
else
{
$value = substr($value, 1); $value = substr($value, 1);
} }
if (!array_key_exists($value, $this->refs)) if (!array_key_exists($value, $this->refs)) {
{
throw new InvalidArgumentException(sprintf('Reference "%s" does not exist (%s).', $value, $this->currentLine)); throw new InvalidArgumentException(sprintf('Reference "%s" does not exist (%s).', $value, $this->currentLine));
} }
return $this->refs[$value]; return $this->refs[$value];
} }
if (preg_match('/^(?P<separator>\||>)(?P<modifiers>\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P<comments> +#.*)?$/', $value, $matches)) if (preg_match('/^(?P<separator>\||>)(?P<modifiers>\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P<comments> +#.*)?$/', $value, $matches)) {
{
$modifiers = isset($matches['modifiers']) ? $matches['modifiers'] : ''; $modifiers = isset($matches['modifiers']) ? $matches['modifiers'] : '';
return $this->parseFoldedScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), intval(abs($modifiers))); return $this->parseFoldedScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), intval(abs($modifiers)));
} } else {
else
{
return sfYamlInline::load($value); return sfYamlInline::load($value);
} }
} }
@ -429,7 +352,7 @@ class sfYamlParser
* *
* @param string $separator The separator that was used to begin this folded scalar (| or >) * @param string $separator The separator that was used to begin this folded scalar (| or >)
* @param string $indicator The indicator that was used to begin this folded scalar (+ or -) * @param string $indicator The indicator that was used to begin this folded scalar (+ or -)
* @param integer $indentation The indentation that was used to begin this folded scalar * @param int $indentation The indentation that was used to begin this folded scalar
* *
* @return string The text value * @return string The text value
*/ */
@ -440,20 +363,17 @@ class sfYamlParser
$notEOF = $this->moveToNextLine(); $notEOF = $this->moveToNextLine();
while ($notEOF && $this->isCurrentLineBlank()) while ($notEOF && $this->isCurrentLineBlank()) {
{
$text .= "\n"; $text .= "\n";
$notEOF = $this->moveToNextLine(); $notEOF = $this->moveToNextLine();
} }
if (!$notEOF) if (!$notEOF) {
{
return ''; return '';
} }
if (!preg_match('#^(?P<indent>'.($indentation ? str_repeat(' ', $indentation) : ' +').')(?P<text>.*)$#u', $this->currentLine, $matches)) if (!preg_match('#^(?P<indent>'.($indentation ? str_repeat(' ', $indentation) : ' +').')(?P<text>.*)$#u', $this->currentLine, $matches)) {
{
$this->moveToPreviousLine(); $this->moveToPreviousLine();
return ''; return '';
@ -463,40 +383,31 @@ class sfYamlParser
$previousIndent = 0; $previousIndent = 0;
$text .= $matches['text'].$separator; $text .= $matches['text'].$separator;
while ($this->currentLineNb + 1 < count($this->lines)) while ($this->currentLineNb + 1 < count($this->lines)) {
{
$this->moveToNextLine(); $this->moveToNextLine();
if (preg_match('#^(?P<indent> {'.strlen($textIndent).',})(?P<text>.+)$#u', $this->currentLine, $matches)) if (preg_match('#^(?P<indent> {'.strlen($textIndent).',})(?P<text>.+)$#u', $this->currentLine, $matches)) {
{ if (' ' == $separator && $previousIndent != $matches['indent']) {
if (' ' == $separator && $previousIndent != $matches['indent'])
{
$text = substr($text, 0, -1)."\n"; $text = substr($text, 0, -1)."\n";
} }
$previousIndent = $matches['indent']; $previousIndent = $matches['indent'];
$text .= str_repeat(' ', $diff = strlen($matches['indent']) - strlen($textIndent)).$matches['text'].($diff ? "\n" : $separator); $text .= str_repeat(' ', $diff = strlen($matches['indent']) - strlen($textIndent)).$matches['text'].($diff ? "\n" : $separator);
} } elseif (preg_match('#^(?P<text> *)$#', $this->currentLine, $matches)) {
else if (preg_match('#^(?P<text> *)$#', $this->currentLine, $matches))
{
$text .= preg_replace('#^ {1,'.strlen($textIndent).'}#', '', $matches['text'])."\n"; $text .= preg_replace('#^ {1,'.strlen($textIndent).'}#', '', $matches['text'])."\n";
} } else {
else
{
$this->moveToPreviousLine(); $this->moveToPreviousLine();
break; break;
} }
} }
if (' ' == $separator) if (' ' == $separator) {
{
// replace last separator by a newline // replace last separator by a newline
$text = preg_replace('/ (\n*)$/', "\n$1", $text); $text = preg_replace('/ (\n*)$/', "\n$1", $text);
} }
switch ($indicator) switch ($indicator) {
{
case '': case '':
$text = preg_replace('#\n+$#s', "\n", $text); $text = preg_replace('#\n+$#s', "\n", $text);
break; break;
@ -513,26 +424,23 @@ class sfYamlParser
/** /**
* Returns true if the next line is indented. * Returns true if the next line is indented.
* *
* @return Boolean Returns true if the next line is indented, false otherwise * @return bool Returns true if the next line is indented, false otherwise
*/ */
protected function isNextLineIndented() protected function isNextLineIndented()
{ {
$currentIndentation = $this->getCurrentLineIndentation(); $currentIndentation = $this->getCurrentLineIndentation();
$notEOF = $this->moveToNextLine(); $notEOF = $this->moveToNextLine();
while ($notEOF && $this->isCurrentLineEmpty()) while ($notEOF && $this->isCurrentLineEmpty()) {
{
$notEOF = $this->moveToNextLine(); $notEOF = $this->moveToNextLine();
} }
if (false === $notEOF) if (false === $notEOF) {
{
return false; return false;
} }
$ret = false; $ret = false;
if ($this->getCurrentLineIndentation() <= $currentIndentation) if ($this->getCurrentLineIndentation() <= $currentIndentation) {
{
$ret = true; $ret = true;
} }
@ -544,7 +452,7 @@ class sfYamlParser
/** /**
* Returns true if the current line is blank or if it is a comment line. * Returns true if the current line is blank or if it is a comment line.
* *
* @return Boolean Returns true if the current line is empty or if it is a comment line, false otherwise * @return bool Returns true if the current line is empty or if it is a comment line, false otherwise
*/ */
protected function isCurrentLineEmpty() protected function isCurrentLineEmpty()
{ {
@ -554,7 +462,7 @@ class sfYamlParser
/** /**
* Returns true if the current line is blank. * Returns true if the current line is blank.
* *
* @return Boolean Returns true if the current line is blank, false otherwise * @return bool Returns true if the current line is blank, false otherwise
*/ */
protected function isCurrentLineBlank() protected function isCurrentLineBlank()
{ {
@ -564,12 +472,13 @@ class sfYamlParser
/** /**
* Returns true if the current line is a comment line. * Returns true if the current line is a comment line.
* *
* @return Boolean Returns true if the current line is a comment line, false otherwise * @return bool Returns true if the current line is a comment line, false otherwise
*/ */
protected function isCurrentLineComment() protected function isCurrentLineComment()
{ {
//checking explicitly the first char of the trim is faster than loops or strpos //checking explicitly the first char of the trim is faster than loops or strpos
$ltrimmedLine = ltrim($this->currentLine, ' '); $ltrimmedLine = ltrim($this->currentLine, ' ');
return $ltrimmedLine[0] === '#'; return $ltrimmedLine[0] === '#';
} }
@ -584,8 +493,7 @@ class sfYamlParser
{ {
$value = str_replace(array("\r\n", "\r"), "\n", $value); $value = str_replace(array("\r\n", "\r"), "\n", $value);
if (!preg_match("#\n$#", $value)) if (!preg_match("#\n$#", $value)) {
{
$value .= "\n"; $value .= "\n";
} }
@ -596,8 +504,7 @@ class sfYamlParser
// remove leading comments // remove leading comments
$trimmedValue = preg_replace('#^(\#.*?\n)+#s', '', $value, -1, $count); $trimmedValue = preg_replace('#^(\#.*?\n)+#s', '', $value, -1, $count);
if ($count == 1) if ($count == 1) {
{
// items have been removed, update the offset // items have been removed, update the offset
$this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n"); $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
$value = $trimmedValue; $value = $trimmedValue;
@ -605,8 +512,7 @@ class sfYamlParser
// remove start of the document marker (---) // remove start of the document marker (---)
$trimmedValue = preg_replace('#^\-\-\-.*?\n#s', '', $value, -1, $count); $trimmedValue = preg_replace('#^\-\-\-.*?\n#s', '', $value, -1, $count);
if ($count == 1) if ($count == 1) {
{
// items have been removed, update the offset // items have been removed, update the offset
$this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n"); $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
$value = $trimmedValue; $value = $trimmedValue;

View file