Advertisement
Guest User

Untitled

a guest
Oct 12th, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 13.02 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="Charles University"
  16.   URL="http://eduroam.cuni.cz/en"
  17.   SUPPORT="info@eduroam.cuni.cz"
  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}Charles University.${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. MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
  220. MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
  221. d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
  222. b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
  223. EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
  224. cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
  225. MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
  226. JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
  227. mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
  228. wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
  229. VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
  230. AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
  231. AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
  232. BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
  233. pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
  234. dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
  235. fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
  236. NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
  237. H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
  238. +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
  239. -----END CERTIFICATE-----
  240.  
  241. " > $HOME/.cat_installer/ca.pem
  242. function run_python_script {
  243. PASSWORD=$( echo "$PASSWORD" | sed "s/'/\\\'/g" )
  244. if python << EEE1 > /dev/null 2>&1
  245. import dbus
  246. EEE1
  247. then
  248.     PYTHON=python
  249. elif python3 << EEE2 > /dev/null 2>&1
  250. import dbus
  251. EEE2
  252. then
  253.     PYTHON=python3
  254. else
  255.     PYTHON=none
  256.     return 1
  257. fi
  258.  
  259. $PYTHON << EOF > /dev/null 2>&1
  260. #-*- coding: utf-8 -*-
  261. import dbus
  262. import re
  263. import sys
  264. import uuid
  265. import os
  266.  
  267. class EduroamNMConfigTool:
  268.  
  269.     def connect_to_NM(self):
  270.         #connect to DBus
  271.         try:
  272.             self.bus = dbus.SystemBus()
  273.         except dbus.exceptions.DBusException:
  274.             print("Can't connect to DBus")
  275.             sys.exit(2)
  276.         #main service name
  277.         self.system_service_name = "org.freedesktop.NetworkManager"
  278.         #check NM version
  279.         self.check_nm_version()
  280.         if self.nm_version == "0.9" or self.nm_version == "1.0":
  281.             self.settings_service_name = self.system_service_name
  282.             self.connection_interface_name = "org.freedesktop.NetworkManager.Settings.Connection"
  283.             #settings proxy
  284.             sysproxy = self.bus.get_object(self.settings_service_name, "/org/freedesktop/NetworkManager/Settings")
  285.             #settings intrface
  286.             self.settings = dbus.Interface(sysproxy, "org.freedesktop.NetworkManager.Settings")
  287.         elif self.nm_version == "0.8":
  288.             #self.settings_service_name = "org.freedesktop.NetworkManagerUserSettings"
  289.             self.settings_service_name = "org.freedesktop.NetworkManager"
  290.             self.connection_interface_name = "org.freedesktop.NetworkManagerSettings.Connection"
  291.             #settings proxy
  292.             sysproxy = self.bus.get_object(self.settings_service_name, "/org/freedesktop/NetworkManagerSettings")
  293.             #settings intrface
  294.             self.settings = dbus.Interface(sysproxy, "org.freedesktop.NetworkManagerSettings")
  295.         else:
  296.             print("This Network Manager version is not supported")
  297.             sys.exit(2)
  298.  
  299.     def check_opts(self):
  300.         self.cacert_file = '${HOME}/.cat_installer/ca.pem'
  301.         self.pfx_file = '${HOME}/.cat_installer/user.p12'
  302.         if not os.path.isfile(self.cacert_file):
  303.             print("Certificate file not found, looks like a CAT error")
  304.             sys.exit(2)
  305.  
  306.     def check_nm_version(self):
  307.         try:
  308.             proxy = self.bus.get_object(self.system_service_name, "/org/freedesktop/NetworkManager")
  309.             props = dbus.Interface(proxy, "org.freedesktop.DBus.Properties")
  310.             version = props.Get("org.freedesktop.NetworkManager", "Version")
  311.         except dbus.exceptions.DBusException:
  312.             version = "0.8"
  313.         if re.match(r'^1\.', version):
  314.             self.nm_version = "1.0"
  315.             return
  316.         if re.match(r'^0\.9', version):
  317.             self.nm_version = "0.9"
  318.             return
  319.         if re.match(r'^0\.8', version):
  320.             self.nm_version = "0.8"
  321.             return
  322.         else:
  323.             self.nm_version = "Unknown version"
  324.             return
  325.  
  326.     def byte_to_string(self, barray):
  327.         return "".join([chr(x) for x in barray])
  328.  
  329.  
  330.     def delete_existing_connections(self, ssid):
  331.         "checks and deletes earlier connections"
  332.         try:
  333.             conns = self.settings.ListConnections()
  334.         except dbus.exceptions.DBusException:
  335.             print("DBus connection problem, a sudo might help")
  336.             exit(3)
  337.         for each in conns:
  338.             con_proxy = self.bus.get_object(self.system_service_name, each)
  339.             connection = dbus.Interface(con_proxy, "org.freedesktop.NetworkManager.Settings.Connection")
  340.             try:
  341.                connection_settings = connection.GetSettings()
  342.                if connection_settings['connection']['type'] == '802-11-wireless':
  343.                    conn_ssid = self.byte_to_string(connection_settings['802-11-wireless']['ssid'])
  344.                    if conn_ssid == ssid:
  345.                        connection.Delete()
  346.             except dbus.exceptions.DBusException:
  347.                pass
  348.  
  349.     def add_connection(self,ssid):
  350.         server_alt_subject_name_list = dbus.Array({'DNS:radius1.eduroam.cuni.cz','DNS:radius2.eduroam.cuni.cz'})
  351.         server_name = 'eduroam.cuni.cz'
  352.         if self.nm_version == "0.9" or self.nm_version == "1.0":
  353.              match_key = 'altsubject-matches'
  354.              match_value = server_alt_subject_name_list
  355.         else:
  356.              match_key = 'subject-match'
  357.              match_value = server_name
  358.            
  359.         s_con = dbus.Dictionary({
  360.             'type': '802-11-wireless',
  361.             'uuid': str(uuid.uuid4()),
  362.             'permissions': ['user:$USER'],
  363.             'id': ssid
  364.         })
  365.         s_wifi = dbus.Dictionary({
  366.             'ssid': dbus.ByteArray(ssid.encode('utf8')),
  367.             'security': '802-11-wireless-security'
  368.         })
  369.         s_wsec = dbus.Dictionary({
  370.             'key-mgmt': 'wpa-eap',
  371.             'proto': ['rsn',],
  372.             'pairwise': ['ccmp',],
  373.             'group': ['ccmp', 'tkip']
  374.         })
  375.         s_8021x = dbus.Dictionary({
  376.             'eap': ['peap'],
  377.             'identity': '$USER_NAME',
  378.             'ca-cert': dbus.ByteArray("file://{0}\0".format(self.cacert_file).encode('utf8')),
  379.              match_key: match_value,
  380.             'password': '$PASSWORD',
  381.             'phase2-auth': 'mschapv2',
  382.         })
  383.         s_ip4 = dbus.Dictionary({'method': 'auto'})
  384.         s_ip6 = dbus.Dictionary({'method': 'auto'})
  385.         con = dbus.Dictionary({
  386.             'connection': s_con,
  387.             '802-11-wireless': s_wifi,
  388.             '802-11-wireless-security': s_wsec,
  389.             '802-1x': s_8021x,
  390.             'ipv4': s_ip4,
  391.             'ipv6': s_ip6
  392.         })
  393.         self.settings.AddConnection(con)
  394.  
  395.     def main(self):
  396.         self.check_opts()
  397.         ver = self.connect_to_NM()
  398.         self.delete_existing_connections('eduroam')
  399.         self.add_connection('eduroam')
  400.  
  401. if __name__ == "__main__":
  402.     ENMCT = EduroamNMConfigTool()
  403.     ENMCT.main()
  404. EOF
  405. }
  406. function create_wpa_conf {
  407. cat << EOFW >> $HOME/.cat_installer/cat_installer.conf
  408.  
  409. network={
  410.   ssid="eduroam"
  411.   key_mgmt=WPA-EAP
  412.   pairwise=CCMP
  413.   group=CCMP TKIP
  414.   eap=PEAP
  415.   ca_cert="${HOME}/.cat_installer/ca.pem"
  416.   identity="${USER_NAME}"
  417.   domain_suffix_match="eduroam.cuni.cz"
  418.   phase2="auth=MSCHAPV2"
  419.   password="${PASSWORD}"
  420. }
  421. EOFW
  422. chmod 600 $HOME/.cat_installer/cat_installer.conf
  423. }
  424. #prompt user for credentials
  425.   user_cred
  426.   if run_python_script ; then
  427.    show_info "Installation successful"
  428. else
  429.    show_info "Network Manager configuration failed, generating wpa_supplicant.conf"
  430.    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
  431.  
  432. if [ -f $HOME/.cat_installer/cat_installer.conf ] ; then
  433.   if ! ask "File $HOME/.cat_installer/cat_installer.conf exists; it will be overwritten." "Continue" 1 ; then confirm_exit; fi
  434.   rm $HOME/.cat_installer/cat_installer.conf
  435.   fi
  436.    create_wpa_conf
  437.    show_info "Output written to $HOME/.cat_installer/cat_installer.conf"
  438. fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement