ubus-scriptd

使用ubus-scriptd自動帶起多個ubus server


更新記錄

item note
20170209 第一版

目錄


ubus-scriptd

來源:ubus-scriptd

ubus-scriptd主要自動帶起ubus service
因此只要停止ubus-scriptd,將會停止自動被帶起的ubus service

  • ubus-scriptd有下例程序:

    • app_load_services
      /usr/lib/ubus-services目錄加入ubus service
      目前只提供使用lua寫的程式

    • app_load_scripts
      /usr/lib/ubus目錄加入ubus service
      此目前可以存放binary及script,需要依據使用方式

  • app_load_script程序

    • 讀取/usr/lib/ubus檔案,並且執行檔案帶參數(.methods)
      此時程式需要回應ubus mehtod的json檔案,並將此method加入obj

    • 檔有人通過ubus call會將參數帶入執行檔
      ex. /usr/lib/ubus cmd-json

ubus-scriptd flow

  • ubus-scriptd
    使用fork各別帶起lua(此lua內部使用ubus.so建立)
    各別執行/usr/lib/ubus,並且帶參數(.methods)來取得obj method json格式

    [ubus-scriptd]
  • rpc_shell_script
    將ubus call的參數帶給/usr/lib/ubus/xxx cmd
    並將回傳值給client

    [rpc_shell_script]

ubus-scriptd

  • 目前使用ubus source的test.lua

    1
    2
    ~ # ls -l /usr/lib/ubus-services/
    -rwxr-xr-x 1 root root 987 Feb 9 2017 test.lua
  • ubus-scriptd

    1
    2
    3
    4
    5
    6
    7
    8
    9
    /opt/dvr_board/bin # ./ubus-scriptd 
    parsing {"test":{"id":"int","msg":"string"}}
    _parse_methods_json: allocating 48 bytes for methods
    - found test
    - blobattr: test id int
    - blobattr: test msg string
    _parse_methods_json: method test with 2 params
    - 1 methods for /usr/lib/ubus/test-script
    Registering ubus object /test-script (-test-script)
  • 目前提供service

    1
    2
    3
    4
    5
    6
    7
    8
    /usr/lib/ubus # ubus list -v
    '/test-script' @19631336
    "test":{"id":"Integer","msg":"String"}
    'broken' @64312369
    "hello1":{}
    'test' @103e8e78
    "hello":{"id":"Integer","msg":"String"}
    "hello1":{"id":"Integer","msg":"String"}

Example

  • /usr/lib/ubus-services/test.lua
  • /usr/lib/ubus/test-script

  • ubus-scriptd
    目前提供service

    1
    2
    3
    4
    5
    6
    7
    ...
    Call to function 'hello'
    key=id value=123
    key=msg value=tt123
    Call to test event
    key=id value=123
    key=msg value=send test
  • ubus call
    test-script直接回應帶入參數

    1
    2
    3
    4
    5
    /usr/lib/ubus # ubus call /test-script test '{"id":123,"msg":"str123"}'
    {
    "id": 123,
    "msg": "str123"
    }
  • ubus call
    test.lua的hello

    1
    2
    3
    4
    /usr/lib/ubus # ubus call test hello '{"id":123,"msg":"tt123"}'
    {
    "message": "foo"
    }
  • ubus send

    1
    ubus send test '{"id":123,"msg":"send test"}

JUCI

github : juci

  • JUCI JavaScript Webgui for embedded devices running OpenWRT
  • JUCI scripts and services are handled entirely by a small C program called ubus-scriptd

creating-backend-scripts

  • it creates ubus objects for all the scripts that are published into /usr/lib/ubus/ directory tree
    • creates a ubus object and then listens for incoming ubus calls
  • Writing a ubus script
  • Writing a ubus service
    Services are different from scripts in that they register their own ubus methods directly and always maintain a running instance of the service in the background
    /usr/lib/ubus-services/
    All ubus-scriptd services are written in lua

參考