App-mqtt2job

 view release on metacpan or  search on metacpan

bin/mqtt2job  view on Meta::CPAN

#!/usr/bin/env perl
use strict;
use warnings;

use Net::MQTT::Simple;
use JSON;
use DateTime;
use Try::Tiny;
use File::Temp;
use Capture::Tiny ':all';

use App::mqtt2job qw/ helper_v1 ha_helper_cfg /;

package MQTT::Job::Options;

use Moose;
with 'MooseX::Getopt';

# required options
has 'mqtt_server'   => (is => "rw", isa => "Str", required => 1 );
has 'base_topic'    => (is => "rw", isa => "Str", required => 1 );
has 'job_dir'       => (is => "rw", isa => "Str", required => 1 );

# optional
has 'mqtt_port'     => (is => "rw", isa => "Int", default => 1883  );
has 'shebang'       => (is => "rw", isa => "Str", default => $^X );
has 'suffix'        => (is => "rw", isa => "Str", default => "pl" );
has 'process_name'  => (is => "rw", isa => "Str", default => "mqtt2job" );
has 'helper_script' => (is => "rw", isa => "Str", default => "helper_v1" );
has 'no_unlink'     => (is => "rw", isa => "Bool" );

# helper modes
has 'ha_helper'     => (is => "rw", isa => "Bool" );
has 'task'          => (is => "rw", isa => "Str", default => "unknown_task" );
has 'cmd'           => (is => "rw", isa => "Str", default => "unknown_cmd" );
has 'args'          => (is => "rw", isa => "Str", default => "" );

# TODO 
#has 'max_velocity'  => (is => "rw", isa => "Int", default => 59  ); # limit triggers to ~once per minute
#has 'timeout'       => (is => "rw", isa => "Int", default => 30  ); # Terminate a job if it runs longer than x seconds
#has 'allowed_tpl'   => (is => "rw", isa => "Str" ); # command template (e.g. regex/string)
#has 'allowed_file'  => (is => "rw", isa => "Str" ); # file containing allowed cmds, timeouts, and max velocities
#has 'cert'          => (is => "rw", isa => "Str" ); # provide cert for request validity check
#has 'cron_pattern'  => (is => "rw", isa => "Bool" ); # use cron pattern to generate ha_helper template

package main;

# PODNAME: mqtt2job
# ABSTRACT: Subscribe to an MQTT topic and trigger job execution

my $opt = MQTT::Job::Options->new_with_options;
$0 = $opt->process_name;

my $mqtt = Net::MQTT::Simple->new($opt->mqtt_server . ":" . $opt->mqtt_port);

my $on_exit = sub {
    my $no_warn = shift;
    printf STDERR "\nProcess %s terminating, disconnecting from %s:%s\n", $0, $opt->mqtt_server, $opt->mqtt_port unless $no_warn;
    $mqtt->disconnect;
    exit;
};

# clean up on exit
$SIG{INT} = $on_exit;
$SIG{USR1} = $on_exit;

if ($opt->ha_helper) {
    warn( sprintf("Did not find %s in %s directory\n", $opt->cmd, $opt->job_dir) ) unless _cmd_ok($opt->cmd);



( run in 0.595 second using v1.01-cache-2.11-cpan-800906f7e73 )