2024年3月15日 星期五

使用 PHP 試寫 LibreNMS 串接 Jandi 通知

 LibreNMS 預設是支援常見的 Line Notify,但不支援 Jandi 的.

所以試寫一個 Jandi 的 alert-transports 


Demo 如下所示.


PS:以下程式的串接寫下僅適用於 librenms-22.12.x 以下的版本.

而且是抄改自  Linenotify.php 原碼,如下所示


[root@Oracle9 Transport]# pwd

/opt/librenms/LibreNMS/Alert/Transport

[root@Oracle9 Transport]# cat Linenotify.php

<?php

/**

 * LINE Notify Transport

 */


namespace LibreNMS\Alert\Transport;


use LibreNMS\Alert\Transport;

use LibreNMS\Util\Proxy;


class Linenotify extends Transport

{

    protected $name = 'LINE Notify';


    public function deliverAlert($obj, $opts)

    {

        $opts['line-notify-access-token'] = $this->config['line-notify-access-token'];


        return $this->contactLinenotify($obj, $opts);

    }


    private function contactLinenotify($obj, $opts)

    {

        $lineUrl = 'https://notify-api.line.me/api/notify';

        $lineHead = ['Authorization: Bearer ' . $opts['line-notify-access-token']];

        $lineFields = ['message' => $obj['msg']];


        $curl = curl_init();

        Proxy::applyToCurl($curl);

        curl_setopt($curl, CURLOPT_URL, $lineUrl);

        curl_setopt($curl, CURLOPT_HTTPHEADER, $lineHead);

        curl_setopt($curl, CURLOPT_NOBODY, false);

        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

        curl_setopt($curl, CURLOPT_POST, true);

        curl_setopt($curl, CURLOPT_POSTFIELDS, $lineFields);

        curl_exec($curl);

        $code = curl_getinfo($curl, CURLINFO_HTTP_CODE);

        curl_close($curl);

        if ($code != 200) {

            return 'HTTP Status code ' . $code;

        }


        return true;

    }


    public static function configTemplate()

    {

        return [

            'config' => [

                [

                    'title' => 'Token',

                    'name' => 'line-notify-access-token',

                    'descr' => 'LINE Notify Token',

                    'type' => 'text',

                ],

            ],

            'validation' => [

                'line-notify-access-token' => 'required|string',

            ],

        ];

    }

}

[root@Oracle9 Transport]#


抄改成 Jandi 的程式如下所示 


[root@Oracle9 Transport]# pwd

/opt/librenms/LibreNMS/Alert/Transport

[root@Oracle9 Transport]# cat Jandi.php

<?php

/**

 * Jandi webhook Transport

 */



namespace LibreNMS\Alert\Transport;


use LibreNMS\Alert\Transport;

use LibreNMS\Util\Proxy;


class Jandi extends Transport

{


    protected $name = 'Jandi';



    public function deliverAlert($obj, $opts)

    {

        $opts['jandi-webhook-access-token'] = $this->config['jandi-webhook-access-token'];

        $opts['jandi-webhook-access-rec'] = $this->config['jandi-webhook-access-rec'];

        return $this->contactLineNotify($obj, $opts);

    }


    private function contactLinenotify($obj, $opts)

    {

        $webhooktoken=$opts['jandi-webhook-access-token'];

        $webhookid=$opts['jandi-webhook-access-rec'];

        $lineUrl = "https://wh.jandi.com/connect-api/webhook/$webhooktoken/$webhookid";

        $lineHead = ['Accept: application/vnd.tosslab.jandi-v2+json','Content-Type: application/json'];

        // $lineFields = [body' => body , 'connectColor' => '#FAC11B' , 'connectInfo' => [ 'title' => title , 'description' => $obj['msg'] ] ];


        $jmsg=$obj['msg'];


        $nowtime=date('Y-m-d H:i:s');


        $lineFields = <<<DATA

        {

        "body" : "$nowtime",

        "connectColor" : "#FAC11B",

        "connectInfo" : [

           { "title" : "AlertMessage",

             "description" : "$jmsg"

           }

         ]

        }

        DATA;


        // $lineFields = ["body" => body];

        $curl = curl_init();

        curl_setopt($curl, CURLOPT_URL, $lineUrl);

        curl_setopt($curl, CURLOPT_HTTPHEADER, $lineHead);

        curl_setopt($curl, CURLOPT_NOBODY, false);

        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

        curl_setopt($curl, CURLOPT_POST, true);

        curl_setopt($curl, CURLOPT_POSTFIELDS, $lineFields);

        curl_exec($curl);

        $code = curl_getinfo($curl, CURLINFO_HTTP_CODE);

        curl_close($curl);

        if ($code != 200) {

            return 'HTTP Status code ' . $code;

        }


        return true;

    }


    public static function configTemplate()

    {

        return [

            'config' => [

                [

                    'title' => 'Jandi WebHook Token',

                    'name' => 'jandi-webhook-access-token',

                    'descr' => 'Jandi WEBHOOK Token',

                    'type' => 'text',

                ],

                [

                    'title' => 'Jandi WebHook Recipient',

                    'name' => 'jandi-webhook-access-rec',

                    'descr' => 'Jandi WEBHOOK Recipient',

                    'type' => 'text',

                ],


            ],

            'validation' => [

                'jandi-webhook-access-token' => 'required|string',

                'jandi-webhook-access-rec' => 'required|string',

            ],

        ];

    }

}

[root@Oracle9 Transport]#


DEMO