fix: update migration references in installer and README
This commit is contained in:
377
MIGRATION.md
377
MIGRATION.md
@@ -1,377 +0,0 @@
|
|||||||
# Migration Guide: NUPST v3.x to v4.0
|
|
||||||
|
|
||||||
This guide will help you migrate from NUPST v3.x (Node.js-based) to v4.0 (Deno-based with pre-compiled binaries).
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
NUPST v4.0 is a complete architectural rewrite:
|
|
||||||
|
|
||||||
- **Runtime**: Node.js → Deno
|
|
||||||
- **Distribution**: Git repository + npm packages → Pre-compiled binaries
|
|
||||||
- **Installation**: Clone + setup.sh → Download binary
|
|
||||||
- **Dependencies**: Node.js + npm packages → Zero dependencies (self-contained binary)
|
|
||||||
- **CLI Structure**: Flat commands → Subcommand structure (with backward compatibility)
|
|
||||||
|
|
||||||
**Good news**: Your configuration files are **100% compatible** - no changes needed!
|
|
||||||
|
|
||||||
## Pre-Migration Checklist
|
|
||||||
|
|
||||||
Before migrating, gather this information:
|
|
||||||
|
|
||||||
1. **Current version**: Run `nupst --version` or check `/opt/nupst/`
|
|
||||||
2. **Service status**: Run `nupst status` to verify service is running
|
|
||||||
3. **Configuration backup**: Copy `/etc/nupst/config.json` to a safe location
|
|
||||||
4. **Current installation**: Note where NUPST is installed (usually `/opt/nupst/`)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Backup your configuration
|
|
||||||
sudo cp /etc/nupst/config.json ~/nupst-config-backup.json
|
|
||||||
|
|
||||||
# Check current status
|
|
||||||
nupst status
|
|
||||||
|
|
||||||
# Note your version
|
|
||||||
nupst --version # or cat /opt/nupst/package.json | grep version
|
|
||||||
```
|
|
||||||
|
|
||||||
## Migration Steps
|
|
||||||
|
|
||||||
### Step 1: Stop and Disable v3.x Service
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Stop the running service
|
|
||||||
sudo nupst stop
|
|
||||||
|
|
||||||
# Disable the service (removes from systemd)
|
|
||||||
sudo nupst disable
|
|
||||||
|
|
||||||
# Verify service is stopped
|
|
||||||
sudo systemctl status nupst # Should show "inactive" or "not found"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 2: Remove v3.x Installation
|
|
||||||
|
|
||||||
The v4.0 installer will replace files, but it's cleaner to remove the old installation first:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Remove the symlink
|
|
||||||
sudo rm /usr/local/bin/nupst
|
|
||||||
|
|
||||||
# Remove the installation directory
|
|
||||||
sudo rm -rf /opt/nupst
|
|
||||||
|
|
||||||
# Configuration at /etc/nupst/ is preserved
|
|
||||||
# DO NOT remove /etc/nupst/config.json
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 3: Install NUPST v4.0
|
|
||||||
|
|
||||||
Use the new binary-based installer:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Method 1: Download and run (recommended)
|
|
||||||
curl -sSL https://code.foss.global/serve.zone/nupst/raw/branch/main/install.sh -o nupst-install.sh
|
|
||||||
sudo bash nupst-install.sh
|
|
||||||
rm nupst-install.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Method 2: One-line installation
|
|
||||||
curl -sSL https://code.foss.global/serve.zone/nupst/raw/branch/main/install.sh | sudo bash -s -- -y
|
|
||||||
```
|
|
||||||
|
|
||||||
The installer will:
|
|
||||||
- Auto-detect your platform (Linux x64/ARM64, macOS Intel/ARM, Windows)
|
|
||||||
- Download the appropriate pre-compiled binary
|
|
||||||
- Install to `/opt/nupst/nupst`
|
|
||||||
- Create symlink at `/usr/local/bin/nupst`
|
|
||||||
|
|
||||||
### Step 4: Verify Installation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Check version (should show 4.0.0 or higher)
|
|
||||||
nupst --version
|
|
||||||
|
|
||||||
# Verify configuration is intact
|
|
||||||
nupst config show
|
|
||||||
|
|
||||||
# Test UPS connectivity
|
|
||||||
nupst ups test
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 5: Update CLI Commands (Optional)
|
|
||||||
|
|
||||||
v4.0 uses a new subcommand structure, but **old commands still work** with deprecation warnings.
|
|
||||||
|
|
||||||
You can update your scripts gradually:
|
|
||||||
|
|
||||||
**Old (v3.x) → New (v4.0) Command Mapping:**
|
|
||||||
|
|
||||||
| v3.x Command | v4.0 Command | Status |
|
|
||||||
|-------------|--------------|--------|
|
|
||||||
| `nupst enable` | `nupst service enable` | Old works with warning |
|
|
||||||
| `nupst disable` | `nupst service disable` | Old works with warning |
|
|
||||||
| `nupst start` | `nupst service start` | Old works with warning |
|
|
||||||
| `nupst stop` | `nupst service stop` | Old works with warning |
|
|
||||||
| `nupst status` | `nupst service status` | Old works with warning |
|
|
||||||
| `nupst logs` | `nupst service logs` | Old works with warning |
|
|
||||||
| `nupst add` | `nupst ups add` | Old works with warning |
|
|
||||||
| `nupst edit [id]` | `nupst ups edit [id]` | Old works with warning |
|
|
||||||
| `nupst delete <id>` | `nupst ups remove <id>` | Old works with warning |
|
|
||||||
| `nupst list` | `nupst ups list` | Old works with warning |
|
|
||||||
| `nupst test` | `nupst ups test` | Old works with warning |
|
|
||||||
| `nupst group add` | `nupst group add` | Unchanged |
|
|
||||||
| `nupst group edit <id>` | `nupst group edit <id>` | Unchanged |
|
|
||||||
| `nupst group delete <id>` | `nupst group remove <id>` | Changed |
|
|
||||||
| `nupst group list` | `nupst group list` | Unchanged |
|
|
||||||
| `nupst config` | `nupst config show` | Old works with warning |
|
|
||||||
| `nupst update` | Re-run installer | **Removed** |
|
|
||||||
| `nupst uninstall` | Manual removal | **Removed** |
|
|
||||||
|
|
||||||
**New aliases in v4.0:**
|
|
||||||
- `nupst ls` → `nupst ups list`
|
|
||||||
- `nupst rm <id>` → `nupst ups remove <id>`
|
|
||||||
|
|
||||||
### Step 6: Enable and Start Service
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Enable systemd service
|
|
||||||
sudo nupst service enable
|
|
||||||
|
|
||||||
# Start the service
|
|
||||||
sudo nupst service start
|
|
||||||
|
|
||||||
# Check status
|
|
||||||
nupst service status
|
|
||||||
|
|
||||||
# View logs
|
|
||||||
nupst service logs
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 7: Verify Operation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Check UPS status
|
|
||||||
nupst service status
|
|
||||||
|
|
||||||
# View recent logs
|
|
||||||
nupst service logs
|
|
||||||
|
|
||||||
# Verify daemon is monitoring
|
|
||||||
sudo journalctl -u nupst -n 20
|
|
||||||
```
|
|
||||||
|
|
||||||
## Configuration Compatibility
|
|
||||||
|
|
||||||
### What Stays the Same
|
|
||||||
|
|
||||||
✅ **Configuration file format**: `/etc/nupst/config.json` remains identical
|
|
||||||
|
|
||||||
✅ **All SNMP settings**: host, port, community, version, security levels, etc.
|
|
||||||
|
|
||||||
✅ **UPS device configurations**: All device IDs, names, thresholds, groups
|
|
||||||
|
|
||||||
✅ **Group configurations**: Redundant/non-redundant modes, descriptions
|
|
||||||
|
|
||||||
✅ **Supported UPS models**: CyberPower, APC, Eaton, TrippLite, Liebert, custom OIDs
|
|
||||||
|
|
||||||
### What Changes
|
|
||||||
|
|
||||||
❌ **Installation method**: No more git clone, use binary installer
|
|
||||||
|
|
||||||
❌ **Update process**: Re-run installer instead of `nupst update`
|
|
||||||
|
|
||||||
❌ **Uninstall process**: Manual removal instead of `nupst uninstall`
|
|
||||||
|
|
||||||
❌ **Systemd service path**: ExecStart now points to binary instead of wrapper script
|
|
||||||
|
|
||||||
## Troubleshooting Migration Issues
|
|
||||||
|
|
||||||
### Issue: `nupst: command not found`
|
|
||||||
|
|
||||||
**Solution**: Symlink wasn't created or isn't in PATH
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Verify symlink exists
|
|
||||||
ls -la /usr/local/bin/nupst
|
|
||||||
|
|
||||||
# If missing, create manually
|
|
||||||
sudo ln -sf /opt/nupst/nupst /usr/local/bin/nupst
|
|
||||||
|
|
||||||
# Or add binary location to PATH
|
|
||||||
export PATH="/opt/nupst:$PATH"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Issue: `Permission denied` when running nupst
|
|
||||||
|
|
||||||
**Solution**: Binary isn't executable
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo chmod +x /opt/nupst/nupst
|
|
||||||
```
|
|
||||||
|
|
||||||
### Issue: Service won't start after migration
|
|
||||||
|
|
||||||
**Solution**: Systemd service file may reference old paths
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Check service file
|
|
||||||
sudo systemctl cat nupst
|
|
||||||
|
|
||||||
# If it references old paths, re-enable service
|
|
||||||
sudo nupst service disable
|
|
||||||
sudo nupst service enable
|
|
||||||
sudo nupst service start
|
|
||||||
```
|
|
||||||
|
|
||||||
### Issue: Configuration not found
|
|
||||||
|
|
||||||
**Solution**: Configuration may have been accidentally deleted
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Restore from backup
|
|
||||||
sudo cp ~/nupst-config-backup.json /etc/nupst/config.json
|
|
||||||
|
|
||||||
# Or re-create configuration
|
|
||||||
sudo nupst ups add
|
|
||||||
```
|
|
||||||
|
|
||||||
### Issue: Old commands show deprecation warnings
|
|
||||||
|
|
||||||
**This is expected behavior**. Old commands still work but will show:
|
|
||||||
|
|
||||||
```
|
|
||||||
Note: 'nupst enable' is deprecated. Use 'nupst service enable' instead.
|
|
||||||
```
|
|
||||||
|
|
||||||
To remove warnings, update to the new command syntax (see Step 5 above).
|
|
||||||
|
|
||||||
### Issue: Binary won't execute (macOS)
|
|
||||||
|
|
||||||
**Solution**: macOS Gatekeeper may block unsigned binaries
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Remove quarantine attribute
|
|
||||||
xattr -d com.apple.quarantine /opt/nupst/nupst
|
|
||||||
|
|
||||||
# Or right-click and "Open" in Finder
|
|
||||||
```
|
|
||||||
|
|
||||||
### Issue: Wrong architecture binary downloaded
|
|
||||||
|
|
||||||
**Solution**: Installer detected wrong platform
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Check your architecture
|
|
||||||
uname -m # Should show: x86_64 (x64) or aarch64/arm64 (ARM)
|
|
||||||
|
|
||||||
# Download correct binary manually
|
|
||||||
# For Linux x64:
|
|
||||||
curl -sSL https://code.foss.global/serve.zone/nupst/releases/download/v4.0.0/nupst-linux-x64 -o nupst
|
|
||||||
sudo mv nupst /opt/nupst/nupst
|
|
||||||
sudo chmod +x /opt/nupst/nupst
|
|
||||||
```
|
|
||||||
|
|
||||||
## Rollback to v3.x
|
|
||||||
|
|
||||||
If you need to rollback to v3.x:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Stop v4.0 service
|
|
||||||
sudo nupst service stop
|
|
||||||
sudo nupst service disable
|
|
||||||
|
|
||||||
# Remove v4.0 installation
|
|
||||||
sudo rm /usr/local/bin/nupst
|
|
||||||
sudo rm -rf /opt/nupst
|
|
||||||
|
|
||||||
# Reinstall v3.x using old method
|
|
||||||
cd /tmp
|
|
||||||
git clone https://code.foss.global/serve.zone/nupst.git -b main /opt/nupst
|
|
||||||
cd /opt/nupst
|
|
||||||
git checkout v3.1.2 # Or your previous version
|
|
||||||
sudo ./install.sh -y
|
|
||||||
|
|
||||||
# Your configuration at /etc/nupst/config.json will still work
|
|
||||||
```
|
|
||||||
|
|
||||||
## Post-Migration Best Practices
|
|
||||||
|
|
||||||
### Update Automation Scripts
|
|
||||||
|
|
||||||
If you have scripts or automation that call NUPST:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Update cron jobs, monitoring scripts, etc.
|
|
||||||
# Old: nupst status
|
|
||||||
# New: nupst service status
|
|
||||||
|
|
||||||
# Example crontab update:
|
|
||||||
# OLD: 0 * * * * /usr/local/bin/nupst status >> /var/log/nupst-check.log
|
|
||||||
# NEW: 0 * * * * /usr/local/bin/nupst service status >> /var/log/nupst-check.log
|
|
||||||
```
|
|
||||||
|
|
||||||
### Monitor for Issues
|
|
||||||
|
|
||||||
Keep an eye on logs for the first few days:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Real-time monitoring
|
|
||||||
nupst service logs
|
|
||||||
|
|
||||||
# Check for errors
|
|
||||||
sudo journalctl -u nupst --since "1 hour ago" | grep -i error
|
|
||||||
```
|
|
||||||
|
|
||||||
### Update Documentation
|
|
||||||
|
|
||||||
Update any internal documentation to reflect:
|
|
||||||
- New installation method (binary-based)
|
|
||||||
- New CLI command structure
|
|
||||||
- New update process (re-run installer)
|
|
||||||
|
|
||||||
## Benefits of v4.0
|
|
||||||
|
|
||||||
After migration, you'll enjoy:
|
|
||||||
|
|
||||||
✅ **Faster Startup**: Binary starts in milliseconds vs seconds
|
|
||||||
|
|
||||||
✅ **Zero Dependencies**: No Node.js or npm on the system
|
|
||||||
|
|
||||||
✅ **Easier Updates**: `curl | bash` vs `git pull && npm install`
|
|
||||||
|
|
||||||
✅ **Better Security**: No npm supply chain risks, checksums provided
|
|
||||||
|
|
||||||
✅ **Smaller Footprint**: ~340MB binary vs ~500MB+ (repo + Node.js + node_modules)
|
|
||||||
|
|
||||||
✅ **Official Support**: Pre-compiled binaries for all major platforms
|
|
||||||
|
|
||||||
✅ **Automated Releases**: New versions built and tested automatically
|
|
||||||
|
|
||||||
## Need Help?
|
|
||||||
|
|
||||||
- **Issues**: https://code.foss.global/serve.zone/nupst/issues
|
|
||||||
- **Documentation**: https://code.foss.global/serve.zone/nupst
|
|
||||||
- **Changelog**: See [changelog.md](./changelog.md) for detailed v4.0 changes
|
|
||||||
|
|
||||||
## Migration Checklist
|
|
||||||
|
|
||||||
Use this checklist to track your migration:
|
|
||||||
|
|
||||||
- [ ] Backup configuration file
|
|
||||||
- [ ] Note current version and status
|
|
||||||
- [ ] Stop v3.x service (`nupst stop`)
|
|
||||||
- [ ] Disable v3.x service (`nupst disable`)
|
|
||||||
- [ ] Remove old installation
|
|
||||||
- [ ] Run v4.0 installer
|
|
||||||
- [ ] Verify version (`nupst --version`)
|
|
||||||
- [ ] Test configuration (`nupst config show`)
|
|
||||||
- [ ] Test UPS connectivity (`nupst ups test`)
|
|
||||||
- [ ] Enable v4.0 service (`nupst service enable`)
|
|
||||||
- [ ] Start v4.0 service (`nupst service start`)
|
|
||||||
- [ ] Verify service status (`nupst service status`)
|
|
||||||
- [ ] Monitor logs for issues (`nupst service logs`)
|
|
||||||
- [ ] Update automation scripts (optional)
|
|
||||||
- [ ] Update documentation (optional)
|
|
||||||
|
|
||||||
Welcome to NUPST v4.0! 🎉
|
|
@@ -362,7 +362,7 @@ if [ $OLD_NODE_INSTALL -eq 1 ]; then
|
|||||||
echo " • CLI commands now use subcommand structure"
|
echo " • CLI commands now use subcommand structure"
|
||||||
echo " (old commands still work with deprecation warnings)"
|
echo " (old commands still work with deprecation warnings)"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Migration guide: https://code.foss.global/serve.zone/nupst/src/branch/main/MIGRATION.md"
|
echo "See readme for migration details: https://code.foss.global/serve.zone/nupst#migration-from-v3x"
|
||||||
echo ""
|
echo ""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
90
readme.md
90
readme.md
@@ -435,18 +435,88 @@ sha256sum -c SHA256SUMS.txt --ignore-missing
|
|||||||
|
|
||||||
## Migration from v3.x
|
## Migration from v3.x
|
||||||
|
|
||||||
If you're upgrading from NUPST v3.x (Node.js-based), see [MIGRATION.md](./MIGRATION.md) for detailed migration instructions.
|
If you're upgrading from NUPST v3.x (Node.js-based) to v4.0 (Deno-based), the migration is straightforward using the install.sh script.
|
||||||
|
|
||||||
**Key Changes in v4.0:**
|
### Quick Migration
|
||||||
- Powered by Deno instead of Node.js
|
|
||||||
- Distributed as pre-compiled binaries
|
|
||||||
- New subcommand structure (backward compatible)
|
|
||||||
- Zero dependencies required
|
|
||||||
- Smaller installation footprint
|
|
||||||
- Faster startup and execution
|
|
||||||
|
|
||||||
**Configuration Compatibility:**
|
The installer script automatically handles the entire migration while preserving your configuration:
|
||||||
Your existing `/etc/nupst/config.json` from v3.x is fully compatible with v4.0. No changes required.
|
|
||||||
|
```bash
|
||||||
|
# Run the installer (handles stop/update/restart automatically)
|
||||||
|
curl -sSL https://code.foss.global/serve.zone/nupst/raw/branch/main/install.sh | sudo bash -s -- -y
|
||||||
|
|
||||||
|
# Verify
|
||||||
|
nupst service status
|
||||||
|
```
|
||||||
|
|
||||||
|
**That's it!** The installer automatically:
|
||||||
|
- Detects your v3.x installation
|
||||||
|
- Stops the running service
|
||||||
|
- Replaces the binary with v4.0
|
||||||
|
- Restarts the service
|
||||||
|
- Preserves your `/etc/nupst/config.json` (fully compatible, no changes needed)
|
||||||
|
|
||||||
|
### Key Changes in v4.0
|
||||||
|
|
||||||
|
- **Runtime**: Node.js → Deno
|
||||||
|
- **Distribution**: Git repository + npm packages → Pre-compiled binaries
|
||||||
|
- **Installation**: Clone + setup.sh → Download binary via install.sh
|
||||||
|
- **Dependencies**: Node.js + npm packages → Zero dependencies (self-contained binary)
|
||||||
|
- **CLI Structure**: Flat commands → Subcommand structure (backward compatible)
|
||||||
|
- **Updates**: `nupst update` → Re-run install.sh
|
||||||
|
- **Footprint**: Single ~340MB self-contained binary (vs repo + node_modules in v3.x)
|
||||||
|
- **Startup**: Seconds → Milliseconds
|
||||||
|
|
||||||
|
### Command Mapping
|
||||||
|
|
||||||
|
v4.0 uses a new subcommand structure, but **old commands still work** with deprecation warnings:
|
||||||
|
|
||||||
|
| v3.x Command | v4.0 Command | Notes |
|
||||||
|
|-------------|--------------|-------|
|
||||||
|
| `nupst enable` | `nupst service enable` | Old works with warning |
|
||||||
|
| `nupst disable` | `nupst service disable` | Old works with warning |
|
||||||
|
| `nupst start` | `nupst service start` | Old works with warning |
|
||||||
|
| `nupst stop` | `nupst service stop` | Old works with warning |
|
||||||
|
| `nupst status` | `nupst service status` | Old works with warning |
|
||||||
|
| `nupst logs` | `nupst service logs` | Old works with warning |
|
||||||
|
| `nupst add` | `nupst ups add` | Old works with warning |
|
||||||
|
| `nupst edit [id]` | `nupst ups edit [id]` | Old works with warning |
|
||||||
|
| `nupst delete <id>` | `nupst ups remove <id>` | Old works with warning |
|
||||||
|
| `nupst list` | `nupst ups list` | Old works with warning |
|
||||||
|
| `nupst test` | `nupst ups test` | Old works with warning |
|
||||||
|
| `nupst config` | `nupst config show` | Old works with warning |
|
||||||
|
|
||||||
|
**New aliases:** `nupst ls` (list UPS devices), `nupst rm <id>` (remove UPS device)
|
||||||
|
|
||||||
|
### Configuration Compatibility
|
||||||
|
|
||||||
|
✅ **Fully Compatible:**
|
||||||
|
- Configuration file format: `/etc/nupst/config.json`
|
||||||
|
- All SNMP settings (host, port, community, version, security)
|
||||||
|
- UPS device configurations (IDs, names, thresholds, groups)
|
||||||
|
- Group configurations (redundant/non-redundant modes)
|
||||||
|
- Supported UPS models (CyberPower, APC, Eaton, TrippLite, Liebert, custom OIDs)
|
||||||
|
|
||||||
|
### Troubleshooting Migration
|
||||||
|
|
||||||
|
**Service won't start after migration:**
|
||||||
|
```bash
|
||||||
|
# Re-enable service to update systemd file
|
||||||
|
sudo nupst service disable
|
||||||
|
sudo nupst service enable
|
||||||
|
sudo nupst service start
|
||||||
|
```
|
||||||
|
|
||||||
|
**Binary won't execute:**
|
||||||
|
```bash
|
||||||
|
sudo chmod +x /opt/nupst/nupst
|
||||||
|
```
|
||||||
|
|
||||||
|
**Command not found:**
|
||||||
|
```bash
|
||||||
|
# Recreate symlink
|
||||||
|
sudo ln -sf /opt/nupst/nupst /usr/local/bin/nupst
|
||||||
|
```
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
|
@@ -13,8 +13,11 @@ echo ""
|
|||||||
echo "Compiling for all supported platforms..."
|
echo "Compiling for all supported platforms..."
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# Create binary directory
|
# Clean up old binaries and create fresh directory
|
||||||
|
rm -rf "$BINARY_DIR"
|
||||||
mkdir -p "$BINARY_DIR"
|
mkdir -p "$BINARY_DIR"
|
||||||
|
echo "→ Cleaned old binaries from $BINARY_DIR"
|
||||||
|
echo ""
|
||||||
|
|
||||||
# Linux x86_64
|
# Linux x86_64
|
||||||
echo "→ Compiling for Linux x86_64..."
|
echo "→ Compiling for Linux x86_64..."
|
||||||
|
Reference in New Issue
Block a user