Mój mały skrypcik

"Łukasz Indeka" 0h w wp.pl
Pią, 22 Maj 2009, 12:49:29 CEST


Witam,

Postanowiłem podzielić się moją radosną twóczością.
Ponieważ 5 smsów na dzień w Erze to czasami mało (zwłaszcza gdy
testuje się jakiś nowy skrypt), a mam dostęp do więcej niż
jednego konta na eraomnix (jak dobrze mieć rodzinę :D), od dawna
kombinowałem, jak to wykorzystać. Wreszcie od myślenia przeszedłem
do czynów i efekty przedstawiam poniżej. Oczywiście powinno to
również działać dla pozostałych bramek.

1. Skrypt
Krótki, ale skuteczny:

#!/bin/sh

# get phone numbers
phones=`cat $HOME/.smsnums`

# for each phone number
for num in $phones; do
    # use sms with phone specific settings
    /usr/local/bin/sms -c $HOME/.smsrc-$num "$@"
    if [ $? -eq 0 ]; then
        # break on success
        break
    else
        # rotate numbers on failure
        sed -i -e '1h;1d;$G' $HOME/.smsnums
    fi
done

Skrypt próbuje wywołać sms z kolejnymi plikami konfiguracyjnymi,
przekazująć pozostałe parametry wywołania. Jeśli wysłanie się
nie powiedzie, dane ustawienia są przerzucane na koniec listy. Jeśli
więc dzisiaj wysłałem już 5 smsów z pierwszego numeru telefonu i
przy kolejnej próbie wyskoczy błąd, to następne będą już
zaczynały próby od kolejnego numeru.

2. Konfiguracja
a) sms
W katalogu użytkownika tworzymy dla każdego konta osobny plik
konfiguracyjny. Ja przyjąłem schemat .smsrc-numer_telefonu (może
być cokolwiek). Przy okazji konfiguracja dla mojego numeru została
podlinkowana do ~/.smsrc żeby się nie narażać na rozjechanie zbyt
wielu konfiguracji.

b) skryptu
Lista dostępnych konfiguracji jest zapisywana w pliku $HOME/.smsnums U
mnie plik wygląda mniej więcej tak:
600123456
600456789
600789456

Jak widać w pliku zapisuję tylko część nazwy pliku
konfiguracyjnego po myślniku.



Przy okazji testów okazało się, że wywołanie z sms z parametrem
-c $HOME/.smsrc nie jest równoważne wywołaniu bez tego parametru.
Wynika to z tego, że funkcja Config::ReRead nie uwzględnia ustawień z
konstruktora klasy Config, a jedynie czyści wszystkie parametry ustawione
wcześniej. Skutkuje to brakiem wartości domyślnych dla mailaddr i
template. Długo się głowiłem co się dzieje, bo cały czas
wyskakiwał mi błąd. Okazało się, że w plikach konfiguracyjnych
zakomentowałem linię ustawiającą template, bo zależało mi
akurat na wykorzystaniu wartości domyślnej opisanej w dokumentacji. :)

Ostatecznie przekopiowałem więc kawałek kodu z konstrktora.
Zastanawiałem się czy wstawić tylko część z params, ale
ostatecznie wybrałem wszystko. Diff poniżej:

--- /home/tests/packages/sms/sms-2.2.3/config.cc        2009-01-17
15:14:10.000000000 +0100
+++ /home/tests/packages/sms/sms-2.2.3-mod/config.cc    2009-05-08
15:09:15.000000000 +0200
@@ -37,6 +37,11 @@
 void Config::ReRead(const std::string &name)
 {
        params.clear();
+       // domsylne zmienne z pliku koniguracyjnego
+       params["mailaddr"] = EmailAddress();
+       params["template"] = "${message}";
+       ReadFile(string(SMS_SYSCONFDIR) + "/" + SMS_CONFIG);
+       ReadEnv();
        ReadFile(name);
 }


Pozdrawiam,
   Łukasz
-- 
Łukasz Indeka
  0h w wp.pl


Więcej informacji o liście dyskusyjnej Sms-users