summaryrefslogtreecommitdiff
path: root/localsendsms
blob: 7ba5ccb414c9b4c80ebaf310f5f2415a4a140a5d (plain)
  1. #!/usr/bin/perl
  2. #
  3. # /usr/local/sbin/localsendsms
  4. # Copyright 2009-2010, Jonas Smedegaard <dr@jones.dk>
  5. #
  6. # Send a message through Kannel
  7. use strict;
  8. use warnings;
  9. use utf8; # this document itself is UTF-8 encoded.
  10. use Env qw[$debug $info $warn $dummy $urldecode];
  11. use Log::Log4perl qw(:easy);
  12. use Text::Unidecode;
  13. use Encode 2.12 qw(encode decode _utf8_off); # need v2.12 to support coderef
  14. use LWP::UserAgent;
  15. use URI::Escape;
  16. my $sms_url = $ENV{SMS_URL} || "http://localhost:13013/cgi-bin/sendsms";
  17. my $sms_usertag = $ENV{SMS_USERTAG} || "username";
  18. my $sms_user = $ENV{SMS_USER} || "tester";
  19. my $sms_pw = $ENV{SMS_PW} || "foobar";
  20. my $sms_api = $ENV{SMS_API};
  21. my $sms_callback = $ENV{SMS_CALLBACK};
  22. my $sms_phone = $ENV{SMS_PHONE};
  23. my $sms_smsc = $ENV{SMS_SMSC};
  24. my $sms_msgtag = $ENV{SMS_MSGTAG} || "text";
  25. my $sms_cp = $ENV{SMS_CP} || "utf8";
  26. my $sms_concatenation = $ENV{SMS_CONCATENATION};
  27. my $sms_concat = $ENV{SMS_CONCAT};
  28. my $sms_dlr_mask = $ENV{SMS_DLR_MASK};
  29. my $sms_dlr_url = $ENV{SMS_DLR_URL};
  30. my $sms_escalate = $ENV{SMS_ESCALATE};
  31. my $sms_validity = $ENV{SMS_VALIDITY};
  32. my $sms_req_feat = $ENV{SMS_REQ_FEAT};
  33. my $sms_binfo = $ENV{SMS_BINFO};
  34. my $stripprefix = $ENV{stripprefix};
  35. # decode data if passed from kannel
  36. if ($urldecode) {
  37. @ARGV = uri_unescape(@ARGV);
  38. }
  39. my ($phone) = shift @ARGV;
  40. # strip international prefix
  41. # (prefix is optional some places and illegal at other places - forgot where)
  42. $phone =~ s/^\+//g if ($stripprefix);
  43. $sms_phone =~ s/^\+//g if ($stripprefix);
  44. if ($debug) {
  45. Log::Log4perl->easy_init($DEBUG);
  46. } elsif ($INFO) {
  47. Log::Log4perl->easy_init($INFO);
  48. } elsif ($WARN) {
  49. Log::Log4perl->easy_init($WARN);
  50. } elsif ($ERROR) {
  51. Log::Log4perl->easy_init($ERROR);
  52. }
  53. # based on Text::Unidecode bug#8017: http://rt.cpan.org/Ticket/Display.html?id=8017#txn-322351
  54. sub transliterate {
  55. my $string = shift @_;
  56. my $res = decode('GSM0338', encode('GSM0338', $string, sub {
  57. my $ascii = unidecode(chr $_[0]);
  58. _utf8_off($ascii);
  59. $ascii;
  60. }));
  61. return $res || '';
  62. }
  63. sub sendmsg {
  64. my ($from, $to, $desc, $msg) = @_;
  65. my $ua = LWP::UserAgent->new(agent => "localsendsms");
  66. $ua->timeout(10);
  67. my $url = $sms_url
  68. . '?' . $sms_usertag . '=' . uri_escape($sms_user)
  69. . '&password=' . uri_escape($sms_pw)
  70. . '&to=' . uri_escape($to);
  71. $url .= '&api_id=' . uri_escape($sms_api) if ($sms_api);
  72. $url .= '&callback=' . uri_escape($sms_callback) if ($sms_callback);
  73. $url .= '&from=' . uri_escape($from) if ($from);
  74. $url .= '&smsc=' . uri_escape($sms_smsc) if ($sms_smsc);
  75. $url .= '&concatenation=true' if ($sms_concatenation);
  76. $url .= '&concat=' . uri_escape($sms_concat) if ($sms_concat);
  77. $url .= '&dlr-mask=' . uri_escape($sms_dlr_mask) if ($sms_dlr_mask);
  78. $url .= '&dlr-url=' . uri_escape($sms_dlr_url) if ($sms_dlr_url);
  79. $url .= '&escalate=' . uri_escape($sms_escalate) if ($sms_escalate);
  80. $url .= '&validity=' . uri_escape($sms_validity) if ($sms_validity);
  81. $url .= '&req_feat=' . uri_escape($sms_req_feat) if ($sms_req_feat);
  82. $url .= '&binfo=' . uri_escape($sms_binfo) if ($sms_binfo);
  83. $url .= '&' . $sms_msgtag . '=' . uri_escape(encode($sms_cp, $msg));
  84. unless ($dummy) {
  85. DEBUG "Sending request: $url";
  86. my $response = $ua->request(HTTP::Request->new('GET', $url));
  87. unless ($response->is_success) {
  88. ERROR $response->status_line;
  89. }
  90. DEBUG "Done $desc";
  91. } else {
  92. DEBUG "[DUMMY] Sending request: $url";
  93. print STDERR "\n [$from --> $to: $desc]\n\n";
  94. print STDERR $msg . "\n";
  95. }
  96. }
  97. my $msg = join(' ', @ARGV);
  98. # FIXME: stop jugling with leading plus when no longer stripped from input
  99. $msg =~ s/(?<=\s)(36\d{9}\s)/+$1/g;
  100. &sendmsg($sms_phone, $phone, "message", &transliterate(decode('UTF-8', $msg)));
  101. 1;