Compare commits
136 Commits
d22e0ead04
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 5b9f1f2f39 | |||
| c5bfc7907b | |||
| 533b0b5ffc | |||
| eba54804d3 | |||
| 09b62923a8 | |||
| 960755e6a2 | |||
| 0fa9b0d85a | |||
| 4de18e6696 | |||
| 3772d373bb | |||
| b75597946d | |||
| 018a91e216 | |||
| 0c61a27b06 | |||
| 675ed5eb39 | |||
| 94f60e30b1 | |||
| e8ccb76cc6 | |||
| 4274f876a7 | |||
| 4760c84bff | |||
| 20b3f7f4ec | |||
| f178e39a28 | |||
| c7b954252d | |||
| 18929109a2 | |||
| 8d24cb96a9 | |||
| 9be43af11a | |||
| ce2e85d197 | |||
| aeead798c3 | |||
| 72355bb65a | |||
| 3053b24063 | |||
| 186fe21d73 | |||
| d63a909d54 | |||
| 9128c453f3 | |||
| ffbd193b79 | |||
| 5259c72de4 | |||
| 045f43b51f | |||
| 89cc3cddeb | |||
| cd7449dd7c | |||
| 2b35e1e017 | |||
| 983f9ecb04 | |||
| b5f567ce2b | |||
| a16e713895 | |||
| 70d24d7fae | |||
| d5069d4c40 | |||
| 718b29cfe8 | |||
| e3ce0b6e57 | |||
| 3ba76a4e8d | |||
| 4f1f145a10 | |||
| 2123205ca0 | |||
| e510f8ccb6 | |||
| da398172e8 | |||
| 12067ac09b | |||
| cf2c35b114 | |||
| 5629472aa3 | |||
| a7a85ee67a | |||
| 4890aa192d | |||
| 819ff0add0 | |||
| 149da1be87 | |||
| 6f1bc4dd00 | |||
| 5d434f031d | |||
| 25b5623a65 | |||
| 20477c21ab | |||
| 8ed85fff2b | |||
| ab8f58ca92 | |||
| 20e11b7419 | |||
| 11c28c7ab3 | |||
| 908664b185 | |||
| 40ce9940ae | |||
| 64ffeeca17 | |||
| 0106ac7eff | |||
| 86f5bf7e3f | |||
| a18d467c4f | |||
| 3a659b4798 | |||
| 7f996e7724 | |||
| 3688539a90 | |||
| c28d7683d8 | |||
| a5b559c59c | |||
| d22d21148c | |||
| 2b4dac7ef3 | |||
| 498f8a7333 | |||
| d28f2e8c31 | |||
| ca3f1e82ed | |||
| 4b66de068b | |||
| 1e88f1b912 | |||
| cbe7e0468d | |||
| a664b70cf4 | |||
| b5199d5682 | |||
| 35ec2993cc | |||
| e4838f361e | |||
| f32b8c84b0 | |||
| f34953b3cc | |||
| e91394ee00 | |||
| a40ac543e9 | |||
| 06a3209046 | |||
| 5ef6d2dc0f | |||
| 36c0786255 | |||
| 25e66b3d19 | |||
| aa24a58aae | |||
| 7298fca349 | |||
| 7191e10f91 | |||
| e80dddf9a7 | |||
| 481e2e2277 | |||
| de84a404f0 | |||
| a5d57fdd3d | |||
| 732233df32 | |||
| 93a962a008 | |||
| ed13912034 | |||
| 2ee0ed2a09 | |||
| f9f5f9a017 | |||
| 647f64c99e | |||
| e04a5a2de4 | |||
| 395263ee66 | |||
| bdc4ff67e7 | |||
| 1d078a30e0 | |||
| 0d8502bfac | |||
| a44254bcc9 | |||
| dcf9aaee84 | |||
| 8dc558a6d5 | |||
| ff275aa0ad | |||
| 0ead0af0b5 | |||
| 21899bb072 | |||
| 84dc370d32 | |||
| ab1569fced | |||
| be5dfb2832 | |||
| 7dbc7fc3ef | |||
| 9efb42f944 | |||
| 6ba2335f8a | |||
| 114c9dfc68 | |||
| 864756c815 | |||
| 116636c9a3 | |||
| dc3ccef3fd | |||
| 5ae94d72b4 | |||
| b245bffbc8 | |||
| 98c17f4ad7 | |||
| a75505f467 | |||
| cabd3aca8b | |||
| 75303a619e | |||
| 60c73cac78 | |||
| 3c8b230cc3 |
5
.gitignore
vendored
5
.gitignore
vendored
@@ -1,7 +1,8 @@
|
|||||||
src/
|
src/
|
||||||
bin/
|
bin/
|
||||||
.vscode/
|
.vscode/
|
||||||
.dependencies
|
*.code-workspace
|
||||||
.dependencies_sc
|
backups/
|
||||||
|
.dependencies_source
|
||||||
.dependencies_ib
|
.dependencies_ib
|
||||||
|
|
||||||
|
|||||||
30
README.md
30
README.md
@@ -1,10 +1,10 @@
|
|||||||
# openwrtbuilder
|
# openwrtbuilder
|
||||||
|
|
||||||
Sanely build and deploy OpenWRT images using the Image Builder or from source code.
|
Build and deploy OpenWRT images using shell-style device profiles, via source code or the official Image Builder.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
`openwrtbuilder [--option [VALUE]]... -p PROFILE [-p PROFILE]...`
|
`openwrtbuilder [OPTION [VALUE]]... -p PROFILE [-p PROFILE]...`
|
||||||
|
|
||||||
## Options
|
## Options
|
||||||
|
|
||||||
@@ -13,8 +13,9 @@ Sanely build and deploy OpenWRT images using the Image Builder or from source co
|
|||||||
--release,-r,--version,-v RELEASE ("snapshot", "22.03.3")
|
--release,-r,--version,-v RELEASE ("snapshot", "22.03.3")
|
||||||
--buildroot,-b PATH (Default: script directory)
|
--buildroot,-b PATH (Default: script directory)
|
||||||
--source
|
--source
|
||||||
Build image from source, not from Image Builder
|
Build image from source code, not from Image Builder.
|
||||||
Allows make config options to be passed in profile
|
Allows make config options to be passed in profile.
|
||||||
|
Uses git worktree for multi-profile deduplication.
|
||||||
--ssh-upgrade HOST
|
--ssh-upgrade HOST
|
||||||
Example: root@192.168.1.1
|
Example: root@192.168.1.1
|
||||||
--ssh-backup SSH_PATH
|
--ssh-backup SSH_PATH
|
||||||
@@ -24,6 +25,8 @@ Sanely build and deploy OpenWRT images using the Image Builder or from source co
|
|||||||
--reset
|
--reset
|
||||||
Cleanup all source and output files
|
Cleanup all source and output files
|
||||||
Can be combined with -p to reset a specific profile
|
Can be combined with -p to reset a specific profile
|
||||||
|
--depends
|
||||||
|
Force dependency installation
|
||||||
--yes,-y
|
--yes,-y
|
||||||
Assume yes for all questions (automatic mode)
|
Assume yes for all questions (automatic mode)
|
||||||
--debug,-d
|
--debug,-d
|
||||||
@@ -32,15 +35,22 @@ Sanely build and deploy OpenWRT images using the Image Builder or from source co
|
|||||||
|
|
||||||
## Profiles
|
## Profiles
|
||||||
|
|
||||||
See `./profiles` for example device profile definitions.
|
See `profiles` for example device profile definitions. Multiple `--profile` can be passed at once.
|
||||||
|
|
||||||
|
The default build mode is `imagebuilder` unless `--source` is passed. Default profile modes can be set individually in `profiles`.
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
* `./openwrtbuilder -p r4s -r snapshot --debug`
|
* `openwrtbuilder -p r4s -p ax6000`
|
||||||
* `./openwrtbuilder -p ax6000 -r 23.05.5 --source --debug`
|
* `openwrtbuilder -p r4s -r snapshot --debug`
|
||||||
* `./openwrtbuilder -p rpi4 -r 23.05.5 --flash /dev/sdX`
|
* `openwrtbuilder -p ax6000 -r 23.05.5 --source --debug`
|
||||||
* `./openwrtbuilder -p linksys -r snapshot --ssh-upgrade root@192.168.1.1`
|
* `openwrtbuilder -p rpi4 -r 23.05.5 --flash /dev/sdX`
|
||||||
|
* `openwrtbuilder -p linksys -r snapshot --ssh-upgrade root@192.168.1.1`
|
||||||
|
|
||||||
## Additional Info
|
## Additional Info
|
||||||
|
|
||||||
Did you find `openwrtbuilder` useful? [Buy me a coffee!](https://paypal.me/bryanroessler)
|
Find `openwrtbuilder` useful? [Paypal me a coffee!](https://paypal.me/bryanroessler)
|
||||||
|
|
||||||
|
[↓ ↓ ↓ Bitcoin ↓ ↓ ↓](bitcoin:bc1q7wy0kszjavgcrvkxdg7mf3s6rh506rasnhfa4a)
|
||||||
|
|
||||||
|
[](bitcoin:bc1q7wy0kszjavgcrvkxdg7mf3s6rh506rasnhfa4a)
|
||||||
|
|||||||
854
openwrtbuilder
854
openwrtbuilder
File diff suppressed because it is too large
Load Diff
317
profiles
317
profiles
@@ -1,217 +1,130 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
# Device profiles for openwrtbuilder
|
||||||
# shellcheck disable=SC2034
|
# shellcheck disable=SC2034
|
||||||
# This file contains a set of device profiles for openwrtbuilder
|
|
||||||
# bash doesn't like nested arrays so we use strings instead
|
|
||||||
|
|
||||||
# Packages to install for all profiles
|
# Default (but optional) packages (precede with "-" to exclude)
|
||||||
default_packages="\
|
default_packages=(nano htop diffutils tar iperf3 zsh rsync curl tcpdump
|
||||||
luci \
|
openssh-sftp-server luci luci-ssl luci-proto-wireguard luci-app-statistics
|
||||||
luci-ssl \
|
collectd-mod-sensors collectd-mod-thermal collectd-mod-conntrack collectd-mod-cpu
|
||||||
luci-proto-wireguard \
|
)
|
||||||
luci-app-statistics \
|
|
||||||
collectd-mod-sensors \
|
# Default (but optional) kernel configs
|
||||||
collectd-mod-thermal \
|
default_configs=(
|
||||||
collectd-mod-conntrack \
|
)
|
||||||
collectd-mod-cpu \
|
|
||||||
nano \
|
|
||||||
htop \
|
|
||||||
diffutils \
|
|
||||||
tar \
|
|
||||||
iperf3 \
|
|
||||||
zsh \
|
|
||||||
rsync \
|
|
||||||
openssh-sftp-server \
|
|
||||||
"
|
|
||||||
|
|
||||||
# Current devices
|
# Current devices
|
||||||
# Main router
|
declare -Ag r4s=(
|
||||||
declare -Ag r4s
|
[mode]="source"
|
||||||
r4s['device']="friendlyarm_nanopi-r4s"
|
[device]="friendlyarm_nanopi-r4s"
|
||||||
r4s['target']="rockchip/armv8"
|
[target]="rockchip/armv8"
|
||||||
r4s['filesystem']="ext4"
|
[filesystem]="ext4"
|
||||||
r4s['packages']="\
|
[packages]="${default_packages[*]} \
|
||||||
$default_packages \
|
luci-app-ddns luci-app-sqm \
|
||||||
luci-app-ddns \
|
adblock luci-app-adblock \
|
||||||
luci-app-sqm \
|
collectd-mod-df usbutils kmod-usb-storage kmod-usb-storage-uas \
|
||||||
irqbalance \
|
kmod-fs-btrfs btrfs-progs block-mount smcroute avahi-daemon \
|
||||||
collectd-mod-df \
|
ethtool ca-bundle tailscale"
|
||||||
usbutils \
|
[config]="${default_configs[*]} \
|
||||||
kmod-usb-storage \
|
CONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y CONFIG_BTRFS_PROGS_ZSTD=y \
|
||||||
kmod-usb-storage-uas \
|
CONFIG_TARGET_ROOTFS_PARTSIZE=512 CONFIG_TARGET_KERNEL_PARTSIZE=32"
|
||||||
kmod-fs-btrfs \
|
[files]="/mnt/backup"
|
||||||
btrfs-progs \
|
# For 24.10 branch (Linux 6.6)
|
||||||
block-mount \
|
# [cherrypicks]="wurzerj:59d6e31 wurzerj:bb251b8" # fix inconsistent reboot
|
||||||
smcroute \
|
)
|
||||||
avahi-daemon \
|
|
||||||
curl \
|
|
||||||
ethtool \
|
|
||||||
ca-bundle"
|
|
||||||
# The following are source mode only
|
|
||||||
r4s['config']="\
|
|
||||||
CONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y \
|
|
||||||
CONFIG_BTRFS_PROGS_ZSTD=y \
|
|
||||||
CONFIG_TARGET_ROOTFS_PARTSIZE=512 \
|
|
||||||
CONFIG_TARGET_KERNEL_PARTSIZE=32"
|
|
||||||
r4s['files']="\
|
|
||||||
/mnt/backup"
|
|
||||||
|
|
||||||
# Access point
|
declare -Ag ax6000=(
|
||||||
declare -Ag ax6000
|
[mode]="imagebuilder"
|
||||||
ax6000['device']="xiaomi_redmi-router-ax6000-stock"
|
[device]="xiaomi_redmi-router-ax6000-stock"
|
||||||
ax6000['target']="mediatek/filogic"
|
[target]="mediatek/filogic"
|
||||||
ax6000['release']="snapshot"
|
[release]="snapshot"
|
||||||
ax6000['filesystem']="squashfs"
|
[filesystem]="squashfs"
|
||||||
ax6000['packages']="\
|
[packages]="${default_packages[*]} \
|
||||||
$default_packages \
|
-dnsmasq -odhcpd-ipv6only -nftables -firewall4 tailscale"
|
||||||
-dnsmasq \
|
)
|
||||||
-odhcpd-ipv6only \
|
|
||||||
-nftables \
|
|
||||||
-firewall4"
|
|
||||||
|
|
||||||
# For uboot'd access points
|
declare -Ag ax6000_uboot=(
|
||||||
declare -Ag ax6000_uboot
|
[mode]="imagebuilder"
|
||||||
ax6000_uboot['device']="xiaomi_redmi-router-ax6000-ubootmod"
|
[device]="xiaomi_redmi-router-ax6000-ubootmod"
|
||||||
ax6000_uboot['target']="mediatek/filogic"
|
[target]="mediatek/filogic"
|
||||||
ax6000_uboot['release']="snapshot"
|
[release]="snapshot"
|
||||||
ax6000_uboot['filesystem']="squashfs"
|
[filesystem]="squashfs"
|
||||||
ax6000_uboot['packages']="\
|
[packages]="${default_packages[*]} \
|
||||||
$default_packages \
|
-dnsmasq -odhcpd-ipv6only -nftables -firewall4"
|
||||||
-dnsmasq \
|
)
|
||||||
-odhcpd-ipv6only \
|
|
||||||
-nftables \
|
|
||||||
-firewall4"
|
|
||||||
|
|
||||||
# Remote NAS
|
declare -Ag n5100=(
|
||||||
declare -Ag n5100
|
[device]="generic"
|
||||||
n5100['device']="generic"
|
[target]="x86/64"
|
||||||
n5100['target']="x86/64"
|
[filesystem]="squashfs"
|
||||||
n5100['filesystem']="squashfs"
|
[packages]="${default_packages[*]} \
|
||||||
n5100['packages']="\
|
luci-app-ddns irqbalance collectd-mod-df \
|
||||||
$default_packages \
|
usbutils kmod-usb-storage kmod-usb-storage-uas kmod-fs-btrfs \
|
||||||
luci-app-ddns \
|
btrfs-progs block-mount cryptsetup kmod-crypto-xts smcroute \
|
||||||
irqbalance \
|
avahi-daemon curl ethtool ca-bundle smartmontools intel-microcode \
|
||||||
collectd-mod-df \
|
lm-sensors samba4-server luci-app-samba4 tailscale shadow-useradd"
|
||||||
usbutils \
|
[config]="${default_configs[*]} \
|
||||||
kmod-usb-storage \
|
CONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y CONFIG_BTRFS_PROGS_ZSTD=y \
|
||||||
kmod-usb-storage-uas \
|
CONFIG_TARGET_ROOTFS_PARTSIZE=512 CONFIG_TARGET_KERNEL_PARTSIZE=32"
|
||||||
kmod-fs-btrfs \
|
# [files]="/mnt/backup"
|
||||||
btrfs-progs \
|
)
|
||||||
block-mount \
|
|
||||||
cryptsetup \
|
|
||||||
kmod-crypto-xts \
|
|
||||||
smcroute \
|
|
||||||
avahi-daemon \
|
|
||||||
curl \
|
|
||||||
ethtool \
|
|
||||||
ca-bundle \
|
|
||||||
smartmontools \
|
|
||||||
intel-microcode \
|
|
||||||
lm-sensors \
|
|
||||||
samba4-server \
|
|
||||||
luci-app-samba4 \
|
|
||||||
tailscale \
|
|
||||||
shadow-useradd"
|
|
||||||
# The following are source mode only
|
|
||||||
n5100['config']="\
|
|
||||||
CONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y \
|
|
||||||
CONFIG_BTRFS_PROGS_ZSTD=y \
|
|
||||||
CONFIG_TARGET_ROOTFS_PARTSIZE=512 \
|
|
||||||
CONFIG_TARGET_KERNEL_PARTSIZE=32"
|
|
||||||
n5100['files']="\
|
|
||||||
/mnt/backup"
|
|
||||||
|
|
||||||
# Dusty drawer
|
declare -Ag rpi4=(
|
||||||
declare -Ag rpi4
|
[device]="rpi-4"
|
||||||
rpi4['device']="rpi-4"
|
[target]="bcm27xx/bcm2711"
|
||||||
rpi4['target']="bcm27xx/bcm2711"
|
[filesystem]="ext4"
|
||||||
rpi4['filesystem']="ext4"
|
[packages]="${default_packages[*]} \
|
||||||
rpi4['packages']="\
|
luci-app-upnp luci-app-pbr -dnsmasq dnsmasq-full luci-app-ddns luci-app-sqm \
|
||||||
$default_packages \
|
kmod-usb-net-asix-ax88179 kmod-usb-net-rtl8152"
|
||||||
kmod-usb-net-asix-ax88179 \
|
)
|
||||||
kmod-usb-net-rtl8152 \
|
|
||||||
luci-app-upnp \
|
|
||||||
luci-app-pbr \
|
|
||||||
-dnsmasq \
|
|
||||||
dnsmasq-full \
|
|
||||||
luci-app-ddns \
|
|
||||||
luci-app-sqm"
|
|
||||||
|
|
||||||
# Stock builds
|
declare -Ag r4s_stock=(
|
||||||
declare -Ag r4s_stock
|
[device]="friendlyarm_nanopi-r4s"
|
||||||
r4s_stock['device']="friendlyarm_nanopi-r4s"
|
[target]="rockchip/armv8"
|
||||||
r4s_stock['target']="rockchip/armv8"
|
[filesystem]="ext4"
|
||||||
r4s_stock['filesystem']="ext4"
|
[release]="snapshot"
|
||||||
r4s_stock['release']="snapshot"
|
)
|
||||||
|
|
||||||
# Old devices
|
declare -Ag totolink=(
|
||||||
declare -Ag totolink
|
[device]="totolink_x5000r"
|
||||||
totolink['device']="totolink_x5000r"
|
[target]="ramips/mt7621"
|
||||||
totolink['target']="ramips/mt7621"
|
[filesystem]="squashfs"
|
||||||
totolink['filesystem']="squashfs"
|
[packages]="${default_packages[*]} \
|
||||||
totolink['packages']="\
|
-dnsmasq -odhcpd-ipv6only -nftables -firewall4 \
|
||||||
$default_packages \
|
-kmod-nft-offload collectd-mod-iwinfo"
|
||||||
-dnsmasq \
|
)
|
||||||
-odhcpd-ipv6only \
|
|
||||||
-nftables \
|
|
||||||
-firewall4 \
|
|
||||||
-kmod-nft-offload \
|
|
||||||
collectd-mod-iwinfo"
|
|
||||||
|
|
||||||
declare -Ag archer
|
declare -Ag archer=(
|
||||||
archer['device']="tplink_archer-c7-v2"
|
[device]="tplink_archer-c7-v2"
|
||||||
archer['target']="ath79/generic"
|
[target]="ath79/generic"
|
||||||
archer['filesystem']="squashfs"
|
[filesystem]="squashfs"
|
||||||
archer['packages']="\
|
[packages]="${default_packages[*]} -dnsmasq -odhcpd -iptables \
|
||||||
$default_packages \
|
-ath10k-firmware-qca988x-ct ath10k-firmware-qca988x-ct-full-htt"
|
||||||
-dnsmasq \
|
)
|
||||||
-odhcpd \
|
|
||||||
-iptables \
|
|
||||||
-ath10k-firmware-qca988x-ct \
|
|
||||||
ath10k-firmware-qca988x-ct-full-htt"
|
|
||||||
|
|
||||||
declare -Ag linksys
|
declare -Ag linksys=(
|
||||||
linksys['device']="linksys_ea8300"
|
[device]="linksys_ea8300"
|
||||||
linksys['target']="ipq40xx/generic"
|
[target]="ipq40xx/generic"
|
||||||
linksys['filesystem']="squashfs"
|
[filesystem]="squashfs"
|
||||||
linksys['packages']="\
|
[packages]="${default_packages[*]} \
|
||||||
$default_packages \
|
-dnsmasq -odhcpd -iptables"
|
||||||
-dnsmasq \
|
)
|
||||||
-odhcpd \
|
|
||||||
-iptables"
|
|
||||||
|
|
||||||
declare -Ag r2s
|
declare -Ag r2s=(
|
||||||
r2s['device']="friendlyarm_nanopi-r2s"
|
[device]="friendlyarm_nanopi-r2s"
|
||||||
r2s['target']="rockchip/armv8"
|
[target]="rockchip/armv8"
|
||||||
r2s['filesystem']="ext4"
|
[filesystem]="ext4"
|
||||||
r2s['packages']="\
|
[packages]="${default_packages[*]} \
|
||||||
$default_packages \
|
luci-app-upnp luci-app-pbr -dnsmasq dnsmasq-full \
|
||||||
luci-app-upnp \
|
luci-app-ddns luci-app-sqm luci-app-statistics collectd-mod-sensors \
|
||||||
luci-app-pbr \
|
collectd-mod-thermal collectd-mod-conntrack smcroute curl ethtool"
|
||||||
-dnsmasq \
|
)
|
||||||
dnsmasq-full \
|
|
||||||
luci-app-ddns \
|
|
||||||
luci-app-sqm \
|
|
||||||
luci-app-statistics \
|
|
||||||
collectd-mod-sensors \
|
|
||||||
collectd-mod-thermal \
|
|
||||||
collectd-mod-conntrack \
|
|
||||||
smcroute \
|
|
||||||
curl \
|
|
||||||
ethtool"
|
|
||||||
|
|
||||||
declare -Ag r2s_tr
|
declare -Ag r2s_tr=(
|
||||||
r2s_tr['device']="friendlyarm_nanopi-r2s"
|
[device]="friendlyarm_nanopi-r2s"
|
||||||
r2s_tr['target']="rockchip/armv8"
|
[target]="rockchip/armv8"
|
||||||
r2s_tr['filesystem']="ext4"
|
[filesystem]="ext4"
|
||||||
r2s_tr['packages']="\
|
[packages]="${default_packages[*]} \
|
||||||
$default_packages \
|
luci-app-upnp luci-app-pbr luci-app-ddns \
|
||||||
luci-app-upnp \
|
luci-app-statistics collectd-mod-sensors collectd-mod-thermal \
|
||||||
luci-app-pbr \
|
collectd-mod-conntrack curl ethtool travelmate"
|
||||||
luci-app-ddns \
|
)
|
||||||
luci-app-statistics \
|
|
||||||
collectd-mod-sensors \
|
|
||||||
collectd-mod-thermal \
|
|
||||||
collectd-mod-conntrack \
|
|
||||||
curl \
|
|
||||||
ethtool \
|
|
||||||
travelmate"
|
|
||||||
|
|||||||
Reference in New Issue
Block a user