Skip to content
This repository has been archived by the owner on Jun 19, 2019. It is now read-only.

Experimental Firmware Nodes fügen zusätzliche Einträge ins JSON ein #7

Open
datenhahn opened this issue Sep 20, 2015 · 8 comments
Open

Comments

@datenhahn
Copy link

Bei experimental Nodes finden sich im JSON File nodes.json komische "function Einträge", z.b. sowas:
"function: 0x97c670": true,

                            }
                        },
                        "function: 0x97c670": true
                    },
                    "mesh_interfaces": [
                        "06:1c:d6:0b:aa:51",
                        "06:1b:d7:0b:aa:51"
                    ]
                },
                "node_id": "0418d60baa51",
                "software": {
                    "autoupdater": {
                        "branch": "experimental",
                        "enabled": true
                    },
                    "batman-adv": {
                        "compat": 15,
                        "function: 0x97c670": true,
                        "version": "2014.4.0"
                    },
                    "fastd": {
@datenhahn
Copy link
Author

Ich experimentiere gerade mit der java lib jackson zum parsen und der stolpert über so Einträge, falls jemand ebenfalls Probleme hat, mit diesem kleinen ruby-script, kann man die störenden Einträge entfernen. Aufrufen als:

./clean_json.rb nodes.json clean_nodes.json

#!/usr/bin/ruby
require 'json'

file = File.read(ARGV[0])
hash = JSON.parse(file)

def clean_json(node)
  if node.is_a?(Hash)
    node.each do |k,v|
        if k.start_with?("function: 0x")
            node.delete(k)
        end
        clean_json(v)
    end
  end
end

clean_json(hash)

File.write(ARGV[1], hash.to_json)

@datenhahn
Copy link
Author

schon die gluon announce neighbour-info hat die Json Probleme

info zu gluon announce: http://gluon.readthedocs.org/en/latest/features/announce.html

Call mit kaputtem output:

gluon-neighbour-info -i bat0 -p 1001 -d fdef:ffc0:4fff:0:6a72:51ff:fe24:fdef -r nodeinfo

{"hostname":"ffmuc-outside","node_id":"68725124fdef","network":{"mac":"68:72:51:24:fd:ef","function: 0x54dcd0":true,"addresses":["fe80:0:0:0:6a72:51ff:fe24:fdef","fdef:ffc0:4fff:0:6a72:51ff:fe24:fdef","2001:470:7ca1:ff80:6a72:51ff:fe24:fdef"],"mesh":{"function: 0x54dcd0":true,"bat0":{"function: 0x54dcd0":true,"interfaces":{"tunnel":["6a:76:51:24:fd:ef"],"function: 0x54dcd0":true,"wireless":["6a:75:52:24:fd:ef"]}}},"mesh_interfaces":["6a:76:51:24:fd:ef","6a:75:52:24:fd:ef"]},"function: 0x54dcd0":true,"location":{"longitude":11.535061,"latitude":48.120651},"hardware":{"nproc":1,"function: 0x54dcd0":true,"model":"Ubiquiti Nanostation M"},"software":{"autoupdater":{"enabled":true,"branch":"experimental"},"function: 0x54dcd0":true,"fastd":{"enabled":true,"version":"v17"},"batman-adv":{"version":"2014.4.0","compat":15,"function: 0x54dcd0":true},"firmware":{"base":"gluon-v2015.1.2-6-g4268d32","release":"v2015.5-16-g9a9c8b3"}},"system":{"function: 0x54dcd0":true,"site_code":"ffmuc"}}

@datenhahn
Copy link
Author

Der Übeltäter ist gefunden, wenn man in der Datei /usr/lib/lua/gluon/announce.lua

function collect_dir(dir)
    local ret = { [json.null] = true }

in

function collect_dir(dir)
    local ret = { }

ändert geht es. Nun muss man nur noch rausfinden warum das überhaupt drin stand und was damit bezweckt werden sollte. Nicht dass durch den fix was anderes gebrochen wird.

#!/usr/bin/lua

module('gluon.announce', package.seeall)

fs = require 'luci.fs'
json = require 'luci.json'
uci = require('luci.model.uci').cursor()
util = require 'luci.util'

local function collect_entry(entry)
    if fs.isdirectory(entry) then
        return collect_dir(entry)
    else
        return setfenv(loadfile(entry), _M)()
    end
end

function collect_dir(dir)
    local ret = { [json.null] = true }

    for _, entry in ipairs(fs.dir(dir)) do
        if entry:sub(1, 1) ~= '.' then
            local ok, val = pcall(collect_entry, dir .. '/' .. entry)
            if ok then
                ret[entry] = val
            else
                io.stderr:write(val, '\n')
            end
        end
    end

    return ret
end

@datenhahn
Copy link
Author

@datenhahn
Copy link
Author

Nur dass der fix immer noch kaputt ist, nur anders:

b3"}},"system":{"table: 0x4aaad0":true,"site_code":"ffmuc"}}

@datenhahn
Copy link
Author

Gluon Bug aufgemacht
freifunk-gluon/gluon#514

@datenhahn
Copy link
Author

Und geschlossen, die haben noch mehr geändert (jsonc, statt json, etc.)

@datenhahn
Copy link
Author

So noch weiter debugged und die Lösung gefunden. Wir brauchen diesen Patch in unserem luci json.lua .

openwrt/luci@304eec2

Lustigerweise bin ich um das gewünschte Verhalten mit den gegebenen Mitteln (json.null in der lua-table) zu erzeugen genau auf die Lösung gekommen :) .

Das Problem war, dass der Json-Parser keine empty json-objects aus empty lua-tables erzeugt hat. Mit dem hinzufügen eines "json.null" Entries in die erzeugten lua-tables in announce.lua und den nodeinfo.d scripten (z.B. interfaces) und dem ändern des Encoders, sodass dieser null-Werte als keys in tables ignoriert wurde das gefixt.

Wir haben anscheinend nur das hinzufügen der json.null Werte ohne die Änderung am Json-Encoder.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant