#!/usr/bin/perl # # /usr/local/sbin/localsendsms # Copyright 2009-2010, Jonas Smedegaard # # Send a message through Kannel use strict; use warnings; use utf8; # this document itself is UTF-8 encoded. use Env qw[$debug $info $warn $dummy $urldecode]; use Log::Log4perl qw(:easy); use Text::Unidecode; use Encode 2.12 qw(encode decode _utf8_off); # need v2.12 to support coderef use LWP::UserAgent; use URI::Escape; my $sms_url = $ENV{SMS_URL} || "http://localhost:13013/cgi-bin/sendsms"; my $sms_usertag = $ENV{SMS_USERTAG} || "username"; my $sms_user = $ENV{SMS_USER} || "tester"; my $sms_pw = $ENV{SMS_PW} || "foobar"; my $sms_api = $ENV{SMS_API}; my $sms_callback = $ENV{SMS_CALLBACK}; my $sms_phone = $ENV{SMS_PHONE}; my $sms_smsc = $ENV{SMS_SMSC}; my $sms_msgtag = $ENV{SMS_MSGTAG} || "text"; my $sms_cp = $ENV{SMS_CP} || "utf8"; my $sms_concatenation = $ENV{SMS_CONCATENATION}; my $sms_concat = $ENV{SMS_CONCAT}; my $sms_dlr_mask = $ENV{SMS_DLR_MASK}; my $sms_dlr_url = $ENV{SMS_DLR_URL}; my $sms_escalate = $ENV{SMS_ESCALATE}; my $sms_validity = $ENV{SMS_VALIDITY}; my $sms_req_feat = $ENV{SMS_REQ_FEAT}; my $sms_binfo = $ENV{SMS_BINFO}; my $stripprefix = $ENV{stripprefix}; # decode data if passed from kannel if ($urldecode) { @ARGV = uri_unescape(@ARGV); } my ($phone) = shift @ARGV; # strip international prefix # (prefix is optional some places and illegal at other places - forgot where) $phone =~ s/^\+//g if ($stripprefix); $sms_phone =~ s/^\+//g if ($stripprefix); if ($debug) { Log::Log4perl->easy_init($DEBUG); } elsif ($INFO) { Log::Log4perl->easy_init($INFO); } elsif ($WARN) { Log::Log4perl->easy_init($WARN); } elsif ($ERROR) { Log::Log4perl->easy_init($ERROR); } # based on Text::Unidecode bug#8017: http://rt.cpan.org/Ticket/Display.html?id=8017#txn-322351 sub transliterate { my $string = shift @_; my $res = decode('GSM0338', encode('GSM0338', $string, sub { my $ascii = unidecode(chr $_[0]); _utf8_off($ascii); $ascii; })); return $res || ''; } sub sendmsg { my ($from, $to, $desc, $msg) = @_; my $ua = LWP::UserAgent->new(agent => "localsendsms"); $ua->timeout(10); my $url = $sms_url . '?' . $sms_usertag . '=' . uri_escape($sms_user) . '&password=' . uri_escape($sms_pw) . '&to=' . uri_escape($to); $url .= '&api_id=' . uri_escape($sms_api) if ($sms_api); $url .= '&callback=' . uri_escape($sms_callback) if ($sms_callback); $url .= '&from=' . uri_escape($from) if ($from); $url .= '&smsc=' . uri_escape($sms_smsc) if ($sms_smsc); $url .= '&concatenation=true' if ($sms_concatenation); $url .= '&concat=' . uri_escape($sms_concat) if ($sms_concat); $url .= '&dlr-mask=' . uri_escape($sms_dlr_mask) if ($sms_dlr_mask); $url .= '&dlr-url=' . uri_escape($sms_dlr_url) if ($sms_dlr_url); $url .= '&escalate=' . uri_escape($sms_escalate) if ($sms_escalate); $url .= '&validity=' . uri_escape($sms_validity) if ($sms_validity); $url .= '&req_feat=' . uri_escape($sms_req_feat) if ($sms_req_feat); $url .= '&binfo=' . uri_escape($sms_binfo) if ($sms_binfo); $url .= '&' . $sms_msgtag . '=' . uri_escape(encode($sms_cp, $msg)); unless ($dummy) { DEBUG "Sending request: $url"; my $response = $ua->request(HTTP::Request->new('GET', $url)); unless ($response->is_success) { ERROR $response->status_line; } DEBUG "Done $desc"; } else { DEBUG "[DUMMY] Sending request: $url"; print STDERR "\n [$from --> $to: $desc]\n\n"; print STDERR $msg . "\n"; } } my $msg = join(' ', @ARGV); # FIXME: stop jugling with leading plus when no longer stripped from input $msg =~ s/(?<=\s)(36\d{9}\s)/+$1/g; &sendmsg($sms_phone, $phone, "message", &transliterate(decode('UTF-8', $msg))); 1;