יום חמישי, ספטמבר 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, בשביל למשוך התראות חדשות 

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

יום שלישי, אוגוסט 27, 2019

Munigrabber לאתרים שמשתמשים בערכת העיצוב Mivzakiim

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

הפעלה לדוגמה עבור מועצה מקומית שקר כל שהוא עם הדומיין
https://www.sheker-kolshehu.co.il
:

munigrabber.pl https://www.sheker-kolshehu.co.il

את הקובץ שנוצר שמים במקום שקורא ה RSS שלנו יכול לקרוא ממנו - למשל איפה שApache לוקח קבצים ממנו .


#!/usr/bin/perl  

use strict;
use warnings;

use LWP 5.64; # Loads all important LWP classes, and makes
use HTTP::Cookies; # Allow work with cookies
use XML::RSS;
use XML::Simple;
use Encode qw(decode encode);
use Data::Dumper;
use DateTime::Format::Strptime qw(strftime );

#The message content is located in a remote page, we fetch it's content to show in our RSS feed.
sub get_display_item
{
    my $url = shift;
    my $browser = shift;
    my $response = $browser->get( $url );
    my @lines = $response->content =~ /<div.*id="WebPartWPQ3"(.*)<\/div>/g;
    $lines[0] = '
new; $browser->cookie_jar( HTTP::Cookies->new( 'file' => '/tmp/headers', # where to read/write cookies 'autosave' => 1, # save it to disk when done )); $browser->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'); my $basepath = "$ARGV[0]"; my $url = "$basepath"; my $response = $browser->get( $url ); print "Workding on " . $url . "\n"; if ($response->{'_rc'} != 200 ) { die "Error for $url $response->{'_content'}"; } #for each cookie we got, add it to the current jar $browser->cookie_jar->extract_cookies( $response ); $response = $browser->get( "$basepath/Pages/Mivzakiim.aspx" ); my $rss = XML::RSS->new( version => '2.0'); $rss->channel( title => "Municipal feed for $basepath", link => "$basepath", description => "MivzakiimAll RSS feed"); my @lines = $response->content =~ /MivzakiimAll generalFilter">(.*)<\/div><\/div>/g; unless ($#lines >= 0) { print Dumper (@lines) ; die "$url does not have MivzakiimAll content, you need to adjust the script"; } my $xml_obj = XMLin(@lines); my $formater = DateTime::Format::Strptime->new( pattern => '%d/%m/%Y', time_zone => 'local', on_error => 'croak', ); foreach my $tr (@{$xml_obj->{tbody}->{tr}}) { foreach my $td ($tr->{td}) { my $date_in_webpage= $td->[0]->{'div'}->{'content'}; my $dt = $formater->parse_datetime($date_in_webpage); my $title = $td->[1]->{'a'}->{'content'}; my $link = $td->[1]->{'a'}->{'href'}; my $description = get_display_item ( $basepath . $link , $browser); $rss->add_item( title => $title, link => $basepath . $link,pubDate=>$dt ,guid=>$basepath . $link , description=>$description); } } #Use the basepath for the generated filename , strip http/https from it for readbility my $filename="$url.rss"; $filename =~ s/https:\/\///g; $filename =~ s/http:\/\///g; $rss->save($filename); __END__ =head1 NAME muni RSS - a script to get an RSS from old municipal websites with the Mivzakiim template which are lacking an RSS/Atom features. =head1 SYNOPSIS Create an RSS 2.0 file based on the embeeded messages page. =head1 DESCRIPTION This script provide a basic example on how one could get the RSS from the rusty pages without the RSS interface, =head1 BUGS =head1 AUTHOR Original code:Boris Shtrasman =head1 COPYRIGHT Copyright (c) 2015 Boris Shtrasman =head1 LICENSE this script is free software. You can redistribute it and/or modify it under the same terms as Perl itself. =head1 CREDITS Rael Dornfest Jonathan Eisenzopf Wojciech Zwiefka Chris Nandor Shlomi Fish

=head1 SEE ALSO perl(1), XML::Parser(3), LWP(3), XML::RSS(3),HTTP::Cookies(3) =cut

יום שני, מאי 13, 2019

Error running context: An error occurred during SSL communication at /usr/share/perl5/Git/SVN.pm line 148.

בשעה טובה ומוצלחת מספר הפצות עברו להצפנת ברירת מחדל של TLS 1.2 רק שלצערי יש עדיין ספקים שלא תומכים בזה כמו שצריך בגלל הגדרה מסויימת בשרתים שלהם.

אחד הדברים שנפגעו מזה זה כל מה שמשתמש ב serf ו tls.

ספקים שדאגו להתכונן לעניין (כמו apache ו github) לא נפגעו ומאפשרים לבצע checkout :

  svn co https://svn.apache.org/repos/asf/subversion/trunk subversion 
A    subversion/build
A    subversion/build/ac-macros
A    subversion/build/generator
A    subversion/build/generator/swig
A    subversion/build/generator/util
A    subversion/build/generator/templates
A    subversion/.editorconfig
A    subversion/build/generator/swig/external_runtime.py
A    subversion/README
.
.
.


אבל יש ספקים אחרים בהם התוצאה היא שאי אפשר לבצע clone / checkout מהם ומקבלים את הדבר הבא :

git svn clone https://cloudservice.com/project/trunk

Initialized empty Git repository in /tmp/svn/trunk/.git/
Can't create session: Unable to connect to a repository at URL 'https://cloudservice.com/project/trunk': Error running context: An error occurred during SSL communication at /usr/share/perl5/Git/SVN.pm line 148.

וגם ב subversion  :

svn checkout https://cloudservice.com/project/trunk .  
svn: E170013: Unable to connect to a repository at URL 'https://cloudservice.com/project/trunk'
svn: E120171: Error running context: An error occurred during SSL communication

לאחר חיפוש גיליתי שהבעיה היא בהצעת הצופן של הספק :

openssl s_client -connect cloudservice.com:443 2>/dev/null |grep 'Cipher is'
New, (NONE), Cipher is (NONE)

אצל ספקים אחרים שאין את הבעיה הזאת כמו github ו apache הפלט יהיה :

openssl s_client -connect github.com:443 2>/dev/null |grep 'Cipher is'
New, TLSv1.3, Cipher is TLS_AES_128_GCM_SHA256

openssl s_client -connect svn.apache.org:443 2>/dev/null |grep 'Cipher is'
New, TLSv1.2, Cipher is ECDHE-RSA-AES256-GCM-SHA384

השרתים בהם יש בעייה לבצע checkout  ,  כן מספרים שהם תומכים ב TLS 1.2 אבל יש בעייה בהצעה עצמה :

New, (NONE), Cipher is (NONE)
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000


המעקף היחיד שמצאתי לדבר הזה הוא שימוש בקובץ openssl.cnf מיוחד עבור השירות הזה :

diff openssl.cnf unsecure_openssl.cnf 
361c361,362
< MinProtocol = TLSv1.2
---
> #MinProtocol = TLSv1.2
> MinProtocol = none
והשימוש כך :

$ OPENSSL_CONF=/tmp/unsecure_openssl.cnf git svn clone https://cloudservice.com/project/trunk                                                             
Initialized empty Git repository in /tmp/svn/trunk/.git/
r1 = 50dd6cc1cc8224a37e5bac80a5ba6ad88e01a96a (refs/remotes/git-svn)
        A        ar/messages/extragear-pim/kmobiletools.po
.
.
.
זהוא פתרון עקום ומחייב שימוש במשתנה הסביבה OPENSSL_CONF רק בשביל האפליקציה הספציפית שצריך, אבל לפחות זה לא פוגע בכל המערכת שלכם ועדיין אפשר לעבוד עם הספק הבעייתי.

יום שני, אפריל 01, 2019

KDEconnect bluetooth

לקח לי יותר מדי זמן לגלות את זה  אבל אפשר להשתמש ב kdeconnect  ע"ג ערוץ השן הכחולה (bluetooth).

חבל שבשביל להפעיל את העברה צריך תקשורת IP ואי אפשר פשוט לבצע peering אבל זה כבר משהוא טוב מכלום.

בשביל לבצע זאת צריך להקים רשת DUN בין המכשיר לבין רכיב השרת שלכם (אפשר ב Network Manager למשל).

לאחר שייצרתם את ה DUN יש לבצע peering של kdeconnect מהטלפון לרכיב השרת שלכם. ואז לאפשר ידנית כל אחד מההתקנים שאתם רוצים לשתף.


יום שלישי, מרץ 26, 2019

איך לבצע מיגרציה בין שרתי svn בצורה שקופה למשתמשים

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

גודל קובץ הdump הדחוס היה כ 3 ג"ב (היסטוריה של מעל 5 ג"ב) כולל מידע בינארי וטקסט.
שרת svn המקור - 10.1.1.1

כמות revisions בשרת המקור בעת יצרת קובץ גיבוי 100000
שרת svn היעד  svn.myrtfm.blogspot.com
יש לייצר שמות משתמש זהים דרך ממשק הניהול בשרת החד

דרישות קדם -
  • svnsync מותקן
  • svnrdump מתוקן
  • הרשאות קריאה לשרת המקור.
  • הרשאות כתיבה לשרת המקור.
  • מקום פנוי פי 1.5 בשרת היעד מגודל קובץ ה dump (במצב פרוס) בתהליך הטעינה.


 יצרת קובץ dump:
svnrdump dump http://10.1.1.1/svn/project > project.dump

טעינת קובץ ה dump בשרת היעד:

 svnrdump load project.dump http://svn.myrtfm.blogspot.com/project


הגדרת שירות svnsync על שרת היעד:

יש למצוא את ה uuid של שרת המקור (10.1.1.1) , מתבצע ע"י הרצת svn info כלפי שרת המקור והעתקת שדה ה UUID.

יש לייצר את את השדה sync-from-uuid עם ערך ה UUID שקיבלתם בשלב הקודם (החליפו את המילה UUID במה שקיבלת בשלב הקודם):

svn propset --revprop -r0 svn:sync-from-uuid UUID \
 http://svn.myrtfm.blogspot.com/project

יש להגדיר מהrevision האחרון שנטען לשרת svn.myrtfm.blogspot.com שישמש כהתחלה לביצוע sync:


svn propset --revprop -r0 \
svn:sync-last-merged-rev 100000   \
http://10.1.1.1/svn/project http://svn.myrtfm.blogspot.com/project

למרות שאצל הספק ממליצים לבצע שינוי שמות האנשים שביצעו קומיט