Jump to content

Автоматическая смена пароля Wi-Fi сети по расписанию


Recommended Posts

Добрый день. Стоит задача раз в сутки менять пароль гостевой вай-фай сети. Пароль генерируется автоматически и состоит из 8ми цифр. 

До этого был тплинк на опен-врт и там это решалось через VBS-скрипт на ПК, который закидывался в планировщик Windows. Скрипт генерировал пароль, записывал пароль в хтмл-файл и загружал его на фтп-сервер, откуда им мог воспользоваться определенный круг лиц. Затем скрипт стучался в роутер по ssh, менял там пароль на вновь сгенерированный и перезагружал вай-фай, выглядело это примерно так:

ssh root@192.168.100.1 uci set wireless.@wifi-iface[0].key=$pass

ssh root@192.168.100.1 uci commit

ssh root@192.168.100.1 wifi down radio0

ssh root@192.168.100.1 wifi up radio0

 

Сейчас перешел на Giga SE, писал в поддержку кинетика, там мне сказали, что нативно ничего подобного реализовать не получится и посоветовали обратиться сюда. Соответственно, обращаюсь.

В идеале мне интересен вариант, когда бы все операции целиком исполнялись на роутере, без участия ПК, т.е. роутер бы генерил пароль, менял его и где-то публиковал. Возможно ли это сделать, и как? Готов заплатить за рабочее решение, если это не слишком сложно и дорого.

 

П.С. Уточню, что сервисы авторизации по смс для моих задач не подходят.

Edited by lascorpio
  • Upvote 1
Link to comment
Share on other sites

  

7 часов назад, lascorpio сказал:

Стоит задача раз в сутки менять пароль гостевой вай-фай сети

Как вариант -

  1. ставим компонент "Сервер SSH"
  2. устанавливаем приложение Putty plink, так как к сожалению компонент не поддерживает авторизацию по ключу
  3. команда в скрипте выглядит примерно так
    plink 192.168.100.1 -P 22 -l admin -pw YourAdminPassword -batch "interface GuestWiFi authentication wpa-psk 'test23445556'"

    -P - порт, если стандартный, 22, можно не указывать
    -l - пользователь (не root, а admin)
    -pw - пароль
    -batch - подавляет интерактивные запросы
    "interface GuestWiFi authentication wpa-psk 'test23445556'" - команда CLI, меняющая пароль сети Wi-Fi.

Если на роутер установлен Entware, то вместо штатного dropbear можно установить пакет openssh-server, он поддерживает авторизацию по ключу.

В этом случае компонент "Сервер SSH" устанавливать не надо. Но в entware надо установить пакет ndmq, это приложение, которое позволяет вводить команды CLI (для процессоров ARM64 пока не работает).

ssh root@192.168.100.1 ndmq "interface GuestWiFi authentication wpa-psk 'test23445556'"

В entware пользователь именно root.

 

Link to comment
Share on other sites

Dropbear тоже поддерживает авторизацию по ключам, но файл authorized_keys при этом должен лежать в директории /opt/etc/dropbear.

Проще всего в Entware сделать симлинк файла /opt/root/.ssh/authorized_keys в директорию /opt/etc/dropbear

ln -s /opt/root/.ssh/authorized_keys /opt/etc/dropbear

После чего можно давать команды используя ssh.

Link to comment
Share on other sites

13 часа назад, lascorpio сказал:

Сейчас перешел на Giga SE, писал в поддержку кинетика, там мне сказали, что нативно ничего подобного реализовать не получится и посоветовали обратиться сюда. Соответственно, обращаюсь.

В идеале мне интересен вариант, когда бы все операции целиком исполнялись на роутере, без участия ПК, т.е. роутер бы генерил пароль, менял его и где-то публиковал. Возможно ли это сделать, и как?

Необходимо Entware, можно во внутреннюю память + ndmq + cron. В итоге рассмотрите вариант :

Скрытый текст
Wifi 2.4

(config)> interface WifiMaster0/AccessPoint0 authentication wpa-psk Eethaich9z
Network::Interface::Wifi: "WifiMaster0/AccessPoint0": WPA PSK set.
(config)> system configuration save
Core::System::Configuration: Saving (cli).
(config)> 

В WEB это будет

1745343688_-2.jpg.b59e991902f8377d4b6093f03393ffe1.jpg

на роутере это

/ # ndmq -p "interface WifiMaster0/AccessPoint0 authentication wpa-psk Eethaich9z" -x
<response>
    <message code="73335684" ident="Network::Interface::Wifi" source="" warning="no">
        "WifiMaster0/AccessPoint0": WPA PSK set.
    </message>
    <prompt>(config)</prompt>
</response>
/ # 


или 

/ # ndmq -p "interface WifiMaster0/AccessPoint0 authentication wpa-psk Eethaich9z"
/ #

Далее прописать в нужное время в cron. Пароль можно брать из готового файла в котором будет просто строки

1234567890
1234567891
1234567892
1234567893
1234567894
1234567895
1234567896
...

По мере использования первую строку можно удалить.

Или случайный набор символов каждый раз можно брать из

/ # date | md5sum
94e002e481f677975dda2f2c7bde102d  -
/ # 

урезав его чуток

 

Или найти в интернете генерация пароль по проще.

 

Link to comment
Share on other sites

В 24.08.2021 в 22:56, lascorpio сказал:

т.е. роутер бы генерил пароль, менял его и где-то публиковал.

  1. Ставим и настраиваем OPKG
  2. Заходим по SSH, ставим три пакета

    opkg install cron ndmq mc

     

  3. FTP-сервер по вкусу, можно из коробки, можно из entware. Как по мне - так тот, что из компонента "FTP-сервер" удобнее, можно пользователей заводить в интерфейсе роутера.
  4. Пишем скрипт 
    mcedit ./pw_gen

    Скрипт может быть примерно такой
    #!/bin/sh
    
    # Options
    FTP_DIR="/your/ftp/directory"
    FILE_PASSWORD="password"
    
    # Generate a pasword
    PASSWD_GEN=`dd if=/dev/urandom bs=16 count=1 oflag=direct|sha256sum|cut -c 1-8`
    
    # Put password to file
    echo $PASSWD_GEN > $FTP_DIR/$FILE_PASSWORD
    
    # Change WPA-PSK key
    ndmq -p "interface GuestWiFi authentication wpa-psk $PASSWD_GEN"

     

  5. делаем скрипт исполняемым и помещаем его в директорию cron.daily (пакет cron установили выше)

    cp ./pw_gen /opt/etc/cron.daily
    chmod 755 /opt/etc/cron.daily

По поводу каталога /your/ftp/directory. Если в качестве FTP-сервера используется компонент "FTP-сервер"

Флэшку, или диск подключенный к роутеру, можно разбить на два раздела. Один под Entware, второй под файлы.

Оба раздела будут видны из Entware, но только один из них будет доступен простым пользователям по FTP - тот, что отведен под файлы.

Оба раздела монтируются в файловой системе роутера в директорию /tmp/mnt в виде, например, таком

/tmp/mnt/f612ceca-4826-45a6-af92-2ba3aa33ea77
/tmp/mnt/cd6ba69a-d125-4624-8bea-f4d80a2d5343

Под OPKG, допустим, выделен раздел /tmp/mnt/f612ceca-4826-45a6-af92-2ba3aa33ea77, тогда /your/ftp/directory будет /tmp/mnt/cd6ba69a-d125-4624-8bea-f4d80a2d5343, то есть

# Options
FTP_DIR=/tmp/mnt/cd6ba69a-d125-4624-8bea-f4d80a2d5343

 

  • Thanks 1
Link to comment
Share on other sites

спасибо большое за ответы! особенно за последний вариант, на днях найду время, переварю полученную информацию, постараюсь реализовать, заранее извиняюсь, если приду с тупыми вопросами (=

Link to comment
Share on other sites

От deprecated XML-интерфейса, и, в частности ndmq лучше отучаться, в новых инсталляционных пакетах ndmq больше не будет, хотя утилита всё ещё доступна в пакетах.

По возможности переходите на REST core interface, пример:

wget --post-data='[{"opkg": {"initrc": {"path": "/opt/etc/init.d/rc.unslung", "no": false}}},{"system": {"configuration": {"save": true}}}]' http://127.0.0.1:79/rci/ -qO -

 

Link to comment
Share on other sites

34 минуты назад, lascorpio сказал:

ndmq не ставит, говорит пакет на найден. Так понимаю, его выпилили? Как установить теперь?

Любые пакеты, когда-либо существовавшие в репозитории, можно найти в папке archive:

opkg install http://bin.entware.net/mipselsf-k3.4/keenetic/archive/libndm_1.1.15-1_mipsel-3.4_kn.ipk
opkd install http://bin.entware.net/mipselsf-k3.4/keenetic/archive/ndmq_1.0.2-7_mipsel-3.4_kn.ipk

А вообще надо отучаться постепенно отучаться от ndmq, причина выше.

Link to comment
Share on other sites

В 25.08.2021 в 23:21, vadimbn сказал:

делаем скрипт исполняемым и помещаем его в директорию cron.daily (пакет cron установили выше)

Спасибо, кажется всё получилось, но в какое время отрабатывает крон-дэйли и как это настроить? Например мне нужно, чтоб скрипт отрабатывал в 10 утра.

 

В 25.08.2021 в 23:21, vadimbn сказал:
# Generate a pasword
PASSWD_GEN=`dd if=/dev/urandom bs=16 count=1 oflag=direct|sha256sum|cut -c 1-8`

Как сделать генератор, который будет только из чисел пароль 8-символьный формировать? 

Link to comment
Share on other sites

1 час назад, lascorpio сказал:

Например мне нужно, чтоб скрипт отрабатывал в 10 утра.

добавить в /opt/etc/crontab строчку

00 10 * * * root /path/to/your/script/pw_gen

/path/to/your/script заменить на путь до вашего скрипта, разумеется.

Потом дать команду

/opt/etc/init.d/S10cron restart

 

1 час назад, lascorpio сказал:

Как сделать генератор, который будет только из чисел пароль 8-символьный формировать?

Хм... Ну, например, удалим из строчки хеша sha256 все буквы. А дополнительно возьмем хеш не sha256, а sha512

PASSWD_GEN=`dd if=/dev/urandom bs=512 count=1 oflag=direct|sha512sum|sed 's~[^[:digit:]/]\+~~g'|cut -c 1-8`

 

Edited by vadimbn
  • Thanks 1
Link to comment
Share on other sites

4 часа назад, Александр Рыжов сказал:

А вообще надо отучаться постепенно отучаться от ndmq, причина выше.

Вот знать бы еще полные пути формирования этих rci-запросов. Документация по ним есть?

Вот например, команда

wget -qO - --post-data='[{"encryption":{"wpa":true}}]' localhost:79/rci/interface/GuestWiFi

работает. По логике вещей должна формироваться так же и команда смены wpa-psk-ключа

wget -qO - --post-data='[{"authentication":{"wpa-psk":"Password"}}]' localhost:79/rci/interface/GuestWiFi

Но судя по

wget -qO - localhost:79/rci/show/interface

в Wi-Fi-интерфейсах вообще нет свойства "autentication" или "wpa-psk".

Link to comment
Share on other sites

Спасибо! Так понимаю, проверить отработает ли планировщик можно будет уже завтра в 10 утра? 

На текущий момент crontab выглядит так:

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/opt/bin:/opt/sbin
MAILTO=""
HOME=/
# ---------- ---------- Default is Empty ---------- ---------- #
*/1 * * * * root /opt/bin/run-parts /opt/etc/cron.1min	
*/5 * * * * root /opt/bin/run-parts /opt/etc/cron.5mins	
01 * * * * root /opt/bin/run-parts /opt/etc/cron.hourly	
02 4 * * * root /opt/bin/run-parts /opt/etc/cron.daily	
22 4 * * 0 root /opt/bin/run-parts /opt/etc/cron.weekly	
42 4 1 * * root /opt/bin/run-parts /opt/etc/cron.monthly	
00 10 * * * root /opt/etc/cron.daily

не спорит ли строчка 

02 4 * * * root /opt/bin/run-parts /opt/etc/cron.daily	

с последней добавленной строкой?

Link to comment
Share on other sites

20 минут назад, lascorpio сказал:

не спорит ли строчка 

у вас скрипт, который вы написали, называется cron.daily? И находится в /opt/etc?

Если стоит задача всё, что есть в директории /opt/etc/cron.daily запускать в 10:00 каждый день, надо править ту строчку, что выше, "00 10 * * * root /opt/bin/run-parts /opt/etc/cron.daily"

Но лучше этого не делать, скрипт поместить куда-нибудь, например в "/opt/root/", а последнюю строчку сделать такой "00 10 * * * root /opt/root/pw_gen"

И не забудьте перезапустить сервис cron.

/opt/etc/init.d/S10cron restart

 

Edited by vadimbn
  • Thanks 1
Link to comment
Share on other sites

31 минуту назад, vadimbn сказал:

у вас скрипт, который вы написали, называется cron.daily? И находится в /opt/etc?

да, понял свою ошибку )

32 минуты назад, vadimbn сказал:

Если стоит задача всё, что есть в директории /opt/etc/cron.daily запускать в 10:00 каждый день, надо править ту строчку, что выше, "00 10 * * * root /opt/bin/run-parts /opt/etc/cron.daily"

Но лучше этого не делать, скрипт поместить куда-нибудь, например в "/opt/root/", а последнюю строчку сделать такой "00 10 * * * root /opt/root/pw_gen"

 

я скрипт поместил в cron.daily как вы выше рекомендовали 🙂

ок, перенесу в root, спасибо.

 

33 минуты назад, vadimbn сказал:

И не забудьте перезапустить сервис cron.

первый раз когда исполнил эту команду cron просто запустился, т.е. он не был запущен, уже при повторном выполнении произошел перезапуск. Отсюда вопрос - он сам будет запускаться? Например при ребуте роутера? 

 

П.С.

еще не подскажите как мне в файл с паролем добавить хтмл-разметку, чтоб сделать пароль крупным шрифтом и посередине? Например для вывода его на экран.

Link to comment
Share on other sites

1 час назад, lascorpio сказал:

Отсюда вопрос - он сам будет запускаться? Например при ребуте роутера? 

Конечно. Все сервисы, скрипты автозапуска которых помещаются в /opt/etc/init.d запускаются с каждым перезапуском роутера.

 

1 час назад, lascorpio сказал:

не подскажите как мне в файл с паролем добавить хтмл-разметку, чтоб сделать пароль крупным шрифтом и посередине?

echo "<html><head><title>Password for my guest WiFi</title></head><body><h1>Password for my WiFi is $PASSWD_GEN</h1></body></html>" > $FTP_DIR/$FILE_PASSWORD

 

  • Thanks 1
Link to comment
Share on other sites

11 час назад, vadimbn сказал:

Вот знать бы еще полные пути формирования этих rci-запросов. Документация по ним есть?

Есть в справочнике CLI. Но можно и без справочника: открыть по F12 отладчик в браузере и выполнить нужную команду в веб-интерефейсе.

Link to comment
Share on other sites

сегодня утром пароль не изменился, не обновился файл с паролем, в логах вот так:

Цитата
[I] Sep  6 10:00:01 cron[1585]: (root) CMD (/opt/root/pw_gen)
[I] Sep  6 10:00:01 cron[1583]: (root) CMD (/opt/bin/run-parts /opt/etc/cron.1min^I)
[I] Sep  6 10:00:01 cron[1584]: (root) CMD (/opt/bin/run-parts /opt/etc/cron.5mins^I)

вроде бы следует, что скрипт запустился? Однако ничего не получилось. Если вручную обработать скрипт - всё работает.

crontab:

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/opt/bin:/opt/sbin
MAILTO=""
HOME=/
# ---------- ---------- Default is Empty ---------- ---------- #
*/1 * * * * root /opt/bin/run-parts /opt/etc/cron.1min	
*/5 * * * * root /opt/bin/run-parts /opt/etc/cron.5mins	
01 * * * * root /opt/bin/run-parts /opt/etc/cron.hourly	
02 4 * * * root /opt/bin/run-parts /opt/etc/cron.daily	
22 4 * * 0 root /opt/bin/run-parts /opt/etc/cron.weekly	
42 4 1 * * root /opt/bin/run-parts /opt/etc/cron.monthly	
00 10 * * * root /opt/root/pw_gen

 

Edited by lascorpio
Link to comment
Share on other sites

24 минуты назад, lascorpio сказал:

Если вручную обработать скрипт - всё работает.

А если так - 00 10 * * * root /opt/bin/sh /path/to/your/script/pw_gen ?

Только не ждите 10 часов следующего дня, время измените в файле /opt/etc/cron, на "через 2 минуты после текущего" и перезапустите cron.

  • Thanks 1
Link to comment
Share on other sites

2 часа назад, lascorpio сказал:

Если вручную обработать скрипт - всё работает.

Если вручную скрипт работает, а в cron'е — нет, то скорее всего дело в среде выполнения: наличия переменных, порядка путей в $PATH и т.п. 

Link to comment
Share on other sites

4 часа назад, vadimbn сказал:

А если так - 00 10 * * * root /opt/bin/sh /path/to/your/script/pw_gen ?

Только не ждите 10 часов следующего дня, время измените в файле /opt/etc/cron, на "через 2 минуты после текущего" и перезапустите cron.

у меня нет файла cron по указанному пути, я просто закинул скрипт в cron.1min, на всякий перезапустил cron - не работает. :( 

 

2 часа назад, Александр Рыжов сказал:

Если вручную скрипт работает, а в cron'е — нет, то скорее всего дело в среде выполнения: наличия переменных, порядка путей в $PATH и т.п. 

я просто вручную исполняю команды из скрипта в консоли, если надо протестить целиком скрипт - подскажите, плз, команду, как его запустить из консоли.

 

сам скрипт:

FTP_DIR="/tmp/mnt/0D64-1511"
FILE_PASSWORD="password.html"
PASSWD_GEN=`dd if=/dev/urandom bs=512 count=1 oflag=direct|sha512sum|sed 's~[^[:digit:]/]\+~~g'|cut -c 1-8`
echo "<br><br><br><br><h1 style=text-align:center;><strong>$PASSWD_GEN</strong></h1>" > $FTP_DIR/$FILE_PASSWORD
ndmq -p "interface GuestWiFi authentication wpa-psk $PASSWD_GEN"

 

добавлял его так, как советовал выше vadimbn:

mcedit ./pw_gen

затем пишем скрипт, сохраняем и:

cp ./pw_gen /opt/etc/cron.1min
chmod 755 /opt/etc/cron.1min

 

Link to comment
Share on other sites

Во первых, там, в скрипте, первая строчка не просто  так стоит

#!/bin/sh

Это то приложение, которое выполняет директивы, прописанные в скрипте.

Она должна быть в первой строке скрипта. Но она должна быть такой -

#!/opt/bin/sh

Прямо как есть, так и вставьте в скрипт. В первую строчку.

Во вторых, если скрипт у вас лежит в /opt/root, и называется pw_gen, то исполняемым его делает команда

chmod 755 /opt/root/pw_gen

Эта команда меняет атрибуты файла, делая его исполняемым для всех, доступным для чтения и записи владельцу, и только для чтения - всем остальным. После этих двух пунктов скрипт можно выполнить прямо в командной строке, вот так

/opt/root/pw_gen

Как обычную команду, и он будет исполняться.

 

  • Upvote 2
Link to comment
Share on other sites

Спасибо вам, кажется всё получилось, по-крайней в папке cron.1min скрипт сейчас исполняется как надо, раз в минуту )) Посмотрим сработает ли сегодня в 10 утра, пока оставил строчку в crontab прежней:

00 10 * * * root /opt/root/pw_gen

думаю проблема была в:

#!/opt/bin/sh

потому что всё остальное я вроде делал правильно - и права выставлял и 

#!/bin/sh 

писал в начале скрипта (это уже под конец решил попробовать без нее, когда идеи кончились). Может конечно где-то и накосячил, но в общем сейчас пока всё заколосилось, так что не трогаю ))

Link to comment
Share on other sites

29 минут назад, lascorpio сказал:

Посмотрим сработает ли сегодня в 10 утра

Если не сработает, можно поместить в /opt/etc/cron.d текстовый файл, например, pw_gen.cron, со строкой

00 10 * * * /opt/root/pw_gen

 

  • Thanks 1
Link to comment
Share on other sites

Всё заколосилось, пароль поменялся с утра. :) Потестирую еще в течение недели, посмотрю как всё будет работать, попробую роутер повыключать и т.д.

Ещё вопросец - сейчас всё крутится на флешке, но так понимаю entware можно и во внутренней памяти развернуть - будут ли какие-то нюансы по работе скрипта без флешки? ФТП-сервер во внутреннюю память будет писать файл с паролем? И насколько можно считать эту задачу износоёмкой по отношению к ресурсу nand-памяти (или там eMMC?)?

Link to comment
Share on other sites

2 часа назад, lascorpio сказал:

но так понимаю entware можно и во внутренней памяти развернуть - будут ли какие-то нюансы по работе скрипта без флешки?

Во всех устройствах, кроме Peak, этой самой памяти маловато. И будет ли доступ по FTP к этой памяти - скорее всего надо будет ставить FTP-сервер из entware.

Кстати, если на выходе получается html-файл, то вместо FTP-сервера можно поставить HTTP-сервер, например, lighthttpd, с авторизацией.

2 часа назад, lascorpio сказал:

И насколько можно считать эту задачу износоёмкой по отношению к ресурсу nand-памяти (или там eMMC?)?

Пишет оно каждый день, но мало. Если не писать никакие логи, то вряд ли будет сильный износ.

Link to comment
Share on other sites

10 часов назад, vadimbn сказал:

Во всех устройствах, кроме Peak, этой самой памяти маловато.

Во внутренней памяти развернуто Entware, вопрос только в сервисах которые необходимы.

Скрытый текст
/opt/etc/init.d # df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root                21504     21504         0 100% /
tmpfs                    62316         0     62316   0% /dev
tmpfs                    62316       464     61852   1% /tmp
ubi0_0                   56540     18844     34772  35% /storage
ubi0_0                   56540     18844     34772  35% /opt
/opt/etc/init.d # opkg list-installed
busybox - 1.31.1-6
cron - 4.1-3
dropbear - 2020.81-1
entware-release - 1.0-2
findutils - 4.7.0-2
glib2 - 2.66.1-1
grep - 3.6-1
hdparm - 9.60-1
htop - 3.0.2-1
ip-bridge - 4.4.0-10a
iperf3 - 3.9-1
iptables - 1.4.21-3
jsonfilter - 2018-02-04-c7e938d6-1
ldconfig - 2.27-11
libattr - 2.4.48-2
libblkid - 2.36-2
libc - 2.27-11
libexslt - 1.1.34-2
libffi - 3.3-2
libgcc - 8.4.0-11
libiconv-full - 1.11.1-4
libintl-full - 0.19.8.1-2
libjson-c - 0.15-1
libmbedtls - 2.16.8-1
libmnl - 1.0.4-2
libmount - 2.36-2
libncurses - 6.2-1
libncursesw - 6.2-1
libndm - 1.1.15-1
libnl-tiny - 2020-08-05-c291088f-1
libopenssl - 1.1.1h-1
libpcap - 1.10.0-1
libpcre - 8.44-2
libpthread - 2.27-11
librt - 2.27-11
libslang2 - 2.3.2-4
libssh2 - 1.9.0-2
libssp - 8.4.0-11
libstdcpp - 8.4.0-11
libubox - 2020-08-06-9e52171d-1
libuuid - 2.36-2
libuv - 1.40.0-1
libxml2 - 2.9.10-2
libxslt - 1.1.34-2
locales - 2.27-9
mc - 4.8.25-1
ndmq - 1.0.2-7
netdata - 1.26.0-1
openssh-sftp-server - 8.4p1-1
opkg - 2020-11-24-61b3c62d-1
opt-ndmsv2 - 1.0-12a
poorbox - 1.31.1-3
tcpdump - 4.9.3-3
terminfo - 6.2-1
ubi-utils - 2.1.2-1
xmlstarlet - 1.6.1-1
zlib - 1.2.11-3
zoneinfo-asia - 2020d-1
zoneinfo-europe - 2020d-1
/opt/etc/init.d # 

 

Рассмотрите вариант рассылки SMS

 

Edited by vasek00
Link to comment
Share on other sites

13 часа назад, lascorpio сказал:

И насколько можно считать эту задачу износоёмкой по отношению к ресурсу nand-памяти (или там eMMC?)?

Как правило nand в роутерах это SLC со 100 тыс. циклов записи.

Узнать точно что за модель NAND можно открыв self-test (или dmesg после перезагрузке в консоли), в поиск вписать NAND chip found

  • Upvote 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...