OpenWrt ボタン（スイッチ）

# はじめに

::: note
### 初心者対応構成
- スクリプトでの自動設定
- UCIとLuCi及びWinSCPにて比較しながら作業がおススメ
:::

::: note
### [PowerShell](https://learn.microsoft.com/ja-jp/powershell/scripting/what-is-windows-powershell?view=powershell-7.4)で[SSHアクセス](https://openwrt.org/docs/guide-quick-start/sshadministration)

- [PowerShellの開始](https://learn.microsoft.com/ja-jp/powershell/scripting/windows-powershell/starting-windows-powershell?view=powershell-7.4) (キー入力)：`Win`+`x` > `a` > `はい`
※Windows7以降標準搭載

```sh
ssh root@192.168.1.1
```

<details><summary>ssh root@192.168.1.1のショートカット作成（デスクトップ）</summary>

```powershell:powershell
$DESKTOP = ([Environment]::GetFolderPath("Desktop") + "\192.168.1.1.lnk")
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$DESKTOP")
$Shortcut.TargetPath = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
$Shortcut.Arguments = '-windowstyle hidden -ExecutionPolicy RemoteSigned "Start-Process ssh root@192.168.1.1"'
$Shortcut.IconLocation = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe,0"
$Shortcut.WorkingDirectory = "."
$Shortcut.Save()

```

- `強制的に貼り付け`
- `yes`

---

</details>

<details><summary>SSHログイン出来ない場合:exclamation:</summary>

known_hostsクリア
- `C:\Users\yourusername\.ssh\known_hosts` ※Windows隠しファイル
```powershell:powershell
Clear-Content .ssh\known_hosts -Force

```
---
OpenSSHのインストール
※Windows 10 Fall Creators Update(1709)以降標準搭載
- 機能の確認
```powershell:powershell
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

```
- 機能のインストール
```powershell:powershell
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

```
---

</details>

:::

# ボタン（スイッチ）
::: note
### ボタン（スイッチ）
- [プッシュボタンに機能を付加する](https://openwrt.org/docs/guide-user/hardware/hardware.button)
- [Wi-Fi切り替え](https://openwrt.org/docs/guide-user/network/wifi/wifitoggle)


インストール
```bash
# install
opkg update
opkg install kmod-button-hotplug
mkdir -p /etc/hotplug.d/button
# log調査用
cat << "EOF" > /etc/hotplug.d/button/buttons
logger "the button was ${BUTTON} and the action was ${ACTION}"
EOF
# 00-button
cat << "EOF" > /etc/hotplug.d/button/00-button
source /lib/functions.sh
 
do_button () {
    local button
    local action
    local handler
    local min
    local max
 
    config_get button "${1}" button
    config_get action "${1}" action
    config_get handler "${1}" handler
    config_get min "${1}" min
    config_get max "${1}" max
 
    [ "${ACTION}" = "${action}" -a "${BUTTON}" = "${button}" -a -n "${handler}" ] && {
        [ -z "${min}" -o -z "${max}" ] && eval ${handler}
        [ -n "${min}" -a -n "${max}" ] && {
            [ "${min}" -le "${SEEN}" -a "${max}" -ge "${SEEN}" ] && eval ${handler}
        }
    }
}
 
config_load system
config_foreach do_button button
EOF

reboot

```
該当ボタン確認
```bash
ls /etc/rc.button/

```
```bash
find /sys/firmware/devicetree/base/keys -mindepth 1 -type d | while read -r f; do printf '%s: %s\n' $(basename $f) $(hexdump -s2 -e '2/1 "%02x""\n"' $f/linux,code); done

```
該当ボタンをプッシュ＆リリースしてから以下を実行
```bash
logread | tail -n 1  | grep button | awk '{ print $11 }'

```
### WiFI ON OFF & リブート
設定ボタン及びスイッチ：AOSSボタン=`wps`
設定デバイス：BUFFALO WSR-6000AX8
```bash
# WiFi ON ワンプッシュボタンリリース
BUTTON='wps' # AOSS BUTTON
uci add system button
uci set system.@button[-1].button=${BUTTON}
uci set system.@button[-1].action="released"
uci set system.@button[-1].handler="uci set wireless.radio0.disabled=0; uci set wireless.radio1.disabled=0; uci commit; wifi"
uci set system.@button[-1].min="0"
uci set system.@button[-1].max="2"
# WiFi OFF 5秒ボタンリリース
uci add system button
uci set system.@button[-1].button=${BUTTON}
uci set system.@button[-1].action="released"
uci set system.@button[-1].handler="uci set wireless.radio0.disabled=1; uci set wireless.radio1.disabled=1; uci commit; wifi"
uci set system.@button[-1].min="3"
uci set system.@button[-1].max="7"
# restart 10秒ボタンリリース
uci add system button
uci set system.@button[-1].button=${BUTTON}
uci set system.@button[-1].action="released"
uci set system.@button[-1].handler="sleep 70 && touch /etc/banner && reboot"
uci set system.@button[-1].min="8"
uci set system.@button[-1].max="15"
# set
uci commit system
/etc/init.d/system reload

```

### ~~遠隔地リモート設定~~
対話型だから無理じゃんねｗ

設定ボタン及びスイッチ：AOSSボタン=`wps`
設定デバイス：BUFFALO WSR-6000AX8
環境設定：[セレクター型インターネット全自動接続設定](https://qiita.com/site_u/items/4b8076cb8c9b05bc3f9a) / [デバイス初期設定](https://qiita.com/site_u/items/59c641c9dc0eec3b1324)
設定方法：デバイス初期設定をする
```bash
# internet-config
wget --no-check-certificate -O /usr/sbin/internet-config.sh https://raw.githubusercontent.com/site-u2023/config-softwire/main/internet-config.sh
# 遠隔地WAN設定 5秒ボタンリリース 
BUTTON='wps' # AOSS BUTTON
uci add system button
uci set system.@button[-1].button=${BUTTON}
uci set system.@button[-1].action="released"
uci set system.@button[-1].handler="sh /usr/sbin/internet-config.sh"
uci set system.@button[-1].min="3"
uci set system.@button[-1].max="8"
# set
uci commit system
/etc/init.d/system reload

```
### ~~ルーターモードとブリッジモード~~
検証中～

設定ボタン及びスイッチ：背面スイッチ=`BTN_2`
設定デバイス：BUFFALO WSR-6000AX8
環境設定：[OCNバーチャルコネクト](https://qiita.com/site_u/items/298a6c2c4d6797e38cd0) / [Dumb アクセスポイント ブリッジ](https://qiita.com/site_u/items/0463c782be0acd6d23d3)
設定方法：一度OCNバーチャルコネクトを設定し、次にDumb アクセスポイント ブリッジで設定し`network.bak`を出力させる(自動)
※要DHCPサーバー接続：Dumb アクセスポイント ブリッジ設定
```bash
# スイッチ切替5秒後設定変更及び再起動
# OCNバーチャルコネクト設定
BUTTON='router' # SWITCH AUTO
uci add system button
uci set system.@button[-1].button=${BUTTON}
uci set system.@button[-1].action="released"
uci set system.@button[-1].handler="cp /etc/config/network.dump.bak /etc/config/network; uci commit; sleep 70 && touch /etc/banner && reboot"
uci set system.@button[-1].min="5"
uci set system.@button[-1].max="10"
# Dumb アクセスポイント ブリッジ設定
BUTTON='router' # SWITCH MANUAL
uci add system button
uci set system.@button[-1].button=${BUTTON}
uci set system.@button[-1].action="pressed"
uci set system.@button[-1].handler="cp /etc/config/network /etc/config/network.dump.bak; uci commit; sleep 70 && touch /etc/banner && reboot"
uci set system.@button[-1].min="5"
uci set system.@button[-1].max="10"
# set
uci commit system
/etc/init.d/system reload

```
:::

# あとがき

# 参考資料（感謝:relaxed:）