TVheadend Power safe script

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • TVheadend Power safe script

    Hi!

    Ich hab im Internet ein nettes Script gefunden, dass meine Qnap 253 pro entsprechend der programmierten Aufnahmen automatisch hoch und runterfahren soll.

    tvheadend.org/boards/4/topics/15826

    (Es ist das 2. Script)

    Leider funktioniert das Script nicht auf meiner Qnap:


    Shell-Script

    1. #!/bin/bash
    2. # BASIC SETTINGS change at wish
    3. # Settings you have to look at
    4. # TvHeadend login and password
    5. tvh_login=YOUR_LOGIN_NAME
    6. tvh_password=YOUR_PASSWORD
    7. # (post recording) process activity to be checked, leave blank to deactivate
    8. process_check=(PROCESS_A PROCESS_B)
    9. # Settings you might look at
    10. # portnumbers to be checked for user activity (tvheadend 9981 + 9982 and samba 445)
    11. port_numbers=(9981 9982 445)
    12. # minimum time in seconds needed for consecutive shutdown AND startup
    13. safe_margin_shutdown=600
    14. # minimum time in seconds needed to start up the computer properly
    15. safe_margin_startup=180
    16. # minimum time in minutes not to shutdown after last user activity (watching tv/recording, up-/downloading files, booting the system)
    17. idle_time_shutdown=30
    18. # maximum time in hours not to wake up for updating EPG
    19. epg_hours=48
    20. # interval in seconds the script will check if the system should be shutdown
    21. script_int=60
    22. # END OF BASIC SETTINGS keep out from here ;-)
    23. # retrieve IP_address tvheadend server
    24. tvh_ip=$(hostname -i | awk '{print $1}')
    25. # set language
    26. export LANG=C
    27. # set session start
    28. uptime_boot_sec=$(cat /proc/uptime | awk -F ' ' '{print$1}' | awk -F '.' '{print$1}')
    29. boot_time=$(($(date +%s)-uptime_boot_sec))
    30. # initial values do not change
    31. recording=1
    32. # check for shutdown
    33. until [ $recording -eq 0 ];do
    34. # initial values do not change
    35. recording=0
    36. shutdown_timer=$idle_time_shutdown
    37. ping_array=()
    38. # countdown to shutdown
    39. until [ $shutdown_timer -eq 0 ];do
    40. shutdown_timer=$((shutdown_timer-1))
    41. # check for server connection tvheadend samba or any other server according to settings above
    42. status_netstat=1
    43. until [ $status_netstat -eq 0 ];do
    44. status_netstat=0
    45. sleep $script_int
    46. for i in $( echo "${port_numbers}"); do
    47. port_no=$i
    48. for i in $(echo $(netstat -n | grep -i "ESTABLISHED" | grep "$tvh_ip:$port_no" | awk -F ':' '{print ":"$2}' | sed 's/:'$port_no'\|[ ]//g')); do
    49. shutdown_timer=$idle_time_shutdown
    50. status_netstat=1
    51. ping_array[$(echo "${#ping_array}")]=$i
    52. done
    53. done
    54. ping_array=($(echo "${ping_array}" | sed 's/[ ]/\n/g' | awk '!a[$0]++' ))
    55. done
    56. for i in $(echo "${ping_array}"); do
    57. if [ $( ping -c1 $i | grep "received" | awk -F ',' '{print $2}' | awk '{print $1}' ) -eq 0 ]; then
    58. ping_array=($(echo "${ping_array/$i/}"))
    59. fi
    60. done
    61. if [ $(echo "${#ping_array}") -eq 0 -a $boot_time -lt $(($(date +%s)-idle_time_shutdown*60)) ]; then
    62. shutdown_timer=0
    63. fi
    64. if [ $(curl -s --user $tvh_login:$tvh_password http://127.0.0.1:9981/status.xml | grep "subscriptions" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}') -ne 0 -a $shutdown_timer -eq 0 ]; then
    65. shutdown_timer=1
    66. fi
    67. done
    68. # check for active post recording processes
    69. total_processes=0
    70. for i in $( echo "${process_check}"); do
    71. counter=$( ps -A | grep "$i" | wc -l )
    72. total_processes=$((total_processes+counter))
    73. done
    74. if [ $total_processes -ne 0 ]; then
    75. recording=$((recording+1))
    76. fi
    77. # check for active users
    78. if [ $(who | wc -l) -ne 0 ]; then
    79. recording=$((recording+1))
    80. fi
    81. # retrieve and calculate wake up data
    82. if [ $(curl -s --user $tvh_login:$tvh_password http://127.0.0.1:9981/status.xml | grep "subscriptions" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}') -eq 0 ]; then
    83. wake_after_min=$((epg_hours*60))
    84. if [ $(curl -s --user $tvh_login:$tvh_password 127.0.0.1:9981/status.xml | grep "next" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}' | wc -l) -gt 0 ]; then
    85. wake_after_min_temp=$(curl -s --user $tvh_login:$tvh_password 127.0.0.1:9981/status.xml | grep "next" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}')
    86. if [ $wake_after_min -gt $wake_after_min_temp ]; then
    87. wake_after_min=$wake_after_min_temp
    88. fi
    89. fi
    90. else
    91. wake_after_min=0
    92. fi
    93. wake_after_secs=$((wake_after_min*60))
    94. # check safe margin shutdown
    95. if [ $safe_margin_shutdown -gt $wake_after_secs ]; then
    96. recording=$((recording+1))
    97. fi
    98. done
    99. # set RTC wake up time
    100. stop_date=$(date +%s)
    101. wake_date=$((stop_date+wake_after_secs-safe_margin_startup))
    102. echo 0 > /sys/class/rtc/rtc0/wakealarm
    103. echo $wake_date > /sys/class/rtc/rtc0/wakealarm
    104. # shutdown computer
    105. sudo shutdown -h now
    Alles anzeigen


    Aktuell hänge ich bei Zeile 46

    Shell-Script

    1. # check for server connection tvheadend samba or any other server according to settings above
    2. status_netstat=1
    3. until [ $status_netstat -eq 0 ];do
    4. status_netstat=0
    5. sleep $script_int
    6. for i in $( echo "${port_numbers[*]}"); do
    7. port_no=$i
    8. for i in $(echo $(netstat -n | grep -i "ESTABLISHED" | grep "$tvh_ip:$port_no" | awk -F ':' '{print ":"$2}' | sed 's/:'$port_no'\|[ ]//g')); do
    9. shutdown_timer=$idle_time_shutdown
    10. status_netstat=1
    11. ping_array[$(echo "${#ping_array[*]}")]=$i
    12. done
    13. done
    14. ping_array=($(echo "${ping_array[*]}" | sed 's/[ ]/\n/g' | awk '!a[$0]++' ))
    15. done
    16. for i in $(echo "${ping_array[*]}"); do
    17. if [ $( ping -c1 $i | grep "received" | awk -F ',' '{print $2}' | awk '{print $1}' ) -eq 0 ]; then
    18. ping_array=($(echo "${ping_array[*]/$i/}"))
    19. fi
    20. done
    21. if [ $(echo "${#ping_array[*]}") -eq 0 -a $boot_time -lt $(($(date +%s)-idle_time_shutdown*60)) ]; then
    22. shutdown_timer=0
    23. fi
    24. if [ $(curl -s --user $tvh_login:$tvh_password http://127.0.0.1:9981/status.xml | grep "subscriptions" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}') -ne 0 -a $shutdown_timer -eq 0 ]; then
    25. shutdown_timer=1
    26. fi
    27. done
    Alles anzeigen
    Da wird mir ein Syntax Error ausgegeben.

    Bin leider ein Linux Neuling. Kann mir jemand helfen das zu fixen? - Ich denke an dem Code hätte mehr Leute interesse.

    Danke und LG
  • Ich bin gerade nicht mehr ganz fit, bei dem Thema. Aber wenn man Scripte aus dem Internet kopiert, gibt es häufig Probleme mit den den einfachen Anführungszeichen. Oft sind es die falschen und man muss sie durch die richtigen ersetzten.

    Frag mich jetzt aber bitte nicht welches das richitge ist, ich muss das auch immer durch probieren.

    Was steht denn beim Syntax Error genau?
  • Hab das Leerzeichen vor dem Echo rausgemacht, sowie auch noch das vor dem do.

    Fehlermeldung ändert sich nicht wirklich:

    ebug.sh: line 47: syntax error near unexpected token `do'
    Debug.sh: line 47: ` for i in $(echo "${port_numbers}");do'

    mit Leerzeichen vor dem do

    ebug.sh: line 47: syntax error near unexpected token `do'
    Debug.sh: line 47: ` for i in $(echo "${port_numbers[*]}"); do'
  • Ich hab mal ein paar Zeilenschaltungen weggenommen

    Shell-Script

    1. #!/bin/bash
    2. # BASIC SETTINGS change at wish
    3. # Settings you have to look at
    4. # TvHeadend login and password
    5. tvh_login=******
    6. tvh_password=*****
    7. # (post recording) process activity to be checked, leave blank to deactivate
    8. process_check=()
    9. # Settings you might look at
    10. # portnumbers to be checked for user activity (tvheadend 9981 + 9982 and samba 445)
    11. port_numbers="9981 9982 445"
    12. # minimum time in seconds needed for consecutive shutdown AND startup
    13. safe_margin_shutdown=600
    14. # minimum time in seconds needed to start up the computer properly
    15. safe_margin_startup=600
    16. # minimum time in minutes not to shutdown after last user activity (watching tv/recording, up-/downloading files, booting the system)
    17. idle_time_shutdown=30
    18. # maximum time in hours not to wake up for updating EPG
    19. epg_hours=48
    20. # interval in seconds the script will check if the system should be shutdown
    21. script_int=60
    22. # END OF BASIC SETTINGS keep out from here ;-)
    23. # retrieve IP_address tvheadend server
    24. tvh_ip=$(hostname -i | awk '{print $1}')
    25. # set language
    26. export LANG=C
    27. # set session start
    28. uptime_boot_sec=$(cat /proc/uptime | awk -F ' ' '{print$1}' | awk -F '.' '{print$1}')
    29. boot_time=$(($(date +%s) -uptime_boot_sec))
    30. # initial values do not change
    31. recording=1
    32. # check for shutdown
    33. until [ $recording -eq 0 ];do
    34. # initial values do not change
    35. recording=0
    36. shutdown_timer=$idle_time_shutdown
    37. ping_array=()
    38. # countdown to shutdown
    39. until [ $shutdown_timer -eq 0 ];do
    40. shutdown_timer=$((shutdown_timer-1))
    41. # check for server connection tvheadend samba or any other server according to settings above
    42. status_netstat=1
    43. until [ $status_netstat -eq 0 ];do
    44. status_netstat=0
    45. sleep $script_int
    46. for i in $(echo "${port_numbers[*]}");do port_no=$i
    47. for i in $(echo $(netstat -n | grep -i "ESTABLISHED" | grep "$tvh_ip:$port_no" | awk -F ':' '{print ":"$2}' | sed 's/:'$port_no'\|[ ]//g')); do shutdown_timer=$idle_time_shutdown
    48. status_netstat=1
    49. ping_array[$(echo "${#ping_array[*]}")]=$i
    50. done
    51. done
    52. ping_array=($(echo "${ping_array[*]}" | sed 's/[ ]/\n/g' | awk '!a[$0]++' ))
    53. done
    54. for i in $(echo "${ping_array[*]}"); do if [ $( ping -c1 $i | grep "received" | awk -F ',' '{print $2}' | awk '{print $1}' ) -eq 0 ]; then
    55. ping_array=($(echo "${ping_array[*]/$i/}"))
    56. fi
    57. done
    58. if [ $(echo "${#ping_array[*]}") -eq 0 -a $boot_time -lt $(($(date +%s)-idle_time_shutdown*60)) ]; then
    59. shutdown_timer=0
    60. fi
    61. if [ $(curl -s --user $tvh_login:$tvh_password http://127.0.0.1:9981/status.xml | grep "subscriptions" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}') -ne 0 -a $shutdown_timer -eq 0 ]; then
    62. shutdown_timer=1
    63. fi
    64. done
    65. # check for active post recording processes
    66. total_processes=0
    67. for i in $( echo "${process_check[*]}"); do counter=$( ps -A | grep "$i" | wc -l )
    68. total_processes=$((total_processes+counter))
    69. done
    70. if [ $total_processes -ne 0 ]; then
    71. recording=$((recording+1))
    72. fi
    73. # check for active users
    74. if [ $(who | wc -l) -ne 0 ]; then
    75. recording=$((recording+1))
    76. fi
    77. # retrieve and calculate wake up data
    78. if [ $(curl -s --user $tvh_login:$tvh_password http://127.0.0.1:9981/status.xml | grep "subscriptions" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}') -eq 0 ]; then
    79. wake_after_min=$((epg_hours*60))
    80. if [ $(curl -s --user $tvh_login:$tvh_password 127.0.0.1:9981/status.xml | grep "next" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}' | wc -l) -gt 0 ]; then
    81. wake_after_min_temp=$(curl -s --user $tvh_login:$tvh_password 127.0.0.1:9981/status.xml | grep "next" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}')
    82. if [ $wake_after_min -gt $wake_after_min_temp ]; then
    83. wake_after_min=$wake_after_min_temp
    84. fi
    85. fi
    86. else
    87. wake_after_min=0
    88. fi
    89. wake_after_secs=$((wake_after_min*60))
    90. # check safe margin shutdown
    91. if [ $safe_margin_shutdown -gt $wake_after_secs ]; then
    92. recording=$((recording+1))
    93. fi
    94. done
    95. # set RTC wake up time
    96. stop_date=$(date +%s)
    97. wake_date=$((stop_date+wake_after_secs-safe_margin_startup))
    98. echo 0 > /sys/class/rtc/rtc0/wakealarm
    99. echo $wake_date > /sys/class/rtc/rtc0/wakealarm
    100. # shutdown computer
    101. sudo shutdown -h now
    Alles anzeigen
    Jetzt bekomm ich folgenden Fehler:

    Debug.sh: line 105: syntax error: unexpected end of file
  • wenn du das Skript wie oben ausführst, kann es auch zu Fehlverhalten kommen, weil in der ersten Zeile, der sogenannten "Shebang", der falsche Pfad zur bash angegeben ist. Wenn du das Skript auf der abgespeckten Variante der Shell, die Standardmä´ßig auf dem NAS installiert ist ausführen möchtest muss da

    Shell-Script

    1. #!/bin/sh

    hin. Besser wäre es jedoch via entware eine "richtige" Version der Bash zu installieren und dann in der Shebang:

    Shell-Script

    1. #!/opt/bin/bash

    einzutragen.
  • '!/bin/sh

    War mal die Lösung, gemeinsam mit einer End of Line Konversion.

    Jetzt läuft

    Bash - n Debug.sh

    Ohne fehler durch.

    Neues Problem:

    Ich bekomme einen Fehler für netstat:

    for i in $(echo $(netstat -n | grep -i "ESTABLISHED" | grep "$tvh_ip:$port_no" | awk -F ':' '{print ":"$2}' | sed 's/:'$port_no'\|[ ]//g')); do

    Fehlermeldung:

    Quellcode

    1. netstat: no support for `AF INET6 (tcp)' on this system.
    2. netstat: no support for `AF INET6 (udp)' on this system.
    3. netstat: no support for `AF INET6 (raw)' on this system.

    Damit kann ich ersmal nichts anfangen...
  • die Stations haben netstat an Bord. Ob das ausreichend ist?
    Entware-ng hat auch etwas

    Quellcode

    1. net-tools-netstat - 1.60-4 - Program netstat from net-tools. Report network connections, routing tables, and interface statistics.
    Das mal installieren und im script auf /opt/bin/netstat weisen.
  • Hab es mal im Hintergrund laufen lassen:

    Aus dem Log:

    1)

    Quellcode

    1. if [ $( ping -c1 $i | grep "received" | awk -F ',' '{print $2}' | awk '{print $1}' ) -eq 0 ]; then



    Gibt folgende Fehlermeldung:


    Quellcode

    1. /share/CACHEDEV1_DATA/Recordings/Test.sh: line 68: [: -eq: unary operator expected2016-09-08 20:24:02.166
    2)

    Quellcode

    1. if [ $(curl -s --user $tvh_login:$tvh_password http://127.0.0.1:9981/status.xml | grep "subscriptions" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}') -ne 0 -a $shutdown_timer -eq 0 ]; then
    Gibt folgende Fehlermeldung:

    Quellcode

    1. /share/CACHEDEV1_DATA/Recordings/Test.sh: line 75: [: too many arguments
    3)

    Quellcode

    1. if [ $(who | wc -l) -ne 0 ]; then
    Gibt folgende Fehlermeldung:

    Quellcode

    1. share/CACHEDEV1_DATA/Recordings/Test.sh: line 89: who: command not found
    4)

    Quellcode

    1. if [ $(curl -s --user $tvh_login:$tvh_password http://127.0.0.1:9981/status.xml | grep "subscriptions" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}') -eq 0 ];
    Gibt folgend Fehlermeldung

    Quellcode

    1. share/CACHEDEV1_DATA/Recordings/Test.sh: line 93: [: -eq: unary operator expected
    Kann damit wer was anfangen?