#!/bin/msh # wizzyconf.sh - DSLinux configuration wizard - part of the wizzy-suite # Licence: GNU GPL v3 or later at yscanusersour option # Author: Florian Bruhin (The Compiler) # Version: 0.01r081126 # Copyright 2008 Florian Bruhin # This program is part of the Wizzy-suite # # The Wizzy-suite is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # The Wizzy-suite is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the Wizzy-suite. If not, see . # FIXME TODO: Check $? etc. for errors # Angerfist - Ubermensch #=============================================================# #=============================================================# NEWLINE=" " OLDIFS="$IFS" dialog --infobox "Please wait...${NEWLINE}Bitte warten..." 0 0 # FIXME add other languages if there're more if [ ! -e /etc/lang ]; then dialog --stdout --backtitle "WizzyConf" --title "Warning" --ok-label "Damn!" --msgbox "No language-file found, falling back to English." 0 0 echo "lang=\"en\"" > /etc/lang lang="de" else lang=`cat /etc/lang` fi if [ ! -e "/usr/share/wizzy/langs/$lang/lang" ]; then dialog --stdout --backtitle "WizzyConf" --title "Warning" --ok-label "Damn!" --msgbox "Language-file /usr/share/wizzy/langs/$lang/lang not found, something went terribly wrong. Aborting." 0 0 exit 1 else . "/usr/share/wizzy/langs/$lang/lang" fi a=`/bin/false` if [ $? != 1 ]; then dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_warning" --ok-label "$t_damn" --msgbox "$t_unpatched" 0 0 exit 1 fi if [ ! -e /etc/rc.conf ]; then dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_warning" --no-label "$t_no" --yes-label "$t_yes" --yesno "$t_rcconf_does_not_exist" 0 0 if [ $? = 1 ]; then dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_warning" --ok-label "$ok" --msgbox "$t_cancelling" exit 1 else cp /etc/rc.defaults /etc/rc.conf fi fi func=start while : do #echo $func # FIXME comment out testing only #sleep 1 # FIXME comment out testing only case $func in #==============================================================# start) #==============================================================# dlginput=`dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_mainmenu" --ok-label "$t_ok" --cancel-label "$t_exit" --help-label "$help" --menu "$t_what_do_you_want_to_configure" 0 0 0 \ "1)" "$t_users" \ "2)" "$t_network" \ "3)" "$t_misc" \ "" "" \ "" "$t_about_wizzy"` case $? in 1|255) clear; exit ;; esac case $dlginput in 1\)) func=users ;; 2\)) func=network ;; 3\)) func=misc ;; "") func=about ;; esac ;; #==============================================================# users) #==============================================================# dlginput=`dialog --stdout --backtitle "$t_dslinux_conf_wizard" --ok-label "$t_ok" --cancel-label "$t_cancel" --help-label "$help" --title "$t_users" --menu "" 0 0 0 \ "1)" "$t_add_user" \ "2)" "$t_del_user" \ "3)" "$t_edit_user" \ "4)" "$t_list_users" \ "5)" "$t_autologin" \ --infobox "$t_please_wait" 0 0` case $? in 1|255) func=start ;; esac case $dlginput in 1\)) func=adduser ;; 2\)) func=deluser ;; 3\)) func=edituser ;; 4\)) func=lsusers ;; 5\)) func=autologin ;; esac dlginput= ;; #===========================# edituser) #===========================# dialog --yesno "This feature is still in development. Enter anyway?" 0 0 # FIXME comment out development only case $? in # FIXME comment out development only 1|255) func=users ;; # FIXME comment out development only *) # FIXME comment out development only if [ "$list_done" != 1 ]; then nouser=0 prev_list=edituser autologin_title="$t_edit_user" func=scanusers else IFS=":" line=`cat /etc/passwd | grep "^$c_user"` set -- $line IFS="$OLDIFS" auto=`cat /etc/autologin.conf | grep "AUTOLOGIN.*$"` if [ "$auto" = yes ]; then dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_edit_user" --no-label "$t_no" --yes-label "$t_yes" --yesno "$t_autologin_changed" 0 0 if [ $? != 1 ]; then if [ $? != 255 ]; then mv /etc/autologin.conf /etc/autologin.conf.bak sed "s/USER.*$/USER='$user'/" /etc/autologin.conf.bak > /etc/autologin.conf fi fi hadouto= fi # Example: root:xxSVJVBe8UDn2:0:0:Tim Bisley:/home:/bin/sh while "$ok"; do dlginput_user=`dialog --stdout --backtitle "$t_dslinux_conf_wizard" --ok-label "$t_ok" --cancel-label "$t_cancel" --help-label "$t_help" --title "$t_username" --inputbox "$t_add_user_text" 0 0 "$1"` user_tmp=`echo "$dlginput_user" | sed "s/[:\\\\\"#,=\/?\']//g"` user=`echo "$user_tmp" | sed 's/^[+@~ -]//g'` user_tmp=`echo "$user" | sed 's/ALL//g'` user=`echo "$user_tmp" | sed 's/default//g'` user_tmp= if [ "$user" = "" ]; then dialog --stdout --backtitle "$t_dslinux_conf_wizard" --ok-label "$t_damn" --title "$t_warning" --msgbox "$t_add_user_text" 0 0 ok=0 else ok=1 fi done dlginput_uid=`dialog --stdout --backtitle "$t_dslinux_conf_wizard" --ok-label "$t_ok" --cancel-label "$t_cancel" --help-label "$t_help" --title "$t_add_user" --inputbox "UID$NEWLINE$t_dont_change_this" 0 0 "$3"` dlginput_gid=`dialog --stdout --backtitle "$t_dslinux_conf_wizard" --ok-label "$t_ok" --cancel-label "$t_cancel" --help-label "$t_help" --title "$t_add_user" --inputbox "GID$NEWLINE$t_dont_change_this" 0 0 "$4"` dlginput_realname=`dialog --stdout --backtitle "$t_dslinux_conf_wizard" --ok-label "$t_ok" --cancel-label "$t_cancel" --help-label "$t_help" --title "$t_add_user" --inputbox "$t_realname" 0 0 "$"` dlginput_home=`dialog --stdout --backtitle "$t_dslinux_conf_wizard" --ok-label "$t_ok" --cancel-label "$t_cancel" --help-label "$t_help" --title "$t_add_user" --inputbox "$t_home$NEWLINE$t_dont_change_this" 0 0 "$6"` dlginput_shell=`dialog --stdout --backtitle "$t_dslinux_conf_wizard" --ok-label "$t_ok" --cancel-label "$t_cancel" --help-label "$t_help" --title "$t_add_user" --inputbox "$t_shell$NEWLINE$t_dont_change_this" 0 0 "$7"` # TODO: check if new home exists and ask for creating [done as of 302208, testing!!!] # FIXME: nothing changes... [maybe fixed as of 081116?] # FIXME sed has an error, realname is empty, ... [maybe fixed as of 081116?] # FIXME: Ask if it should adjust autologin [should be done as of 081120, needs testing] # FIXME cancel doesn't work # TODO: comment what sed does # FIXME: Line is appended to the file, not changed. Do something like "sed s/oldline/newline/" echo "$dlginput_user:$2:$dlginput_uid:$dlginput_gid:$dlginput_realname:$dlginput_home:$dlginput_shell" >> /etc/passwd dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_edit_user" --no-label "$t_no" --yes-label "$t_yes" --yesno "$t_do_you_want_to_set_a_new_password" 0 0 && passwd "$dlginput_user" dlginput_user= dlginput_uid= dlginput_gid= dlginput_realname= dlginput_home= dlginput_shell= dlginput= func=users prev_list= c_user= cmd= list_done=0 autologin_title= skip= fi esac # FIXME comment out development only ;; #===========================# adduser) #===========================# dialog --yesno "This feature is still in development. Enter anyway?" 0 0 # FIXME comment out development only case $? in # FIXME comment out development only 1|255) func=users ;; # FIXME comment out development only *) # FIXME comment out development only # Example: root:xxSVJVBe8UDn2:0:0:Tim Bisley:/home:/bin/sh lastuser=`echo /etc/passwd | sed -n -e '1 p'` # that looks IFS=":" # rather strange set -- $lastuser # does that IFS="$OLDIFS" # work? FIXME if [ "$3" -ge 1000 ]; then uid=`expr "$3" + 1` else uid=1000 fi dlginput_user=`dialog --stdout --backtitle "$t_dslinux_conf_wizard" --ok-label "$t_ok" --cancel-label "$t_cancel" --help-label "$t_help" --title "$t_add_user" --inputbox "$t_usern" 0 0` && \ dlginput_realname=`dialog --stdout --backtitle "$t_dslinux_conf_wizard" --ok-label "$t_ok" --cancel-label "$t_cancel" --help-label "$t_help" --title "$t_add_user" --inputbox "$t_realname" 0 0` && \ dlginput_uid=`dialog --stdout --backtitle "$t_dslinux_conf_wizard" --ok-label "$t_ok" --cancel-label "$t_cancel" --help-label "$t_help" --title "$t_add_user" --inputbox "UID$NEWLINE$t_dont_change_this" 0 0 "$uid"` && \ dlginput_home=`dialog --stdout --backtitle "$t_dslinux_conf_wizard" --ok-label "$t_ok" --cancel-label "$t_cancel" --help-label "$t_help" --title "$t_add_user" --inputbox "$t_home$NEWLINE$t_dont_change_this" 0 0 "/home"` && \ dlginput_shell=`dialog --stdout --backtitle "$t_dslinux_conf_wizard" --ok-label "$t_ok" --cancel-label "$t_cancel" --help-label "$t_help" --title "$t_add_user" --inputbox "$t_shell$NEWLINE$t_dont_change_this" 0 0 "/bin/sh"` case $? in # does it what it should 1|255) # because of the &&s (FIXME) dlginput_user= dlginput_realname= dlginput_home= dlginput_shell= dlginput_uid= uid= lastuser= func=users ;; *) # TODO: check if new home exists and ask for creating [done as of 302208, testing!!!] # FIXME: TEST Test if updating of /etc/group acts correctly [is it even necessary?] # FIXME: Ask if it should adjust autologin [should be done as of 081120, needs testing] # FIXME cancel doesn't work # TODO: comment what sed does dialog --stdout --backtitle "$dslinux_conf_wizard" --infobox "$t_please_wait" 0 0 user_tmp=`echo "$dlginput_user" | sed "s/[:\\\\\"#,=\/?\']//g"` user=`echo "$user_tmp" | sed 's/^[+@~ -]//g'` user_tmp=`echo "$user" | sed 's/ALL//g'` user=`echo "$user_tmp" | sed 's/default//g'` user_tmp= echo "$user:xxSVJVBe8UDn2:$dlginput_uid:0:$dlginput_realname:$dlginput_home:$dlginput_shell" >> /etc/passwd dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_set_password" --ok-label "$t_ok" --msgbox "$t_password_explanation" 0 0 && passwd "$dlginput_user" uid= user= dlginput_user= dlginput_realname= dlginput_home= dlginput_shell= dlginput= lastuser= func=users esac esac ;; #===========================# deluser) #===========================# if [ "$list_done" != 1 ]; then nouser=0 prev_list=deluser autologin_title="$t_del_user" func=scanusers else # FIXME what about the errors deluser gives? dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_del_user" --no-label "$t_no" --yes-label "$t_yes" --yesno "$t_really_del_user_1 \"$c_user\" $t_really_del_user_2" 0 0 && deluser "$c_user" func=users prev_list= c_user= list_done=0 autologin_title= fi ;; #===========================# lsusers) #===========================# IFS=":" cat /etc/passwd | while read line do set -- $line allusers="$allusers|$1" allusers="$allusers/$5" done line= IFS="|" i=1 for j in $allusers; do IFS="/" set -- $j cmd="$cmd \"$i\) $1\" \"$2\"" i=`expr $i + 1` done allusers= dlginput= j= i= eval dlginput=\`dialog --stdout --backtitle \""$t_dslinux_conf_wizard"\" --title \""$t_list_users"\" --ok-label \""$t_more_info"\" --cancel-label \""$t_cancel"\" --menu \"\" 0 0 0 "$cmd"\` case $? in 1|255) cmd= func=start ;; *) cmd= IFS=" " set -- $dlginput user="$2" infos=`cat /etc/passwd | grep "^$user"` IFS=":" set -- $infos [ "$1" = "nobody" ] && sysuser="$t_sysuser" [ "$1" = "bin" ] && sysuser="$t_sysuser" [ "$1" = "daemon" ] && sysuser="$t_sysuser" [ "$1" = "root" ] && sysuser="$t_root" dlginput2=`dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_userinfo_to_user $user $t_userinfo_to_user2" --ok-label "$t_ok" --msgbox "$t_username: $1$NEWLINE$t_passwordhash: $2${NEWLINE}UID: $3${NEWLINE}GID: $4$NEWLINE$t_realname: $5$NEWLINE$t_home: $6$NEWLINE$t_shell: $7$NEWLINE$sysuser" 0 0` infos= sysuser= user= dlginput2= IFS="$OLDIFS" func=lsusers ;; esac ;; #===========================# scanusers) #===========================# IFS=":" cat /etc/passwd | while read line; do set -- $line allusers="$allusers|$1" allusers="$allusers/$5" done IFS="|" i=1 for j in $allusers; do IFS="/" set -- $j [ "$1" = nobody ] && no=1 [ "$1" = bin ] && no=1 [ "$1" = daemon ] && no=1 if [ "$no" != 1 ]; then cmd="$cmd \"$i\) $1\" \"$2\"" i=`expr $i + 1` else no= fi done i="$i\)" if [ "$nouser" = 1 ]; then eval dlginput=\`dialog --stdout --backtitle \""$t_dslinux_conf_wizard"\" --title \""$userlist_title"\" --ok-label \""$t_ok"\" --cancel-label \""$t_cancel"\" --help-label \""$t_help"\" --menu \"\" 0 0 0 "$cmd" \""$i"\" \""$t_no_autologin"\" --infobox \""$t_please_wait"\" 0 0\` dlgout="$?" else eval dlginput=\`dialog --stdout --backtitle \""$t_dslinux_conf_wizard"\" --title \""$userlist_title"\" --ok-label \""$t_ok"\" --cancel-label \""$t_cancel"\" --help-label \""$t_help"\" --menu \"\" 0 0 0 "$cmd" --infobox \""$t_please_wait"\" 0 0\` dlgout="$?" fi cmd= c_user= if [ $dlgout = 0 ]; then # if ok is choosen if [ "$i)" != $dlginput ]; then # if a user is choosen. IFS=" " set -- $dlginput c_user="$2" fi fi i= j= line= IFS="$OLDIFS" allusers= cmd= dlginput= nouser=0 no=0 if [ $dlgout = 0 ]; then func="$prev_list" list_done=1 else func=users list_done=0 fi dlgout= ;; #===========================# autologin) #===========================# if [ "$list_done" != 1 ]; then nouser=1 prev_list=autologin userlist_title="$t_autologin" func=scanusers else if [ "$c_user" = "" ]; then mv /etc/autologin.conf /etc/autologin.conf.bak sed 's/AUTOLOGIN.*$/AUTOLOGIN=no/' /etc/autologin.conf.bak > /etc/autologin.conf else mv /etc/autologin.conf /etc/autologin.conf.bak sed 's/AUTOLOGIN.*$/AUTOLOGIN=yes/' /etc/autologin.conf.bak > /etc/autologin.conf mv /etc/autologin.conf /etc/autologin.conf.tmp sed 's/USER.*$/USER='$c_user'/' /etc/autologin.conf.tmp > /etc/autologin.conf rm /etc/autologin.conf.tmp fi func=users prev_list= c_user= list_done=0 fi ;; #==============================================================# network) #==============================================================# dlginput=`dialog --stdout --backtitle "$t_dslinux_conf_wizard" --ok-label "$t_ok" --cancel-label "$t_cancel" --help-label "$t_help" --title "$t_network" --title "$t_network" --menu "" 0 0 0 \ "1)" "WiFi" \ "2)" "esd" \ "3)" "DynDNS" \ "4)" "Boa" \ "5)" "Hostname" \ "6)" "SSH" \ "7)" "telnet" \ "8)" "FTP" \ "9)" "Samba"` case $? in 1|255) func=start ;; esac case $dlginput in 1\)) func=wifi ;; 2\)) func=esd ;; 3\)) func=dns ;; 4\)) func=boa ;; 5\)) func=hostname ;; 6\)) func=ssh ;; 7\)) func==telnet ;; 8\)) func=ftp ;; 9\)) func=samba ;; esac ;; #===========================# wifi) #===========================# dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "WiFi" --no-label "$t_no" --yes-label "$t_yes" --yesno "$t_start_wnc_now" 0 0 && wnc func=network ;; #===========================# esd) #===========================# dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_warning" --no-label "$t_no" --yes-label "$t_yes" --yesno "$t_function_doesn_exist_yet" 0 0 func=network ;; #===========================# dns) #===========================# dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_warning" --no-label "$t_no" --yes-label "$t_yes" --yesno "$t_function_doesn_exist_yet" 0 0 func=network ;; #===========================# boa) #===========================# dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_warning" --no-label "$t_no" --yes-label "$t_yes" --yesno "$t_function_doesn_exist_yet" 0 0 func=network ;; #===========================# Needs testing! FIXME hostname) #===========================# dialog --stdout --backtitle "$t_dslinux_conf_wizard" --infobox "$t_please_wait" 0 0 hostname=`cat /etc/rc.conf | grep "hostname=" | sed "s/hostname=//" | sed "s/\"//g"` dlginput=`dialog --stdout --backtitle "$t_dslinux_conf_wizard" --ok-label "$t_ok" --cancel-label "$t_cancel" --help-label "$t_help" --title "$t_hostname_of_the_nds" --inputbox "$t_hostname_explanation" 0 0 $hostname` case $? in 1|255) func=network ;; esac # FIXME BUG sed gives an error (fixed?) mv /etc/rc.conf /etc/rc.conf.bak hostname=`echo "$dlginput" | sed "s/[^a-zA-Z0-9-]//g"` if [ "$hostname" = "" ]; then dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_warning" --ok-label "$t_damn" "$t_hostname_is_empty" 0 0 else sed 's/hostname=.*$/hostname=\"$hostname\"/' /etc/rc.conf.bak > /etc/rc.conf # TODO: delete non-allowed chars # doesn't work FIXME fi hostname= func=network ;; #===========================# ssh) #===========================# dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_warning" --ok-label "$t_damn" --msgbox "$t_function_doesn_exist_yet" 0 0 func=network ;; #===========================# telnet) #===========================# dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_warning" --ok-label "$t_8damn" --msgbox "$t_function_doesn_exist_yet" 0 0 func=network ;; #===========================# ftp) #===========================# dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_warning" --ok-label "$t_damn" --msgbox "$t_function_doesn_exist_yet" 0 0 func=network ;; #===========================# samba) #===========================# dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_warning" --ok-label "$t_damn" --msgbox "$t_function_doesn_exist_yet" 0 0 func=network ;; #==============================================================# misc) #==============================================================# dialog --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_warning" --ok-label "$t_damn" --msgbox "$t_function_doesn_exist_yet" 0 0 func=start ;; #==============================================================# about) #==============================================================# # FIXME Intro => Credits => Lizenz per Buttons switchbar dialog --ok-label "$t_credits" --extra-button --extra-label "$t_licence" --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_about_wizzy" --textbox /usr/share/wizzy/about 0 0 case $? in 1|255) func=start ;; 0) func=credits ;; 3) func=licence ;; esac ;; #===========================# licence) #===========================# dialog --ok-label "$t_about" --extra-button --extra-label "$t_credits" --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_about_wizzy" --textbox /usr/share/wizzy/copying 0 0 case $? in 1|255) func=start ;; 0) func=about ;; 3) func=credits ;; esac ;; #===========================# credits) #===========================# dialog --ok-label "$t_about" --extra-button --extra-label "$t_licence" --stdout --backtitle "$t_dslinux_conf_wizard" --title "$t_about_wizzy" --textbox /usr/share/wizzy/credits 0 0 case $? in 1|255) func=start ;; 0) func=about ;; 3) func=licence ;; esac ;; #===========================# help) #===========================# [ "$helptopic" = irssi ] && helptext="$helptext_irssi" # helptext_irssi is in lang-file func="$help_prev" ;; #=============================================================# #=============================================================# esac done