Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Mam zgryza i to dość konkretnego. Napisałem sobie "moduł" do perla, niby zgodnie z zaleceniami itd itp jednak coś mi nie bangla.
moduł wygląda tak: http://wklej.tk/pnipny4wp/roz9nm
Skrypt testujący moduł wygląda tak: http://wklej.tk/pxuvlaz1n/8himm9/
I jest mały zonk bo jak odpale sobie test modułu to mam:
root@s1:~/tmp# ./test_module.pl Deep recursion on subroutine "i18n::_concat" at /usr/share/perl/5.14/Carp.pm line 345. Deep recursion on subroutine "Carp::trusts" at /usr/share/perl/5.14/Carp.pm line 284. Deep recursion on subroutine "Carp::get_status" at /usr/share/perl/5.14/Carp.pm line 323. Deep recursion on subroutine "Carp::trusts_directly" at /usr/share/perl/5.14/Carp.pm line 170. Deep recursion on subroutine "Carp::trusts" at /usr/share/perl/5.14/Carp.pm line 285. Deep recursion on subroutine "Carp::get_status" at /usr/share/perl/5.14/Carp.pm line 323. Deep recursion on subroutine "Carp::trusts_directly" at /usr/share/perl/5.14/Carp.pm line 170. Deep recursion on subroutine "Carp::get_status" at /usr/share/perl/5.14/Carp.pm line 330. Deep recursion on subroutine "Carp::trusts_directly" at /usr/share/perl/5.14/Carp.pm line 170.
Jeśli z modułu z funkcji "BadAss()" usunę wywołanie
notify($data);
to wtedy wszsytko bangla jak powinno....
Sama funkcja "notify()" jest poprawna bo korzystam z niej w innym skrypcie. Nie chce jej wywalać z "modułu" bo będzie wykorzystywana w innych skryptach a nie chce mi się jej za każdym razem przepisywać (w końcu po to są moduły i funkcje żeby je pisać raz a nie milion razy w każdym skrypcie)
Jeśli ktoś ma pomysła co i dlaczego jest zjebane będę bardzo zobowiązany. Próbowałem zamienić kolejnością funkcje BadAss() i notify() ale bez rezultatu...
Offline
Pewnie $data przyjmuje różne dziwne wartości, które Perl traktuje poważnie, ja kiedyś musiałem dać:
my @vlcstart = ("$odtwarzacz \"$adres\" 2>&1>/dev/null &" );
bo miałem podobne klocki ze zmienną, na szczęście nie w module, ino w skrypcie. ;)
Ostatnio edytowany przez Jacekalex (2015-03-29 18:24:42)
Offline
To nie to bo nawet jak zrobie wywołanie:
notify("dupa") to nie bangla
Buntuje się do samej funkcji notify i
use MIME::Lite; use MIME::Base64; use Encode;
Natomiast jak wywale te use to nie bardzo chcą działać wywołania, np:
MIME::Base64::encode_base64()
Offline
A jak dasz "z drugiej strony"?
sub notify{ my ($body) = @_; my $msg = MIME::Lite->build( From => 'USER <user@example.com>', To => 'user@example.org', Subject => '=?UTF-8?B?'.encode_base64(encode('utf8', 'BadAss Detected')).'?=', Type => 'TEXT', Encoding => 'quoted-printable', Data => "$body", ); $msg->attr("Content-type" => "text/plain"); $msg->attr("content-type.charset" => "UTF-8"); $msg->send('smtp', 'server.example.com', AuthUser=>'user@example.com', AuthPass=>'secretpass'); }
Bo wygląda na to, że chodzi o jakiś duperel.
Zapuść do skrypta:
use diagnostics -vebose;
Wtedy powie dokładniej, co go boli.
PS:
Subject => '=?UTF-8?B?'.encode_base64(encode('utf8', 'BadAss Detected')).'?=',
To mi się przyda w innym skrypcie. ;)
Ostatnio edytowany przez Jacekalex (2015-03-29 19:05:11)
Offline
z diagnostic:
DESCRIPTION OF DIAGNOSTICS These messages are classified as follows (listed in increasing order of desperation): (W) A warning (optional). (D) A deprecation (enabled by default). (S) A severe warning (enabled by default). (F) A fatal error (trappable). (P) An internal error you should never see (trappable). (X) A very fatal error (nontrappable). (A) An alien error message (not generated by Perl). The majority of messages from the first three classifications above (W, D & S) can be controlled using the warnings pragma. If a message can be controlled by the warnings pragma, its warning category is included with the classification letter in the description below. Severe warnings are always enabled, unless they are explicitly disabled with the warnings pragma or the -X switch. Trappable errors may be trapped using the eval operator. See "eval" in perlfunc. In almost all cases, warnings may be selectively disabled or promoted to fatal errors using the warnings pragma. See warnings. Deep recursion on subroutine "i18n::_concat" at /usr/share/perl/5.14/Carp.pm line 345 (#1) (W recursion) This subroutine has called itself (directly or indirectly) 100 times more than it has returned. This probably indicates an infinite recursion, unless you're writing strange benchmark programs, in which case it indicates something else. This threshold can be changed from 100, by recompiling the perl binary, setting the C pre-processor macro PERL_SUB_DEPTH_WARN to the desired value. Deep recursion on subroutine "warnings::enabled" at /usr/local/share/perl/5.14.2/i18n.pm line 108 (#1) Deep recursion on subroutine "warnings::__chk" at /usr/share/perl/5.14/warnings.pm line 394 (#1) Deep recursion on subroutine "Carp::short_error_loc" at /usr/share/perl/5.14/warnings.pm line 389 (#1) Deep recursion on subroutine "Carp::trusts" at /usr/share/perl/5.14/Carp.pm line 284 (#1) Deep recursion on subroutine "Carp::get_status" at /usr/share/perl/5.14/Carp.pm line 323 (#1) Deep recursion on subroutine "Carp::trusts_directly" at /usr/share/perl/5.14/Carp.pm line 170 (#1) Deep recursion on subroutine "Carp::trusts" at /usr/share/perl/5.14/Carp.pm line 285 (#1) Deep recursion on subroutine "Carp::get_status" at /usr/share/perl/5.14/Carp.pm line 330 (#1)
Bolą go (tylko nie wiem dlaczego) encode_base64 i encode z cpanów MIME::Base64 i Encode i MIME::Lite...
Dobra najwyżej na razie wywalę powiadomienia mailowe i obejdę się bez tego w sumie to taki niekrytyczny ficzer.
Offline
while (<STDIN>) { $mailbody = $_; } notify($mailbody); sub notify{ my ($body) = @_; my $msg = MIME::Lite->build( From => "$mailfrom", To => "$mailto", Subject => '=?UTF-8?B?'.encode_base64(encode('utf8', 'BadAss Detected')).'?=', Type => 'TEXT', Encoding => 'quoted-printable', Data => "$body", ); $msg->attr("Content-type" => "text/plain"); $msg->attr("content-type.charset" => "UTF-8"); # $msg->send('smtp', "$serwer", AuthUser=>"$authuser", AuthPass=>"$authpass" , Port => 587); # $msg->send('sendmail'); $msg->send("sendmail", "/usr/sbin/sendmail -t -i"); }
To wysyła grzecznie, ale źle koduje Subject, TB go wyświetla jako:
=?UTF-8?B?QmFkQXNzIERldGVjdGVk ?=
Do serwera SMTP nie umie się zalogować, bo tam bez TLS/SSL nie ma autoryzacji, a Mimie::Lite chyba nie potrafi po TLS wysyłać.
W Body tekst:
grzegżółka i różyczka na łączce
przeszedł poprawnie.
Offline
my bad, zapomniałem o jednym "" ;)
"=?UTF-8?B?".encode_base64(encode("utf8", 'BadAss Detected'),"")."?=",
Ale w moim przypadku to i tak nic nie zmienia dalej krzyczy o recursion ;]
Offline
A u mnie, jak w skrypcie w zmiennej jest temat, to jest poprawny, a jak go czyta z ARGV = to wygląda tak:
GrzegżóÅka i Różyczka na ÅÄ czce
Prawidłowo powinno być:
Grzegżółka i Różyczka na łączce
Poza tym NET-SMTP-TLS nie gada z Postfixem z powodu "self signed cert", po tym, jak mu przerobiłem zawartość, żeby akceptował TLSv12, a MIME:;LITE w ogóle z szyfrowanymi serwerami nie gada.
Poza tym wysyła maile jak burza przez sendmaila.
Aktualny rysopis:
#!/usr/bin/perl -w use warnings; use strict; use diagnostics -verbose; use base qw(Exporter); use utf8; use MIME::Lite; use MIME::Base64; use Encode; use Net::SMTP::TLS; use Net::SMTP::SSL; my $serwer = "127.0.0.1"; my $authuser = "pacjent\@domena.tld"; my $authpass = "<hasełko>"; my $mailto = "adresat\@domena.tld"; my $mailfrom = "pacjent\@domena.tld"; my $mailbody = ""; my $subj = "Grzegżółka i Różyczka na łączce"; my $subj2 = $ARGV[0]; print "$subj2\n" if $subj2; my $msg=""; local $/; while (<STDIN>) { $mailbody = $_; }; notify($mailbody); sub notify{ my ($body) = @_; my $msg = MIME::Lite->build( From => "$mailfrom", To => "$mailto", Subject => "=?UTF-8?B?".encode_base64(encode("utf8", "$subj2"),"")."?=", Type => 'TEXT', Encoding => 'quoted-printable', Data => "$body", ); $msg->attr("Content-type" => "text/plain"); $msg->attr("content-type.charset" => "UTF-8"); # $msg->send('smtp', "$serwer", AuthUser=>"$authuser", AuthPass=>"$authpass" , Port => 587); $msg->send("sendmail", "/usr/sbin/sendmail -t -i"); } my $mailer = new Net::SMTP::TLS( '127.0.0.1', Port => '587', User => "$authuser", Password=> "$authpass", ssl_verify => 'none' ); $mailer->mail("$mailfrom"); $mailer->to("$mailto"); $mailer->data; $mailer->datasend($msg->as_string); $mailer->dataend; $mailer->quit;
Może się przyda.
U Ciebie funkcja data jest podobna, ino nie łapie zmiennej, która u mnie wchodzi z <STDIN> w dowolnej formie.
Sugerowałbym dokładnie sprawdzić wszystkie kropki, przecinki i spacje. ;)
Ostatnio edytowany przez Jacekalex (2015-03-30 02:20:06)
Offline
@Jacekalex - jak już wyżej pisałem - funkcja notify() jest ^C^V z innego skryptu w którym to działa i jest wykorzystywane na co dzień. Polskimi ogonkami też się nie martwię bo:
* wszsytko gada u mnie w UTF8
* nie używam w $data czy innych polskich ogonków.
Co do TLS to też nie problem bo akurat cert mam poprawny a nie self-signed. Poza tym buntuje się do modułu Carp/CGI::Carp w strace jedyne co wyczaiłem to (o ile pamiętam, jutro wrzucę całego) to "cannot use Carp because Carp depends on us".
Offline
A możesz spróbować na aktualnym Perlu?
Bo jedziesz na 5.14, a aktualnie już jest
dev-lang/perl-5.20.1-r4
Co oznacza, ze niektóre moduły regularnie aktualizowane mogą tracić kompatybilność z językiem.
Poza tym, jak się wywala na notify($data) to oznacza, ze coś dziwnego jest w tej zmiennej $data,
i być może trzeba ją potraktować jakąś specjalnie.
Czy to jest zmienna wieloliniowa?
Pytam, bo właśnie wysłałem przez mailperla cały dmesg, i doszedł w wiadomości dokładnie co do przecinka.
Jak obczaję, dlaczego rozsypuje się temat, kiedy jest wczytywany z ARGV, to spamrobot będzie gotowy. :D
Potem dorobimy mu jakiegoś GetOpta do zabawy.
Oczywiście kiedyś będzie częścią czegoś dużo większego, ale dopracowany skrypcik się przyda zawsze "na potem". xD
Pozdro
;-)
Ostatnio edytowany przez Jacekalex (2015-03-30 02:19:26)
Offline
Jacekalex napisał(-a):
Poza tym, jak się wywala na notify($data) to oznacza, ze coś dziwnego jest w tej zmiennej $data,
i być może trzeba ją potraktować jakąś specjalnie.
Czy to jest zmienna wieloliniowa?
winnetou napisał(-a):
bo nawet jak zrobie wywołanie:
notify("dupa") to nie bangla
Może się nie znam ale "dupa" to nie jest jakiś wielolinijkowy tekst ;]
A co do perla to w debianie wheezy nowszego nie ma. Aktualizacja do jessie/sid nie wchodzi w rachubę.
Poza tym (co wynikało niejako z poprzednich postów) nie dochodzi do wysłania maila
"moduł" wypierdala się w momencie wywołania funkcji
* encode_base64
* encode
oraz
* MIME::Lite->build
Nie pomaga zmiana
use MIME::Base64
na
use MIME::Base64 qw(encode_base64)
i analogicznie dla Encode i MIME::Lite.
Jeśli usunę inkludowanie modułów MIME::Lite, MIME::Base64 i Encode i odowłania encode_base64 oraz encode zastąpię przez
MIME::Base64::encode_base64 i Encode::Encode to dalej jest kupa bo perl -c skrypt krzyczy "wywołanie nieznanej funkcji - może zapominałeś o module"
Offline
Ciekawostka:
package Win::Notifier; use strict; use warnings; use base qw(Exporter); use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); use i18n "/home/winnetou/perl/i18n"; use diagnostics -verbose; use utf8; $VERSION = 1.00; @ISA = qw(Exporter); @EXPORT = (); @EXPORT_OK = qw(viaSMS); %EXPORT_TAGS = ( all => [qw(&viaSMS)], ); binmode STDOUT, ":utf8"; sub viaSMS{ my ($user, $script, $msg) = @_; my $txt = "$user => $script => $msg"; print "$txt"; return 1; } 1;
i test modułu:
#!/usr/bin/perl BEGIN { push @INC, '/home/winnetou/perl/modules' } use strict; use warnings; use utf8; use i18n "/home/winnetou/perl/i18n"; use DAP::Notifier qw(:all); use diagnostics -verbose; my $user = "jakis_login"; print "Calling notify viaSMS\n"; viaSMS($user,$0,"no zjebał coś") or die "nope nope nope!";
winnetou@myhost:~/tmp$ ./modtest2.pl Calling notify viaSMS DESCRIPTION OF DIAGNOSTICS These messages are classified as follows (listed in increasing order of desperation): (W) A warning (optional). (D) A deprecation (enabled by default). (S) A severe warning (enabled by default). (F) A fatal error (trappable). (P) An internal error you should never see (trappable). (X) A very fatal error (nontrappable). (A) An alien error message (not generated by Perl). The majority of messages from the first three classifications above (W, D & S) can be controlled using the warnings pragma. If a message can be controlled by the warnings pragma, its warning category is included with the classification letter in the description below. Severe warnings are always enabled, unless they are explicitly disabled with the warnings pragma or the -X switch. Trappable errors may be trapped using the eval operator. See "eval" in perlfunc. In almost all cases, warnings may be selectively disabled or promoted to fatal errors using the warnings pragma. See warnings. Deep recursion on subroutine "i18n::_concat" at /usr/share/perl/5.14/Carp.pm line 345 (#1) (W recursion) This subroutine has called itself (directly or indirectly) 100 times more than it has returned. This probably indicates an infinite recursion, unless you're writing strange benchmark programs, in which case it indicates something else. This threshold can be changed from 100, by recompiling the perl binary, setting the C pre-processor macro PERL_SUB_DEPTH_WARN to the desired value. Deep recursion on subroutine "warnings::enabled" at /usr/local/share/perl/5.14.2/i18n.pm line 108 (#1) Deep recursion on subroutine "warnings::__chk" at /usr/share/perl/5.14/warnings.pm line 394 (#1) Deep recursion on subroutine "Carp::short_error_loc" at /usr/share/perl/5.14/warnings.pm line 389 (#1) Deep recursion on subroutine "Carp::trusts" at /usr/share/perl/5.14/Carp.pm line 284 (#1) Deep recursion on subroutine "Carp::get_status" at /usr/share/perl/5.14/Carp.pm line 323 (#1) Deep recursion on subroutine "Carp::trusts_directly" at /usr/share/perl/5.14/Carp.pm line 170 (#1) Deep recursion on subroutine "Carp::trusts" at /usr/share/perl/5.14/Carp.pm line 285 (#1) Deep recursion on subroutine "Carp::get_status" at /usr/share/perl/5.14/Carp.pm line 330 (#1) ^C
ALE!.. Jak funkcja viaSMS będzie wyglądać tak:
sub viaSMS{ print "@_"; return 1; }
To wszystko wykona się prawidłowo! Czyli tak jakbym mu się nie podobała konkatenacja stringów...
nawet na takim czymś
sub viaSMS{ print "@_\n"; return 1; }
się wywala i musi być tak
sub viaSMS{ print "@_"; print "\n"; return 1; }
Nadal nie rozumiem dlaczego buntuje się do modułów Carp... Spróbuję jeszcze przechwycić $SIG{__WARN__} i $SIG{__DIE__}
Offline
Na moje oko kilka errorow.
Deep recursion on subroutine "warnings::enabled" at
Jak dasz
# use warnings;
dalej jest ten error?
Może po prostu zajrzeć, co tam się dzieje w tych modułach, ja już przez 2 dni poprawiałem NEt::SMTP::TLS i zrobiłem drobną zmianę w MIME::Lite, także mnie już w tych modach nic nie zdziwi. :D
Ostatnio edytowany przez Jacekalex (2015-03-30 20:45:50)
Offline
Po wywaleniu "use warnings" i "use utf8" dalej tego samego... Skoro nie chce gadać przez moduł to zrobimy obejście (require)
Offline
To chyba do Ciebie:
package Carp; { use 5.006; } use strict; use warnings; BEGIN { # Very old versions of warnings.pm load Carp. This can go wrong due # to the circular dependency. If warnings is invoked before Carp, # then warnings starts by loading Carp, then Carp (above) tries to # invoke warnings, and gets nothing because warnings is in the process # of loading and hasn't defined its import method yet. If we were # only turning on warnings ("use warnings" above) this wouldn't be too # bad, because Carp would just gets the state of the -w switch and so # might not get some warnings that it wanted. The real problem is # that we then want to turn off Unicode warnings, but "no warnings # 'utf8'" won't be effective if we're in this circular-dependency # situation. So, if warnings.pm is an affected version, we turn # off all warnings ourselves by directly setting ${^WARNING_BITS}. # On unaffected versions, we turn off just Unicode warnings, via # the proper API. if(!defined($warnings::VERSION) || eval($warnings::VERSION) < 1.06) { ${^WARNING_BITS} = ""; } else { "warnings"->unimport("utf8"); } }...
U mnie pliczek:
/usr/lib64/perl5/5.20.1/Carp.pm
ma kilka podobnych ostrzeżeń.
Zobacz:
#!/usr/bin/perl -w use warnings; my $dupa = $warnings::VERSION; print $dupa;
wynik:
perl testwarn 1.23
A u Ciebie?
Bo coś mi się zdaje, że ten Twój Perl jest troszkę za stary na takie zabawy.
W perlu szósta wersja tamu nazad, to gruba przesada, kiedy już jest 5.20, to poniżej 5.16 sporo rzeczy zaczyna się sypać (i mają do tego pełne prawo). :D
W Gentusiu:
[i] dev-lang/perl Available versions: {M}5.18.2-r2(0/5.18){tbz2} 5.20.1-r4(0/5.20){tbz2} ~5.20.2(0/5.20) {berkdb debug doc gdbm ithreads} Installed versions: 5.20.1-r4{tbz2}(17:17:06 20.02.2015)(berkdb gdbm ithreads -debug -doc)
Offline
Ehh czepiasz się najpierw TLSa a potem wersji. Toć napisałem wyraźnie, że nie mam możliwości aktualizacji do nowszej wersji Debiana. Jak załatwisz w Debian Team żeby w 7.8 (do głównego repo a nie jakiś dziwnych backportów) wrzucili perla 5.20.x albo chociaż 5.18.x... Jakby była możliwość aktualizacji to zrobiłbym to w pierwszej kolejności...
Niestety jestem skazany na Debiana w takiej a nie innej wersji i do tego muszę się dostosować. Jakby się dało zainstalować na tej maszynie gentoo/*bsd to już by tam dawno stało.
Wracając do tematu
require "/sciezka/do/skryptu.pl";
Obejście na razie działa więc skorzystam z tej opcji.
Offline
Wytrzymasz te kilka miechów, aż stable będzie Jessie. ;)
Offline
Strony: 1