This commit is contained in:
commit
f20a2919d3
106
.drone.yml
Normal file
106
.drone.yml
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
kind: pipeline
|
||||||
|
type: kubernetes
|
||||||
|
name: build-amd64
|
||||||
|
platform:
|
||||||
|
arch: amd64
|
||||||
|
node_selector:
|
||||||
|
kubernetes.io/arch: amd64
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- name: fedhq-ca-crt
|
||||||
|
config_map:
|
||||||
|
name: fedhq-ca-crt
|
||||||
|
default_mode: 420 # same as 644 in octal, or u+w,a+r
|
||||||
|
optional: false
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build amd64
|
||||||
|
image: quay.io/buildah/stable
|
||||||
|
privileged: true
|
||||||
|
volumes:
|
||||||
|
- name: fedhq-ca-crt
|
||||||
|
path: /etc/ssl/certs2/
|
||||||
|
commands:
|
||||||
|
- scripts/setupEnvironment.sh
|
||||||
|
- buildah bud -t "registry.cloud.federationhq.de/webhook2ntfy:latest-amd64" --arch amd64 .
|
||||||
|
- buildah push --all registry.cloud.federationhq.de/webhook2ntfy:latest-amd64
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
kind: pipeline
|
||||||
|
type: kubernetes
|
||||||
|
name: build-arm64
|
||||||
|
platform:
|
||||||
|
arch: arm64
|
||||||
|
node_selector:
|
||||||
|
kubernetes.io/arch: arm64
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- name: fedhq-ca-crt
|
||||||
|
config_map:
|
||||||
|
name: fedhq-ca-crt
|
||||||
|
default_mode: 420 # same as 644 in octal, or u+w,a+r
|
||||||
|
optional: false
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build arm64
|
||||||
|
image: quay.io/buildah/stable
|
||||||
|
privileged: true
|
||||||
|
volumes:
|
||||||
|
- name: fedhq-ca-crt
|
||||||
|
path: /etc/ssl/certs2/
|
||||||
|
commands:
|
||||||
|
- scripts/setupEnvironment.sh
|
||||||
|
- buildah bud -t "registry.cloud.federationhq.de/webhook2ntfy:latest-arm64" --arch arm64 .
|
||||||
|
- buildah push --all registry.cloud.federationhq.de/webhook2ntfy:latest-arm64
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: kubernetes
|
||||||
|
name: push
|
||||||
|
node_selector:
|
||||||
|
kubernetes.io/arch: amd64
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- name: fedhq-ca-crt
|
||||||
|
config_map:
|
||||||
|
name: fedhq-ca-crt
|
||||||
|
default_mode: 420 # same as 644 in octal, or u+w,a+r
|
||||||
|
optional: false
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: push
|
||||||
|
image: quay.io/buildah/stable
|
||||||
|
privileged: true
|
||||||
|
environment:
|
||||||
|
USERNAME:
|
||||||
|
from_secret: username
|
||||||
|
PASSWORD:
|
||||||
|
from_secret: password
|
||||||
|
volumes:
|
||||||
|
- name: fedhq-ca-crt
|
||||||
|
path: /etc/ssl/certs2/
|
||||||
|
commands:
|
||||||
|
- scripts/setupEnvironment.sh
|
||||||
|
- buildah manifest create webhook2ntfy:latest registry.cloud.federationhq.de/webhook2ntfy:latest-arm64 registry.cloud.federationhq.de/webhook2ntfy:latest-amd64
|
||||||
|
- buildah manifest push --all webhook2ntfy:latest docker://registry.cloud.federationhq.de/webhook2ntfy:latest
|
||||||
|
#- buildah login -u $${USERNAME} -p $${PASSWORD} registry.hub.docker.com
|
||||||
|
#- buildah manifest push --all imapfilter:latest docker://registry.hub.docker.com/byterazor/imapfilter:latest
|
||||||
|
- buildah manifest rm webhook2ntfy:latest
|
||||||
|
depends_on:
|
||||||
|
- build-amd64
|
||||||
|
- build-arm64
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: secret
|
||||||
|
name: username
|
||||||
|
get:
|
||||||
|
path: docker
|
||||||
|
name: username
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: secret
|
||||||
|
name: password
|
||||||
|
get:
|
||||||
|
path: docker
|
||||||
|
name: secret
|
20
Containerfile
Normal file
20
Containerfile
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
FROM alpine
|
||||||
|
|
||||||
|
RUN apk update && apk add --no-cache tini bash ca-certificates openssl perl perl-mojolicious perl-json perl-mime-base64 perl-app-cpanminus perl-test-fatal perl-test-warnings perl-test-needs perl-uri perl-lwp-useragent-determined
|
||||||
|
|
||||||
|
#RUN cpanm install URI::Escape
|
||||||
|
|
||||||
|
RUN mkdir -p /opt/webhook2_ntfy/
|
||||||
|
ADD . /opt/webhook2_ntfy/
|
||||||
|
RUN chmod a+x /opt/webhook2_ntfy/script/webhook2_ntfy
|
||||||
|
WORKDIR /opt/webhook2_ntfy
|
||||||
|
|
||||||
|
RUN addgroup webhook2ntfy && adduser -D -G webhook2ntfy webhook2ntfy
|
||||||
|
|
||||||
|
ADD entrypoint.sh /entrypoint.sh
|
||||||
|
RUN chmod a+x /entrypoint.sh
|
||||||
|
|
||||||
|
USER webhook2ntfy
|
||||||
|
|
||||||
|
|
||||||
|
ENTRYPOINT ["/sbin/tini", "--", "/entrypoint.sh"]
|
5
entrypoint.sh
Normal file
5
entrypoint.sh
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
cd /opt/webhook2_ntfy
|
||||||
|
|
||||||
|
script/webhook2_ntfy daemon -l http://*:3000
|
32
lib/Webhook2Ntfy.pm
Normal file
32
lib/Webhook2Ntfy.pm
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
package Webhook2Ntfy;
|
||||||
|
use Mojo::Base 'Mojolicious', -signatures;
|
||||||
|
|
||||||
|
# This method will run once at server start
|
||||||
|
sub startup ($self) {
|
||||||
|
|
||||||
|
# Configure the application
|
||||||
|
$self->secrets($ENV{SECRETS});
|
||||||
|
|
||||||
|
my $webhook = $ENV{WEBHOOK_PATH};
|
||||||
|
|
||||||
|
if (!$webhook || length($webhook) == 0 )
|
||||||
|
{
|
||||||
|
$self->log->fatal("no webhook provided in WEBHOOK_PATH");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
elsif (length($webhook) < 20)
|
||||||
|
{
|
||||||
|
$self->log->fatal("please provide a more complex webhook path in WEBHOOK_PATH");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$self->log->info("using webhook path: " . $webhook);
|
||||||
|
|
||||||
|
# Router
|
||||||
|
my $r = $self->routes;
|
||||||
|
|
||||||
|
# Normal route to controller
|
||||||
|
$r->post($webhook)->to('Webhook#call');
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
105
lib/Webhook2Ntfy/Controller/Webhook.pm
Normal file
105
lib/Webhook2Ntfy/Controller/Webhook.pm
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
package Webhook2Ntfy::Controller::Webhook;
|
||||||
|
use Mojo::Base 'Mojolicious::Controller', -signatures;
|
||||||
|
use JSON;
|
||||||
|
use Data::Dumper;
|
||||||
|
use URI::Escape;
|
||||||
|
use Encode qw/encode decode/;
|
||||||
|
use MIME::Base64;
|
||||||
|
use LWP::UserAgent;
|
||||||
|
use HTTP::Request::Common qw{ POST };
|
||||||
|
|
||||||
|
sub publish
|
||||||
|
{
|
||||||
|
my $self = shift;
|
||||||
|
my $msg = shift;
|
||||||
|
my $ntfyServer = $ENV{NTFY_SERVER};
|
||||||
|
my $ntfyToken = $self->prepareAuthToken($ENV{NTFY_TOKEN});
|
||||||
|
|
||||||
|
my $ua = LWP::UserAgent->new();
|
||||||
|
my $url = $ntfyServer . "/?auth=$ntfyToken";
|
||||||
|
|
||||||
|
my $response = $ua->post( $url, Markdown=>'yes', Content => to_json($msg));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub prepareAuthToken
|
||||||
|
{
|
||||||
|
my $self = shift;
|
||||||
|
my $token = shift;
|
||||||
|
|
||||||
|
my $auth=encode_base64("".":".$token, "");
|
||||||
|
my $authString = encode_base64("Basic " . $auth, "");
|
||||||
|
$authString =~ s/=+$//;
|
||||||
|
return $authString;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub redmine2ntfy
|
||||||
|
{
|
||||||
|
|
||||||
|
my $self = shift;
|
||||||
|
my $data = shift;
|
||||||
|
|
||||||
|
$data->{text} =~ /^<(.*)\|(.+)>\+\-\+(.+)\+<(.*)\|(.*)>\+.*\+by\+(.*)$/;
|
||||||
|
|
||||||
|
my $projectUrl=$1;
|
||||||
|
my $projectName=$2;
|
||||||
|
my $entity = $3;
|
||||||
|
my $entityUrl=$4;
|
||||||
|
my $entityName=$5;
|
||||||
|
my $author=$6;
|
||||||
|
$author =~ s/\+/ /g;
|
||||||
|
|
||||||
|
my $status;
|
||||||
|
if ($entity eq "Issue")
|
||||||
|
{
|
||||||
|
$entityName=~s/\+/ /g;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $title = "$entity update for $projectName";
|
||||||
|
my $text = "There has been an $entity update for project [$projectName]($projectUrl) by $author on [$entityName]($entityUrl)";
|
||||||
|
|
||||||
|
my $message = {
|
||||||
|
topic => $data->{channel},
|
||||||
|
title => $title,
|
||||||
|
message => $text
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub toNtfyMessage
|
||||||
|
{
|
||||||
|
my $self = shift;
|
||||||
|
my $data = shift;
|
||||||
|
|
||||||
|
|
||||||
|
if ($ENV{IS_REDMINE})
|
||||||
|
{
|
||||||
|
return $self->redmine2ntfy($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
my $message = {
|
||||||
|
topic => $data->{channel},
|
||||||
|
message => $data->{text}
|
||||||
|
};
|
||||||
|
|
||||||
|
return $message;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# This action will render a template
|
||||||
|
sub call {
|
||||||
|
my $self = shift;
|
||||||
|
my $body = $self->req->body;
|
||||||
|
$body=uri_unescape($body);
|
||||||
|
$body=substr($body,8,length($body));
|
||||||
|
my $data=from_json($body);
|
||||||
|
|
||||||
|
$self->publish($self->toNtfyMessage($data));
|
||||||
|
|
||||||
|
# Render template "example/welcome.html.ep" with message
|
||||||
|
$self->render(msg => 'accepted');
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
11
public/index.html
Normal file
11
public/index.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Welcome to the Mojolicious real-time web framework!</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h2>Welcome to the Mojolicious real-time web framework!</h2>
|
||||||
|
This is the static document "public/index.html",
|
||||||
|
<a href="/">click here</a> to get back to the start.
|
||||||
|
</body>
|
||||||
|
</html>
|
11
script/webhook2_ntfy
Executable file
11
script/webhook2_ntfy
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/env perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use Mojo::File qw(curfile);
|
||||||
|
use lib curfile->dirname->sibling('lib')->to_string;
|
||||||
|
use Mojolicious::Commands;
|
||||||
|
|
||||||
|
# Start command line interface for application
|
||||||
|
Mojolicious::Commands->start_app('Webhook2Ntfy');
|
3
scripts/setupEnvironment.sh
Executable file
3
scripts/setupEnvironment.sh
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
cp /etc/ssl/certs2/federationHQ-CA.pem /etc/pki/ca-trust/source/anchors/
|
||||||
|
update-ca-trust
|
9
t/basic.t
Normal file
9
t/basic.t
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
use Mojo::Base -strict;
|
||||||
|
|
||||||
|
use Test::More;
|
||||||
|
use Test::Mojo;
|
||||||
|
|
||||||
|
my $t = Test::Mojo->new('Webhook2Ntfy');
|
||||||
|
$t->get_ok('/')->status_is(200)->content_like(qr/Mojolicious/i);
|
||||||
|
|
||||||
|
done_testing();
|
5
templates/layouts/default.html.ep
Normal file
5
templates/layouts/default.html.ep
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head><title><%= title %></title></head>
|
||||||
|
<body><%= content %></body>
|
||||||
|
</html>
|
3
templates/webhook/call.html.ep
Normal file
3
templates/webhook/call.html.ep
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
% layout 'default';
|
||||||
|
% title 'Message Accepted';
|
||||||
|
<h2><%= $msg %></h2>
|
3
webhook2_ntfy.yml
Normal file
3
webhook2_ntfy.yml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
---
|
||||||
|
secrets:
|
||||||
|
- 6d0aaa833652976c0d076e7567195a8d258f57e3
|
Loading…
Reference in New Issue
Block a user