DEV Community

Cover image for Summer Log #3 - Building a MikroTik Monitor
Vobinax
Vobinax

Posted on • Edited on

Summer Log #3 - Building a MikroTik Monitor

Today's Work

بعد از این بخش
بیشتر زمان کار روی یک پروژه سپری شد

ساخت یک
Microservice
برای مانیتورینگ پکیج های
MikroTik

مدلی که تو دیتا سنتر داشتیم این بود 😼

MikroTik RB4011iGS+RM

یک روتر قدرتمند برای شبکه‌های متوسط
که
RouterOS API
هم داره

ایده سرویس ساده بود
یک
Agent
کوچیک نوشته‌شده با
Go
که به
MikroTik
متصل شه، اطلاعات پکیج های نصب‌شده رو بررسی کنه و وضعیت رو برای یک سرور مرکزی ارسال میکنه
Sd03::12


Architecture

         +----------------+
         |    MikroTik    |
         |    RB4011      |
         |  RouterOS API  |
         +--------+-------+
                  |
                  |
            Go Microservice
            Package Monitor
                  |
  +---------------+----------------+
  |                                |
  | Package Scanner                |
  | Health Reporter                |
  | Central Server REST API        |
  +--------------------------------+
Enter fullscreen mode Exit fullscreen mode

Data Model

type RouterPackage struct {
    Name      string `json:"name"`
    Version   string `json:"version"`
    Disabled  bool   `json:"disabled"`
    RouterID  string `json:"router_id"`
    Timestamp int64  `json:"timestamp"`
}
Enter fullscreen mode Exit fullscreen mode

اسم
Package

نسخه

وضعیت فعال بودن

شناسه روتر

زمان ثبت اطلاعات


Package Scanner

Agent
از طریق
RouterOS API

اطلاعات پکیج ها رو دریافت میکنه

func (c *Client) GetPackages() ([]RouterPackage, error) {

    reply, err := c.api.Run("/system/package/print")

    if err != nil {
        return nil, err
    }

    var packages []RouterPackage

    for _, item := range reply.Re {
        packages = append(packages, RouterPackage{
            Name: item.Map["name"],
            Version: item.Map["version"],
        })
    }

    return packages, nil
}
Enter fullscreen mode Exit fullscreen mode

Reporting

بعد از جمع‌آوری اطلاعات
Agent
داده‌ها رو به سرور مرکزی ارسال می‌کنه

func Report(data []RouterPackage) error {

    body, _ := json.Marshal(data)

    resp, err := http.Post(
        "https://monitor.example.com/api/mikrotik/packages",
        "application/json",
        bytes.NewBuffer(body),
    )

    if err != nil {
        return err
    }

    defer resp.Body.Close()

    return nil
}
Enter fullscreen mode Exit fullscreen mode

Example Payload

{
  "router_id": "branch-tehran-01",
  "device": "RB4011",
  "packages": [
    {
      "name": "routeros",
      "version": "7.16.1"
    },
    {
      "name": "wireless",
      "version": "7.16.1"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

پایان روز

امروز شاید از بیرون روز خیلی شلوغی نبود
ولی روز به شدت خوبی بود

یک پیام
چند خاطره
یک شروع دوبار
و چند ساعت کد

گاهی مسیر، آدم‌هایی که تو اون هستند و چیزهایی که ساخته می‌شن، خودشون کافی ان

روز سوم تموم شد
روز چهارم دیگه کاری نیست مرخصی گرفتم
یکمی هم حال خوب
🛤

Top comments (0)