יום חמישי, ספטמבר 12, 2019

משלוח התראות של פיקוד העורף ב KDE ו Gnome

לפני תקופה כתבתי תסריט שמשך את התראות פיקוד העורף ושלח התראות בממשק KDE, עבדתי קצת על הקוד ועכשיו אני די מרוצה מאיך שהקוד נראה. העירו  לי על זה שלא פרסמתי את הקוד המעודכן.

צריך להוריד את סמליל פיקוד העורף ולשים אותו ב
/usr/share/oref/240px-Pakar.svg.png

כשיש התראה קופץ חלון התראה גרפי:

בשביל חיבור ממשק טקסט (משל ssh) יש גם התראת טקסט :
Broadcast message from user@pi (pts/4):         
                                                                               
Oref : [{ 
"title" : "התרעות פיקוד העורף ",
"data" : ["מבקיעים"]
}]


הקוד עצמו  :
#!/bin/bash
#License : MIT
#Copyright (c) 2019 Boris Shtrasman

#Permission is hereby granted, free of charge, to any person obtaining a copy
#of this software and associated documentation files (the "Software"), to deal
#in the Software without restriction, including without limitation the rights
#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#copies of the Software, and to permit persons to whom the Software is
#furnished to do so, subject to the following conditions:

#The above copyright notice and this permission notice shall be included in all
#copies or substantial portions of the Software.

#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
#SOFTWARE.

if [ $# -ne 1 ]; then
echo "$0 expect alert url"
echo "example:"
echo "$0 http://www.oref.org.il/WarningMessages/Alert/alerts.json";
exit 1
fi
#send a notification for each user that has X session, and accept notif
function notify_user()
{
     users=($(who | sed -nr "s/([a-z]*)[ \t]*.*\((:[^)]+)\).*/\1,\2/p" | sort|uniq))
     summary=$1
     text=$2
     for i in "${users[@]}"
     do
        user=$(echo $i | cut -d',' -f1)
        screen=$(echo $i|cut -d',' -f2)
        id=$(id -u $user)
        DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$id/bus
        #I use screen to avoid blocking the process for other connected users, I'm obligated to use sudo as notify-send need to be run under the same user which own the session.
        #This unfurtunatly will take over fullscreen Firefox or flash video
        screen -Dm sudo -u $user /bin/bash -c "DISPLAY=$screen DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS  /usr/bin/notify-send -t 15000 -i /usr/share/oref/240px-Pakar.svg.png -u critical \"$summary\" \"$text\""

      done
} 

result=$( wget --header="Referer: https://www.oref.org.il/" \
--header="X-Requested-With: XMLHttpRequest" --header="User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0" --header="Accept: application/json, text/javascript, */*; q=0.01"  -qO-  $1)

if [ -e "$result" ]; then
        echo "empty"
        exit 0
fi

if [ ${#result} -lt 1 ]; then
       exit 0
fi

#Send alert over all shells on the system.
wall "Oref : [$result]"
#Send alert for each UI session that support notify-send
title=$(echo $result|jq -s -r '.[].title')
amount_of_alerts=$(echo $result |jq -s '.[].data | length')
#if there had been no data members we can not iterate over it
if [ ! -z "$amount_of_alerts" ]; then
  for (( alert_index = 0 ; alert_index < $amount_of_alerts; alert_index++))
  do
     area=$(echo $result|jq -r -s ".[].data| .[$alert_index]")
     notify_user  "Oref $title $date" "$area"
  done
fi

exit 0


בדיוק כמו בפעם הקודמת צריך להשתמש בשעון עצר של systemd (פורסם בלינק הקודם).

עריכה :


הקוד הזה דורש ש notify-send , jq ו wget יהיו מותקנים במערכת.

הקוד הזה מיועד ל X , אין לי wayland מותקן,  ואין לי דרך לדעת איך wayland עובד עם notify-send או אם notify_user()  תעבוד שם.

יש להפעיל את התסריט הזה מטיימר  או שורת cron, בשביל למשוך התראות חדשות 

הטסריט הזה לא מושך התראות פנים ישוביות - ישנן התראות שמופעלות רק ביישובים עצמם , וההתראות האלה אינן מפורסמות ע"י אתר פיקוד העורף.

3 תגובות:

  1. תגובה זו הוסרה על ידי המחבר.

    השבמחק
  2. היי, האם צריך כל פעם לפנות אל השרת ולראות אם יש פלט?
    או שברגע שמריצים את הפקודה היא רצה ללא הפסקה ומציגה פלט בכל התראת צבע אדום?

    השבמחק
    תשובות
    1. אכן אתה צריך לפנות אל השרת בכל פעם ולראות אם יש פלט.

      אתה יכול פשוט להשתמש ב timer של systemd שיפעיל את זה .
      דוגמה לטיימר :

      [Unit]
      Description=HomeFront aler
      [Timer]
      OnUnitActiveSec=3s
      OnBootSec=100s
      OnCalendar=*:*:0/5

      [Install]
      WantedBy=timers.target


      מחק