1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
package rfkill
import (
"errors"
"strconv"
"github.com/muka/go-bluetooth/hw/linux/hciconfig"
)
var rfclass = [...]string{
"bluetooth",
"wifi",
}
var rfkillHandler = NewRFKill()
// GetHCIConfig return an HCIConfig struct
func GetHCIConfig(adapterID string) *hciconfig.HCIConfig {
return hciconfig.NewHCIConfig(adapterID)
}
// GetAdapterStatus return the status of an adapter
func GetAdapterStatus(adapterID string) (*RFKillResult, error) {
if !rfkillHandler.IsInstalled() {
return nil, errors.New("rfkill is not available")
}
list, err := rfkillHandler.ListAll()
if err != nil {
return nil, err
}
for _, adapter := range list {
if adapter.Description == adapterID {
// dbgSwitch("Got adapter index %d desc: %s type: %s hard-block: %t soft-block: %t",
// adapter.Index,
// adapter.Description,
// adapter.IdentifierType,
// adapter.HardBlocked,
// adapter.SoftBlocked,
// )
return &adapter, nil
}
}
return nil, errors.New("Adapter not found")
}
// ToggleAdapter Swap Off/On a device
func ToggleAdapter(adapterID string) error {
err := TurnOffAdapter(adapterID)
if err != nil {
return err
}
return TurnOnAdapter(adapterID)
}
// TurnOnAdapter Enable a rfkill managed device
func TurnOnAdapter(adapterID string) error {
var identifier string
if isRFClass(adapterID) {
identifier = adapterID
} else {
adapter, err := GetAdapterStatus(adapterID)
if err != nil {
return err
}
identifier = strconv.Itoa(adapter.Index)
}
if rfkillHandler.IsSoftBlocked(adapterID) {
err := rfkillHandler.SoftUnblock(identifier)
if err != nil {
return err
}
}
if rfkillHandler.IsHardBlocked(adapterID) {
return errors.New("Adapter is hard locked, check for a physical switch to enable it")
}
return nil
}
// TurnOffAdapter Enable a rfkill managed device
func TurnOffAdapter(adapterID string) error {
var identifier string
if isRFClass(adapterID) {
identifier = adapterID
} else {
adapter, err := GetAdapterStatus(adapterID)
if err != nil {
return err
}
identifier = strconv.Itoa(adapter.Index)
}
if !rfkillHandler.IsSoftBlocked(adapterID) {
err := rfkillHandler.SoftBlock(identifier)
if err != nil {
return err
}
}
return nil
}
func isRFClass(id string) bool {
for _, class := range rfclass {
if class == id {
return true
}
}
return false
}
// TurnOnBluetooth turn on bluetooth support
func TurnOnBluetooth() error {
return TurnOnAdapter("bluetooth")
}
// TurnOffBluetooth turn on bluetooth support
func TurnOffBluetooth() error {
return TurnOffAdapter("bluetooth")
}
// ToggleBluetooth toggle off/on the bluetooth support
func ToggleBluetooth() error {
err := TurnOffBluetooth()
if err != nil {
return err
}
return TurnOnBluetooth()
}
|