Advertisement
Guest User

eduroam_sh

a guest
Sep 20th, 2018
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 14.93 KB | None | 0 0
  1. #!/usr/bin/env bash
  2. if [ -z "$BASH" ] ; then
  3.    bash  $0
  4.    exit
  5. fi
  6.  
  7.  
  8.  
  9. my_name=$0
  10.  
  11.  
  12. function setup_environment {
  13.   bf=""
  14.   n=""
  15.   ORGANISATION="Bard College at Simon's Rock"
  16.   URL="http://wireless.simons-rock.edu"
  17.   SUPPORT="its@simons-rock.edu"
  18. if [ ! -z "$DISPLAY" ] ; then
  19.   if which zenity 1>/dev/null 2>&1 ; then
  20.     ZENITY=`which zenity`
  21.   elif which kdialog 1>/dev/null 2>&1 ; then
  22.     KDIALOG=`which kdialog`
  23.   else
  24.     if tty > /dev/null 2>&1 ; then
  25.       if  echo $TERM | grep -E -q "xterm|gnome-terminal|lxterminal"  ; then
  26.         bf="";
  27.         n="";
  28.       fi
  29.     else
  30.       find_xterm
  31.       if [ -n "$XT" ] ; then
  32.         $XT -e $my_name
  33.       fi
  34.     fi
  35.   fi
  36. fi
  37. }
  38.  
  39. function split_line {
  40. echo $1 | awk  -F '\\\\n' 'END {  for(i=1; i <= NF; i++) print $i }'
  41. }
  42.  
  43. function find_xterm {
  44. terms="xterm aterm wterm lxterminal rxvt gnome-terminal konsole"
  45. for t in $terms
  46. do
  47.   if which $t > /dev/null 2>&1 ; then
  48.   XT=$t
  49.   break
  50.   fi
  51. done
  52. }
  53.  
  54.  
  55. function ask {
  56.      T="eduroam CAT"
  57. #  if ! [ -z "$3" ] ; then
  58. #     T="$T: $3"
  59. #  fi
  60.   if [ ! -z $KDIALOG ] ; then
  61.      if $KDIALOG --yesno "${1}\n${2}?" --title "$T" ; then
  62.        return 0
  63.      else
  64.        return 1
  65.      fi
  66.   fi
  67.   if [ ! -z $ZENITY ] ; then
  68.      text=`echo "${1}" | fmt -w60`
  69.      if $ZENITY --no-wrap --question --text="${text}\n${2}?" --title="$T" 2>/dev/null ; then
  70.        return 0
  71.      else
  72.        return 1
  73.      fi
  74.   fi
  75.  
  76.   yes=Y
  77.   no=N
  78.   yes1=`echo $yes | awk '{ print toupper($0) }'`
  79.   no1=`echo $no | awk '{ print toupper($0) }'`
  80.  
  81.   if [ $3 == "0" ]; then
  82.     def=$yes
  83.   else
  84.     def=$no
  85.   fi
  86.  
  87.   echo "";
  88.   while true
  89.   do
  90.   split_line "$1"
  91.   read -p "${bf}$2 ${yes}/${no}? [${def}]:$n " answer
  92.   if [ -z "$answer" ] ; then
  93.     answer=${def}
  94.   fi
  95.   answer=`echo $answer | awk '{ print toupper($0) }'`
  96.   case "$answer" in
  97.     ${yes1})
  98.        return 0
  99.        ;;
  100.     ${no1})
  101.        return 1
  102.        ;;
  103.   esac
  104.   done
  105. }
  106.  
  107. function alert {
  108.   if [ ! -z $KDIALOG ] ; then
  109.      $KDIALOG --sorry "${1}"
  110.      return
  111.   fi
  112.   if [ ! -z $ZENITY ] ; then
  113.      $ZENITY --warning --text="$1" 2>/dev/null
  114.      return
  115.   fi
  116.   echo "$1"
  117.  
  118. }
  119.  
  120. function show_info {
  121.   if [ ! -z $KDIALOG ] ; then
  122.      $KDIALOG --msgbox "${1}"
  123.      return
  124.   fi
  125.   if [ ! -z $ZENITY ] ; then
  126.      $ZENITY --info --width=500 --text="$1" 2>/dev/null
  127.      return
  128.   fi
  129.   split_line "$1"
  130. }
  131.  
  132. function confirm_exit {
  133.   if [ ! -z $KDIALOG ] ; then
  134.      if $KDIALOG --yesno "Really quit?"  ; then
  135.      exit 1
  136.      fi
  137.   fi
  138.   if [ ! -z $ZENITY ] ; then
  139.      if $ZENITY --question --text="Really quit?" 2>/dev/null ; then
  140.         exit 1
  141.      fi
  142.   fi
  143. }
  144.  
  145.  
  146.  
  147. function prompt_nonempty_string {
  148.   prompt=$2
  149.   if [ ! -z $ZENITY ] ; then
  150.     if [ $1 -eq 0 ] ; then
  151.      H="--hide-text "
  152.     fi
  153.     if ! [ -z "$3" ] ; then
  154.      D="--entry-text=$3"
  155.     fi
  156.   elif [ ! -z $KDIALOG ] ; then
  157.     if [ $1 -eq 0 ] ; then
  158.      H="--password"
  159.     else
  160.      H="--inputbox"
  161.     fi
  162.   fi
  163.  
  164.  
  165.   out_s="";
  166.   if [ ! -z $ZENITY ] ; then
  167.     while [ ! "$out_s" ] ; do
  168.       out_s=`$ZENITY --entry --width=300 $H $D --text "$prompt" 2>/dev/null`
  169.       if [ $? -ne 0 ] ; then
  170.         confirm_exit
  171.       fi
  172.     done
  173.   elif [ ! -z $KDIALOG ] ; then
  174.     while [ ! "$out_s" ] ; do
  175.       out_s=`$KDIALOG $H "$prompt" "$3"`
  176.       if [ $? -ne 0 ] ; then
  177.         confirm_exit
  178.       fi
  179.     done  
  180.   else
  181.     while [ ! "$out_s" ] ; do
  182.       read -p "${prompt}: " out_s
  183.     done
  184.   fi
  185.   echo "$out_s";
  186. }
  187.  
  188. function user_cred {
  189.   PASSWORD="a"
  190.   PASSWORD1="b"
  191.  
  192.   if ! USER_NAME=`prompt_nonempty_string 1 "enter your userid"` ; then
  193.     exit 1
  194.   fi
  195.  
  196.   while [ "$PASSWORD" != "$PASSWORD1" ]
  197.   do
  198.     if ! PASSWORD=`prompt_nonempty_string 0 "enter your password"` ; then
  199.       exit 1
  200.     fi
  201.     if ! PASSWORD1=`prompt_nonempty_string 0 "repeat your password"` ; then
  202.       exit 1
  203.     fi
  204.     if [ "$PASSWORD" != "$PASSWORD1" ] ; then
  205.       alert "passwords do not match"
  206.     fi
  207.   done
  208. }
  209. setup_environment
  210. show_info "This installer has been prepared for ${ORGANISATION}\n\nMore information and comments:\n\nEMAIL: ${SUPPORT}\nWWW: ${URL}\n\nInstaller created with software from the GEANT project."
  211. if ! ask "This installer will only work properly if you are a member of ${bf}Bard College at Simon's Rock.${n}" "Continue" 1 ; then exit; fi
  212. if [ -d $HOME/.cat_installer ] ; then
  213.    if ! ask "Directory $HOME/.cat_installer exists; some of its files may be overwritten." "Continue" 1 ; then exit; fi
  214. else
  215.   mkdir $HOME/.cat_installer
  216. fi
  217. # save certificates
  218. echo "-----BEGIN CERTIFICATE-----
  219. MIIE5TCCA82gAwIBAgIQB28SRoFFnCjVSNaXxA4AGzANBgkqhkiG9w0BAQUFADBv
  220. MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
  221. ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF
  222. eHRlcm5hbCBDQSBSb290MB4XDTEyMDIxNjAwMDAwMFoXDTIwMDUzMDEwNDgzOFow
  223. czELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
  224. A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxGTAXBgNV
  225. BAMTEFBvc2l0aXZlU1NMIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
  226. AoIBAQDo6jnjIqaqucQA0OeqZztDB71Pkuu8vgGjQK3g70QotdA6voBUF4V6a4Rs
  227. NjbloyTi/igBkLzX3Q+5K05IdwVpr95XMLHo+xoD9jxbUx6hAUlocnPWMytDqTcy
  228. Ug+uJ1YxMGCtyb1zLDnukNh1sCUhYHsqfwL9goUfdE+SNHNcHQCgsMDqmOK+ARRY
  229. FygiinddUCXNmmym5QzlqyjDsiCJ8AckHpXCLsDl6ez2PRIHSD3SwyNWQezT3zVL
  230. yOf2hgVSEEOajBd8i6q8eODwRTusgFX+KJPhChFo9FJXb/5IC1tdGmpnc5mCtJ5D
  231. YD7HWyoSbhruyzmuwzWdqLxdsC/DAgMBAAGjggF3MIIBczAfBgNVHSMEGDAWgBSt
  232. vZh6NLQm9/rEJlTvA73gJMtUGjAdBgNVHQ4EFgQUmeRAX2sUXj4F2d3TY1T8Yrj3
  233. AKwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwEQYDVR0gBAow
  234. CDAGBgRVHSAAMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0
  235. LmNvbS9BZGRUcnVzdEV4dGVybmFsQ0FSb290LmNybDCBswYIKwYBBQUHAQEEgaYw
  236. gaMwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNvbS9BZGRUcnVz
  237. dEV4dGVybmFsQ0FSb290LnA3YzA5BggrBgEFBQcwAoYtaHR0cDovL2NydC51c2Vy
  238. dHJ1c3QuY29tL0FkZFRydXN0VVROU0dDQ0EuY3J0MCUGCCsGAQUFBzABhhlodHRw
  239. Oi8vb2NzcC51c2VydHJ1c3QuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQCcNuNOrvGK
  240. u2yXjI9LZ9Cf2ISqnyFfNaFbxCtjDei8d12nxDf9Sy2e6B1pocCEzNFti/OBy59L
  241. dLBJKjHoN0DrH9mXoxoR1Sanbg+61b4s/bSRZNy+OxlQDXqV8wQTqbtHD4tc0azC
  242. e3chUN1bq+70ptjUSlNrTa24yOfmUlhNQ0zCoiNPDsAgOa/fT0JbHtMJ9BgJWSrZ
  243. 6EoYvzL7+i1ki4fKWyvouAt+vhcSxwOCKa9Yr4WEXT0K3yNRw82vEL+AaXeRCk/l
  244. uuGtm87fM04wO+mPZn+C+mv626PAcwDj1hKvTfIPWhRRH224hoFiB85ccsJP81cq
  245. cdnUl4XmGFO3
  246. -----END CERTIFICATE-----
  247.  
  248. -----BEGIN CERTIFICATE-----
  249. MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
  250. MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
  251. IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
  252. MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
  253. FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
  254. bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
  255. dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
  256. H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
  257. uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
  258. mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
  259. a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
  260. E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
  261. WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
  262. VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
  263. Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
  264. cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
  265. IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
  266. AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
  267. YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
  268. 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
  269. Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
  270. c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
  271. mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
  272. -----END CERTIFICATE-----
  273.  
  274. " > $HOME/.cat_installer/ca.pem
  275. function run_python_script {
  276. PASSWORD=$( echo "$PASSWORD" | sed "s/'/\\\'/g" )
  277. if python << EEE1 > /dev/null 2>&1
  278. import dbus
  279. EEE1
  280. then
  281.     PYTHON=python
  282. elif python3 << EEE2 > /dev/null 2>&1
  283. import dbus
  284. EEE2
  285. then
  286.     PYTHON=python3
  287. else
  288.     PYTHON=none
  289.     return 1
  290. fi
  291.  
  292. $PYTHON << EOF > /dev/null 2>&1
  293. #-*- coding: utf-8 -*-
  294. import dbus
  295. import re
  296. import sys
  297. import uuid
  298. import os
  299.  
  300. class EduroamNMConfigTool:
  301.  
  302.     def connect_to_NM(self):
  303.         #connect to DBus
  304.         try:
  305.             self.bus = dbus.SystemBus()
  306.         except dbus.exceptions.DBusException:
  307.             print("Can't connect to DBus")
  308.             sys.exit(2)
  309.         #main service name
  310.         self.system_service_name = "org.freedesktop.NetworkManager"
  311.         #check NM version
  312.         self.check_nm_version()
  313.         if self.nm_version == "0.9" or self.nm_version == "1.0":
  314.             self.settings_service_name = self.system_service_name
  315.             self.connection_interface_name = "org.freedesktop.NetworkManager.Settings.Connection"
  316.             #settings proxy
  317.             sysproxy = self.bus.get_object(self.settings_service_name, "/org/freedesktop/NetworkManager/Settings")
  318.             #settings intrface
  319.             self.settings = dbus.Interface(sysproxy, "org.freedesktop.NetworkManager.Settings")
  320.         elif self.nm_version == "0.8":
  321.             #self.settings_service_name = "org.freedesktop.NetworkManagerUserSettings"
  322.             self.settings_service_name = "org.freedesktop.NetworkManager"
  323.             self.connection_interface_name = "org.freedesktop.NetworkManagerSettings.Connection"
  324.             #settings proxy
  325.             sysproxy = self.bus.get_object(self.settings_service_name, "/org/freedesktop/NetworkManagerSettings")
  326.             #settings intrface
  327.             self.settings = dbus.Interface(sysproxy, "org.freedesktop.NetworkManagerSettings")
  328.         else:
  329.             print("This Network Manager version is not supported")
  330.             sys.exit(2)
  331.  
  332.     def check_opts(self):
  333.         self.cacert_file = '${HOME}/.cat_installer/ca.pem'
  334.         self.pfx_file = '${HOME}/.cat_installer/user.p12'
  335.         if not os.path.isfile(self.cacert_file):
  336.             print("Certificate file not found, looks like a CAT error")
  337.             sys.exit(2)
  338.  
  339.     def check_nm_version(self):
  340.         try:
  341.             proxy = self.bus.get_object(self.system_service_name, "/org/freedesktop/NetworkManager")
  342.             props = dbus.Interface(proxy, "org.freedesktop.DBus.Properties")
  343.             version = props.Get("org.freedesktop.NetworkManager", "Version")
  344.         except dbus.exceptions.DBusException:
  345.             version = "0.8"
  346.         if re.match(r'^1\.', version):
  347.             self.nm_version = "1.0"
  348.             return
  349.         if re.match(r'^0\.9', version):
  350.             self.nm_version = "0.9"
  351.             return
  352.         if re.match(r'^0\.8', version):
  353.             self.nm_version = "0.8"
  354.             return
  355.         else:
  356.             self.nm_version = "Unknown version"
  357.             return
  358.  
  359.     def byte_to_string(self, barray):
  360.         return "".join([chr(x) for x in barray])
  361.  
  362.  
  363.     def delete_existing_connections(self, ssid):
  364.         "checks and deletes earlier connections"
  365.         try:
  366.             conns = self.settings.ListConnections()
  367.         except dbus.exceptions.DBusException:
  368.             print("DBus connection problem, a sudo might help")
  369.             exit(3)
  370.         for each in conns:
  371.             con_proxy = self.bus.get_object(self.system_service_name, each)
  372.             connection = dbus.Interface(con_proxy, "org.freedesktop.NetworkManager.Settings.Connection")
  373.             try:
  374.                connection_settings = connection.GetSettings()
  375.                if connection_settings['connection']['type'] == '802-11-wireless':
  376.                    conn_ssid = self.byte_to_string(connection_settings['802-11-wireless']['ssid'])
  377.                    if conn_ssid == ssid:
  378.                        connection.Delete()
  379.             except dbus.exceptions.DBusException:
  380.                pass
  381.  
  382.     def add_connection(self,ssid):
  383.         server_alt_subject_name_list = dbus.Array({'DNS:pi.simons-rock.edu'})
  384.         server_name = 'pi.simons-rock.edu'
  385.         if self.nm_version == "0.9" or self.nm_version == "1.0":
  386.              match_key = 'altsubject-matches'
  387.              match_value = server_alt_subject_name_list
  388.         else:
  389.              match_key = 'subject-match'
  390.              match_value = server_name
  391.            
  392.         s_con = dbus.Dictionary({
  393.             'type': '802-11-wireless',
  394.             'uuid': str(uuid.uuid4()),
  395.             'permissions': ['user:$USER'],
  396.             'id': ssid
  397.         })
  398.         s_wifi = dbus.Dictionary({
  399.             'ssid': dbus.ByteArray(ssid.encode('utf8')),
  400.             'security': '802-11-wireless-security'
  401.         })
  402.         s_wsec = dbus.Dictionary({
  403.             'key-mgmt': 'wpa-eap',
  404.             'proto': ['rsn',],
  405.             'pairwise': ['ccmp',],
  406.             'group': ['ccmp', 'tkip']
  407.         })
  408.         s_8021x = dbus.Dictionary({
  409.             'eap': ['peap'],
  410.             'identity': '$USER_NAME',
  411.             'ca-cert': dbus.ByteArray("file://{0}\0".format(self.cacert_file).encode('utf8')),
  412.              match_key: match_value,
  413.             'password': '$PASSWORD',
  414.             'phase2-auth': 'mschapv2',
  415.         })
  416.         s_ip4 = dbus.Dictionary({'method': 'auto'})
  417.         s_ip6 = dbus.Dictionary({'method': 'auto'})
  418.         con = dbus.Dictionary({
  419.             'connection': s_con,
  420.             '802-11-wireless': s_wifi,
  421.             '802-11-wireless-security': s_wsec,
  422.             '802-1x': s_8021x,
  423.             'ipv4': s_ip4,
  424.             'ipv6': s_ip6
  425.         })
  426.         self.settings.AddConnection(con)
  427.  
  428.     def main(self):
  429.         self.check_opts()
  430.         ver = self.connect_to_NM()
  431.         self.delete_existing_connections('eduroam')
  432.         self.add_connection('eduroam')
  433.  
  434. if __name__ == "__main__":
  435.     ENMCT = EduroamNMConfigTool()
  436.     ENMCT.main()
  437. EOF
  438. }
  439. function create_wpa_conf {
  440. cat << EOFW >> $HOME/.cat_installer/cat_installer.conf
  441.  
  442. network={
  443.   ssid="eduroam"
  444.   key_mgmt=WPA-EAP
  445.   pairwise=CCMP
  446.   group=CCMP TKIP
  447.   eap=PEAP
  448.   ca_cert="${HOME}/.cat_installer/ca.pem"
  449.   identity="${USER_NAME}"
  450.   domain_suffix_match="pi.simons-rock.edu"
  451.   phase2="auth=MSCHAPV2"
  452.   password="${PASSWORD}"
  453. }
  454. EOFW
  455. chmod 600 $HOME/.cat_installer/cat_installer.conf
  456. }
  457. #prompt user for credentials
  458.   user_cred
  459.   if run_python_script ; then
  460.    show_info "Installation successful"
  461. else
  462.    show_info "Network Manager configuration failed, generating wpa_supplicant.conf"
  463.    if ! ask "Network Manager configuration failed, but we may generate a wpa_supplicant configuration file if you wish. Be warned that your connection password will be saved in this file as clear text." "Write the file" 1 ; then exit ; fi
  464.  
  465. if [ -f $HOME/.cat_installer/cat_installer.conf ] ; then
  466.   if ! ask "File $HOME/.cat_installer/cat_installer.conf exists; it will be overwritten." "Continue" 1 ; then confirm_exit; fi
  467.   rm $HOME/.cat_installer/cat_installer.conf
  468.   fi
  469.    create_wpa_conf
  470.    show_info "Output written to $HOME/.cat_installer/cat_installer.conf"
  471. fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement