# راهنمای خلاصه نصب و تنظیم سرویس اجرای دوره‌ای برنامه پیامک با WinSW

## 1) هدف
این راهنما برای اجرای دوره‌ای برنامه پیامک به‌صورت **Windows Service** با استفاده از **WinSW** تهیه شده است، بدون استفاده از Task Scheduler.

---

## 2) ساختار فایل‌ها و مسیرها

### مسیر برنامه پیامک
```text
D:\SMSSender\iMaster.ERP.SmsSender.Console.exe
```

### مسیر فایل سرویس WinSW
```text
D:\SmsService\SmsRunnerService.exe
```

### فایل تنظیمات سرویس
```text
D:\SmsService\SmsRunnerService.xml
```

### فایل اسکریپت اجرای حلقه‌ای
```text
D:\SmsService\run-loop.ps1
```

### فایل لاگ برنامه
```text
D:\SmsService\runner.log
```

### پوشه لاگ‌های WinSW
```text
D:\SmsService\logs
```

---

## 3) نکات مهم در نام‌گذاری و مسیرها

- فایل exe مربوط به WinSW و فایل xml باید **هم‌نام** باشند.
- در این پروژه:
  - نام فایل سرویس:
    ```text
    SmsRunnerService.exe
    ```
  - نام فایل تنظیمات:
    ```text
    SmsRunnerService.xml
    ```
- اگر نام فایل exe سرویس تغییر کند، نام فایل xml هم باید دقیقاً مطابق آن تغییر کند.
- مسیر فایل‌ها بهتر است ثابت باشد و بعد از نصب تغییر نکند.
- در صورت تغییر مسیر برنامه پیامک، باید مقدار `$exePath` در فایل `run-loop.ps1` اصلاح شود.
- در صورت تغییر نام فایل اجرایی برنامه پیامک، مقدار `$processName` نیز باید اصلاح شود.

---

## 4) نصب و راه‌اندازی

### مرحله 1: ایجاد پوشه‌ها
درایو و پوشه‌های زیر باید وجود داشته باشند:

```text
D:\SMSSender\
D:\SmsService\
D:\SmsService\logs\
```

### مرحله 2: قرار دادن فایل‌ها
- فایل برنامه پیامک را در مسیر زیر قرار دهید:
  ```text
  D:\SMSSender\iMaster.ERP.SmsSender.Console.exe
  ```
- فایل WinSW را دانلود کرده و با این نام در این مسیر قرار دهید:
  ```text
  D:\SmsService\SmsRunnerService.exe
  ```
- فایل `run-loop.ps1` را در مسیر زیر بسازید:
  ```text
  D:\SmsService\run-loop.ps1
  ```
- فایل `SmsRunnerService.xml` را در مسیر زیر بسازید:
  ```text
  D:\SmsService\SmsRunnerService.xml
  ```

### مرحله 3: نصب سرویس
CMD یا PowerShell را با **Run as Administrator** باز کنید و دستورهای زیر را اجرا کنید.

<details>
<summary>دستورهای نصب سرویس</summary>

```bat
cd /d D:\SmsService
SmsRunnerService.exe install
SmsRunnerService.exe start
```

</details>

### مرحله 4: تنظیم Recovery سرویس
برای ری‌استارت خودکار سرویس در صورت خطا:

<details>
<summary>دستورهای Recovery</summary>

```bat
sc failure SmsRunnerService reset= 86400 actions= restart/5000/restart/10000/restart/60000
sc config SmsRunnerService start= auto
```

</details>

---

## 5) فایل‌های تنظیمات

### فایل `run-loop.ps1`
<details>
<summary>نمایش کد فایل PowerShell</summary>

```powershell
$exePath = "D:\SMSSender\iMaster.ERP.SmsSender.Console.exe"
$processName = "iMaster.ERP.SmsSender.Console"
$intervalSeconds = 60
$logFile = "D:\SmsService\runner.log"

while ($true) {
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

    try {
        $alreadyRunning = Get-Process -Name $processName -ErrorAction SilentlyContinue

        if (-not $alreadyRunning) {
            Add-Content $logFile "[$timestamp] Starting $exePath"

            $process = Start-Process -FilePath $exePath -PassThru
            $process.WaitForExit()

            $exitCode = $process.ExitCode
            Add-Content $logFile "[$timestamp] Finished with exit code $exitCode"
        }
        else {
            Add-Content $logFile "[$timestamp] Process already running. Skipped."
        }
    }
    catch {
        Add-Content $logFile "[$timestamp] ERROR: $($_.Exception.Message)"
    }

    Start-Sleep -Seconds $intervalSeconds
}
```

</details>

### فایل `SmsRunnerService.xml`
<details>
<summary>نمایش کد فایل XML سرویس</summary>

```xml
<service>
  <id>SmsRunnerService</id>
  <name>SMS Runner Service</name>
  <description>Runs iMaster.ERP.SmsSender.Console.exe every 1 minute</description>

  <executable>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</executable>
  <arguments>-NoProfile -ExecutionPolicy Bypass -File "D:\SmsService\run-loop.ps1"</arguments>

  <logpath>D:\SmsService\logs</logpath>
  <log mode="roll-by-size">
    <sizeThreshold>10240</sizeThreshold>
    <keepFiles>8</keepFiles>
  </log>

  <startmode>Automatic</startmode>

  <onfailure action="restart" delay="10 sec"/>
  <onfailure action="restart" delay="30 sec"/>
  <onfailure action="restart" delay="1 min"/>
</service>
```

</details>

---

## 6) تست فعال بودن سرویس

### روش 1: بررسی در Services
پنجره سرویس‌ها را باز کنید:

```bat
services.msc
```

سرویس زیر باید وجود داشته باشد و در حالت Running باشد:

```text
SMS Runner Service
```

### روش 2: بررسی از خط فرمان
<details>
<summary>دستور بررسی وضعیت سرویس</summary>

```bat
sc query SmsRunnerService
```

</details>

اگر سرویس فعال باشد، وضعیت آن باید شبیه `RUNNING` باشد.

### روش 3: بررسی فایل لاگ برنامه
فایل زیر را بررسی کنید:

```text
D:\SmsService\runner.log
```

اگر سرویس درست کار کند، ورودهای جدید در لاگ ثبت می‌شود.

### روش 4: بررسی لاگ‌های WinSW
پوشه زیر را بررسی کنید:

```text
D:\SmsService\logs
```

---

## 7) تنظیم زمان اجرای برنامه
زمان اجرای مجدد برنامه از این متغیر در فایل `run-loop.ps1` کنترل می‌شود:

```powershell
$intervalSeconds = 60
```

### نمونه‌ها

- اجرای هر 1 دقیقه:
  ```powershell
  $intervalSeconds = 60
  ```

- اجرای هر 2 دقیقه:
  ```powershell
  $intervalSeconds = 120
  ```

- اجرای هر 5 دقیقه:
  ```powershell
  $intervalSeconds = 300
  ```

بعد از تغییر این مقدار، سرویس را ری‌استارت کنید:

<details>
<summary>دستور ری‌استارت سرویس</summary>

```bat
D:\SmsService\SmsRunnerService.exe restart
```

</details>

---

## 8) دستورات کاربردی مدیریت سرویس

<details>
<summary>نمایش دستورهای Start / Stop / Restart / Uninstall</summary>

```bat
D:\SmsService\SmsRunnerService.exe start
D:\SmsService\SmsRunnerService.exe stop
D:\SmsService\SmsRunnerService.exe restart
D:\SmsService\SmsRunnerService.exe uninstall
```

</details>

---

## 9) نکات عملیاتی مهم

- مسیر فایل‌های سرویس را بعد از نصب تغییر ندهید.
- اگر نام فایل اصلی برنامه پیامک تغییر کرد، مقدارهای زیر را نیز اصلاح کنید:
  - `$exePath`
  - `$processName`
- اگر فایل `runner.log` ساخته نشد، دسترسی نوشتن روی مسیر `D:\SmsService` بررسی شود.
- اگر سرویس بالا نیامد، ابتدا لاگ‌های داخل `D:\SmsService\logs` بررسی شوند.
- این سرویس برای زمانی مناسب است که برنامه پیامک:
  - کوتاه‌مدت اجرا شود
  - رکوردها را ارسال کند
  - بسته شود
  - سپس بعد از زمان مشخص دوباره اجرا شود

---

## 10) جمع‌بندی
در این ساختار:

- **WinSW** سرویس ویندوز را مدیریت می‌کند
- **PowerShell** اجرای دوره‌ای برنامه را انجام می‌دهد
- **runner.log** لاگ اجرای برنامه را نگه می‌دارد
- سرویس بعد از ریبوت سرور به‌صورت خودکار دوباره فعال می‌شود
