Just a quick one.

So I use nClone to image my computers using the Synology NAS and PXE booting. In lamens terms its like ghost or clonezilla, however it boots via PXE and backs up directly to the Synology NAS, so no need for disks, You just start the pc to be backed up or restored and hit F12 and off it goes. If you have a Synology Nas running x86 I would suggest giving nClone a go www.nclone.com .

As with a lot of free software this hasn’t had much love lately and with the latest DSM 5.3 update we moved to Synologys build of PHP 5.5.26 with its own range of issues. One issue was nClone no longer showed the images in the interface, instead you just got a blank page.

Upon further inspection I right clicked and viewed frame source and saw in the code “Fatal error: Call to undefined function __json_encode() in /volume1/@appstore/nclone/public_html/nclone.cgi on line 308”. I checked the json extension is apparently on and working however this version of PHP doesn’t seem to allow json_encode.

So i wrote(Found) a little additional php code to get this working again follow the following steps;

  1. SSH/telnet to the NAS.
  2. vi /volume1/@appstore/nclone/public_html/nclone.cgi
  3. Scroll down until you see ” /* — end classes —*/” around line 151
  4. Hit “insert” and then “return” on the keyboard
  5. Copy the following code into clipboard and then paste into vi (right click the window)
    /* --- json_encode work arround ---*/
    function __json_encode( $data ) {
      if( is_array($data) || is_object($data) ) {
        $islist = is_array($data) && ( empty($data) || array_keys($data) === range(0,count($data)-1) );
        if( $islist ) {
          $json = '[' . implode(',', array_map('__json_encode', $data) ) . ']';
        } else {
          $items = Array();
          foreach( $data as $key => $value ) {
            $items[] = __json_encode("$key") . ':' . __json_encode($value);
          }
          $json = '{' . implode(',', $items) . '}';
        }
      } elseif( is_string($data) ) {
        # Escape non-printable or Non-ASCII characters.
        # I also put the \ character first, as suggested in comments on the 'addclashes' page.
        $string = '"' . addcslashes($data, "\"nrt/" . chr(8) . chr(12)) . '"';
        $json    = '';
        $len    = strlen($string);
        # Convert UTF-8 to Hexadecimal Codepoints.
        for( $i = 0; $i < $len; $i++ ) {
          $char = $string[$i];
          $c1 = ord($char);
    
          # Single byte;
          if( $c1 <128 ) {
            $json .= ($c1 > 31) ? $char : sprintf("\u%04x", $c1);
            continue;
          }
          # Double byte
          $c2 = ord($string[++$i]);
          if ( ($c1 & 32) === 0 ) {
            $json .= sprintf("\u%04x", ($c1 - 192) * 64 + $c2 - 128);
            continue;
          }
          # Triple
          $c3 = ord($string[++$i]);
          if( ($c1 & 16) === 0 ) {
            $json .= sprintf("\u%04x", (($c1 - 224) <<12) + (($c2 - 128) << 6) + ($c3 - 128));
            continue;
          }
          # Quadruple
          $c4 = ord($string[++$i]);
          if( ($c1 & 8 ) === 0 ) {
            $u = (($c1 & 15) << 2) + (($c2>>4) & 3) - 1;
            $w1 = (54<<10) + ($u<<6) + (($c2 & 15) << 2) + (($c3>>4) & 3);
            $w2 = (55<<10) + (($c3 & 15)<<6) + ($c4-128);
            $json .= sprintf("\u%04x\u%04x", $w1, $w2);
          }
        }
      } else {
        # int, floats, bools, null
        $json = strtolower(var_export( $data, true ));
      }
      return $json;
    }
  6. Scroll down to line 309ish change “Max.token = <?php echo json_encode($token); ?>;” to “Max.token = <?php echo __json_encode($token); ?>;” (Note additional “__”)
  7. Scroll down to line 311ish change “data: <?php echo __json_encode($images_info); ?>,” to “data: <?php echo __json_encode($images_info); ?>,” (Note additional “__”)
  8. Hit “Escape” type “:w”
  9. Go to your NAS control panel and reopen the nClone window, the backups should be showing again.
All fixed; So this function above is a satisfactory workaround for this json_encode issue.