tauri-plugin-device-info 1.0.1

A Tauri plugin to access device information.
Documentation
# 🐧 Linux Device Info - Detailed Documentation

## 📋 Overview

Collects device information for Linux platform using **sysfs** and **proc filesystem**. This approach leverages Linux's "everything is a file" philosophy - system information is presented as virtual files.

## 🏗️ Architecture

### Technologies Used:
- **sysfs**: `/sys` - Modern Linux system information interface
- **procfs**: `/proc` - Older but still used system interface
- **DMI (Desktop Management Interface)**: BIOS/UEFI information standard
- **Standard Rust fs**: File reading operations

## 🗂️ File System Structure

### /proc Directory
```
/proc/sys/kernel/hostname    # System hostname
```

### /sys Directory
```
/sys/class/dmi/id/
├── sys_vendor              # System manufacturer
├── product_name            # Product name/model
├── product_uuid            # Unique system ID
└── product_serial          # Serial number
```

### /etc Directory
```
/etc/hostname               # Hostname fallback
/etc/machine-id             # System unique ID fallback
```

## 🔧 Code Analysis

### 1. Helper Function
```rust
fn read(path: &str) -> Option<String> {
    fs::read_to_string(path).ok().map(|s| s.trim().to_string())
}
```

**What It Does:**
- Reads the specified file path
- Returns `None` on error (with `.ok()`)
- Cleans whitespace on successful read (`.trim()`)
- Returns `Option<String>` - safe error handling

**Advantages:**
- Doesn't panic if file doesn't exist or can't be read
- Automatic string cleaning
- Safe file reading in a single line

### 2. Device Name (Hostname)
```rust
let device_name = read("/proc/sys/kernel/hostname").or_else(|| read("/etc/hostname"));
```

**Two Fallback Strategy:**
1. **Primary**: `/proc/sys/kernel/hostname` - Running kernel's hostname
2. **Fallback**: `/etc/hostname` - Persistent hostname configuration

**Why Two Paths?**
- `/proc/sys/kernel/hostname`: Runtime hostname (modifiable)
- `/etc/hostname`: Boot-time hostname (persistent)
- May differ based on network configuration

### 3. Hardware Information (DMI)
```rust
manufacturer: read("/sys/class/dmi/id/sys_vendor"),
model: read("/sys/class/dmi/id/product_name"),
serial: read("/sys/class/dmi/id/product_serial"),
```

**What is DMI (Desktop Management Interface)?**
- Hardware information provided by BIOS/UEFI
- Standard SMBIOS (System Management BIOS) protocol
- Embedded in firmware by manufacturer

**What Each Field Means:**
- `sys_vendor`: **Dell Inc.**, **HP**, **ASUS**, etc.
- `product_name`: **OptiPlex 7090**, **ThinkPad X1 Carbon**, etc.
- `product_serial`: Unique serial number

### 4. UUID with Machine-ID Fallback
```rust
uuid: read("/sys/class/dmi/id/product_uuid").or_else(|| read("/etc/machine-id")),
```

**Two-Level UUID:**
1. **Hardware UUID**: Hardware-based UUID from BIOS
2. **Machine-ID**: Software UUID generated by systemd

**Fallback Logic:**
- First tries hardware UUID (more reliable)
- Uses machine-id if hardware UUID is missing or empty
- Hardware UUID may not exist in virtual machines

## 📊 Data Sources Detail

### /sys/class/dmi/id/* Files

| File | Description | Example Value |
|------|-------------|---------------|
| `sys_vendor` | System manufacturer | "Dell Inc." |
| `product_name` | Product model | "OptiPlex 7090" |
| `product_uuid` | Hardware UUID | "12345678-1234-..." |
| `product_serial` | Serial number | "ABC123DEF" |
| `board_vendor` | Motherboard manufacturer | "Dell Inc." |
| `board_name` | Motherboard model | "0ABC12" |
| `chassis_serial` | Chassis serial no | "XYZ789" |

### Proc Filesystem Alternatives

| Information | Primary Path | Alternative |
|-------------|--------------|-------------|
| Hostname | `/proc/sys/kernel/hostname` | `/etc/hostname` |
| Machine ID | `/sys/class/dmi/id/product_uuid` | `/etc/machine-id` |
| Kernel Info | `/proc/version` | `/proc/sys/kernel/release` |

## 🛡️ Error Handling

### Graceful Degradation
```rust
Ok(DeviceInfoResponse {
    device_name,           // Option<String>
    manufacturer: read("/sys/class/dmi/id/sys_vendor"),  // Option<String>
    model: read("/sys/class/dmi/id/product_name"),       // Option<String>
    uuid: read("/sys/class/dmi/id/product_uuid")
        .or_else(|| read("/etc/machine-id")),            // Option<String>
    serial: read("/sys/class/dmi/id/product_serial"),    // Option<String>
    android_id: None,
})
```

**Approach:**
- Every field is `Option<String>` - `None` on failure
- Response is returned even if no files can be read
- Partial success possible (some fields filled, some empty)

### Possible Error Scenarios:

1. **Permission Issues:**
   ```bash
   # Some DMI files may require root
   sudo cat /sys/class/dmi/id/product_serial
   ```

2. **Virtual Machines:**
   - DMI information may be missing or generic
   - UUID is generated by hypervisor

3. **Embedded Systems:**
   - ARM boards may not have DMI support
   - Device tree information is in different location

4. **Container Environments:**
   - `/sys` may not be mounted
   - Host system information may not be visible

## 🖥️ Platform Variations

### Desktop/Laptop Systems:
```bash
/sys/class/dmi/id/sys_vendor: "Dell Inc."
/sys/class/dmi/id/product_name: "Latitude E7470"
```

### Server Systems:
```bash
/sys/class/dmi/id/sys_vendor: "Supermicro"
/sys/class/dmi/id/product_name: "Super Server"
```

### Virtual Machines:
```bash
/sys/class/dmi/id/sys_vendor: "QEMU"
/sys/class/dmi/id/product_name: "Standard PC (i440FX + PIIX, 1996)"
```

### ARM/Embedded:
```bash
# DMI information may not exist, device tree is used:
/proc/device-tree/model
/proc/cpuinfo
```

## 🔍 Debugging and Testing

### Manual Check:
```bash
# Show all DMI information
ls -la /sys/class/dmi/id/
cat /sys/class/dmi/id/*

# Check hostname
cat /proc/sys/kernel/hostname
cat /etc/hostname

# Check machine ID
cat /etc/machine-id
```

### DMI Decode Tool:
```bash
# Detailed hardware information
sudo dmidecode -t system
sudo dmidecode -t baseboard
sudo dmidecode -t chassis
```

## 📝 Example Output

### Physical Machine:
```json
{
  "device_name": "ubuntu-desktop",
  "manufacturer": "Dell Inc.",
  "model": "OptiPlex 7090",
  "uuid": "12345678-1234-5678-9abc-def012345678",
  "serial": "ABC123D",
  "android_id": null
}
```

### Virtual Machine:
```json
{
  "device_name": "vm-test",
  "manufacturer": "QEMU",
  "model": "Standard PC (Q35 + ICH9, 2009)",
  "uuid": "98765432-4321-8765-cba9-876543210fed",
  "serial": null,
  "android_id": null
}
```

---

This implementation uses Linux's native file system interfaces to provide maximum compatibility and minimal dependencies.