Commit Graph
1 Commits
  • Feat: Shelly deploy hook for firmware 2.0.0+ (#7145)
    * feat: add Shelly Gen3+ deploy hook with RFC 7616 HTTP Digest auth
    
    Adds deploy/shelly.sh for deploying Let's Encrypt HTTPS server certificates
    to Shelly Gen3+ devices (Gen4 tested) via JSON-RPC over HTTP.
    
    - RFC 7616 SHA-256 HTTP Digest authentication (Authorization header)
    - Uploads fullchain.pem and private key via Shelly.PutHTTPServerCert / PutHTTPServerKey
    - Auto-reboot support (SHELLY_REBOOT to disable)
    - Auth auto-detection: no password = no auth, password = Digest
    - Nonce counter (nc) increments per request per RFC 7616
    - Tested against Shelly 2PM Gen4 (firmware 2.0.0)
    
    Also adds deploy/test_shelly.sh for self-testing the hook logic without
    a real device (mocked _post).
    
    * fix: address review feedback on shelly deploy hook
    
    - Fix _secure_debug calls to use two arguments (label + value)
    - Remove bash-only $RANDOM cnonce fallback; openssl always available
    - Parse $HTTP_HEADER directly instead of raw curl re-request
    - Detect auth via HTTP 401 status line, not empty response body
    - Route reboot through _shelly_rpc to rebuild auth header with correct nc
    - Remove export HTTPS_INSECURE=1 (no-op for http://, leaks to other hooks)
    - Clear _H1 before returning from shelly_deploy
    - Prefix all helper variables with _shelly_ to avoid namespace collisions
    - Delete deploy/test_shelly.sh (deploy/ files become hook names)
    - Fix missing trailing newline
    
    * fix: validate shelly JSON-RPC responses are valid JSON
    
    Non-JSON responses like HTTP 429 'Too Many Requests' would pass
    the empty-response and '"error"' checks and be reported as success.
    Now reject any response that doesn't start with '{' and contain '"id"'.
    
    * fix: add 1s delay between shelly cert/key clear and upload calls
    
    The Shelly device has a race condition where uploading data immediately
    after clearing the existing cert/key returns -103 'Missing required
    argument data!'. A 1-second delay fixes this.
    
    * fix: remove clear-before-upload in shelly deploy hook
    
    Shelly auto-removes all three TLS files (cert, key, CA bundle) when any
    single one is cleared. The old sequence clear-cert → upload-cert →
    clear-key → upload-key resulted in the key clear wiping the newly
    uploaded cert, leaving only the key at boot time. The mbedtls
    pk_check_pair then silently skipped the HTTPS listener.
    
    Fix: just upload directly (overwrite in place). No clearing needed.
    
    * Fix ShellCheck SC2090 and shfmt in shelly deploy hook
    
    SC2090: false positive on export _H1 (used quoted in _post)
    shfmt: no space after "<" in _json_encode redirects
    
    * moved  two lines to cover the whole if block
    
    ---------
    
    Co-authored-by: neil <github@neilpang.com>
    Co-authored-by: cysimons <cysimons@cisco.com>