> For the complete documentation index, see [llms.txt](https://wiki.libreelec.tv/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wiki.libreelec.tv/configuration/useful_scripts.md).

# Useful Scripts

## Prevent Idle Shutdown

This script uses the `kodi-send` tool to prevent Kodi from shutting down if there are active SSH, SAMBA, or NFS connections. The script checks every 60 seconds, and if at least one connection exists the command `InhibitIdleShutdown(true)` is sent to Kodi.

Create `/storage/.config/prevent_idle.sh` with the following content:

```bash
#!/bin/sh

IDLE_SHUTDOWN_ALLOWED_LAST_STATE=-1

while true
do
  KODI_RUNNING=`ps -A | grep kodi.bin | grep -v grep | wc -l`
  if [ 1 == $KODI_RUNNING ] ; then
    SSH_ACTIVE=`netstat -tnpa | grep 'tcp.*:22.*ESTABLISHED.*' | wc -l`
    NFS_ACTIVE=`netstat -tnpa | grep 'tcp.*:111.*ESTABLISHED.*' | wc -l`
    SMB_ACTIVE=`netstat -tnpa | grep 'tcp.*:445.*ESTABLISHED.*' | wc -l`  
    [ $SSH_ACTIVE -gt 0 -o $NFS_ACTIVE -gt 0 -o $SMB_ACTIVE -gt 0 ] && IDLE_SHUTDOWN_ALLOWED=1 || IDLE_SHUTDOWN_ALLOWED=0 
      if [ $IDLE_SHUTDOWN_ALLOWED_LAST_STATE != $IDLE_SHUTDOWN_ALLOWED ] ; then
        IDLE_SHUTDOWN_ALLOWED_LAST_STATE=$IDLE_SHUTDOWN_ALLOWED
        kodi-send --action="AllowIdleShutdown"
        if [ 0 == $IDLE_SHUTDOWN_ALLOWED ] ; then
          kodi-send --action="InhibitIdleShutdown(false)"
        else
          kodi-send --action="InhibitIdleShutdown(true)"
        fi
      fi
  fi
  sleep 60
done
```

Call the script from `/storage/.config/autostart.sh` so it runs as a background task. It will continue to monitor the state of connections until the device is halted.

```bash
(
/usr/bin/bash /storage/.config/prevent_idle.sh
)&
```

## DYNU IP Updater

This script identifies your public IP address and updates a <https://dynu.com> Dynamic DNS record.

Create `/storage/.config/dynu_update.sh` with the following content:

```bash
#!/bin/sh

DYNU_USERNAME="username"
DYNU_PASSWORD="password-hash"
DYNU_HOSTNAME="example.dynu.com"
REFRESH_RATE=60

PUBLIC_IP=0.0.0.0

test_ip ()
{
  if [ -n $2 ] ; then
    if [ $1 != $2 ] ; then
      update_ip $2
      echo $2
    else 
      echo $1
    fi
  fi
}

update_ip ()
{
  DYNU_WGET="https://api.dynu.com/nic/update?hostname=$DYNU_HOSTNAME&myip=$1&username=$DYNU_USERNAME&password=$DYNU_PASSWORD"
  DYNU_UPDATE=`wget $DYNU_WGET -O - -q ; echo`
  (>&2 echo "$DYNU_UPDATE")
}

while true; do
  PUBLIC_IP_TEST=`wget http://ipecho.net/plain -O - -q ; echo`
  echo $PUBLIC_IP - $PUBLIC_IP_TEST
  PUBLIC_IP="$(test_ip $PUBLIC_IP $PUBLIC_IP_TEST)"
  sleep $(REFRESH_RATE)
  PUBLIC_IP_TEST=`curl -s checkip.dyndns.org | sed 's#.*Address: \(.*\)</b.*#\1#'`
  echo $PUBLIC_IP - $PUBLIC_IP_TEST
  sleep $(REFRESH_RATE)
  PUBLIC_IP_TEST=`curl -s ifconfig.co`
  echo $PUBLIC_IP - $PUBLIC_IP_TEST
  PUBLIC_IP="$(test_ip $PUBLIC_IP $PUBLIC_IP_TEST)"
  sleep $(REFRESH_RATE)
done
```

Call the script from `/storage/.config/autostart.sh` so it runs as a background task. It will continue to monitor the state of connections until the device is halted.

```bash
(
/usr/bin/bash /storage/.config/dynu_update.sh
)&
```

Note: If you set the refresh rate under 60 seconds the `checkip.dyndns.org` server will probably block your requests causing the script to fail.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://wiki.libreelec.tv/configuration/useful_scripts.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
