diff --git a/bash_completion b/bash_completion index 23acf2d..3e2dfd1 100644 --- a/bash_completion +++ b/bash_completion @@ -2,6 +2,14 @@ # Bash Completion routine for create_ap # +_use_filedir() { + if [[ $(type -t _filedir) == "function" ]]; then + _filedir + return 0 + fi + return 1 +} + _create_ap() { local awk_cmd=' ($1 ~ /^-/) { @@ -117,6 +125,9 @@ _create_ap() { --list) # No Options ;; + --mkconfig) + _use_filedir && return 0 + ;; -g) # Not going to implement ;; diff --git a/create_ap b/create_ap index 4edf172..467a127 100755 --- a/create_ap +++ b/create_ap @@ -30,37 +30,38 @@ usage() { echo "Usage: "$PROGNAME" [options] [] [ []]" echo echo "Options:" - echo " -h, --help Show this help" - echo " --version Print version number" - echo " -c Channel number (default: 1)" - echo " -w Use 1 for WPA, use 2 for WPA2, use 1+2 for both (default: 1+2)" - echo " -n Disable Internet sharing (if you use this, don't pass" - echo " the argument)" - echo " -m Method for Internet sharing." - echo " Use: 'nat' for NAT (default)" - echo " 'bridge' for bridging" - echo " 'none' for no Internet sharing (equivalent to -n)" - echo " --hidden Make the Access Point hidden (do not broadcast the SSID)" - echo " --ieee80211n Enable IEEE 802.11n (HT)" - echo " --ht_capab HT capabilities (default: [HT40+])" - echo " --country Set two-letter country code for regularity (example: US)" - echo " --freq-band Set frequency band. Valid inputs: 2.4, 5 (default: 2.4)" - echo " --driver Choose your WiFi adapter driver (default: nl80211)" - echo " --no-virt Do not create virtual interface" - echo " --no-haveged Do not run 'haveged' automatically when needed" - echo " --fix-unmanaged If NetworkManager shows your interface as unmanaged after you" - echo " close create_ap, then use this option to switch your interface" - echo " back to managed" - echo " --mac Set MAC address" - echo " --daemon Run create_ap in the background" - echo " --stop Send stop command to an already running create_ap. For an " - echo " you can put the PID of create_ap or the WiFi interface. You can" - echo " get them with --list" - echo " --list Show the create_ap processes that are already running" + echo " -h, --help Show this help" + echo " --version Print version number" + echo " -c Channel number (default: 1)" + echo " -w Use 1 for WPA, use 2 for WPA2, use 1+2 for both (default: 1+2)" + echo " -n Disable Internet sharing (if you use this, don't pass" + echo " the argument)" + echo " -m Method for Internet sharing." + echo " Use: 'nat' for NAT (default)" + echo " 'bridge' for bridging" + echo " 'none' for no Internet sharing (equivalent to -n)" + echo " --hidden Make the Access Point hidden (do not broadcast the SSID)" + echo " --ieee80211n Enable IEEE 802.11n (HT)" + echo " --ht_capab HT capabilities (default: [HT40+])" + echo " --country Set two-letter country code for regularity (example: US)" + echo " --freq-band Set frequency band. Valid inputs: 2.4, 5 (default: 2.4)" + echo " --driver Choose your WiFi adapter driver (default: nl80211)" + echo " --no-virt Do not create virtual interface" + echo " --no-haveged Do not run 'haveged' automatically when needed" + echo " --fix-unmanaged If NetworkManager shows your interface as unmanaged after you" + echo " close create_ap, then use this option to switch your interface" + echo " back to managed" + echo " --mac Set MAC address" + echo " --daemon Run create_ap in the background" + echo " --stop Send stop command to an already running create_ap. For an " + echo " you can put the PID of create_ap or the WiFi interface. You can" + echo " get them with --list" + echo " --list Show the create_ap processes that are already running" + echo " --mkconfig Store configs in conf_file" echo echo "Non-Bridging Options:" - echo " -g IPv4 Gateway for the Access Point (default: 192.168.12.1)" - echo " -d DNS server will take into account /etc/hosts" + echo " -g IPv4 Gateway for the Access Point (default: 192.168.12.1)" + echo " -d DNS server will take into account /etc/hosts" echo echo "Useful informations:" echo " * If you're not using the --no-virt option, then you can create an AP with the same" @@ -574,14 +575,21 @@ IEEE80211N=0 HT_CAPAB='[HT40+]' DRIVER=nl80211 NO_VIRT=0 -FIX_UNMANAGED=0 COUNTRY= FREQ_BAND=2.4 NEW_MACADDR= DAEMONIZE=0 +NO_HAVEGED=0 + +CONFIG_OPTS=(CHANNEL GATEWAY WPA_VERSION ETC_HOST HIDDEN SHARE_METHOD + IEEE80211N HT_CAPAB DRIVER NO_VIRT COUNTRY FREQ_BAND + NEW_MACADDR DAEMONIZE NO_HAVEGED) + +FIX_UNMANAGED=0 LIST_RUNNING=0 STOP_ID= -NO_HAVEGED=0 + +STORE_CONFIG= CONFDIR= WIFI_IFACE= @@ -806,8 +814,31 @@ send_stop() { mutex_unlock } +# Storing configs +write_config() { + local i=1 + + if ! eval 'echo -n > "$STORE_CONFIG"' > /dev/null 2>&1; then + echo "ERROR: Unable to create config file $STORE_CONFIG" >&2 + exit 1 + fi + + for config_opt in "${CONFIG_OPTS[@]}"; do + eval echo $config_opt=\$$config_opt + done >> "$STORE_CONFIG" + + while [[ $# -ne 0 ]]; do + echo "ARG$i=$1" + shift + ((i++)) + done >> "$STORE_CONFIG" + + echo -e "\nConfigs written to $STORE_CONFIG" + exit 0 +} + ARGS=( "$@" ) -GETOPT_ARGS=$(getopt -o hc:w:g:dnm: -l "help","hidden","ieee80211n","ht_capab:","driver:","no-virt","fix-unmanaged","country:","freq-band:","mac:","daemon","stop:","list","version","no-haveged" -n "$PROGNAME" -- "$@") +GETOPT_ARGS=$(getopt -o hc:w:g:dnm: -l "help","hidden","ieee80211n","ht_capab:","driver:","no-virt","fix-unmanaged","country:","freq-band:","mac:","daemon","stop:","list","version","no-haveged","mkconfig:" -n "$PROGNAME" -- "$@") [[ $? -ne 0 ]] && exit 1 eval set -- "$GETOPT_ARGS" @@ -908,6 +939,11 @@ while :; do shift NO_HAVEGED=1 ;; + --mkconfig) + shift + STORE_CONFIG="$1" + shift + ;; --) shift break @@ -934,6 +970,8 @@ trap "clean_exit" SIGINT SIGUSR1 # if we get USR2 signal then run die(). trap "die" SIGUSR2 +[[ -n "$STORE_CONFIG" ]] && write_config "$@" + if [[ $LIST_RUNNING -eq 1 ]]; then echo -e "List of running $PROGNAME instances:\n" list_running