diff --git a/bin/milis-kur b/bin/milis-kur new file mode 100755 index 000000000..05da78d22 --- /dev/null +++ b/bin/milis-kur @@ -0,0 +1,996 @@ +#!/bin/sh +#- +# Copyright (c) 2012-2015 Juan Romero Pardines . +# 2012 Dave Elusive . +# 2016 milisarge . +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#- + +# Make sure we don't inherit these from env. +SOURCE_DONE= +HOSTNAME_DONE= +KEYBOARD_DONE= +LOCALE_DONE= +TIMEZONE_DONE= +ROOTPASSWORD_DONE= +USERNAME_DONE= +USERPASSWORD_DONE= +BOOTLOADER_DONE= +PARTITIONS_DONE= +NETWORK_DONE= +FILESYSTEMS_DONE= + +TARGETDIR=/mnt/hedef +LOG=/dev/tty8 +CONF_FILE=/tmp/.milis-kur.conf +if [ ! -f $CONF_FILE ]; then + touch -f $CONF_FILE +fi +ANSWER=$(mktemp -t miliskur-XXXXXXXX || exit 1) +TARGET_FSTAB=$(mktemp -t miliskur-fstab-XXXXXXXX || exit 1) + +trap "DIE" INT TERM QUIT + +# disable printk +if [ -w /proc/sys/kernel/printk ]; then + echo 0 >/proc/sys/kernel/printk +fi + +# Detect if this is an EFI system. +if [ -e /sys/firmware/efi/systab ]; then + EFI_SYSTEM=1 +fi + +# dialog colors +BLACK="\Z0" +RED="\Z1" +GREEN="\Z2" +YELLOW="\Z3" +BLUE="\Z4" +MAGENTA="\Z5" +CYAN="\Z6" +WHITE="\Z7" +BOLD="\Zb" +REVERSE="\Zr" +UNDERLINE="\Zu" +RESET="\Zn" + +# Properties shared per widget. +MENULABEL="${BOLD}Ok tuşlarıyla menüyü gezinme,TAB tuşuyla butonlar arası geçiş,ENTER tuşuyla seçim yapın.${RESET}" +MENUSIZE="14 60 0" +INPUTSIZE="8 60" +MSGBOXSIZE="8 70" +YESNOSIZE="$INPUTSIZE" +WIDGET_SIZE="10 70" + +DIALOG() { + rm -f $ANSWER + dialog --colors --keep-tite --no-shadow --no-mouse \ + --backtitle "${BOLD}${WHITE}Milis İşletim Sistemi kurulumu -- Milis 1.0 milisarge@gmail.com ${RESET}" \ + --cancel-label "Geri" --aspect 20 "$@" 2>$ANSWER + return $? +} + +DIE() { + rval=$1 + [ -z "$rval" ] && rval=0 + clear + rm -f $ANSWER $TARGET_FSTAB + # reenable printk + if [ -w /proc/sys/kernel/printk ]; then + echo 4 >/proc/sys/kernel/printk + fi + umount_filesystems + exit $rval +} + +set_option() { + if grep -Eq "^${1}.*" $CONF_FILE; then + sed -i -e "/^${1}.*/d" $CONF_FILE + fi + echo "${1} ${2}" >>$CONF_FILE +} + +get_option() { + echo $(grep -E "^${1}.*" $CONF_FILE|sed -e "s|${1}||") +} + +show_disks() { + local dev size sectorsize gbytes + + # IDE + for dev in $(ls /sys/block|grep -E '^hd'); do + if [ "$(cat /sys/block/$dev/device/media)" = "disk" ]; then + # Find out nr sectors and bytes per sector; + echo "/dev/$dev" + size=$(cat /sys/block/$dev/size) + sectorsize=$(cat /sys/block/$dev/queue/hw_sector_size) + gbytes="$(($size * $sectorsize / 1024 / 1024 / 1024))" + echo "size:${gbytes}GB;sector_size:$sectorsize" + fi + done + # SATA/SCSI and Virtual disks (virtio) + for dev in $(ls /sys/block|grep -E '^([sv]|xv)d|mmcblk'); do + echo "/dev/$dev" + size=$(cat /sys/block/$dev/size) + sectorsize=$(cat /sys/block/$dev/queue/hw_sector_size) + gbytes="$(($size * $sectorsize / 1024 / 1024 / 1024))" + echo "size:${gbytes}GB;sector_size:$sectorsize" + done + # cciss(4) devices + for dev in $(ls /dev/cciss 2>/dev/null|grep -E 'c[0-9]d[0-9]$'); do + echo "/dev/cciss/$dev" + size=$(cat /sys/block/cciss\!$dev/size) + sectorsize=$(cat /sys/block/cciss\!$dev/queue/hw_sector_size) + gbytes="$(($size * $sectorsize / 1024 / 1024 / 1024))" + echo "size:${gbytes}GB;sector_size:$sectorsize" + done +} + +show_partitions() { + local dev fstype fssize p part + + set -- $(show_disks) + while [ $# -ne 0 ]; do + disk=$(basename $1) + shift 2 + # ATA/SCSI/SATA + for p in /sys/block/$disk/$disk*; do + if [ -d $p ]; then + part=$(basename $p) + fstype=$(lsblk -nfr /dev/$part|awk '{print $2}'|head -1) + [ "$fstype" = "iso9660" ] && continue + [ "$fstype" = "crypto_LUKS" ] && continue + [ "$fstype" = "LVM2_member" ] && continue + fssize=$(lsblk -nr /dev/$part|awk '{print $4}'|head -1) + echo "/dev/$part" + echo "size:${fssize:-unknown};fstype:${fstype:-none}" + fi + done + done + # Software raid (md) + for p in $(ls -d /dev/md* 2>/dev/null|grep '[0-9]'); do + part=$(basename $p) + if cat /proc/mdstat|grep -qw $part; then + fstype=$(lsblk -nfr /dev/$part|awk '{print $2}') + [ "$fstype" = "crypto_LUKS" ] && continue + [ "$fstype" = "LVM2_member" ] && continue + fssize=$(lsblk -nr /dev/$part|awk '{print $4}') + echo "$p" + echo "size:${fssize:-unknown};fstype:${fstype:-none}" + fi + done + # cciss(4) devices + for part in $(ls /dev/cciss 2>/dev/null|grep -E 'c[0-9]d[0-9]p[0-9]+'); do + fstype=$(lsblk -nfr /dev/cciss/$part|awk '{print $2}') + [ "$fstype" = "crypto_LUKS" ] && continue + [ "$fstype" = "LVM2_member" ] && continue + fssize=$(lsblk -nr /dev/cciss/$part|awk '{print $4}') + echo "/dev/cciss/$part" + echo "size:${fssize:-unknown};fstype:${fstype:-none}" + done + if [ -e /sbin/lvs ]; then + # LVM + lvs --noheadings|while read lvname vgname perms size; do + echo "/dev/mapper/${vgname}-${lvname}" + echo "size:${size};fstype:lvm" + done + fi +} + +menu_filesystems() { + local dev fstype fssize mntpoint reformat + + while true; do + DIALOG --title " Ayarlamak için bir disk bölümü seçiniz. " --menu "$MENULABEL" \ + ${MENUSIZE} $(show_partitions) + [ $? -ne 0 ] && return + + dev=$(cat $ANSWER) + DIALOG --title " $dev için bir dosya sistemi seçiniz. " \ + --menu "$MENULABEL" ${MENUSIZE} \ + "btrfs" "Oracle's Btrfs" \ + "ext2" "Linux ext2 (no journaling)" \ + "ext3" "Linux ext3 (journal)" \ + "ext4" "Linux ext4 (journal)" \ + "f2fs" "Flash-Friendly Filesystem" \ + "swap" "Linux swap" \ + "vfat" "FAT32" \ + "xfs" "SGI's XFS" + if [ $? -eq 0 ]; then + fstype=$(cat $ANSWER) + else + continue + fi + if [ "$fstype" != "swap" ]; then + DIALOG --inputbox " $dev için bir bağlama noktası seçiniz:" ${INPUTSIZE} + if [ $? -eq 0 ]; then + mntpoint=$(cat $ANSWER) + elif [ $? -eq 1 ]; then + continue + fi + else + mntpoint=swap + fi + DIALOG --yesno " $dev üzerinde yeni bir dosya sistemi oluşturmak istiyor musunuz?" ${YESNOSIZE} + if [ $? -eq 0 ]; then + reformat=1 + elif [ $? -eq 1 ]; then + reformat=0 + else + continue + fi + fssize=$(lsblk -nr $dev|awk '{print $4}') + set -- "$fstype" "$fssize" "$mntpoint" "$reformat" + if [ -n "$1" -a -n "$2" -a -n "$3" -a -n "$4" ]; then + local bdev=$(basename $dev) + local ddev=$(basename $(dirname $dev)) + if [ "$ddev" != "dev" ]; then + sed -i -e "/^MOUNTPOINT \/dev\/${ddev}\/${bdev}.*/d" $CONF_FILE + else + sed -i -e "/^MOUNTPOINT \/dev\/${bdev}.*/d" $CONF_FILE + fi + echo "MOUNTPOINT $dev $1 $2 $3 $4" >>$CONF_FILE + fi + done +} + +menu_partitions() { + DIALOG --title " Bölümleme yapmak için bir disk seçiniz. " \ + --menu "$MENULABEL" ${MENUSIZE} $(show_disks) + if [ $? -eq 0 ]; then + local device=$(cat $ANSWER) + + DIALOG --title "Modify Partition Table on $device" --msgbox "\n +${BOLD}cfdisk will be executed in disk $device.${RESET}\n\n +For BIOS systems, MBR or GPT partition tables are supported.\n +To use GPT on PC BIOS systems an empty partition of 1MB must be added\n +at the first 2GB of the disk with the TOGGLE \`bios_grub' enabled.\n +${BOLD}NOTE: you don't need this on EFI systems.${RESET}\n\n +For EFI systems GPT is mandatory and a FAT32 partition with at least\n +100MB must be created with the TOGGLE \`boot', this will be used as\n +EFI System Partition. This partition must have mountpoint as \`/boot/efi'.\n\n +At least 1 partitions is required for the rootfs (/).\n +For swap, RAM*2 must be really enough. For / 600MB are required.\n\n +${BOLD}WARNING: /usr is not supported as a separate partition.${RESET}\n +${RESET}\n" 18 80 + if [ $? -eq 0 ]; then + while true; do + clear; cfdisk $device; PARTITIONS_DONE=1 + break + done + else + return + fi + fi +} + +menu_keymap() { + local _keymaps="$(find /lib/kbd/keymaps/ -type f -iname "*.map.gz" -printf "%f\n" | sed 's|.map.gz||g' | sort)" + local _KEYMAPS= + + for f in ${_keymaps}; do + _KEYMAPS="${_KEYMAPS} ${f} -" + done + while true; do + DIALOG --title " Select your keymap " --menu "$MENULABEL" 14 70 14 ${_KEYMAPS} + if [ $? -eq 0 ]; then + set_option KEYMAP "$(cat $ANSWER)" + loadkeys "$(cat $ANSWER)" + KEYBOARD_DONE=1 + break + else + return + fi + done +} + +set_keymap() { + local KEYMAP=$(get_option KEYMAP) + + if [ -f /etc/vconsole.conf ]; then + sed -i -e "s|KEYMAP=.*|KEYMAP=$KEYMAP|g" $TARGETDIR/etc/vconsole.conf + else + sed -i -e "s|#\?KEYMAP=.*|KEYMAP=$KEYMAP|g" $TARGETDIR/etc/rc.conf + fi +} + +menu_locale() { + local _locales="$(locale --all-locales |awk '{print $1}'|sed -e 's/^#//')" + local _LOCALES= + + for f in ${_locales}; do + _LOCALES="${_LOCALES} ${f} -" + done + while true; do + DIALOG --title " yerel bilgi seçimi " --menu "$MENULABEL" 14 70 14 ${_LOCALES} + if [ $? -eq 0 ]; then + set_option LOCALE "$(cat $ANSWER)" + LOCALE_DONE=1 + break + else + return + fi + done +} + +set_locale() { + if [ -f $TARGETDIR/etc/default/libc-locales ]; then + #yerelleştirme ayarı yapılacak bashrc de değişim olacak. + local LOCALE=$(get_option LOCALE) + sed -i -e "s|LANG=.*|LANG=$LOCALE|g" $TARGETDIR/etc/locale.conf + # Uncomment locale from /etc/default/libc-locales and regenerate it. + sed -e "/${LOCALE}/s/^\#//" -i $TARGETDIR/etc/default/libc-locales + fi +} + +menu_timezone() { + local _tzones="$(cd /usr/share/zoneinfo; find Africa/ America/ Antarctica/ Arctic/ Asia/ Atlantic/ Australia/ Europe/ Indian/ Pacific/ posix/ -type f | sort)" + local _TIMEZONES= + + for f in ${_tzones}; do + _TIMEZONES="${_TIMEZONES} ${f} -" + done + while true; do + DIALOG --title " Select your timezone " --menu "$MENULABEL" 14 70 14 ${_TIMEZONES} + if [ $? -eq 0 ]; then + set_option TIMEZONE "$(cat $ANSWER)" + TIMEZONE_DONE=1 + break + else + return + fi + done +} + +set_timezone() { + local TIMEZONE="$(get_option TIMEZONE)" + + sed -i -e "s|#TIMEZONE=.*|TIMEZONE=$TIMEZONE|g" $TARGETDIR/etc/rc.conf +} + +menu_hostname() { + while true; do + DIALOG --inputbox "Set the machine hostname:" ${INPUTSIZE} + if [ $? -eq 0 ]; then + set_option HOSTNAME "$(cat $ANSWER)" + HOSTNAME_DONE=1 + break + else + return + fi + done +} + +set_hostname() { + echo $(get_option HOSTNAME) > $TARGETDIR/etc/hostname +} + +menu_rootpassword() { + local _firstpass= _secondpass= _desc= + + while true; do + if [ -n "${_firstpass}" ]; then + _desc="Enter the root password again (password won't be displayed)" + else + _desc="Enter the root password (password won't be displayed)" + fi + DIALOG --passwordbox "${_desc}" ${MSGBOXSIZE} + if [ $? -eq 0 ]; then + if [ -z "${_firstpass}" ]; then + _firstpass="$(cat $ANSWER)" + else + _secondpass="$(cat $ANSWER)" + fi + if [ -n "${_firstpass}" -a -n "${_secondpass}" ]; then + if [ "${_firstpass}" != "${_secondpass}" ]; then + DIALOG --infobox "Passwords do not match! please reenter it again" 6 80 + unset _firstpass _secondpass + sleep 2 && continue + fi + set_option ROOTPASSWORD "${_firstpass}" + ROOTPASSWORD_DONE=1 + break + fi + else + return + fi + done +} + +set_rootpassword() { + echo "root:$(get_option ROOTPASSWORD)" | chpasswd -R $TARGETDIR -c SHA512 +} + +menu_useraccount() { + local _firstpass= _secondpass= _desc= + + while true; do + DIALOG --inputbox "Birincil kullanıcı adını seçin:" ${INPUTSIZE} "miliskuv" + if [ $? -eq 0 ]; then + set_option USERNAME "$(cat $ANSWER)" + USERNAME_DONE=1 + break + else + return + fi + done + + while true; do + if [ -n "${_firstpass}" ]; then + _desc="Enter the password for '$(get_option USERNAME)' again (password won't be displayed)" + else + _desc="Enter the password for '$(get_option USERNAME)' (password won't be displayed)" + fi + DIALOG --passwordbox "${_desc}" ${MSGBOXSIZE} + if [ $? -eq 0 ]; then + if [ -z "${_firstpass}" ]; then + _firstpass="$(cat $ANSWER)" + else + _secondpass="$(cat $ANSWER)" + fi + if [ -n "${_firstpass}" -a -n "${_secondpass}" ]; then + if [ "${_firstpass}" != "${_secondpass}" ]; then + DIALOG --infobox "Passwords do not match! please reenter it again" 6 80 + unset _firstpass _secondpass + sleep 2 && continue + fi + set_option USERPASSWORD "${_firstpass}" + USERPASSWORD_DONE=1 + break + fi + else + return + fi + done +} + +set_useraccount() { + useradd -R $TARGETDIR -m -G wheel,audio,video,floppy,cdrom,optical,kvm,xbuilder \ + "$(get_option USERNAME)" + echo "$(get_option USERNAME):$(get_option USERPASSWORD)" | chpasswd -R $TARGETDIR -c SHA512 +} + +menu_bootloader() { + while true; do + DIALOG --title " Select the disk to install the bootloader" \ + --menu "$MENULABEL" ${MENUSIZE} $(show_disks) none "Manage bootloader otherwise" + if [ $? -eq 0 ]; then + set_option BOOTLOADER "$(cat $ANSWER)" + BOOTLOADER_DONE=1 + break + else + return + fi + done +} + +set_bootloader() { + local dev=$(get_option BOOTLOADER) grub_args= + + if [ "$dev" = "none" ]; then return; fi + + # Check if it's an EFI system via efivars module. + if [ -n "$EFI_SYSTEM" ]; then + grub_args="--target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=milis_grub --recheck" + fi + echo "Running grub-install $grub_args $dev..." >$LOG + chroot $TARGETDIR grub-install $grub_args $dev >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \ + failed to install GRUB to $dev!\nCheck $LOG for errors." ${MSGBOXSIZE} + DIE 1 + fi + echo "Running grub-mkconfig on $TARGETDIR..." >$LOG + chroot $TARGETDIR grub-mkconfig -o /boot/grub/grub.cfg >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR${RESET}: \ + failed to run grub-mkconfig!\nCheck $LOG for errors." ${MSGBOXSIZE} + DIE 1 + fi +} + +test_network() { + #ağ testi + if [ $? -eq 0 ]; then + DIALOG --msgbox "Ağ düzgün çalışıyor!" ${MSGBOXSIZE} + NETWORK_DONE=1 + return 1 + fi + DIALOG --msgbox "Ağda sorun var,gerekli ayarları yapınız." ${MSGBOXSIZE} +} + +configure_wifi() { + local dev="$1" ssid enc pass _wpasupconf=/etc/wpa_supplicant/wpa_supplicant.conf + + DIALOG --form "Wireless configuration for ${dev}\n(encryption type: wep or wpa)" 0 0 0 \ + "SSID:" 1 1 "" 1 16 30 0 \ + "Encryption:" 2 1 "" 2 16 4 3 \ + "Password:" 3 1 "" 3 16 50 0 || return 1 + set -- $(cat $ANSWER) + ssid="$1"; enc="$2"; pass="$3"; + + if [ -z "$ssid" ]; then + DIALOG --msgbox "Invalid SSID." ${MSGBOXSIZE} + return 1 + elif [ -z "$enc" -o "$enc" != "wep" -a "$enc" != "wpa" ]; then + DIALOG --msgbox "Invalid encryption type (possible values: wep or wpa)." ${MSXBOXSIZE} + return 1 + elif [ -z "$pass" ]; then + DIALOG --msgbox "Invalid AP password." ${MSGBOXSIZE} + fi + + rm -f ${_wpasupconf%.conf}-${dev}.conf + cp -f ${_wpasupconf} ${_wpasupconf%.conf}-${dev}.conf + if [ "$enc" = "wep" ]; then + echo "network={" >> ${_wpasupconf%.conf}-${dev}.conf + echo " ssid=\"$ssid\"" >> ${_wpasupconf%.conf}-${dev}.conf + echo " wep_key0=\"$pass\"" >> ${_wpasupconf%.conf}-${dev}.conf + echo " wep_tx_keyidx=0" >> ${_wpasupconf%.conf}-${dev}.conf + echo " auth_alg=SHARED" >> ${_wpasupconf%.conf}-${dev}.conf + echo "}" >> ${_wpasupconf%.conf}-${dev}.conf + else + wpa_passphrase "$ssid" "$pass" >> ${_wpasupconf%.conf}-${dev}.conf + fi + + configure_net_dhcp $dev + return $? +} + +configure_net() { + local dev="$1" rval + + DIALOG --yesno "Do you want to use DHCP for $dev?" ${YESNOSIZE} + rval=$? + if [ $rval -eq 0 ]; then + configure_net_dhcp $dev + elif [ $rval -eq 1 ]; then + configure_net_static $dev + fi +} + +iface_setup() { + ip addr show dev $1|grep -q 'inet ' + return $? +} + +configure_net_dhcp() { + local dev="$1" + + iface_setup $dev + if [ $? -eq 1 ]; then + dhcpcd -t 10 -w -4 -L $dev -e "wpa_supplicant_conf=/etc/wpa_supplicant/wpa_supplicant-${dev}.conf" 2>&1 | tee $LOG | \ + DIALOG --progressbox "Initializing $dev via DHCP..." ${WIDGET_SIZE} + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} failed to run dhcpcd. See $LOG for details." ${MSGBOXSIZE} + return 1 + fi + iface_setup $dev + if [ $? -eq 1 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} DHCP request failed for $dev. Check $LOG for errors." ${MSGBOXSIZE} + return 1 + fi + fi + test_network + if [ $? -eq 1 ]; then + set_option NETWORK "${dev} dhcp" + fi +} + +configure_net_static() { + local ip gw dns1 dns2 dev=$1 + + DIALOG --form "Static IP configuration for $dev:" 0 0 0 \ + "IP address:" 1 1 "192.168.0.2" 1 21 20 0 \ + "Gateway:" 2 1 "192.168.0.1" 2 21 20 0 \ + "DNS Primary" 3 1 "8.8.8.8" 3 21 20 0 \ + "DNS Secondary" 4 1 "8.8.4.4" 4 21 20 0 || return 1 + + set -- $(cat $ANSWER) + ip=$1; gw=$2; dns1=$3; dns2=$4 + echo "running: ip link set dev $dev up" >$LOG + ip link set dev $dev up >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} Failed to bring $dev interface." ${MSGBOXSIZE} + return 1 + fi + echo "running: ip addr add $ip dev $dev" + ip addr add $ip dev $dev >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} Failed to set ip to the $dev interface." ${MSGBOXSIZE} + return 1 + fi + ip route add $gw dev $dev >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} failed to setup your gateway." ${MSGBOXSIZE} + return 1 + fi + echo "nameserver $dns1" >/etc/resolv.conf + echo "nameserver $dns2" >>/etc/resolv.conf + test_network + if [ $? -eq 1 ]; then + set_option NETWORK "${dev} static $ip $gw $dns1 $dns2" + fi +} + +menu_network() { + local dev addr f DEVICES + + for f in $(ls /sys/class/net); do + [ "$f" = "lo" ] && continue + addr=$(cat /sys/class/net/$f/address) + DEVICES="$DEVICES $f $addr" + done + DIALOG --title " Select the network interface to configure " \ + --menu "$MENULABEL" ${MENUSIZE} ${DEVICES} + if [ $? -eq 0 ]; then + dev=$(cat $ANSWER) + if $(echo $dev|egrep -q "^wl.*" 2>/dev/null); then + configure_wifi $dev + else + configure_net $dev + fi + fi +} + +validate_filesystems() { + local mnts dev size fstype mntpt mkfs rootfound fmt + local usrfound efi_system_partition + + unset TARGETFS + mnts=$(grep -E '^MOUNTPOINT.*' $CONF_FILE) + set -- ${mnts} + while [ $# -ne 0 ]; do + dev=$2; fstype=$3; size=$4; mntpt="$5"; mkfs=$6 + shift 6 + + if [ "$mntpt" = "/" ]; then + rootfound=1 + elif [ "$mntpt" = "/usr" ]; then + usrfound=1 + elif [ "$fstype" = "vfat" -a "$mntpt" = "/boot/efi" ]; then + efi_system_partition=1 + fi + if [ "$mkfs" -eq 1 ]; then + fmt="NEW FILESYSTEM: " + fi + if [ -z "$TARGETFS" ]; then + TARGETFS="${fmt}$dev ($size) mounted on $mntpt as ${fstype}\n" + else + TARGETFS="${TARGETFS}${fmt}${dev} ($size) mounted on $mntpt as ${fstype}\n" + fi + done + if [ -z "$rootfound" ]; then + DIALOG --msgbox "${BOLD}${RED}HATA:${RESET} \ +kökdizin (/) için bağlama noktası ayarlı değil." ${MSGBOXSIZE} + return 1 + elif [ -n "$usrfound" ]; then + DIALOG --msgbox "${BOLD}${RED}HATA:${RESET} \ +/usr bağlama noktası desteklenmiyor,siliniz." ${MSGBOXSIZE} + return 1 + elif [ -n "$EFI_SYSTEM" -a -z "$efi_system_partition" ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \ +The EFI System Partition has not yet been configured, please create it\n +as FAT32, mountpoint /boot/efi and at least with 100MB of size." ${MSGBOXSIZE} + fi + FILESYSTEMS_DONE=1 +} + +create_filesystems() { + local mnts dev mntpt fstype fspassno mkfs size rv uuid + + mnts=$(grep -E '^MOUNTPOINT.*' $CONF_FILE) + set -- ${mnts} + while [ $# -ne 0 ]; do + dev=$2; fstype=$3; mntpt="$5"; mkfs=$6 + shift 6 + + # swap partitions + if [ "$fstype" = "swap" ]; then + swapoff $dev >/dev/null 2>&1 + if [ "$mkfs" -eq 1 ]; then + mkswap $dev >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \ +failed to create swap on ${dev}!\ncheck $LOG for errors." ${MSGBOXSIZE} + DIE 1 + fi + fi + swapon $dev >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \ +failed to activate swap on $dev!\ncheck $LOG for errors." ${MSGBOXSIZE} + DIE 1 + fi + # Add entry for target fstab + uuid=$(blkid -o value -s UUID "$dev") + echo "UUID=$uuid none swap sw 0 0" >>$TARGET_FSTAB + continue + fi + + if [ "$mkfs" -eq 1 ]; then + case "$fstype" in + btrfs) MKFS="mkfs.btrfs -f"; modprobe btrfs >$LOG 2>&1;; + ext2) MKFS="mke2fs -F"; modprobe ext2 >$LOG 2>&1;; + ext3) MKFS="mke2fs -F -j"; modprobe ext3 >$LOG 2>&1;; + ext4) MKFS="mke2fs -F -t ext4"; modprobe ext4 >$LOG 2>&1;; + f2fs) MKFS="mkfs.f2fs"; modprobe f2fs >$LOG 2>&1;; + vfat) MKFS="mkfs.vfat -F32"; modprobe vfat >$LOG 2>&1;; + xfs) MKFS="mkfs.xfs -f"; modprobe xfs >$LOG 2>&1;; + esac + DIALOG --infobox "Creating filesystem $fstype on $dev for $mntpt ..." 8 60 + echo "Running $MKFS $dev..." >$LOG + $MKFS $dev >$LOG 2>&1; rv=$? + if [ $rv -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}HATA:${RESET} \ + $dev $fstype dosyasistemi oluşturma esnasında hata oluştu!\nayrıntı için $LOG dosyasına bakınız." ${MSGBOXSIZE} + DIE 1 + fi + fi + # Mount rootfs the first one. + [ "$mntpt" != "/" ] && continue + mkdir -p $TARGETDIR + echo " $dev noktası $mntpt a bağlanıyor($fstype)..." >$LOG + mount -t $fstype $dev $TARGETDIR >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \ + $dev bağlanması ${mntpt} esnasında hata oluştu! ayrıntı için $LOG dosyasına bakınız." ${MSGBOXSIZE} + DIE 1 + fi + # Add entry to target fstab + uuid=$(blkid -o value -s UUID "$dev") + if [ "$fstype" = "f2fs" ]; then + fspassno=0 + else + fspassno=1 + fi + echo "UUID=$uuid $mntpt $fstype defaults 0 $fspassno" >>$TARGET_FSTAB + done + + # mount all filesystems in target rootfs + mnts=$(grep -E '^MOUNTPOINT.*' $CONF_FILE) + set -- ${mnts} + while [ $# -ne 0 ]; do + dev=$2; fstype=$3; mntpt="$5" + shift 6 + [ "$mntpt" = "/" -o "$fstype" = "swap" ] && continue + mkdir -p ${TARGETDIR}${mntpt} + echo "Mounting $dev on $mntpt ($fstype)..." >$LOG + mount -t $fstype $dev ${TARGETDIR}${mntpt} >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}HATA:${RESET} \ +failed to mount $dev on $mntpt! check $LOG for errors." ${MSGBOXSIZE} + DIE + fi + # Add entry to target fstab + uuid=$(blkid -o value -s UUID "$dev") + echo "UUID=$uuid $mntpt $fstype defaults 0 2" >>$TARGET_FSTAB + done +} + +mount_filesystems() { + for f in sys proc dev; do + [ ! -d $TARGETDIR/$f ] && mkdir $TARGETDIR/$f + echo "Mounting $TARGETDIR/$f..." >$LOG + mount --bind /$f $TARGETDIR/$f >$LOG 2>&1 + done +} + +umount_filesystems() { + local f + + for f in sys/fs/fuse/connections sys proc dev; do + echo "Unmounting $TARGETDIR/$f..." >$LOG + umount $TARGETDIR/$f >$LOG 2>&1 + done + local mnts="$(grep -E '^MOUNTPOINT.*$' $CONF_FILE)" + set -- ${mnts} + while [ $# -ne 0 ]; do + local dev=$2; local fstype=$3; local mntpt=$5 + shift 6 + if [ "$fstype" = "swap" ]; then + echo "Disabling swap space on $dev..." >$LOG + swapoff $dev >$LOG 2>&1 + continue + fi + if [ "$mntpt" != "/" ]; then + echo "Unmounting $TARGETDIR/$mntpt..." >$LOG + umount $TARGETDIR/$mntpt >$LOG 2>&1 + fi + done + echo "Unmounting $TARGETDIR..." >$LOG + umount $TARGETDIR >$LOG 2>&1 +} + +copy_rootfs() { + DIALOG --title "Ayrıntı için $LOG a bakınız" \ + --infobox "Çalışan ortam hedef noktaya kopyalanıyor,lütfen bekleyiniz ..." 4 60 + LANG=C cp -axvnu / $TARGETDIR >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIE 1 + fi +} + +install_packages() { + local _grub= _syspkg= + + if [ -n "$EFI_SYSTEM" ]; then + _grub="grub-x86_64-efi" + else + _grub="grub" + fi + + _syspkg="base-system" + + #temel sistem paketleri kurulacak +} + +enable_dhcpd() { + #dhcp hedef kurulum noktasında ayarlanacak +} + +menu_install() { + # Don't continue if filesystems are not ready. + validate_filesystems || return 1 + + #şimdilik kapalı + ROOTPASSWORD_DONE=1 #"$(get_option ROOTPASSWORD)" + BOOTLOADER_DONE=1 #"$(get_option BOOTLOADER)" + + if [ -z "$FILESYSTEMS_DONE" ]; then + DIALOG --msgbox "${BOLD}Gerekli dosya sistemi ayarlı değil, \ + gerekli ayarlamayı yaptıktan sonra kuruluma başlayınız.${RESET}" ${MSGBOXSIZE} + return 1 + elif [ -z "$ROOTPASSWORD_DONE" ]; then + DIALOG --msgbox "${BOLD}Root şifresi ayarlı değil, \ + gerekli ayarlamayı yaptıktan sonra kuruluma başlayınız.${RESET}" ${MSGBOXSIZE} + return 1 + elif [ -z "$BOOTLOADER_DONE" ]; then + DIALOG --msgbox "${BOLD}Bootloader için disk ayarlı değil, \ + gerekli ayarlamayı yaptıktan sonra kuruluma başlayınız.${RESET}" ${MSGBOXSIZE} + return 1 + fi + + DIALOG --yesno "${BOLD}Şu işlemler uygulanacak:${RESET}\n\n + ${BOLD}${TARGETFS}${RESET}\n + ${BOLD}${RED}UYARI: YENİ DOSYA SİSTEMİ İÇİN HEDEF BÖLÜMDEKİ TÜM DATA SİLİNECEK.${RESET}\n\n + ${BOLD}Devam etmek istiyor musunuz?${RESET}" 20 80 || return + unset TARGETFS + + # Create and mount filesystems + create_filesystems + copy_rootfs + rm -r -f $TARGETDIR/tmp/* + DIALOG --title "Ayrıntılar için $LOG kontrol ediniz." \ + --infobox "Hedef için başlatıcı ayarı yapılıyor ..." 4 60 + echo "Hedef için başlatıcı ayarı yapılıyor ..." >$LOG + # mount required fs + mount_filesystems + chroot $TARGETDIR dracut --no-hostonly --add-drivers "ahci" --force >>$LOG 2>&1 + + + DIALOG --infobox "Kurulum ayarları uygulanıyor..." 4 60 + + # copy target fstab. + install -Dm644 $TARGET_FSTAB $TARGETDIR/etc/fstab + # Mount /tmp as tmpfs. + echo "tmpfs /tmp tmpfs defaults,nosuid,nodev 0 0" >> $TARGETDIR/etc/fstab + + + # set up keymap, locale, timezone, hostname and root passwd.-simdilik kapali + #set_keymap + #set_locale + #set_timezone + #set_hostname + #set_rootpassword + #set_useraccount + + + + # install bootloader.-simdilik kapali + #set_bootloader + + sync && sync && sync + + # unmount all filesystems. + umount_filesystems + + # installed successfully. + DIALOG --yesno "${BOLD}Milis İşletim Sistemi başarıyla kuruldu!${RESET}\n + Bilgisayar yeniden başlatılsın mı?" ${YESNOSIZE} + if [ $? -eq 0 ]; then + shutdown -r now + else + return + fi +} + +menu_source() { + local src= + + DIALOG --title " Select installation source " \ + --menu "$MENULABEL" 8 70 0 \ + "Local" "Packages from ISO image" \ + "Network" "Packages from official remote reposity" + case "$(cat $ANSWER)" in + "Local") src="local";; + "Network") src="net"; + if [ -z "$NETWORK_DONE" ]; then + menu_network; + fi;; + *) return 1;; + esac + SOURCE_DONE=1 + set_option SOURCE $src +} + +menu() { + if [ -z "$DEFITEM" ]; then + DEFITEM="Keyboard" + fi + + DIALOG --default-item $DEFITEM \ + --extra-button --extra-label "Ayarlar" \ + --title " Milis İşletim Sistemi kurulumu menüsü " \ + --menu "$MENULABEL" 10 70 0 \ + "Dosyasistemi" "Dosya sistemlerini ayarlama,gerekli bağlamalar" \ + "Kur" "Kayıt edilen ayarlarla kuruluma başlanması" \ + "Çıkış" "Kurulumdan çıkış" + + if [ $? -eq 3 ]; then + # Show settings + cp $CONF_FILE /tmp/conf_hidden.$$; + sed -i "s/^ROOTPASSWORD.*/ROOTPASSWORD <-hidden->/" /tmp/conf_hidden.$$ + DIALOG --title "Kurulum için ayarlar kayıt edildi." --textbox /tmp/conf_hidden.$$ 14 60 + rm /tmp/conf_hidden.$$ + return + fi + + case $(cat $ANSWER) in + "Dosyasistemi") menu_filesystems && [ -n "$FILESYSTEMS_DONE" ] && DEFITEM="Kur";; + "Kur") menu_install;; + "Çıkış") DIE;; + *) DIALOG --yesno "Kurulumu iptal et?" ${YESNOSIZE} && DIE + esac +} + +if [ ! -x /bin/dialog ]; then + echo "ERROR: missing dialog command, exiting..." + exit 1 +fi +# +# main() +# +DIALOG --title "${BOLD}${RED} Milis İşletim Sistemi Hakkında ... ${RESET}" --msgbox "\n +Milis işletim sistemi kurulumuna hoşgeldiniz. Milis sıfırdan kaynak kodlardan +oluşturulan yerli bağımsız bir işletim sistemidir.Kendine özgü mps isimli paket yöneticisine sahiptir.\ +Mps ile hem derleme talimatları kullanılarak paket üretilebilir hem de direk ikili paketlerin kurulumu sağlanır. +irtibat için ${BOLD}#milisarge on irc.freenode.org${RESET}.\n\n +${BOLD}milisarge@gmail.com${RESET}\n\n" 16 80 + +while true; do + menu +done + +exit 0 +# vim: set ts=4 sw=4 et: