okleinschmidt / wdmc

The missing CLI Client for Western Digital MyCloud NAS Systems.
MIT License
14 stars 3 forks source link

WD NAS returns invalid JSON #5

Closed tdilauro closed 6 years ago

tdilauro commented 6 years ago

Nota bene: This is not a problem with the code, but with the server with which it interacts.

My WD PR4100 NAS returns invalid JSON in response to this method in the Client class. The response includes an unescaped newline (\n), resulting in JSON which cannot be parsed.

def network
      response = get("#{@config['url']}/api/2.1/rest/network_configuration", {accept: :json, :cookies => cookies})
      JSON.parse(response, :symbolize_names => true)[:network_configuration]
    end

Running the response body through jq...

echo '''{"network_configuration":{"ifname":"bond0", "iftype":"wired", "proto":"dhcp_client", "ip":"192.168.1.33", "netmask":"255.255.255.0", "gateway":"192.168.1.1", "dns0":"192.168.1.1
", "dns1":"", "dns2":"", "gateway_mac_address":""}}''' | jq .

...produces the following:

parse error: Invalid string: control characters from U+0000 through U+001F must be escaped at line 2, column 1

Running it through od...

echo '''{"network_configuration":{"ifname":"bond0", "iftype":"wired", "proto":"dhcp_client", "ip":"192.168.1.33", "netmask":"255.255.255.0", "gateway":"192.168.1.1", "dns0":"192.168.1.1
", "dns1":"", "dns2":"", "gateway_mac_address":""}}''' | od -t x1

...produces the following:

0000000  7b  22  6e  65  74  77  6f  72  6b  5f  63  6f  6e  66  69  67
          {   "   n   e   t   w   o   r   k   _   c   o   n   f   i   g
0000020  75  72  61  74  69  6f  6e  22  3a  7b  22  69  66  6e  61  6d
          u   r   a   t   i   o   n   "   :   {   "   i   f   n   a   m
0000040  65  22  3a  22  62  6f  6e  64  30  22  2c  20  22  69  66  74
          e   "   :   "   b   o   n   d   0   "   ,       "   i   f   t
0000060  79  70  65  22  3a  22  77  69  72  65  64  22  2c  20  22  70
          y   p   e   "   :   "   w   i   r   e   d   "   ,       "   p
0000100  72  6f  74  6f  22  3a  22  64  68  63  70  5f  63  6c  69  65
          r   o   t   o   "   :   "   d   h   c   p   _   c   l   i   e
0000120  6e  74  22  2c  20  22  69  70  22  3a  22  31  39  32  2e  31
          n   t   "   ,       "   i   p   "   :   "   1   9   2   .   1
0000140  36  38  2e  31  2e  33  33  22  2c  20  22  6e  65  74  6d  61
          6   8   .   1   .   3   3   "   ,       "   n   e   t   m   a
0000160  73  6b  22  3a  22  32  35  35  2e  32  35  35  2e  32  35  35
          s   k   "   :   "   2   5   5   .   2   5   5   .   2   5   5
0000200  2e  30  22  2c  20  22  67  61  74  65  77  61  79  22  3a  22
          .   0   "   ,       "   g   a   t   e   w   a   y   "   :   "
0000220  31  39  32  2e  31  36  38  2e  31  2e  31  22  2c  20  22  64
          1   9   2   .   1   6   8   .   1   .   1   "   ,       "   d
0000240  6e  73  30  22  3a  22  31  39  32  2e  31  36  38  2e  31  2e
          n   s   0   "   :   "   1   9   2   .   1   6   8   .   1   .
0000260  31  0a  22  2c  20  22  64  6e  73  31  22  3a  22  22  2c  20
          1  \n   "   ,       "   d   n   s   1   "   :   "   "   ,
0000300  22  64  6e  73  32  22  3a  22  22  2c  20  22  67  61  74  65
          "   d   n   s   2   "   :   "   "   ,       "   g   a   t   e
0000320  77  61  79  5f  6d  61  63  5f  61  64  64  72  65  73  73  22
          w   a   y   _   m   a   c   _   a   d   d   r   e   s   s   "
0000340  3a  22  22  7d  7d  0a
          :   "   "   }   }  \n

Would be interested to know if others have this problem, as well.

okleinschmidt commented 6 years ago

Yes, same here:

irb(main):002:0> puts Wdmc::Client.new.network
{:ifname=>"egiga", :iftype=>"wired", :proto=>"dhcp_client", :ip=>"192.168.180.10", :netmask=>"255.255.255.0", :gateway=>"192.168.180.1", :dns0=>"172.16.20.1\n", :dns1=>"8.8.8.8\n", :dns2=>"8.8.4.4\n", :gateway_mac_address=>""}
=> nil
irb(main):003:0>
tdilauro commented 6 years ago

Blocks #4.

tdilauro commented 6 years ago

Yes, same here:

irb(main):002:0> puts Wdmc::Client.new.network
{:ifname=>"egiga", :iftype=>"wired", :proto=>"dhcp_client", :ip=>"192.168.180.10", :netmask=>"255.255.255.0", :gateway=>"192.168.180.1", :dns0=>"172.16.20.1\n", :dns1=>"8.8.8.8\n", :dns2=>"8.8.4.4\n", :gateway_mac_address=>""}
=> nil
irb(main):003:0>

Yeah, makes sense. I suspect that this is what you were fixing in commit https://github.com/okleinschmidt/wdmc/commit/a872d92f920767f922f6e2385332a4f085b494ff.

tdilauro commented 6 years ago

Work-around added/documented on PR #6. Removed old eval()-based work-around on PR #7.

Resolved. Closing.