とある条件を満たしてから15分後にメール通知を送信する方法について

__ __96
Tera Contributor

MID ServerのStatusがDownして15分後にメール通知を送信する方法を検討しています。

具体的には、notificationのWhen to sendのスクリプトを使って、MID ServerのStatusがDownしてから15分後にメール通知を送信するためには、どのようなスクリプトを記述すればよいでしょうか。
flowやスクリプトインクルードを使わず、When to sendのスクリプトのみで完結するものだと幸いです。

1件の返信1

iwai
Giga Sage

NotificationのAdvanced conditionのScriptのみ(When to sendのスクリプト)を使って作ってみました。あえてNotification のScriptをのみを使う方式なので、少々特殊な方法も含んでいます。主な動きはNotificationを15分後に再呼び出しするScheduleJobをScriptで作成しています。それと通知状態を判断するためにEventTableを使っています。(GWに4時間ぐらいかかっています。Scriptのヒントだけでよいなら早いですが、本当にアイデアが動くかどうか実際に作って検証する必要があり、Scriptを作って動作確認してわかりやすい形式に整えて投稿しています)

answer = (function () {
    gs.info('Test Notification');
    // Event Table を利用して、通知状態を把握する
    var grEvent = new GlideRecord('sysevent');
    grEvent.setLimit(1);
    grEvent.addQuery('name', 'STARTSWITH', 'midserver.' + current.name);
    grEvent.orderByDesc('sys_created_on');
    grEvent.query();
    if (grEvent.next()) {
        gs.info('Test Notification ' + grEvent.name);
        // 待機状態なら通知はしないで待機
        if (grEvent.name == 'midserver.' + current.name + '.waiting') return false;
        // 通知許可状態なら通知
        if (grEvent.name == 'midserver.' + current.name + '.sendemail') {
            //通知状態を正常に戻す。再通知を制御する場合はこの辺りを改良する
            gs.eventQueue('midserver.' + current.name + '.normal', current);
            return true;
        }
    }

    //15分後に通知するかどうか判断する関数
    var notifyServerDown = function (sysid) {
        gs.info('Test Notification notifyServerDown');
        var grMid = new GlideRecord('ecc_agent');
        var eventtype = 'normal';
        //MIDServerを特定
        if (grMid.get(sysid)) {
            //MIDServerの状態がDown
            if (grMid.status == 'Down') {
                var grEvent = new GlideRecord('sysevent');
                grEvent.setLimit(1);
                grEvent.addQuery('name', 'STARTSWITH', 'midserver.' + grMid.name);
                grEvent.orderByDesc('sys_created_on');
                grEvent.query();
                if (grEvent.next()) {
                    //通知許可状態がwaitingなら、通知許可
                    if (grEvent.name == 'midserver.' + grMid.name + '.waiting') {
                        eventtype = 'sendemail';
                    }
                }
            }
            //通知状態をEventに発行
            gs.eventQueue('midserver.' + grMid.name + '.' + eventtype, grMid);
            if (eventtype == 'sendemail') {
                grMid.setForceUpdate(true);//変更箇所がなくても更新する
                //Record更新をすることで再度Notificationを実行させる
                grMid.update();
            }
        }
        gs.info('Test Notification notifyServerDown ' + eventtype);
    };
    gs.info('Test Notification ScheduleOnce');
    //15分後に通知するか判断する処理を発行する
    var sched = new ScheduleOnce();
    sched.script = '(' + notifyServerDown + ')("' + current.sys_id + '");';
    sched.setLabel('notifyServerDown');
    sched.setAsSeconds(15 * 60);
    sched.schedule();
    //通知待機状態をEventに発行
    gs.eventQueue('midserver.' + current.name + '.waiting', current);
    return false;//いまは通知しないで待機状態
})();