Start the session bus of DBus with Perl Net::DBus - perl

I am using Perl and the Net::DBus module. I wrote a simple test program:
#!/usr/bin/perl
use strict;
use warnings;
package MyObj;
use Net::DBus::Exporter qw(org.example.Tao);
use base qw(Net::DBus::Object);
sub new {
my $class = shift;
my $service = shift;
my $self = $class->SUPER::new($service, '/MyObj');
bless $self, $class;
return $self;
}
dbus_method("Hello", ["string"]);
sub Hello {
return 'Hello';
}
package main;
use Net::DBus;
use Net::DBus::Reactor;
my $bus = Net::DBus->session;
my $service = $bus->export_service("org.example.Tao");
my $object = MyObj->new($service);
my $reactor = Net::DBus::Reactor->main();
$reactor->run();
return 0;
I am connecting by ssh and using:
Perl, v5.8.8 built for x86_64-linux-thread-multi
Linux example.com 2.6.32.19-0.2.99.17.22250fd-xen #1 SMP 2010-09-13 10:16:50 +0200 x86_64 x86_64 x86_64 GNU/Linux
CentOS release 5.4 (Final)
When I try to start my test.pl, I get the error:
org.freedesktop.DBus.Error.Spawn.ExecFailed:
Failed to execute dbus-launch to autolaunch D-Bus session
This error is raised by this line:
my $bus = Net::DBus->session;
Google hinted to me about dbus-launch. I executed yum install dbus-x11.
I try start my test code again and get error in the same line:
org.freedesktop.DBus.Error.Spawn.ExecFailed:
dbus-launch failed to autolaunch D-Bus session:
Autolaunch error: X11 initialization failed.
After read manuals, I detect that DBUS session daemon isn't started and my ENV var DBUS_SESSION_BUS_ADDRESS is empty:
[root#zion perl]# ps ax|grep dbus|grep -v grep
1019 ? Ss 0:00 dbus-daemon --system
Then I exec:
[root#zion perl]# dbus-launch --sh-syntax
DBUS_SESSION_BUS_ADDRESS='unix:abstract=/tmp/dbus-smHadq6yxV,guid=101ccd74fb75ae501485ed004e2a9043';
export DBUS_SESSION_BUS_ADDRESS;
DBUS_SESSION_BUS_PID=5037;
[root#zion perl]# ps ax|grep dbus|grep -v grep
1019 ? Ss 0:00 dbus-daemon --system
5037 ? Ss 0:00 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session
But DBUS_SESSION_BUS_ADDRESS is same empty.
Question:
I need simple two Perl apps. The first app registers the dbus session service. Another app using my registered service. What is the best and correct way to do it in my environment?

First of all, you need to eval dbus-launch output. Like this:
$ env | grep DBUS
(empty output; no DBUS session bus launched yet)
$ eval `dbus-launch --sh-syntax`
(empty output; DBUS session bus started, output is evaluated to set shell vars)
$ env | grep DBUS
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-ZkMjn6B47b,guid=85b2da814a8a061d4e7a55004e35b499
Second, you should consider how are you going to use your apps. Try to answer yourself these questions: why are you trying to bind to session bus (which is by definition a bus, associated with an interactive user session)? If this is a system-wide service, it should bind to system bus. If it is a user service, user session manager should take care of starting dbus session bus.

Related

How to correctly display messages in console?

I use mojolicious application. When I do logging all if fine, except when I run application under morbo I see text like:
$app->log->info('тест лога');
[Sat Oct 6 15:22:43 2018] [info] �е�� лога
here is some problem with utf8.
What should I do that messages will be correctly displayed?
My terminal have support for utf8. I run Linux Mint v19.3
Here is how messages looks which come from script:
Test terminal:
Don't use the following when using Mojo::Log to write to STDERR:
binmode STDERR, ':encoding(UTF-8)';
Mojo::Log explicitly encodes everything it logs using UTF-8, even when writing to STDERR.
sub append {
my ($self, $msg) = #_;
return unless my $handle = $self->handle;
flock $handle, LOCK_EX;
$handle->print(encode('UTF-8', $msg)) or croak "Can't write to log: $!";
flock $handle, LOCK_UN;
}
When using STDERR as the log output (the default), this conflicts with the well-established practice of adding an encoding layer to STD*. In such a circumstance, double-encoding occurs.
One must therefore avoid doing
binmode STDERR, ':encoding(UTF-8)';
Note that this is done as part of
use open ':std', ':encoding(UTF-8)';
Try to run following code sample in your system. The test confirmed with correct UTF-8 output in terminal
#!/usr/bin/env perl
use Mojolicious::Lite -signatures;
get '/' => sub ($c) {
$c->render(text => 'Hello World!');
};
app->log->info('тест лога');
app->start;
Run as morbo test.pl produces following output
:u99257852:~/work/perl/mojo$ morbo ./test.pl
Web application available at http://127.0.0.1:3000
[2020-10-31 13:33:57.42056] [83940] [info] тест лога
[2020-10-31 13:35:16.72465] [83940] [debug] [hga9Tgyy] GET "/"
[2020-10-31 13:35:16.72528] [83940] [debug] [hga9Tgyy] Routing to a callback
[2020-10-31 13:35:16.72574] [83940] [debug] [hga9Tgyy] 200 OK (0.001078s, 927.644/s)
(uiserver):u99257852:~/work/perl/mojo$
Tested locally with nc localhost 3000
(uiserver):u99257852:~$ nc localhost 3000
GET / HTTP/1.1
HTTP/1.1 200 OK
Date: Sat, 31 Oct 2020 17:35:16 GMT
Server: Mojolicious (Perl)
Content-Type: text/html;charset=UTF-8
Content-Length: 12
Hello World!
Output of uname -a
(uiserver):u99257852:~/work/perl/mojo$ uname -a
Linux infongwp-us19 4.4.223-icpu-044 #2 SMP Sun May 10 11:26:44 UTC 2020 x86_64 GNU/Linux
(uiserver):u99257852:~/work/perl/mojo$
Bash is user's shell configured with ~/.bashrc with following settings to support UTF-8
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8:

Selenium headless does not run on CentOS 7 with Perl, "no display specified"

I try to run headless Selenium on CentOS7:
# cat /etc/os-release
NAME="Red Hat Enterprise Linux Server"
VERSION="7.2 (Maipo)"
I installed Xvfb and run it as
# /usr/bin/Xvfb :99
I installed firefox:
# firefox -v
Mozilla Firefox 38.5.0
and run it to check if it can be run at all:
# export DISPLAY=:99
# firefox
This is the output:
# firefox
Xlib: extension "RANDR" missing on display ":99".
console.error:
[CustomizableUI]
Custom widget with id loop-button does not return a valid node
console.error:
[CustomizableUI]
Custom widget with id loop-button does not return a valid node
GLib-GIO-Message: Using the 'memory' GSettings backend. Your settings will not be saved or shared with other applications.
Firefox seems to be running after that command:
# ps aux | grep firefox
root 29476 7.3 14.9 852356 152256 pts/3 Sl+ 10:30 0:03 /usr/lib64/firefox/firefox
EDIT
Yes, it's running. Taking screenshot from the Xvfb by
DISPLAY=:99 import -window root -crop 1264x948+0+0 /tmp/screenshot.jpg
I can see
Now the problematic part.
I installed Selenium Remote Driver for perl
# cpanm Selenium::Remote::Driver
Then I ran standalone selenium driver:
# java -jar selenium-server-standalone-2.49.0.jar
Now I run test script:
#!/usr/bin/perl
use strict;
use warnings;
use Selenium::Remote::Driver;
my $driver = Selenium::Remote::Driver->new(browser_name=>'firefox');
$driver->get('http://www.google.com');
print $driver->get_title();
$driver->quit();
After 45 second I get error from the driver:
Could not create new session: Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms. Firefox console output:
Error: no display specified
at (eval 89) line 510.
Seems like firefox launched by the driver does not see DISPLAY environment variable. I try to add it from the script:
#!/usr/bin/perl
use strict;
use warnings;
use Selenium::Remote::Driver;
$ENV{DISPLAY}=":99";
my $driver = Selenium::Remote::Driver->new(browser_name=>'firefox');
$driver->get('http://www.google.com');
print $driver->get_title();
$driver->quit();
It does not help, the previous error remains.
What do I do?
EDIT2
I tried the current setup with Python. All works.
# pip install selenium
And used the following test script:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("http://www.python.org")
f = open('ptn-sel.txt', 'w')
f.write(driver.title)
driver.close()
f.close()
I understand it's problem of Perl driver.... Any suggestions?
Is python using the standalone server or running firefox itself?
If perl is using the server and the server is spawning firefox then you need $DISPLAY set in the server processes environment not the script's environment. (By running export DISPLAY=:99; java -jar selenium-server-standalone-2.49.0.jaror similar.)
If you don't want to use the standalone server at all then Selenium::Firefox looks like it might be interesting.

Padre complains about an SQLite database issue

I am starting with perl and wanted to install the IDE Padre on Ubuntu 14.04.
The answers in this question indicate that I simply can use apt-get:
sudo apt-get install padre
I also tried to install it with:
sudo cpan Padre
as indicated here.
However, when I run padre, it gives me the following error:
DBD::SQLite::db selectall_arrayref failed: attempt to write a readonly database at (eval 1905) line 41.
Perl exited with active threads:
1 running and unjoined
0 finished and unjoined
0 running and detached
And when I run it as root (sudo padre):
DBD::SQLite::db do failed: Safety level may not be changed inside a transaction at (eval 1905) line 37.
Perl exited with active threads:
1 running and unjoined
0 finished and unjoined
0 running and detached
padre --version shows me: Perl Application Development and Refactoring Environment 1.00, and my perl version is 5.18.2.
In the /usr/bin/padre script I do not see any reference to an SQLite database. Does anyone know how I can solve this issue?
Finally I found the solution in this bug report. In the file Locker.pm (in my system located in /usr/share/perl5/Padre) the following function (line 102) should be changed:
sub db_increment {
my $self = shift;
unless ( $self->{db_depth}++ ) {
Padre::DB->begin;
# ...
Padre::DB->pragma( synchronous => 0 );
}
return;
}
to:
sub db_increment {
my $self = shift;
unless ( $self->{db_depth}++ ) {
#...
Padre::DB->pragma( synchronous => 0 );
Padre::DB->begin;
}
return;
}
i.e. changing the order of Padre::DB->pragma and Padre::DB->begin.
This allowed me to start padre as root (sudo), and to fix this I had to change the owner of the Padre configuration. I changed the rights to my user using chown:
sudo chown -R myuser:myuser /.local/share/.padre/

Why is my use of hypnotoad crashing on Heroku?

I'm trying to get hypnotoad with a Mojolicious::Lite app running on Heroku with Perloku. There's something that doesn't happen when hypnotoad gets into its run loop that causes it to crash. I figure I'm missing something simple, but the Heroku docs haven't helped and I haven't been able to coax good error messages out of this.
I start with a very simple application so show some environment variables:
#!/usr/bin/env perl
# today
use Mojolicious::Lite;
get '/' => sub {
my $c = shift;
my $content = "Perl: $^X Pid: $$\n\n";
foreach my $key ( keys %ENV ) {
next unless $key =~ /Mojo|toad/i;
$content .= "$key $ENV{$key}\n";
}
$c->stash( content => $content );
$c->render('index');
};
app->start;
__DATA__
## index.html.ep
% layout 'default';
% title 'Welcome';
<p>Welcome to the Mojolicious real-time web framework!</p>
<pre>
<%= $content %>
</pre>
## layouts/default.html.ep
<!DOCTYPE html>
<html>
<head><title><%= title %></title></head>
<body><%= content %></body>
</html>
When I run this locally, I have no problem. I see from the environment variables that my program is run under hypnotoad:
Welcome to the Mojolicious real-time web framework!
Perl: /Users/brian/Dropbox/bin/perls/perl5.20.0 Pid: 40006
HYPNOTOAD_PID 39981
MOJO_HELP
HYPNOTOAD_TEST
HYPNOTOAD_EXE /Users/brian/bin/perls/hypnotoad5.20.0
MOJO_REUSE 0.0.0.0:8080:6
HYPNOTOAD_REV 3
HYPNOTOAD_APP /Users/brian/Desktop/toady.d/toady
MOJO_MODE production
MOJO_HOME
HYPNOTOAD_STOP
HYPNOTOAD_FOREGROUND
Now, I deploy this with Mojolicious::Command::deploy::heroku:
% toady deploy heroku --create
This is running at https://frozen-brushlands-4002.herokuapp.com, using the default Perloku file:
#!/bin/sh
./toady daemon --listen http://*:$PORT --mode production
This isn't running hypnotoad though, despite some references I've seen that says that's what I should get. The application works, though:
Welcome to the Mojolicious real-time web framework!
Perl: /app/vendor/perl/bin/perl Pid: 3
MOJO_REUSE 0.0.0.0:12270:4
MOJO_HOME
MOJO_HELP
MOJO_MODE production
MOJO_EXE ./toady
I figured I could just change the Perloku file to start hypnotoad:
#!/bin/sh
/app/vendor/perl/bin/perl /app/vendor/perl-deps/bin/hypnotoad toady
hypnotoad starts and almost immediately shuts down with no other log messages:
% heroku logs --app ...
2015-01-04T09:23:36.516864+00:00 heroku[web.1]: Starting process with command `./Perloku`
2015-01-04T09:23:38.321628+00:00 heroku[web.1]: State changed from starting to crashed
I can change the invocation to use the -t to test the app to see if :
#!/bin/sh
/app/vendor/perl/bin/perl /app/vendor/perl-deps/bin/hypnotoad -t toady
That works and I get the "Everything looks good!" message, so hypnotoad is running:
2015-01-04T09:36:36.955680+00:00 heroku[web.1]: Starting process with command `./Perloku`
2015-01-04T09:36:38.340717+00:00 app[web.1]: Everything looks good!
2015-01-04T09:36:39.085887+00:00 heroku[web.1]: State changed from starting to crashed
I turn on Mojo debug logging, but I don't see additional output other than my own statements.
#!/usr/bin/env perl
use Mojolicious::Lite;
$|++;
my $log = app->log;
$log->level( 'debug' );
$log->debug( "INC: #INC" );
get '/' => sub {
...;
};
$log->debug( "Right before start" );
my $app = app->start;
$log->debug( "Right after start" );
$app; # must return application object
I tried other things, such as making it load a module I know is not there and I get the expected "Could not find" error in the logs.
Running from the shell in heroku (heroku run bash) was not illuminating. The output of mojo version is the same as on my local machine:
$ perl vendor/perl-deps/bin/mojo version
CORE
Perl (v5.16.2, linux)
Mojolicious (5.71, Tiger Face)
OPTIONAL
EV 4.0+ (n/a)
IO::Socket::Socks 0.64+ (n/a)
IO::Socket::SSL 1.84+ (n/a)
Net::DNS::Native 0.15+ (n/a)
You might want to update your Mojolicious to 5.72.
I figure there's something really simple that I'm missing, but at the same time, none of this is architected for easy debugging.
Oleg gets a little closer, but there are still problems. I had tried the foreground option before and run into the same problems but failed to mention it.
If I start hypnotoad in the foreground, it tries to bind to an address. It can't bind to port 80 (or 443) and crashes, and it can listen to 127.0.0.1: almost, but it looks like it fails to completely listen:
2015-01-13T11:47:54+00:00 heroku[slug-compiler]: Slug compilation started
2015-01-13T11:48:32+00:00 heroku[slug-compiler]: Slug compilation finished
2015-01-13T11:48:32.735095+00:
00 heroku[api]: Deploy dcab778 by ...
2015-01-13T11:48:32.735095+00:00 heroku[api]: Release v31 created by ...
2015-01-13T11:48:32.969489+00:00 heroku[web.1]: State changed from crashed to starting
2015-01-13T11:48:34.909134+00:00 heroku[web.1]: Starting process with command `./Perloku`
2015-01-13T11:48:36.045985+00:00 app[web.1]: Can't create listen socket: Permission denied at /app/vendor/perl-deps/lib/perl5/Mojo/IOLoop.pm line 120.
2015-01-13T11:48:36.920004+00:00 heroku[web.1]: Process exited with status 13
2015-01-13T11:48:36.932014+00:00 heroku[web.1]: State changed from starting to crashed
Here's with an unprivileged port:
2015-01-13T11:39:10+00:00 heroku[slug-compiler]: Slug compilation started
2015-01-13T11:39:44+00:00 heroku[slug-compiler]: Slug compilation finished
2015-01-13T11:39:44.519679+00:00 heroku[api]: Deploy bbd1f68 by ...
2015-01-13T11:39:44.519679+00:00 heroku[api]: Release v29 created by ...
2015-01-13T11:39:44.811111+00:00 heroku[web.1]: State changed from crashed to starting
2015-01-13T11:39:47.382298+00:00 heroku[web.1]: Starting process with command `./Perloku`
2015-01-13T11:39:48.454706+00:00 app[web.1]: [Tue Jan 13 11:39:48 2015] [info] Listening at "http://*:8000".
2015-01-13T11:39:48.454733+00:00 app[web.1]: Server available at http://127.0.0.1:8000.
2015-01-13T11:39:48.454803+00:00 app[web.1]: [Tue Jan 13 11:39:48 2015] [info] Manager 3 started.
2015-01-13T11:39:48.480084+00:00 app[web.1]: [Tue Jan 13 11:39:48 2015] [info] Creating process id file "/app/hypnotoad.pid".
2015-01-13T11:40:47.703110+00:00 heroku[web.1]: Stopping process with SIGKILL
2015-01-13T11:40:47.702867+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2015-01-13T11:40:48.524470+00:00 heroku[web.1]: Process exited with status 137
2015-01-13T11:40:48.534002+00:00 heroku[web.1]: State changed from starting to crashed
This is really just a wild guess, but maybe the heroku infrastructure doesn't expect the runner to terminate? If so, you could try to start hypnotoad with --foreground or -f.
Also, you could try to do some logging from inside the application to see if it ever runs it at all.
Oleg answers the question, but there are some pieces missing in the assumptions.
First, create a new heroku app and remember the name of the app:
$ heroku create
Creating vast-spire-6174... done, stack is cedar-14
https://vast-spire-6174.herokuapp.com/ | https://git.heroku.com/vast-spire-6174.git
Next, add the Perloku build pack:
$ heroku config:add BUILDPACK_URL=https://github.com/judofyr/perloku.git
Create the git repo and setup on Heroku:
$ mkdir testapp
$ cd testapp
$ git init
$ heroku git:remote -a vast-spire-6174
To make everything work, you need a Perloku file to start hypnotoad in the foreground. You have to specify perl explicity because the shebang line in hypnotoad refers to the temp location of perl when it was built and where it no longer is. Change myapp.pl to whatever you named your application.
#!/bin/sh
/app/vendor/perl/bin/perl /app/vendor/perl-deps/bin/hypnotoad -f myapp.pl
To get everything installed, you use a standard Makefile.PL. Specify Mojolicious as one of the prerequisites:
use strict;
use warnings;
use ExtUtils::MakeMaker;
WriteMakefile(
VERSION => '0.01',
PREREQ_PM => {'Mojolicious' => '5.72'},
test => {TESTS => 't/*.t'}
);
Finally, the app itself, which you can create with mojo (which calls is myapp.ppl)
$ mojo generate lite_app
Here's the generated source:
#!/usr/bin/env perl
use Mojolicious::Lite;
# Documentation browser under "/perldoc"
plugin 'PODRenderer';
get '/' => sub {
my $c = shift;
$c->render('index');
};
app->start;
__DATA__
## index.html.ep
% layout 'default';
% title 'Welcome';
Welcome to the Mojolicious real-time web framework!
## layouts/default.html.ep
<!DOCTYPE html>
<html>
<head><title><%= title %></title></head>
<body><%= content %></body>
</html>
You have to modify the basic program since hypnotoad needs a bit of configuration (where the default server does not):
#!/usr/bin/env perl
use Mojolicious::Lite;
# Documentation browser under "/perldoc"
plugin 'PODRenderer';
plugin Config => {
default => {
hypnotoad => {
listen => ["http://*:$ENV{PORT}"]
}
}
};
get '/' => sub {
my $c = shift;
$c->render('index');
};
app->start;
__DATA__
## index.html.ep
% layout 'default';
% title 'Welcome';
Welcome to the Mojolicious real-time web framework!
## layouts/default.html.ep
<!DOCTYPE html>
<html>
<head><title><%= title %></title></head>
<body><%= content %></body>
</html>
Once you have all the files, commit them, and push to the heroku branch.
$ git add .
$ git commit -am "make it better"
$ git push heroku master
When you push, a hook will start up everything.
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (7/7), 1.14 KiB | 0 bytes/s, done.
Total 7 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Fetching custom git buildpack... done
remote: -----> Perloku app detected
remote: -----> Vendoring Perl
remote: Using Perl 5.18.1
remote: -----> Installing dependencies
remote: --> Working on /tmp/build_a73f24f0619fa2ab299586098c5e8daf
remote: Configuring /tmp/build_a73f24f0619fa2ab299586098c5e8daf ... OK
remote: ==> Found dependencies: Mojolicious
remote: --> Working on Mojolicious
remote: Fetching http://www.cpan.org/authors/id/S/SR/SRI/Mojolicious-5.72.tar.gz ... OK
remote: Configuring Mojolicious-5.72 ... OK
remote: ==> Found dependencies: IO::Socket::IP
remote: --> Working on IO::Socket::IP
remote: Fetching http://www.cpan.org/authors/id/P/PE/PEVANS/IO-Socket-IP-0.36.tar.gz ... OK
remote: Configuring IO-Socket-IP-0.36 ... OK
remote: Building IO-Socket-IP-0.36 ... OK
remote: Successfully installed IO-Socket-IP-0.36
remote: Building Mojolicious-5.72 ... OK
remote: Successfully installed Mojolicious-5.72
remote: <== Installed dependencies for /tmp/build_a73f24f0619fa2ab299586098c5e8daf. Finishing.
remote: 2 distributions installed
remote: Dependencies installed
remote: -----> Discovering process types
remote: Procfile declares types -> (none)
remote: Default types for Perloku -> web
remote:
remote: -----> Compressing... done, 14.1MB
remote: -----> Launching... done, v5
remote: https://vast-spire-6174.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/vast-spire-6174.git
* [new branch] master -> master
The URL of your application shows up toward the end of the output.
Why this was working for me before I don't know. I was letting a mojo command deploy for me, so there could be something to investigate there. However, it's a bit easier to commit and push without the intermediary.
After some testing I found a way to run hypnotoad on heroku
1. Perloku content should looks like this
#!/bin/sh
perl /app/vendor/perl-deps/bin/hypnotoad -f mojocrashtest
Description
First of all we need to explicity call perl. Because
heroku run bash
head /app/vendor/perl-deps/bin/hypnotoad
shows
#!/tmp/perl/perls/perl-5.18.1/bin/perl
eval 'exec /tmp/perl/perls/perl-5.18.1/bin/perl -S $0 ${1+"$#"}'
if 0; # not running under some shell
where /tmp/perl/perls/perl-5.18.1/bin/perl doesn't exists. So, /app/vendor/perl-deps/bin/hypnotoad will not start, but perl /app/vendor/perl-deps/bin/hypnotoad will be ok.
Then we need key -f for hypnotoad as #moritz guessed. Otherwise heroku will think that your app finished unexpectedly.
2. You should start hypnotoad on port $ENV{PORT}
For Mojolicious::Lite you just need to write something like this at the top of your app:
plugin Config => {default => {hypnotoad => {listen => ["http://*:$ENV{PORT}"]}}};
For full app you can do it inside the startup handler.
3. heroku open
And this is a full code of Mojolicious::Lite application
#!/usr/bin/env perl
# today
use Mojolicious::Lite;
plugin Config => {default => {hypnotoad => {listen => ["http://*:$ENV{PORT}"]}}};
get '/' => sub {
my $c = shift;
my $content = "Perl: $^X Pid: $$\n\n";
foreach my $key ( keys %ENV ) {
next unless $key =~ /Mojo|toad/i;
$content .= "$key $ENV{$key}\n";
}
$c->stash( content => $content );
$c->render('index');
};
app->start;
__DATA__
## index.html.ep
% layout 'default';
% title 'Welcome';
<p>Welcome to the Mojolicious real-time web framework!</p>
<pre>
<%= $content %>
</pre>
## layouts/default.html.ep
<!DOCTYPE html>
<html>
<head><title><%= title %></title></head>
<body><%= content %></body>
</html>
heroku logs
2015-01-13T12:08:04.843204+00:00 heroku[web.1]: Starting process with command `./Perloku`
2015-01-13T12:08:06.019070+00:00 app[web.1]: Server available at http://127.0.0.1:13533.
2015-01-13T12:08:06.018899+00:00 app[web.1]: [Tue Jan 13 12:08:06 2015] [info] Listening at "http://*:13533".
2015-01-13T12:08:06.019035+00:00 app[web.1]: [Tue Jan 13 12:08:06 2015] [info] Manager 3 started.
2015-01-13T12:08:06.055437+00:00 app[web.1]: [Tue Jan 13 12:08:06 2015] [info] Creating process id file "/app/hypnotoad.pid".
2015-01-13T12:08:06.412283+00:00 heroku[web.1]: State changed from starting to up
2015-01-13T12:08:08.040072+00:00 heroku[router]: at=info method=GET path="/" host=floating-temple-3676.herokuapp.com request_id=e9f9bb4d-f71f-4b4c-a129-70faf044c38b fwd=194" dyno=web.1 connect=3ms service=34ms status=200 bytes=586
2015-01-13T12:08:08.029819+00:00 app[web.1]: Use of uninitialized value in concatenation (.) or string at /app/mojocrashtest line 13, <DATA> line 39.
2015-01-13T12:08:08.029836+00:00 app[web.1]: Use of uninitialized value in concatenation (.) or string at /app/mojocrashtest line 13, <DATA> line 39.
2015-01-13T12:08:08.029839+00:00 app[web.1]: Use of uninitialized value in concatenation (.) or string at /app/mojocrashtest line 13, <DATA> line 39.
2015-01-13T12:08:08.029842+00:00 app[web.1]: Use of uninitialized value in concatenation (.) or string at /app/mojocrashtest line 13, <DATA> line 39.
URL for my app: http://floating-temple-3676.herokuapp.com/
BTW, I didn't use mojo deploy, just git

add crontab daemon

I'm trying to simulate a socket client using simple perl program.
socket client:
#!/usr/bin/perl
#path: /home/nuthan/client1
use IO::Socket;
my $sock = new IO::Socket::INET ( PeerAddr => 'xx.xx.xx.xx', PeerPort => '11050', Proto => 'tcp', );
die "Could not create socket: $!\n" unless $sock;
use POSIX 'strftime';
$time=strftime("%H%M%S",localtime) . "\n";
$date=strftime("%d%m%y",localtime)."\n";
$data="#00000##0#0000#AUT#1#V#07734.7000,E,1259.5355,N,000.00,288#$date#$time##";
print $data;
print $sock "$data";
close($sock);
command: bash script to execute
#!/bin/bash
#path: /bin/server
set PATH=/usr/bin/perl
export PATH
/home/nuthan/client1
#perl home/nuthan/client1
crontab command:
Run this socket client every 60 secs.
* * * * * server 2>&1 >> /var/log/client.log
Error: Finally, i get this Error!!!
No command 'bin' found, did you mean:
Command 'win' from package 'wily' (universe)
Command 'tin' from package 'tin' (universe)
Command 'bip' from package 'bip' (universe)
Command 'bing' from package 'bing' (universe)
Command 'bins' from package 'bins' (universe)
bin: command not found
WHERE AM I GOING WRONG!!!!? please help!!!
You should not set PATH to the perl executable but instead to the directories containing the tools you want to use, e.g.
export PATH=/bin:/usr/bin
#TLP Thanks for ur help. Got it working!!!
bash:
#!/bin/sh
set PATH=/usr/bin/perl
export PATH=/bin:/bin
/home/nuthan/clients/client1
cron command:
* * * * * /usr/bin/perl /bin/client1 2>&1 >> /home/nuthan/logs/client1.log
logging client # /home/nuthan/logs/client1.log