Every log has a story

خب، روز سوم

الان که دارم این لاگ رو می‌نویسم، روز تقریبا تموم شده و امروز از اون روزهایی بود که حس خوبی داشت

اگر بخوام بهش نگاه کنم، می‌تونم بگم یکی از روزهای خوب ۱۴۰۵ بود

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

چون هنوز کلی برنامه داریم، کلی چیز هست که باید ساخته بشه و کلی روز بهتر قراره بیاد


یک پیام غیرمنتظره

دیروز ساعت 17:54 یک پیام دریافت کردم

راستش آن لحظه خیلی آماده جواب دادن نبودم

من معمولا پیام کسی را بی‌جواب نمی‌گذارم، حتی اگر ناراحت باشم یا فاصله‌ای ایجاد شده باشد

اما بعضی وقت‌ها آدم نیاز داره سکوت کنه

چند دقیقه، چند ساعت یا حتی بیشتر

نه برای نادیده گرفتن، فقط برای اینکه بتونه با
ذهن آرام‌تر و بی کینه تر جواب بده

تایم نهار تصمیم گرفتم بخونم و جواب بدم
هر چی نباشه اون کسی بود که موقع
اعتراضات حالم رو پرسید

حتی وقتی راجع به

اون روز جمعه نکبت بار شنید
با خطرات اون روزا برای عیادت من اومد
ای کاش اون روزا بجای ساچمه تیر میخوردم
ای کاش بعد دیدن اون کشتار
من هم زنده نمی موندم
شاید غریبه باشیم
شاید دلخور باشم
ولی خب هرگز خوبی ادم ها رو فراموش نمیکنم


پیام طولانی بود

خیلی طولانی

و این دقیقا چیزی است که همیشه دوست داشتم

آدم‌هایی که من را می‌شناسند می‌دانند که خودم هم معمولا جواب‌های کوتاه نمی‌دهم

به نظرم نوشتن زیاد همیشه به معنی زیاد حرف زدن نیست

گاهی یعنی برای توضیح دادن، برای فهمیده شدن و برای احترام گذاشتن وقت گذاشتی

و این پیام هم همین حس را داشت

نه فقط دفاع از خودت
بلکه تلاش برای فهمیدن و توضیح دادن


مرور خاطرات

بعد از خواندن پیام، چند سال گذشته دوباره مرور شد

بعضی آدم‌ها و بعضی روزها، حتی بعد از گذشت زمان، یک گوشه از ذهن باقی می‌مونن

سال‌هایی که گذشت
از ۱۳۹۹ تا ۱۴۰۲
سال‌هایی پر از تغییر، تجربه و اتفاق‌های مختلف
پونه
فرزانگان
اختیاریه

خب خیلی گذشته
احساس پیری میکنم

سال ۱۴۰۳ ارتباط کمتر شد و هر کسی مسیر خودش رو دنبال کرد
تو کنکورت
و من هم
درگیر درد و دل با این باینری ها بودم

اردیبهشت ۴۰۴
اتفاق‌هایی افتاد که شاید بهتر باشه فقط به عنوان تجربه به اون نگاه کنیم
نه چیزی که هر روز دوباره مرور شه

گاهی گذشته رو نمیشه تغییر داد
و خب هممون اشتباه میکنیم


بعد دوباره رسیدیم به یک نقطه جدید
از ۴فروردین تا ۲۰ اردیبهشت
امسال
خب بازم شاید همون طوری که امروز گفتی هردو یه چیزی رو اشتباه فهمیدیم
این بار با شناخت بیشتر
با تجربه بیشتر

بعضی مسیرها دوباره تکرار نمی‌شوند حداقل دوباره امیدوارم نشه

اما می‌تونه شکل بهتری پیدا کنن

ممنونم سودا

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


پایان روز

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

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

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

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