1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/dokuwiki_ynh.git synced 2024-09-03 18:26:20 +02:00

[enh] Add upgrade plugin.

This commit is contained in:
opi 2014-07-20 13:53:23 +02:00
parent cb514f120a
commit 16d59707cb
36 changed files with 1706 additions and 0 deletions

View file

@ -0,0 +1,25 @@
upgrade Plugin for DokuWiki
All documentation for this plugin can be found at
http://www.dokuwiki.org/plugin:upgrade
If you install this plugin manually, make sure it is installed in
lib/plugins/upgrade/ - if the folder is called different it
will not work!
Please refer to http://www.dokuwiki.org/plugins for additional info
on how to install plugins in DokuWiki.
----
Copyright (C) Andreas Gohr <andi@splitbrain.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
See the COPYING file in your DokuWiki folder for details

View file

@ -0,0 +1,599 @@
<?php
/**
* This is a copy of DokuWiki's core tar library
*
* A copy is used because old DokuWiki installs may have an old version. It has also been adjusted to
* print each extracted file
*
* @author Andreas Gohr <andi@splitbrain.org>
* @author Bouchon <tarlib@bouchon.org> (Maxg)
* @license GPL 2
*/
class VerboseTar {
const COMPRESS_AUTO = 0;
const COMPRESS_NONE = 1;
const COMPRESS_GZIP = 2;
const COMPRESS_BZIP = 3;
protected $file = '';
protected $comptype = Tar::COMPRESS_AUTO;
protected $fh;
protected $memory = '';
protected $closed = true;
protected $writeaccess = false;
/**
* Open an existing TAR file for reading
*
* @param string $file
* @param int $comptype
* @throws VerboseTarIOException
*/
public function open($file, $comptype = Tar::COMPRESS_AUTO) {
// determine compression
if($comptype == Tar::COMPRESS_AUTO) $comptype = $this->filetype($file);
$this->compressioncheck($comptype);
$this->comptype = $comptype;
$this->file = $file;
if($this->comptype === Tar::COMPRESS_GZIP) {
$this->fh = @gzopen($this->file, 'rb');
} elseif($this->comptype === Tar::COMPRESS_BZIP) {
$this->fh = @bzopen($this->file, 'r');
} else {
$this->fh = @fopen($this->file, 'rb');
}
if(!$this->fh) throw new VerboseTarIOException('Could not open file for reading: '.$this->file);
$this->closed = false;
}
/**
* Read the contents of a TAR archive
*
* This function lists the files stored in the archive, and returns an indexed array of associative
* arrays containing for each file the following information:
*
* checksum Tar Checksum of the file
* filename The full name of the stored file (up to 100 c.)
* mode UNIX permissions in DECIMAL, not octal
* uid The Owner ID
* gid The Group ID
* size Uncompressed filesize
* mtime Timestamp of last modification
* typeflag Empty for files, set for folders
* link Is it a symlink?
* uname Owner name
* gname Group name
*
* The archive is closed afer reading the contents, because rewinding is not possible in bzip2 streams.
* Reopen the file with open() again if you want to do additional operations
*/
public function contents() {
if($this->closed || !$this->file) throw new VerboseTarIOException('Can not read from a closed archive');
$result = array();
while($read = $this->readbytes(512)) {
$header = $this->parseHeader($read);
if(!is_array($header)) continue;
$this->skipbytes(ceil($header['size'] / 512) * 512);
$result[] = $header;
}
$this->close();
return $result;
}
/**
* Extract an existing TAR archive
*
* The $strip parameter allows you to strip a certain number of path components from the filenames
* found in the tar file, similar to the --strip-components feature of GNU tar. This is triggered when
* an integer is passed as $strip.
* Alternatively a fixed string prefix may be passed in $strip. If the filename matches this prefix,
* the prefix will be stripped. It is recommended to give prefixes with a trailing slash.
*
* By default this will extract all files found in the archive. You can restrict the output using the $include
* and $exclude parameter. Both expect a full regular expression (including delimiters and modifiers). If
* $include is set only files that match this expression will be extracted. Files that match the $exclude
* expression will never be extracted. Both parameters can be used in combination. Expressions are matched against
* stripped filenames as described above.
*
* The archive is closed afer reading the contents, because rewinding is not possible in bzip2 streams.
* Reopen the file with open() again if you want to do additional operations
*
* @param string $outdir the target directory for extracting
* @param int|string $strip either the number of path components or a fixed prefix to strip
* @param string $exclude a regular expression of files to exclude
* @param string $include a regular expression of files to include
* @throws VerboseTarIOException
* @return array
*/
function extract($outdir, $strip = '', $exclude = '', $include = '') {
if($this->closed || !$this->file) throw new VerboseTarIOException('Can not read from a closed archive');
$outdir = rtrim($outdir, '/');
io_mkdir_p($outdir);
$striplen = strlen($strip);
$extracted = array();
while($dat = $this->readbytes(512)) {
// read the file header
$header = $this->parseHeader($dat);
if(!is_array($header)) continue;
if(!$header['filename']) continue;
// strip prefix
$filename = $this->cleanPath($header['filename']);
if(is_int($strip)) {
// if $strip is an integer we strip this many path components
$parts = explode('/', $filename);
if(!$header['typeflag']) {
$base = array_pop($parts); // keep filename itself
} else {
$base = '';
}
$filename = join('/', array_slice($parts, $strip));
if($base) $filename .= "/$base";
} else {
// ifstrip is a string, we strip a prefix here
if(substr($filename, 0, $striplen) == $strip) $filename = substr($filename, $striplen);
}
// check if this should be extracted
$extract = true;
if(!$filename) {
$extract = false;
} else {
if($include) {
if(preg_match($include, $filename)) {
$extract = true;
} else {
$extract = false;
}
}
if($exclude && preg_match($exclude, $filename)) {
$extract = false;
}
}
// Now do the extraction (or not)
if($extract) {
$extracted[] = $header;
$output = "$outdir/$filename";
$directory = ($header['typeflag']) ? $output : dirname($output);
io_mkdir_p($directory);
// print status
admin_plugin_upgrade::_say(hsc($filename));
// is this a file?
if(!$header['typeflag']) {
$fp = fopen($output, "wb");
if(!$fp) throw new VerboseTarIOException('Could not open file for writing: '.$output);
$size = floor($header['size'] / 512);
for($i = 0; $i < $size; $i++) {
fwrite($fp, $this->readbytes(512), 512);
}
if(($header['size'] % 512) != 0) fwrite($fp, $this->readbytes(512), $header['size'] % 512);
fclose($fp);
touch($output, $header['mtime']);
chmod($output, $header['perm']);
} else {
$this->skipbytes(ceil($header['size'] / 512) * 512); // the size is usually 0 for directories
}
} else {
$this->skipbytes(ceil($header['size'] / 512) * 512);
}
}
$this->close();
return $extracted;
}
/**
* Create a new TAR file
*
* If $file is empty, the tar file will be created in memory
*
* @param string $file
* @param int $comptype
* @param int $complevel
* @throws VerboseTarIOException
* @throws VerboseTarIllegalCompressionException
*/
public function create($file = '', $comptype = Tar::COMPRESS_AUTO, $complevel = 9) {
// determine compression
if($comptype == Tar::COMPRESS_AUTO) $comptype = $this->filetype($file);
$this->compressioncheck($comptype);
$this->comptype = $comptype;
$this->file = $file;
$this->memory = '';
$this->fh = 0;
if($this->file) {
if($this->comptype === Tar::COMPRESS_GZIP) {
$this->fh = @gzopen($this->file, 'wb'.$complevel);
} elseif($this->comptype === Tar::COMPRESS_BZIP) {
$this->fh = @bzopen($this->file, 'w');
} else {
$this->fh = @fopen($this->file, 'wb');
}
if(!$this->fh) throw new VerboseTarIOException('Could not open file for writing: '.$this->file);
}
$this->writeaccess = true;
$this->closed = false;
}
/**
* Add a file to the current TAR archive using an existing file in the filesystem
*
* @todo handle directory adding
* @param string $file the original file
* @param string $name the name to use for the file in the archive
* @throws VerboseTarIOException
*/
public function addFile($file, $name = '') {
if($this->closed) throw new VerboseTarIOException('Archive has been closed, files can no longer be added');
if(!$name) $name = $file;
$name = $this->cleanPath($name);
$fp = fopen($file, 'rb');
if(!$fp) throw new VerboseTarIOException('Could not open file for reading: '.$file);
// create file header and copy all stat info from the original file
clearstatcache(false, $file);
$stat = stat($file);
$this->writeFileHeader(
$name,
$stat[4],
$stat[5],
fileperms($file),
filesize($file),
filemtime($file)
);
while(!feof($fp)) {
$data = fread($fp, 512);
if($data === false) break;
if($data === '') break;
$packed = pack("a512", $data);
$this->writebytes($packed);
}
fclose($fp);
}
/**
* Add a file to the current TAR archive using the given $data as content
*
* @param string $name
* @param string $data
* @param int $uid
* @param int $gid
* @param int $perm
* @param int $mtime
* @throws VerboseTarIOException
*/
public function addData($name, $data, $uid = 0, $gid = 0, $perm = 0666, $mtime = 0) {
if($this->closed) throw new VerboseTarIOException('Archive has been closed, files can no longer be added');
$name = $this->cleanPath($name);
$len = strlen($data);
$this->writeFileHeader(
$name,
$uid,
$gid,
$perm,
$len,
($mtime) ? $mtime : time()
);
for($s = 0; $s < $len; $s += 512) {
$this->writebytes(pack("a512", substr($data, $s, 512)));
}
}
/**
* Add the closing footer to the archive if in write mode, close all file handles
*
* After a call to this function no more data can be added to the archive, for
* read access no reading is allowed anymore
*
* "Physically, an archive consists of a series of file entries terminated by an end-of-archive entry, which
* consists of two 512 blocks of zero bytes"
*
* @link http://www.gnu.org/software/tar/manual/html_chapter/tar_8.html#SEC134
*/
public function close() {
if($this->closed) return; // we did this already
// write footer
if($this->writeaccess) {
$this->writebytes(pack("a512", ""));
$this->writebytes(pack("a512", ""));
}
// close file handles
if($this->file) {
if($this->comptype === Tar::COMPRESS_GZIP) {
gzclose($this->fh);
} elseif($this->comptype === Tar::COMPRESS_BZIP) {
bzclose($this->fh);
} else {
fclose($this->fh);
}
$this->file = '';
$this->fh = 0;
}
$this->closed = true;
}
/**
* Returns the created in-memory archive data
*
* This implicitly calls close() on the Archive
*/
public function getArchive($comptype = Tar::COMPRESS_AUTO, $complevel = 9) {
$this->close();
if($comptype === Tar::COMPRESS_AUTO) $comptype = $this->comptype;
$this->compressioncheck($comptype);
if($comptype === Tar::COMPRESS_GZIP) return gzcompress($this->memory, $complevel);
if($comptype === Tar::COMPRESS_BZIP) return bzcompress($this->memory);
return $this->memory;
}
/**
* Save the created in-memory archive data
*
* Note: It more memory effective to specify the filename in the create() function and
* let the library work on the new file directly.
*
* @param $file
* @param int $comptype
* @param int $complevel
* @throws VerboseTarIOException
*/
public function save($file, $comptype = Tar::COMPRESS_AUTO, $complevel = 9) {
if($comptype === Tar::COMPRESS_AUTO) $comptype = $this->filetype($file);
if(!file_put_contents($file, $this->getArchive($comptype, $complevel))) {
throw new VerboseTarIOException('Could not write to file: '.$file);
}
}
/**
* Read from the open file pointer
*
* @param int $length bytes to read
* @return string
*/
protected function readbytes($length) {
if($this->comptype === Tar::COMPRESS_GZIP) {
return @gzread($this->fh, $length);
} elseif($this->comptype === Tar::COMPRESS_BZIP) {
return @bzread($this->fh, $length);
} else {
return @fread($this->fh, $length);
}
}
/**
* Write to the open filepointer or memory
*
* @param string $data
* @throws VerboseTarIOException
* @return int number of bytes written
*/
protected function writebytes($data) {
if(!$this->file) {
$this->memory .= $data;
$written = strlen($data);
} elseif($this->comptype === Tar::COMPRESS_GZIP) {
$written = @gzwrite($this->fh, $data);
} elseif($this->comptype === Tar::COMPRESS_BZIP) {
$written = @bzwrite($this->fh, $data);
} else {
$written = @fwrite($this->fh, $data);
}
if($written === false) throw new VerboseTarIOException('Failed to write to archive stream');
return $written;
}
/**
* Skip forward in the open file pointer
*
* This is basically a wrapper around seek() (and a workaround for bzip2)
*
* @param int $bytes seek to this position
*/
function skipbytes($bytes) {
if($this->comptype === Tar::COMPRESS_GZIP) {
@gzseek($this->fh, $bytes, SEEK_CUR);
} elseif($this->comptype === Tar::COMPRESS_BZIP) {
// there is no seek in bzip2, we simply read on
@bzread($this->fh, $bytes);
} else {
@fseek($this->fh, $bytes, SEEK_CUR);
}
}
/**
* Write a file header
*
* @param string $name
* @param int $uid
* @param int $gid
* @param int $perm
* @param int $size
* @param int $mtime
* @param string $typeflag Set to '5' for directories
*/
protected function writeFileHeader($name, $uid, $gid, $perm, $size, $mtime, $typeflag = '') {
// handle filename length restrictions
$prefix = '';
$namelen = strlen($name);
if($namelen > 100) {
$file = basename($name);
$dir = dirname($name);
if(strlen($file) > 100 || strlen($dir) > 155) {
// we're still too large, let's use GNU longlink
$this->writeFileHeader('././@LongLink', 0, 0, 0, $namelen, 0, 'L');
for($s = 0; $s < $namelen; $s += 512) {
$this->writebytes(pack("a512", substr($name, $s, 512)));
}
$name = substr($name, 0, 100); // cut off name
} else {
// we're fine when splitting, use POSIX ustar
$prefix = $dir;
$name = $file;
}
}
// values are needed in octal
$uid = sprintf("%6s ", decoct($uid));
$gid = sprintf("%6s ", decoct($gid));
$perm = sprintf("%6s ", decoct($perm));
$size = sprintf("%11s ", decoct($size));
$mtime = sprintf("%11s", decoct($mtime));
$data_first = pack("a100a8a8a8a12A12", $name, $perm, $uid, $gid, $size, $mtime);
$data_last = pack("a1a100a6a2a32a32a8a8a155a12", $typeflag, '', 'ustar', '', '', '', '', '', $prefix, "");
for($i = 0, $chks = 0; $i < 148; $i++)
$chks += ord($data_first[$i]);
for($i = 156, $chks += 256, $j = 0; $i < 512; $i++, $j++)
$chks += ord($data_last[$j]);
$this->writebytes($data_first);
$chks = pack("a8", sprintf("%6s ", decoct($chks)));
$this->writebytes($chks.$data_last);
}
/**
* Decode the given tar file header
*
* @param string $block a 512 byte block containign the header data
* @return array|bool
*/
protected function parseHeader($block) {
if(!$block || strlen($block) != 512) return false;
for($i = 0, $chks = 0; $i < 148; $i++)
$chks += ord($block[$i]);
for($i = 156, $chks += 256; $i < 512; $i++)
$chks += ord($block[$i]);
$header = @unpack("a100filename/a8perm/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor/a155prefix", $block);
if(!$header) return false;
$return['checksum'] = OctDec(trim($header['checksum']));
if($return['checksum'] != $chks) return false;
$return['filename'] = trim($header['filename']);
$return['perm'] = OctDec(trim($header['perm']));
$return['uid'] = OctDec(trim($header['uid']));
$return['gid'] = OctDec(trim($header['gid']));
$return['size'] = OctDec(trim($header['size']));
$return['mtime'] = OctDec(trim($header['mtime']));
$return['typeflag'] = $header['typeflag'];
$return['link'] = trim($header['link']);
$return['uname'] = trim($header['uname']);
$return['gname'] = trim($header['gname']);
// Handle ustar Posix compliant path prefixes
if(trim($header['prefix'])) $return['filename'] = trim($header['prefix']).'/'.$return['filename'];
// Handle Long-Link entries from GNU Tar
if($return['typeflag'] == 'L') {
// following data block(s) is the filename
$filename = trim($this->readbytes(ceil($header['size'] / 512) * 512));
// next block is the real header
$block = $this->readbytes(512);
$return = $this->parseHeader($block);
// overwrite the filename
$return['filename'] = $filename;
}
return $return;
}
/**
* Cleans up a path and removes relative parts, also strips leading slashes
*
* @param string $p_dir
* @return string
*/
public function cleanPath($path) {
$path=explode('/', $path);
$newpath=array();
foreach($path as $p) {
if ($p === '' || $p === '.') continue;
if ($p==='..') {
array_pop($newpath);
continue;
}
array_push($newpath, $p);
}
return trim(implode('/', $newpath), '/');
}
/**
* Checks if the given compression type is available and throws an exception if not
*
* @param $comptype
* @throws VerboseTarIllegalCompressionException
*/
protected function compressioncheck($comptype) {
if($comptype === Tar::COMPRESS_GZIP && !function_exists('gzopen')) {
throw new VerboseTarIllegalCompressionException('No gzip support available');
}
if($comptype === Tar::COMPRESS_BZIP && !function_exists('bzopen')) {
throw new VerboseTarIllegalCompressionException('No bzip2 support available');
}
}
/**
* Guesses the wanted compression from the given filename extension
*
* You don't need to call this yourself. It's used when you pass Tar::COMPRESS_AUTO somewhere
*
* @param string $file
* @return int
*/
public function filetype($file) {
$file = strtolower($file);
if(substr($file, -3) == '.gz' || substr($file, -4) == '.tgz') {
$comptype = Tar::COMPRESS_GZIP;
} elseif(substr($file, -4) == '.bz2' || substr($file, -4) == '.tbz') {
$comptype = Tar::COMPRESS_BZIP;
} else {
$comptype = Tar::COMPRESS_NONE;
}
return $comptype;
}
}
class VerboseTarIOException extends Exception {
}
class VerboseTarIllegalCompressionException extends Exception {
}

View file

@ -0,0 +1,473 @@
<?php
/**
* DokuWiki Plugin upgrade (Admin Component)
*
* @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
* @author Andreas Gohr <andi@splitbrain.org>
*/
// must be run within Dokuwiki
if(!defined('DOKU_INC')) die();
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC.'lib/plugins/');
require_once DOKU_PLUGIN.'admin.php';
require_once DOKU_PLUGIN.'upgrade/VerboseTarLib.class.php';
class admin_plugin_upgrade extends DokuWiki_Admin_Plugin {
private $tgzurl;
private $tgzfile;
private $tgzdir;
private $tgzversion;
private $pluginversion;
public function __construct() {
global $conf;
$branch = 'stable';
$this->tgzurl = "https://github.com/splitbrain/dokuwiki/archive/$branch.tar.gz";
$this->tgzfile = $conf['tmpdir'].'/dokuwiki-upgrade.tgz';
$this->tgzdir = $conf['tmpdir'].'/dokuwiki-upgrade/';
$this->tgzversion = "https://raw.githubusercontent.com/splitbrain/dokuwiki/$branch/VERSION";
$this->pluginversion = "https://raw.githubusercontent.com/splitbrain/dokuwiki-plugin-upgrade/master/plugin.info.txt";
}
public function getMenuSort() {
return 555;
}
public function handle() {
if($_REQUEST['step'] && !checkSecurityToken()) {
unset($_REQUEST['step']);
}
}
public function html() {
$abrt = false;
$next = false;
echo '<h1>'.$this->getLang('menu').'</h1>';
global $conf;
if($conf['safemodehack']) {
$abrt = false;
$next = false;
echo $this->locale_xhtml('safemode');
return;
}
$this->_say('<div id="plugin__upgrade">');
// enable auto scroll
?>
<script language="javascript" type="text/javascript">
var plugin_upgrade = window.setInterval(function () {
var obj = document.getElementById('plugin__upgrade');
if (obj) obj.scrollTop = obj.scrollHeight;
}, 25);
</script>
<?php
// handle current step
$this->_stepit($abrt, $next);
// disable auto scroll
?>
<script language="javascript" type="text/javascript">
window.setTimeout(function () {
window.clearInterval(plugin_upgrade);
}, 50);
</script>
<?php
$this->_say('</div>');
echo '<form action="" method="get" id="plugin__upgrade_form">';
echo '<input type="hidden" name="do" value="admin" />';
echo '<input type="hidden" name="page" value="upgrade" />';
echo '<input type="hidden" name="sectok" value="'.getSecurityToken().'" />';
if($next) echo '<input type="submit" name="step['.$next.']" value="'.$this->getLang('btn_continue').' ➡" class="button continue" />';
if($abrt) echo '<input type="submit" name="step[cancel]" value="✖ '.$this->getLang('btn_abort').'" class="button abort" />';
echo '</form>';
$this->_progress($next);
}
/**
* Display a progress bar of all steps
*
* @param string $next the next step
*/
private function _progress($next) {
$steps = array('version', 'download', 'unpack', 'check', 'upgrade');
$active = true;
$count = 0;
echo '<div id="plugin__upgrade_meter"><ol>';
foreach($steps as $step) {
$count++;
if($step == $next) $active = false;
if($active) {
echo '<li class="active">';
echo '<span class="step">✔</span>';
} else {
echo '<li>';
echo '<span class="step">'.$count.'</span>';
}
echo '<span class="stage">'.$this->getLang('step_'.$step).'</span>';
echo '</li>';
}
echo '</ol></div>';
}
/**
* Decides the current step and executes it
*
* @param bool $abrt
* @param bool $next
*/
private function _stepit(&$abrt, &$next) {
if(isset($_REQUEST['step']) && is_array($_REQUEST['step'])) {
$step = array_shift(array_keys($_REQUEST['step']));
} else {
$step = '';
}
if($step == 'cancel') {
# cleanup
@unlink($this->tgzfile);
$this->_rdel($this->tgzdir);
$step = '';
}
if($step) {
$abrt = true;
$next = false;
if($step == 'version') {
$this->_step_version();
$next = 'download';
} elseif(!file_exists($this->tgzfile)) {
if($this->_step_download()) $next = 'unpack';
} elseif(!is_dir($this->tgzdir)) {
if($this->_step_unpack()) $next = 'check';
} elseif($step != 'upgrade') {
if($this->_step_check()) $next = 'upgrade';
} elseif($step == 'upgrade') {
if($this->_step_copy()) $next = 'cancel';
} else {
echo 'uhm. what happened? where am I? This should not happen';
}
} else {
# first time run, show intro
echo $this->locale_xhtml('step0');
$abrt = false;
$next = 'version';
}
}
/**
* Output the given arguments using vsprintf and flush buffers
*/
public static function _say() {
$args = func_get_args();
echo '<img src="'.DOKU_BASE.'lib/images/blank.gif" width="16" height="16" alt="" /> ';
echo vsprintf(array_shift($args)."<br />\n", $args);
flush();
ob_flush();
}
/**
* Print a warning using the given arguments with vsprintf and flush buffers
*/
public static function _warn() {
$args = func_get_args();
echo '<img src="'.DOKU_BASE.'lib/images/error.png" width="16" height="16" alt="!" /> ';
echo vsprintf(array_shift($args)."<br />\n", $args);
flush();
ob_flush();
}
/**
* Recursive delete
*
* @author Jon Hassall
* @link http://de.php.net/manual/en/function.unlink.php#87045
*/
private function _rdel($dir) {
if(!$dh = @opendir($dir)) {
return false;
}
while(false !== ($obj = readdir($dh))) {
if($obj == '.' || $obj == '..') continue;
if(!@unlink($dir.'/'.$obj)) {
$this->_rdel($dir.'/'.$obj);
}
}
closedir($dh);
return @rmdir($dir);
}
/**
* Check various versions
*
* @return bool
*/
private function _step_version() {
$ok = true;
// check if PHP is up to date
if(version_compare(phpversion(), '5.2.0', '<')) {
$this->_warn($this->getLang('vs_php'));
$ok = false;
}
// we need SSL - only newer HTTPClients check that themselves
if(!in_array('ssl', stream_get_transports())) {
$this->_warn($this->getLang('vs_ssl'));
$ok = false;
}
// get the available version
$http = new DokuHTTPClient();
$tgzversion = $http->get($this->tgzversion);
if(!$tgzversion) {
$this->_warn($this->getLang('vs_tgzno').' '.hsc($http->error));
$ok = false;
}
if(!preg_match('/(^| )(\d\d\d\d-\d\d-\d\d[a-z]*)( |$)/i', $tgzversion, $m)) {
$this->_warn($this->getLang('vs_tgzno'));
$ok = false;
$tgzversionnum = 0;
} else {
$tgzversionnum = $m[2];
$this->_say($this->getLang('vs_tgz'), $tgzversion);
}
// get the current version
$version = getVersion();
if(!preg_match('/(^| )(\d\d\d\d-\d\d-\d\d[a-z]*)( |$)/i', $version, $m)) {
$versionnum = 0;
} else {
$versionnum = $m[2];
}
$this->_say($this->getLang('vs_local'), $version);
// compare versions
if(!$versionnum) {
$this->_warn($this->getLang('vs_localno'));
$ok = false;
} else if($tgzversionnum) {
if($tgzversionnum < $versionnum) {
$this->_warn($this->getLang('vs_newer'));
$ok = false;
} elseif($tgzversionnum == $versionnum) {
$this->_warn($this->getLang('vs_same'));
$ok = false;
}
}
// check plugin version
$pluginversion = $http->get($this->pluginversion);
if($pluginversion) {
$plugininfo = linesToHash(explode("\n", $pluginversion));
$myinfo = $this->getInfo();
if($plugininfo['date'] > $myinfo['date']) {
$this->_warn($this->getLang('vs_plugin'));
$ok = false;
}
}
return $ok;
}
/**
* Download the tarball
*
* @return bool
*/
private function _step_download() {
$this->_say($this->getLang('dl_from'), $this->tgzurl);
@set_time_limit(120);
@ignore_user_abort();
$http = new DokuHTTPClient();
$http->timeout = 120;
$data = $http->get($this->tgzurl);
if(!$data) {
$this->_warn($http->error);
$this->_warn($this->getLang('dl_fail'));
return false;
}
if(!io_saveFile($this->tgzfile, $data)) {
$this->_warn($this->getLang('dl_fail'));
return false;
}
$this->_say($this->getLang('dl_done'), filesize_h(strlen($data)));
return true;
}
/**
* Unpack the tarball
*
* @return bool
*/
private function _step_unpack() {
$this->_say('<b>'.$this->getLang('pk_extract').'</b>');
@set_time_limit(120);
@ignore_user_abort();
try {
$tar = new VerboseTar();
$tar->open($this->tgzfile);
$tar->extract($this->tgzdir, 1);
$tar->close();
} catch (Exception $e) {
$this->_warn($e->getMessage());
$this->_warn($this->getLang('pk_fail'));
return false;
}
$this->_say($this->getLang('pk_done'));
$this->_say(
$this->getLang('pk_version'),
hsc(file_get_contents($this->tgzdir.'/VERSION')),
getVersion()
);
return true;
}
/**
* Check permissions of files to change
*
* @return bool
*/
private function _step_check() {
$this->_say($this->getLang('ck_start'));
$ok = $this->_traverse('', true);
if($ok) {
$this->_say('<b>'.$this->getLang('ck_done').'</b>');
} else {
$this->_warn('<b>'.$this->getLang('ck_fail').'</b>');
}
return $ok;
}
/**
* Copy over new files
*
* @return bool
*/
private function _step_copy() {
$this->_say($this->getLang('cp_start'));
$ok = $this->_traverse('', false);
if($ok) {
$this->_say('<b>'.$this->getLang('cp_done').'</b>');
$this->_rmold();
$this->_say('<b>'.$this->getLang('finish').'</b>');
} else {
$this->_warn('<b>'.$this->getLang('cp_fail').'</b>');
}
return $ok;
}
/**
* Delete outdated files
*/
private function _rmold() {
$list = file($this->tgzdir.'data/deleted.files');
foreach($list as $line) {
$line = trim(preg_replace('/#.*$/', '', $line));
if(!$line) continue;
$file = DOKU_INC.$line;
if(!file_exists($file)) continue;
if((is_dir($file) && $this->_rdel($file)) ||
@unlink($file)
) {
$this->_say($this->getLang('rm_done'), hsc($line));
} else {
$this->_warn($this->getLang('rm_fail'), hsc($line));
}
}
}
/**
* Traverse over the given dir and compare it to the DokuWiki dir
*
* Checks what files need an update, tests for writability and copies
*
* @param string $dir
* @param bool $dryrun do not copy but only check permissions
* @return bool
*/
private function _traverse($dir, $dryrun) {
$base = $this->tgzdir;
$ok = true;
$dh = @opendir($base.'/'.$dir);
if(!$dh) return false;
while(($file = readdir($dh)) !== false) {
if($file == '.' || $file == '..') continue;
$from = "$base/$dir/$file";
$to = DOKU_INC."$dir/$file";
if(is_dir($from)) {
if($dryrun) {
// just check for writability
if(!is_dir($to)) {
if(is_dir(dirname($to)) && !is_writable(dirname($to))) {
$this->_warn('<b>'.$this->getLang('tv_noperm').'</b>', hsc("$dir/$file"));
$ok = false;
}
}
}
// recursion
if(!$this->_traverse("$dir/$file", $dryrun)) {
$ok = false;
}
} else {
$fmd5 = md5(@file_get_contents($from));
$tmd5 = md5(@file_get_contents($to));
if($fmd5 != $tmd5 || !file_exists($to)) {
if($dryrun) {
// just check for writability
if((file_exists($to) && !is_writable($to)) ||
(!file_exists($to) && is_dir(dirname($to)) && !is_writable(dirname($to)))
) {
$this->_warn('<b>'.$this->getLang('tv_noperm').'</b>', hsc("$dir/$file"));
$ok = false;
} else {
$this->_say($this->getLang('tv_upd'), hsc("$dir/$file"));
}
} else {
// check dir
if(io_mkdir_p(dirname($to))) {
// copy
if(!copy($from, $to)) {
$this->_warn('<b>'.$this->getLang('tv_nocopy').'</b>', hsc("$dir/$file"));
$ok = false;
} else {
$this->_say($this->getLang('tv_done'), hsc("$dir/$file"));
}
} else {
$this->_warn('<b>'.$this->getLang('tv_nodir').'</b>', hsc("$dir"));
$ok = false;
}
}
}
}
}
closedir($dh);
return $ok;
}
}
// vim:ts=4:sw=4:et:enc=utf-8:

View file

@ -0,0 +1,29 @@
<?php
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author soer9648 <soer9648@eucl.dk>
*/
$lang['menu'] = 'Wiki Opgradering';
$lang['dl_from'] = 'Downloader arkiv fra %s...';
$lang['dl_fail'] = 'Download fejlet';
$lang['dl_done'] = 'Download færdig (%s).';
$lang['pk_extract'] = 'Pakker arkiv ud...';
$lang['pk_fail'] = 'Udpakning fejlet.';
$lang['pk_done'] = 'Udpakning færdig.';
$lang['pk_version'] = 'DokuWiki <b>%s</b> er klar til installation (Du benytter i øjeblikket <b>%s</b>).';
$lang['ck_start'] = 'Kontrollerer filtilladelser';
$lang['ck_done'] = 'Alle filer er skrivbare. Klar til at opgradere.';
$lang['ck_fail'] = 'Nogle filer er ikke skrivbare. Automatisk opgradering er ikke muligt.';
$lang['cp_start'] = 'Opdaterer filer...';
$lang['cp_done'] = 'Alle filer opdateret.';
$lang['cp_fail'] = 'Å-Åh. Noget gik galt. Du må hellere tjekke manuelt.';
$lang['tv_noperm'] = '<code>%s</code> er ikke skrivbar!';
$lang['tv_upd'] = '<code>%s</code> vil blive opdateret.';
$lang['tv_nocopy'] = 'Kunne ikke kopiere filen <code>%s</code>!';
$lang['tv_nodir'] = 'Kunne ikke oprette mappen <code>%s</code>!';
$lang['tv_done'] = 'Opdaterede <code>%s</code>';
$lang['rm_done'] = 'Forældet <code>%s</code> slettet.';
$lang['rm_fail'] = 'Kunne ikke slette forældet <code>%s</code>. <b>Slet venligst manuelt!</b>';
$lang['finish'] = 'Opgradering færdig. Nyd din nye DokuWiki';

View file

@ -0,0 +1 @@
Denne wiki er konfigureret til at benytte safemode hack'et. Vi kan desværre ikke opgradere wikien automatisk under disse forhold. Venligst [[doku>install:upgrade|opgradér din wiki manuelt]].

View file

@ -0,0 +1,29 @@
<?php
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Thomas Templin <templin@gnuwhv.de>
*/
$lang['menu'] = 'Wiki aktualisieren';
$lang['dl_from'] = 'Archiv wird von %s heruntergeladen...';
$lang['dl_fail'] = 'Herunterladen fehlgeschlagen.';
$lang['dl_done'] = 'Herunterladen abgeschlossen (%s).';
$lang['pk_extract'] = 'Archiv wird entpackt...';
$lang['pk_fail'] = 'Entpacken fehlgeschlagen.';
$lang['pk_done'] = 'Entpacken abgeschlossen.';
$lang['pk_version'] = 'DokuWiki <b>%s</b> ist zur Installation bereit (Du betreibst momentan <b>%s</b>).';
$lang['ck_start'] = 'Dateirechte werden &uuml;berpr&uuml;ft...';
$lang['ck_done'] = 'Alle Dateien sind beschreibbar. Zur Aktualisierung bereit.';
$lang['ck_fail'] = 'Einige Dateien sind nicht beschreibbar. Die automatische Aktualisierung ist nicht m&ouml;glich.';
$lang['cp_start'] = 'Dateien werden aktualisiert...';
$lang['cp_done'] = 'Dateien wurden aktualisiert.';
$lang['cp_fail'] = 'Autsch. Irgendetwas funktioniert nicht. &Uuml;berpr&uuml;fe es besser von Hand.';
$lang['tv_noperm'] = '<code>%s</code> ist nicht beschreibbar!';
$lang['tv_upd'] = '<code>%s</code> wird aktualisiert.';
$lang['tv_nocopy'] = 'Konnte Datei <code>%s</code> nicht kopieren!';
$lang['tv_nodir'] = 'Konnte Verzeichnis <code>%s</code> nicht erstellen!';
$lang['tv_done'] = '<code>%s</code> wurde aktualisiert.';
$lang['rm_done'] = 'Veraltete <code>%s</code> wurde gel&ouml;scht.';
$lang['rm_fail'] = 'Konnte veraltete Datei <code>%s</code> nicht l&ouml;schen. <b>Bitte l&ouml;schen Sie von Hand!</b>';
$lang['finish'] = 'Aktualisierung abgeschlossen. Genie&szlig;en Sie Ihr neues DokuWiki!';

View file

@ -0,0 +1 @@
Dieses Wiki ist so eingestellt dass es den safemode hack verwendet. Leider kann so das Wiki nicht automatisch aktualisiert werden. Bitte besuche Regul&auml;re[[doku>install:upgrade|upgrade your wiki manually]].

View file

@ -0,0 +1,32 @@
<?php
/**
* German language file for upgrade plugin
*
* @author Christoph Ziehr <info@einsatzleiterwiki.de>
*/
// menu entry for admin plugins
$lang['menu'] = 'Wiki aktualisieren';
// custom language strings for the plugin
$lang['dl_from'] = 'Archiv wird von %s heruntergeladen...';
$lang['dl_fail'] = 'Herunterladen fehlgeschlagen.';
$lang['dl_done'] = 'Herunterladen abgeschlossen (%s).';
$lang['pk_extract'] = 'Archiv wird entpackt...';
$lang['pk_fail'] = 'Entpacken fehlgeschlagen.';
$lang['pk_done'] = 'Entpacken abgeschlossen.';
$lang['pk_version'] = 'DokuWiki <b>%s</b> ist zur Installation bereit (Sie betreiben momentan <b>%s</b>).';
$lang['ck_start'] = 'Dateirechte werden &uuml;berpr&uuml;ft...';
$lang['ck_done'] = 'Alle Dateien sind beschreibbar. Zur Aktualisierung bereit.';
$lang['ck_fail'] = 'Einige Dateien sind nicht beschreibbar. Die automatische Aktualisierung ist nicht m&ouml;glich.';
$lang['cp_start'] = 'Dateien werden aktualisiert...';
$lang['cp_done'] = 'Dateien wurden aktualisiert.';
$lang['cp_fail'] = 'Irgendetwas funktioniert nicht. &Uuml;berpr&uuml;fen Sie von Hand.';
$lang['tv_noperm'] = '<code>%s</code> ist nicht beschreibbar!';
$lang['tv_upd'] = '<code>%s</code> wird aktualisiert.';
$lang['tv_nocopy'] = 'Konnte Datei <code>%s</code> nicht kopieren!';
$lang['tv_nodir'] = 'Konnte Verzeichnis <code>%s</code> nicht erstellen!';
$lang['tv_done'] = '<code>%s</code> wurde aktualisiert.';
$lang['rm_done'] = 'Veraltete <code>%s</code> wurde gel&ouml;scht.';
$lang['rm_fail'] = 'Konnte veraltete Datei <code>%s</code> nicht l&ouml;schen. <b>Bitte l&ouml;schen Sie von Hand!</b>';
$lang['finish'] = 'Aktualisierung abgeschlossen. Genie&szlig;en Sie Ihr neues DokuWiki!';

View file

@ -0,0 +1 @@
Dieses Wiki ist so eingestellt dass es den safemode hack verwendet. Leider kann so das Wiki nicht automatisch aktualisiert werden. Bitte besuchen Sie [[doku>install:upgrade|upgrade your wiki manually]].

View file

@ -0,0 +1,53 @@
<?php
/**
* English language file for upgrade plugin
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
// menu entry for admin plugins
$lang['menu'] = 'Wiki Upgrade';
// custom language strings for the plugin
$lang['vs_php'] = 'New DokuWiki releases need at least PHP %s, but you\'re running %s. You should upgrade your PHP version before upgrading!';
$lang['vs_tgzno'] = 'Could not determine the newest version of DokuWiki.';
$lang['vs_tgz'] = 'DokuWiki <b>%s</b> is available for download.';
$lang['vs_local'] = 'You\'re currently running DokuWiki <b>%s</b>.';
$lang['vs_localno'] = 'It\'s not clear how old your currently running version is, manual upgrade is recommended.';
$lang['vs_newer'] = 'It seems your current DokuWiki is even newer than the latest stable release. Upgrade not recommended.';
$lang['vs_same'] = 'Your current DokuWiki is already up to date. No need for upgrading.';
$lang['vs_plugin'] = 'There is a newer upgrade plugin available (%s) you should update the plugin before continuing.';
$lang['vs_ssl'] = 'Your PHP seems not to support SSL streams, downloading the needed data will most likely fail. Upgrade manually instead.';
$lang['dl_from'] = 'Downloading archive from %s...';
$lang['dl_fail'] = 'Download failed.';
$lang['dl_done'] = 'Download completed (%s).';
$lang['pk_extract'] = 'Unpacking archive...';
$lang['pk_fail'] = 'Unpacking failed.';
$lang['pk_done'] = 'Unpacking completed.';
$lang['pk_version'] = 'DokuWiki <b>%s</b> is ready to install (You\'re currently running <b>%s</b>).';
$lang['ck_start'] = 'Checking file permissions...';
$lang['ck_done'] = 'All files are writable. Ready to upgrade.';
$lang['ck_fail'] = 'Some files aren\'t writable. Automatic upgrade not possible.';
$lang['cp_start'] = 'Updating files...';
$lang['cp_done'] = 'All files updated.';
$lang['cp_fail'] = 'Uh-Oh. Something went wrong. Better check manually.';
$lang['tv_noperm'] = '<code>%s</code> is not writable!';
$lang['tv_upd'] = '<code>%s</code> will be updated.';
$lang['tv_nocopy'] = 'Could not copy file <code>%s</code>!';
$lang['tv_nodir'] = 'Could not create directory <code>%s</code>!';
$lang['tv_done'] = 'updated <code>%s</code>';
$lang['rm_done'] = 'Deprecated <code>%s</code> deleted.';
$lang['rm_fail'] = 'Could not delete deprecated <code>%s</code>. <b>Please delete manually!</b>';
$lang['finish'] = 'Upgrade completed. Enjoy your new DokuWiki';
$lang['btn_continue'] = 'Continue';
$lang['btn_abort'] = 'Abort';
$lang['step_version'] = 'Check';
$lang['step_download'] = 'Download';
$lang['step_unpack'] = 'Unpack';
$lang['step_check'] = 'Verify';
$lang['step_upgrade'] = 'Install';
//Setup VIM: ex: et ts=4 enc=utf-8 :

View file

@ -0,0 +1 @@
This wiki is configured to use the safemode hack. Unfortunately we cannot safely upgrade the wiki automatically under this conditions. Please [[doku>install:upgrade|upgrade your wiki manually]].

View file

@ -0,0 +1,7 @@
This plugin will automatically upgrade your wiki to the newest available DokuWiki version. Before continuing, you should read the [[doku>changes|Changelog]] to check if there are any additional steps for you to perform before or after upgrading.
To allow automatic upgrading, the PHP process requires write permissions for Dokuwiki files. The plugin will check for the necessary file permissions before starting the upgrade process.
This plugin will not upgrade any installed plugins or templates.
We recommend that you create a backup of your wiki before continuing.

View file

@ -0,0 +1,44 @@
<?php
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Robert Bogenschneider <bogi@uea.org>
*/
$lang['menu'] = 'Viki-Aktualigo';
$lang['vs_php'] = 'Novaj DokuWiki-eldonoj bezonas minumime PHP-version %s, sed vi uzas %s. Vi devus aktualigi vian PHP-version antaŭ ol aktualigi la vikion!';
$lang['vs_tgzno'] = 'Ne eblis ekkoni la plej novan DokuWiki-version.';
$lang['vs_tgz'] = 'DokuWiki <b>%s</b> haveblas por elŝuto.';
$lang['vs_local'] = 'Momente vi uzas DokuWiki <b>%s</b>.';
$lang['vs_localno'] = 'Ne estas klare, kiom malnova via momenta versio estas, permana aktualigo estas rekomendata.';
$lang['vs_newer'] = 'Aspektas, ke via momenta DokuWiki-versio estas eĉ pli nova ol la plej freŝa stabila eldono. Aktualigo estas malrekomendata.';
$lang['vs_same'] = 'Via momenta DokuWiki estas jam ĝisdata. Neniu bezono aktualigi.';
$lang['vs_plugin'] = 'Ekzistas pli nova kromaĵo (%s), vi devus aktualigi la kromaĵon antaŭ ol daŭrigi.';
$lang['dl_from'] = 'Elŝutanta arkivon de %s...';
$lang['dl_fail'] = 'La elŝuto ne funkciis.';
$lang['dl_done'] = 'Elŝuto kompleta (%s).';
$lang['pk_extract'] = 'Malpakanta arkivon...';
$lang['pk_fail'] = 'Malpakado ne funkciis.';
$lang['pk_done'] = 'Malpakado kompleta.';
$lang['pk_version'] = 'DokuWiki <b>%s</b> pretas por instalado (Momente vi uzas <b>%s</b>).';
$lang['ck_start'] = 'Kontrolanta dosier-permesojn...';
$lang['ck_done'] = 'Ĉiuj dosieroj estas skribeblaj. Preta por aktualigo.';
$lang['ck_fail'] = 'Iuj dosieroj ne estas skribeblaj. Aŭtomata aktualigo ne eblas.';
$lang['cp_start'] = 'Aktualiganta dosierojn...';
$lang['cp_done'] = 'Ĉiuj dosieroj aktualigitaj.';
$lang['cp_fail'] = 'Aj, io misiris. Pli bone kontrolu permane.';
$lang['tv_noperm'] = '<code>%s</code> ne estas skribebla!';
$lang['tv_upd'] = '<code>%s</code> estos aktualigata.';
$lang['tv_nocopy'] = 'Ne eblis kopii la dosieron <code>%s</code>!';
$lang['tv_nodir'] = 'Ne eblis krei la dosierujon <code>%s</code>!';
$lang['tv_done'] = 'aktualiĝis <code>%s</code>';
$lang['rm_done'] = 'Malaktuala <code>%s</code> forigita.';
$lang['rm_fail'] = 'Ne eblis forigi la malaktualan <code>%s</code>. <b>Bonvolu forigi ĝin permane!</b>';
$lang['finish'] = 'Aktualigo kompleta. Ĝuu vian novan DokuWiki.';
$lang['btn_continue'] = 'Daŭrigi';
$lang['btn_abort'] = 'Ĉesi';
$lang['step_version'] = 'Kontroli';
$lang['step_download'] = 'Elŝuti';
$lang['step_unpack'] = 'Malpaki';
$lang['step_check'] = 'Certigi';
$lang['step_upgrade'] = 'Instali';

View file

@ -0,0 +1 @@
Tiu-ĉi vikio laŭagorde uzas la safemode-econ. Bedaŭrinde tiel ne eblas sekure aktualigi la vikion aŭtomate. Bonvolu [[doku>install:upgrade|aktualigi vian vikion permane]].

View file

@ -0,0 +1,7 @@
Tiu kromaĵo aŭtomate aktualigos vian vikion al la plej freŝe havebla DokuWiki-versio. Antaŭ ol daŭrigi, legu [[doku>changes|la ŝanĝ-liston]] por kontroli, ĉu vi devus fari aldonajn paŝojn antaŭ aŭ post la aktualigo.
Por permesi aŭtomatan aktualigon, la PHP-procezo bezonas skribpermeson por Dokuwiki-dosieroj. La kromaĵo kontrolos la necesajn dosierpermesojn antaŭ la komenco de la aktualigado.
Tiu kromaĵo **ne aktualigos** instalitajn kromaĵojn aŭ ŝablonojn.
Ni rekomendas, ke vi faru sekurkopion de via vikio antaŭ ol daŭrigi.

View file

@ -0,0 +1,47 @@
<?php
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Guillaume Turri <guillaume.turri@gmail.com>
* @author Nicolas Friedli <nicolas@theologique.ch>
* @author Schplurtz le Déboulonné <schplurtz@laposte.net>
*/
$lang['menu'] = 'Mise a jour du wiki';
$lang['vs_php'] = 'Les nouvelles version de DokuWiki requièrent au moins la version %s de PHP, mais votre serveur propose %s. Il faut mettre PHP à jour avant DokuWiki.';
$lang['vs_tgzno'] = 'Ne peut déterminer quelle est la plus récente version de DokuWiki.';
$lang['vs_tgz'] = 'DokuWiki <b>%s</b> est disponible au téléchargement.';
$lang['vs_local'] = 'Vous utilisez actuellement DokuWiki <b>%s</b>.';
$lang['vs_localno'] = 'La version que vous utilisez actuellement ne peut pas être déterminée. Une mise à jour manuelle est recommandée.';
$lang['vs_newer'] = 'Il semble que votre version actuelle de DokuWiki soit plus récente que l\'actuelle version stable. La mise à jour n\'est pas recommandée.';
$lang['vs_same'] = 'Votre DokuWiki est le dernier en date. Pas besoin de mise à jour.';
$lang['vs_plugin'] = 'Une nouvelle version de l\'extension de mise à jour est disponible (%s). Vous devriez la mettre à jour avant de continuer.';
$lang['vs_ssl'] = 'Votre PHP semble ne pas prendre en charge les flux SSL; le téléchargement des données nécessaires va très probablement échouer. Faites la mise à jour manuellement.';
$lang['dl_from'] = 'Téléchargement de l\'archive depuis %s...';
$lang['dl_fail'] = 'Échec du téléchargement.';
$lang['dl_done'] = 'Téléchargement achevé (%s).';
$lang['pk_extract'] = 'Décompression de l\'archive...';
$lang['pk_fail'] = 'Échec de la décompression.';
$lang['pk_done'] = 'Décompression achevée.';
$lang['pk_version'] = 'DokuWiki <b>%s</b> est prêt à être installé (Vous utilisez actuellement <b>%s</b>).';
$lang['ck_start'] = 'Vérification des permissions des fichiers...';
$lang['ck_done'] = 'Tous les fichiers sont autorisés en écriture. Prêt à mettre à jour.';
$lang['ck_fail'] = 'Quelques fichiers sont interdits en écriture. La mise à jour automatique n\'est pas possible.';
$lang['cp_start'] = 'Mise à jour des fichiers...';
$lang['cp_done'] = 'Tous les fichiers ont été mis à jour.';
$lang['cp_fail'] = 'Oh-oh. Quelque chose est allé de travers. Il vaudrait mieux vérifier à la main.';
$lang['tv_noperm'] = '<code>%s</code> est interdit en écriture !';
$lang['tv_upd'] = '<code>%s</code> sera mis à jour.';
$lang['tv_nocopy'] = 'Impossible de copier le fichier <code>%s</code>!';
$lang['tv_nodir'] = 'Impossible de créer le répertoire <code>%s</code>!';
$lang['tv_done'] = 'Mis à jour : <code>%s</code>';
$lang['rm_done'] = 'Suppression du fichier obsolète <code>%s</code>.';
$lang['rm_fail'] = 'Impossible de supprimer le fichier obsolète <code>%s</code>. <b>Veuillez le supprimer à la main.</b>';
$lang['finish'] = 'Mise à jour accomplie. Profitez de votre nouveau Dokuwiki !';
$lang['btn_continue'] = 'Continuer';
$lang['btn_abort'] = 'Arrêter';
$lang['step_version'] = 'Contrôler';
$lang['step_download'] = 'Télécharger';
$lang['step_unpack'] = 'Décompresser';
$lang['step_check'] = 'Vérifier';
$lang['step_upgrade'] = 'Installer';

View file

@ -0,0 +1 @@
Ce wiki est configuré pour utiliser le mode sans échec. Il n'est malheureusement pas possible de mettre à jour automatiquement le wiki dans ces conditionst. Veuillez [[doku>install:upgrade|mettre à jour votre wiki manuellement]].

View file

@ -0,0 +1,7 @@
Cette extension met votre DokuWiki à jour automatiquement, en installant la dernière version. Avant d'aller plus loin, vous devriez lire la liste des modifications apportées ([[doku>changes|Changelog]]), afin de voir s'il y a des étapes supplémentaires à faire avant ou après la mise à jour.
Pour rendre la mise à jour automatique possible, PHP doit avoir les droits en écriture sur les fichiers de DokuWiki. Cette extension contrôle les permissions avant le début du processus de mise à jour.
Cette extension ne met pas à jour les extensions et les thèmes.
Nous vous recommandons d'effectuer une sauvegarde de votre wiki avant de poursuivre !

View file

@ -0,0 +1,29 @@
<?php
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Marina Vladi <deldadam@gmail.com>
*/
$lang['menu'] = 'Wiki-frissítő';
$lang['dl_from'] = 'Archívum letöltése innen: %s...';
$lang['dl_fail'] = 'A letöltés sikertelen.';
$lang['dl_done'] = 'A letöltés befejeződött (%s).';
$lang['pk_extract'] = 'Archívum kicsomagolása...';
$lang['pk_fail'] = 'A kicsomagolás sikertelen.';
$lang['pk_done'] = 'A kicsomagolás befejeződött.';
$lang['pk_version'] = 'A DokuWiki <b>%s</b> készen áll a telepítésre. (Jelenleg telepítve: b>%s</b>)';
$lang['ck_start'] = 'Fájlok hozzáférési jogosultságainak ellenőrzése...';
$lang['ck_done'] = 'Minden fájl írható. A frissítés készen áll a telepítésre.';
$lang['ck_fail'] = 'Néhány fájl nem írható. Az automatikus frissítés nem lehetséges.';
$lang['cp_start'] = 'Fájlok frissítése...';
$lang['cp_done'] = 'Minden fájl frissítve.';
$lang['cp_fail'] = 'Ejha. Valami nem sikerült. Jobb, ha manuálisan ellenőrizzük.';
$lang['tv_noperm'] = 'A(z) <code>%s</code> nem írható!';
$lang['tv_upd'] = 'A(z) <code>%s</code> frissítésre kerül!';
$lang['tv_nocopy'] = 'Nem tudtam lemásolni a(z) <code>%s</code> nevű fájlt!';
$lang['tv_nodir'] = 'Nem tudtam létrehozni a(z) <code>%s</code> nevű könyvtárat!';
$lang['tv_done'] = '<code>%s</code> frissítve';
$lang['rm_done'] = 'Elavult fájl törölve: <code>%s</code>.';
$lang['rm_fail'] = 'Nem tudtam törölni az elavult fájlt: <code>%s</code>. <b>Töröljük manuálisan!</b>';
$lang['finish'] = 'Frissítés kész. Élvezzük az új DokuWiki-t!';

View file

@ -0,0 +1 @@
A wiki a safemode hack használatára van beállítva. Sajnos, ilyen körülmények mellett nem tudjuk a wikit biztonsággal frissíteni automatikisan. Próbáljuk meg a [[doku>install:upgrade|wiki manuális frissítését]].

View file

@ -0,0 +1,29 @@
<?php
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Edmondo Di Tucci <snarchio@gmail.com>
*/
$lang['menu'] = 'Aggiornamento della Wiki';
$lang['dl_from'] = 'Sto scaricando l\'archivio da %s...';
$lang['dl_fail'] = 'Download fallito.';
$lang['dl_done'] = 'Download completo (%s).';
$lang['pk_extract'] = 'Scompattando l\'archivio...';
$lang['pk_fail'] = 'Scompattamento fallito.';
$lang['pk_done'] = 'Scompattamento completo.';
$lang['pk_version'] = 'DokuWiki <b>%s</b> è pronto per essere installato (Attualmente stai eseguendo <b>%s</b>).';
$lang['ck_start'] = 'Controllo i permessi sui file...';
$lang['ck_done'] = 'Tutti i file sono scrivibili. Pronto per aggiornare.';
$lang['ck_fail'] = 'Alcuni file non sono scrivibili. L\'aggiornamento automatico non è possibile.';
$lang['cp_start'] = 'Aggiornando i file...';
$lang['cp_done'] = 'Tutti i file sono aggiornati.';
$lang['cp_fail'] = 'Uh-Oh! Qualcosa è andato storto. Meglio controllare a mano.';
$lang['tv_noperm'] = '<code>%s</code> non è scrivibile!';
$lang['tv_upd'] = '<code>%s</code> sarà aggiornato.';
$lang['tv_nocopy'] = 'Non posso copiare il file <code>%s</code>!';
$lang['tv_nodir'] = 'Non posso creare la directory <code>%s</code>!';
$lang['tv_done'] = 'aggiornato <code>%s</code>';
$lang['rm_done'] = '<code>%s</code> deprecato cancellato.';
$lang['rm_fail'] = 'Non posso cancellare <code>%s</code> deprecato. <b>Per favore cancellalo a mano!</b>';
$lang['finish'] = 'Aggiornamento completo. Divertiti con la tua nuova DokuWiki';

View file

@ -0,0 +1 @@
Questa wiki è configurata per usare il trucco safemode. Sfortunatamente non possiamo aggiornare senza rischi la wiki automaticamente sotto queste condizioni. Per favore [[doku>install:upgrade|aggiorna la tua wiki manualmente]].

View file

@ -0,0 +1,45 @@
<?php
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Hideaki SAWADA <chuno@live.jp>
*/
$lang['menu'] = 'Wiki のアップグレード';
$lang['vs_php'] = '新しい DokuWiki には PHP %s 以上が必要だが %s が稼働中です。DokuWiki のアップグレード前に PHP のアップグレードが必要です!';
$lang['vs_tgzno'] = 'DokuWiki の最新バージョンが確認できませんでした。';
$lang['vs_tgz'] = 'DokuWiki <b>%s</b> がダウンロード可能です。';
$lang['vs_local'] = 'DokuWiki <b>%s</b> が稼働中です。';
$lang['vs_localno'] = '稼働中のバージョンが明確でないので手動でのアップグレードをお勧めします。';
$lang['vs_newer'] = '稼働中の DokuWiki は、最新の安定版リリースよりも新しいです。アップグレードはお勧めしません。';
$lang['vs_same'] = 'この DokuWiki は既に最新です。アップグレードは必要ありません。';
$lang['vs_plugin'] = '新しいアップグレードプラグインが利用可能です(%s) 。続行する前に、プラグインの更新が必要です。';
$lang['vs_ssl'] = 'PHP が SSL 接続に未対応っぽいので、データのダウンロードができません。手動でアップグレードして下さい。';
$lang['dl_from'] = '%s からアーカイブをダウンロード中...';
$lang['dl_fail'] = 'ダウンロードが失敗しました。';
$lang['dl_done'] = 'ダウンロードが完了しました(%s。';
$lang['pk_extract'] = 'アーカイブを解凍中...';
$lang['pk_fail'] = '解凍が失敗しました。';
$lang['pk_done'] = '解凍が完了しました。';
$lang['pk_version'] = 'DokuWiki <b>%s</b> をインストールする準備ができました(現在 <b>%s</b> を実行中です)。';
$lang['ck_start'] = 'ファイル権限を確認中...';
$lang['ck_done'] = '全ファイルが書込み可能です。アップグレードする準備ができました。';
$lang['ck_fail'] = 'いくつかのファイルが書込不可です。自動アップグレードは不可能です。';
$lang['cp_start'] = 'ファイルの更新中...';
$lang['cp_done'] = '全ファイルの更新完了。';
$lang['cp_fail'] = '何かが間違っていました。手動で確認して下さい。';
$lang['tv_noperm'] = '<code>%s</code> は書込み不可です!';
$lang['tv_upd'] = '<code>%s</code> は更新可能です。';
$lang['tv_nocopy'] = '<code>%s</code> ファイルがコピーできませんでした!';
$lang['tv_nodir'] = '<code>%s</code> ディレクトリが作成できませんでした!';
$lang['tv_done'] = '<code>%s</code> の更新完了。';
$lang['rm_done'] = '廃止予定の <code>%s</code> の削除完了。';
$lang['rm_fail'] = '廃止予定の <code>%s</code> が削除できませんでした。<b>手動で削除して下さい!</b>';
$lang['finish'] = 'アップグレードが完了しました。新しい DokuWiki をお楽しみ下さい。';
$lang['btn_continue'] = '続行';
$lang['btn_abort'] = '中止';
$lang['step_version'] = '確認';
$lang['step_download'] = 'ダウンロード';
$lang['step_unpack'] = '解凍';
$lang['step_check'] = '検証';
$lang['step_upgrade'] = 'インストール';

View file

@ -0,0 +1 @@
このWikiは、セーフモードハックを使用するように設定されています。残念ながら、この設定では自動で安全に Wiki のアップグレードができません。[[doku>ja:install:upgrade|手動でWiki のアップグレード]]をしてください。

View file

@ -0,0 +1,9 @@
このプラグインは、稼働中の DokuWiki を利用可能な最新バージョンにアップグレードします。
続行する前に、[[doku>ja:changes|更新履歴]]を読んで、アップグレードの前後に実行すべき追加の手順があるかどうかを確認してください。
自動アップグレードのために、DokuWikiのファイルは PHP プロセスからの書き込み権限が必要です。
実際にアップグレードする前に、必要なファイルのアクセス権を検証します。
インストール済のプラグインやテンプレートはアップグレードされません。
処理を続行する前に wiki のバックアップの作成をお勧めします。

View file

@ -0,0 +1,44 @@
<?php
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Myeongjin <aranet100@gmail.com>
*/
$lang['menu'] = '위키 업그레이드';
$lang['vs_php'] = '새 도쿠위키 릴리스는 적어도 PHP %s(이)가 필요하지만, 현재 %s(을)를 실행하고 있습니다. 업그레이드하기 전에 PHP 버전을 업그레이드해야 합니다!';
$lang['vs_tgzno'] = '도쿠위키의 최신 버전을 확인할 수 없습니다.';
$lang['vs_tgz'] = '도쿠위키 <b>%s</b>(은)는 다운로드할 수 있습니다.';
$lang['vs_local'] = '현재 도쿠위키 <b>%s</b>(을)를 실행하고 있습니다.';
$lang['vs_localno'] = '현재 실행 중인 버전은 얼마나 오래되었는지 분명하지 않습니다, 수동 업그레이드를 권장합니다.';
$lang['vs_newer'] = '현재 도쿠위키가 최신 안정 릴리스보다 새 릴리스인 것으로 보입니다. 업그레이드하지 않는 것이 좋습니다.';
$lang['vs_same'] = '현재 도쿠위키가 이미 최신입니다. 업그레이드할 필요가 없습니다.';
$lang['vs_plugin'] = '새 upgrade 플러그인을 사용할 수 있으므로 (%s) 계속하기 전에 플러그인을 업데이트해야 합니다.';
$lang['dl_from'] = '%s에서 아카이브 다운로드 중...';
$lang['dl_fail'] = '다운로드가 실패되었습니다.';
$lang['dl_done'] = '다운로드가 완료되었습니다. (%s)';
$lang['pk_extract'] = '아카이브를 압축 푸는 중...';
$lang['pk_fail'] = '압축 풀기가 실패되었습니다.';
$lang['pk_done'] = '압축 풀기가 완료되었습니다.';
$lang['pk_version'] = '도쿠위키 <b>%s</b>(은)는 설치할 준비가 되어 있습니다. (현재 <b>%s</b>(을)를 실행하고 있습니다)';
$lang['ck_start'] = '파일 권한 확인 중...';
$lang['ck_done'] = '모든 파일을 쓸 수 있습니다. 업그레이드를 준비합니다.';
$lang['ck_fail'] = '일부 파일을 쓸 수 없습니다. 자동으로 업그레이드는 할 수 없습니다.';
$lang['cp_start'] = '파일을 업데이트 중...';
$lang['cp_done'] = '모든 파일을 업데이트했습니다.';
$lang['cp_fail'] = '어머나. 무언가가 잘못되었습니다. 수동으로 잘 확인하세요.';
$lang['tv_noperm'] = '<code>%s</code>(은)는 쓸 수 없습니다!';
$lang['tv_upd'] = '<code>%s</code>(은)는 업데이트됩니다.';
$lang['tv_nocopy'] = '<code>%s</code> 파일을 복사할 수 없습니다!';
$lang['tv_nodir'] = '<code>%s</code> 디렉터리를 만들 수 없습니다!';
$lang['tv_done'] = '<code>%s</code>(을)를 업데이트했습니다';
$lang['rm_done'] = '사용되지 않는 <code>%s</code>(은)는 삭제되었습니다.';
$lang['rm_fail'] = '사용되지 않는 <code>%s</code>(을)를 삭제할 수 없습니다. <b>수동으로 삭제하세요!</b>';
$lang['finish'] = '업그레이드가 완료되었습니다. 새 도쿠위키를 즐기세요';
$lang['btn_continue'] = '계속';
$lang['btn_abort'] = '중단';
$lang['step_version'] = '확인';
$lang['step_download'] = '다운로드';
$lang['step_unpack'] = '압축 풀기';
$lang['step_check'] = '검증';
$lang['step_upgrade'] = '설치';

View file

@ -0,0 +1 @@
이 위키는 안전 모드 해킹을 사용하도록 설정되어 있습니다. 불행히도 이 조건에서 자동으로 안전하게 위키를 업그레이드할 수 없습니다. [[doku>install:upgrade|수동으로 위키를 업그레이드]]하세요.

View file

@ -0,0 +1,7 @@
이 플러그인은 자동으로 사용할 수 있는 최신 도쿠위키 버전으로 위키를 업그레이드합니다. 계속하기 전에, 업그레이드하기 전이나 후에 수행하기 위한 어떤 추가 단계가 있는지 확인하기 위해 [[doku>changes|바뀜기록]]을 읽어야 합니다.
자동으로 업그레이드를 허용하려면, PHP 프로세스에는 도쿠위키 파일에 쓰기 권한이 필요합니다. 플러그인은 업그레이드 과정을 시작하기 전에 필요한 파일 권한을 확인합니다.
이 플러그인은 어떠한 설치된 플러그인이나 템플릿도 업그레이드하지 않습니다.
계속하기 전에 위키의 백업을 만드는 것이 좋습니다.

View file

@ -0,0 +1,29 @@
<?php
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Gerrit Uitslag <klapinklapin@gmail.com>
*/
$lang['menu'] = 'Wiki Upgrade';
$lang['dl_from'] = 'Archief wordt van %s gedownload...';
$lang['dl_fail'] = 'Download is mislukt.';
$lang['dl_done'] = 'Download is compleet (%s)';
$lang['pk_extract'] = 'Archief uitpakken...';
$lang['pk_fail'] = 'Uitpakken mislukt.';
$lang['pk_done'] = 'Uitpakken voltooit.';
$lang['pk_version'] = 'DokuWiki <b>%s</b> is klaar om geïnstalleerd te worden (Op dit moment heb je <b>%s</b> draaien).';
$lang['ck_start'] = 'Bestandspermissies controleren...';
$lang['ck_done'] = 'Alle bestanden zijn beschrijfbaar. Klaar om te upgraden.';
$lang['ck_fail'] = 'Sommige bestanden zijn niet beschrijfbaar. Automatische upgrade is niet mogelijk.';
$lang['cp_start'] = 'Bestanden updaten...';
$lang['cp_done'] = 'Alle bestanden zijn geüpdatet.';
$lang['cp_fail'] = 'Uh-Oh. Iets ging verkeerd. Het is beter om het handmatig te controleren.';
$lang['tv_noperm'] = '<code>%s</code> is niet beschrijfbaar!';
$lang['tv_upd'] = '<code>%s</code> zal worden geüpdatet.';
$lang['tv_nocopy'] = 'Kon het bestand <code>%s</code> niet kopiëren!';
$lang['tv_nodir'] = 'De map <code>%s</code> kan niet aangemaakt worden!';
$lang['tv_done'] = '<code>%s</code> is geüpdatet.';
$lang['rm_done'] = 'Verouderde <code>%s</code> verwijderd.';
$lang['rm_fail'] = 'Verouderde <code>%s</code> kan niet worden verwijderd. <b>Verwijder alsjeblieft handmatig!</b>';
$lang['finish'] = 'Upgrade is compleet. Geniet van je nieuwe DokuWiki';

View file

@ -0,0 +1 @@
Deze wiki is geconfigureerd om de safemode hack te gebruiken. Helaas kunnen we onder die omstandigheden de wiki niet automatisch upgraden. Alsjeblieft [[doku>install:upgrade|upgrade je wiki handmatig]].

View file

@ -0,0 +1,30 @@
<?php
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Grigory Gubin <gv.gubin@gmail.com>
* @author Aleksandr Selivanov <alexgearbox@yandex.ru>
*/
$lang['menu'] = 'Обновление вики';
$lang['dl_from'] = 'Загрузка архива из %s...';
$lang['dl_fail'] = 'Ошибка загрузки.';
$lang['dl_done'] = 'Загрузка завершена (%s).';
$lang['pk_extract'] = 'Распаковка архива...';
$lang['pk_fail'] = 'Ошибка распаковки.';
$lang['pk_done'] = 'Распаковка завершена';
$lang['pk_version'] = '«Докувики» <b>%s</b> уже установлена (Текущая установка <b>%s</b>).';
$lang['ck_start'] = 'Проверка прав доступа к файлам...';
$lang['ck_done'] = 'Все файлы доступны для записи. Готово к обновлению.';
$lang['ck_fail'] = 'Некоторые файлы недоступны для записи. Автообновление невозможно.';
$lang['cp_start'] = 'Обновление файлов...';
$lang['cp_done'] = 'Все файлы обновлены.';
$lang['cp_fail'] = 'Ой... Что-то пошло не так. Лучше проверить вручную.';
$lang['tv_noperm'] = 'Не могу записать <code>%s</code>!';
$lang['tv_upd'] = '<code>%s</code> будет обновлен.';
$lang['tv_nocopy'] = 'Невозможно скопировать файл <code>%s</code>!';
$lang['tv_nodir'] = 'Невозможно создать папку <code>%s</code>!';
$lang['tv_done'] = 'обновление <code>%s</code>';
$lang['rm_done'] = 'Устаревший <code>%s</code> удалён.';
$lang['rm_fail'] = 'Невозможно удалить устаревший <code>%s</code>. <b>Пожалуйста, удалите вручную!</b>';
$lang['finish'] = 'Обновление завершено. Наслаждайтесь своей новой «Докувики»';

View file

@ -0,0 +1 @@
Ваша вики настроена с использованием safemode, поэтому не может быть обновлена в автоматическом режиме. Пожалуйста, ознакомьтесь с разделом [[doku>ru:install:upgrade|Обновление]].

View file

@ -0,0 +1,29 @@
<?php
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author İlker R. Kapaç <irifat@gmail.com>
*/
$lang['menu'] = 'Wiki Yükseltme';
$lang['dl_from'] = 'Arşiv, %s adresinden indiriliyor...';
$lang['dl_fail'] = 'İndirme başarısız oldu.';
$lang['dl_done'] = 'İndirme tamamlandı (%s).';
$lang['pk_extract'] = 'Arşiv açılıyor...';
$lang['pk_fail'] = 'Arşivin açılması başarısız oldu.';
$lang['pk_done'] = 'Arşivin açıklası tamamlandı.';
$lang['pk_version'] = 'DokuWiki <b>%s</b> , kurulmaya hazır (Şu an kullanmakta olduğunuz sürüm <b>%s</b>).';
$lang['ck_start'] = 'Dosya izinleri kontrol ediliyor...';
$lang['ck_done'] = 'Tüm dosyalar yazılabilir. Yükseltme için hazır.';
$lang['ck_fail'] = 'Bazı dosyalar yazılabilir değil. Otomatik yükseltme mümkün değil.';
$lang['cp_start'] = 'Dosyalar güncelleniyor...';
$lang['cp_done'] = 'Tüm dosyalar güncellendi.';
$lang['cp_fail'] = 'Offf! Birşey yanlış gitti. En iyisi elle kontrol edin.';
$lang['tv_noperm'] = '<code>%s</code> yazılabilir değil!';
$lang['tv_upd'] = '<code>%s</code> güncellenecek.';
$lang['tv_nocopy'] = '<code>%s</code> dosyası kopyalanamıyor!';
$lang['tv_nodir'] = '<code>%s</code> klasörü oluşturulamıyor!';
$lang['tv_done'] = '<code>%s</code> güncellendi';
$lang['rm_done'] = 'Çakışan <code>%s</code> silindi.';
$lang['rm_fail'] = 'Çakışan <code>%s</code> silinemiyor. <b>Lütfen elle silin!</b>';
$lang['finish'] = 'Yükseltme tamamlandı. Yeni DokuWiki\'nizin keyfini çıkarın';

View file

@ -0,0 +1 @@
Bu wiki safemod hack kullanacak şekilde yapılandırılmış. Ne yazık ki bu şartlar altında wikiyi otomatik olarak güvenli bir şekilde yükseltemeyiz. Lütfen [[doku>install:upgrade|wikinizin elle yükseltilmesi (İngilizce)]] sayfasındaki talimatları okuyun.

View file

@ -0,0 +1,7 @@
base upgrade
author Andreas Gohr
email andi@splitbrain.org
date 2014-07-04
name DokuWiki Upgrade Plugin
desc Automatically upgrade your DokuWiki install to the most recent stable release
url http://www.dokuwiki.org/plugin:upgrade

View file

@ -0,0 +1,83 @@
#plugin__upgrade {
margin: 0 auto;
height: 20em;
overflow: auto;
}
#plugin__upgrade_form {
display: block;
overflow: auto;
margin: 1em;
font-size: 120%;
}
#plugin__upgrade_form input {
float: right;
margin-left: 0.5em;
}
/* based on http://cssdeck.com/labs/progress-bar */
#plugin__upgrade_meter {
height: 20px;
position: relative;
margin: 3em 1em 1em 1em;
}
#plugin__upgrade_meter ol {
margin: 0;
padding: 0;
display: block;
height: 100%;
border-radius: 10px;
background-color: #ddd;
position: relative;
list-style: none;
}
#plugin__upgrade_meter ol li {
float: left;
margin: 0;
padding: 0;
text-align: right;
width: 19%;
position: relative;
border-radius: 10px;
}
#plugin__upgrade_meter ol li span{
right:-0.5em;
display: block;
text-align: center;
}
#plugin__upgrade_meter ol li .step {
top: -0.4em;
padding: .2em 0;
border: 3px solid #ddd;
z-index: 99;
font-size: 1.25em;
color: #ddd;
width: 1.5em;
font-weight: 700;
position: absolute;
background-color: #fff;
border-radius: 50%;
}
#plugin__upgrade_meter ol li .stage {
color: #fff;
font-weight: 700;
}
#plugin__upgrade_meter ol li.active {
height: 20px;
background: #aaa;
}
#plugin__upgrade_meter ol li.active span.stage {
color: #000;
}
#plugin__upgrade_meter ol li.active span.step{
color: #000;
border: 3px solid __link__;
}