Summary: PC Installer
Group: Base/Utilities
Source: %{name}-%{version}.tar.xz
-Requires: rsync
-Requires: plymouth
-Requires: syslinux-extlinux
+Source2: http://invisible-island.net/dialog/dialog-1.2-20140219.tgz
+Source1001: system-installer.manifest
+Requires: bmap-tools
Requires: btrfs-progs
-Requires: snapper
+Requires: curl
Requires: dosfstools
Requires: gptfdisk
-Source1001: system-installer.manifest
+Requires: plymouth
+Requires: rsync
+Requires: snapper
+Requires: syslinux-extlinux
+Requires: util-linux
+Requires(post): /sbin/ldconfig
+Requires(postun): /sbin/ldconfig
+BuildRequires: autoconf >= 2.64, automake >= 1.11
+BuildRequires: libtool
+BuildRequires: ncurses-devel
+BuildRequires: findutils
+Requires: %{name}-dialog
%description
Installs a system from a USB stick to a local hard-disk.
+%package dialog
+
+Summary: Display interactive boxes from shell script
+Group: Development/Tools
+Requires(post): /sbin/ldconfig
+Requires(postun): /sbin/ldconfig
+
+%description dialog
+A program that will let you present a variety of questions or
+display messages using dialog boxes from a shell script.
+
+%package dialog-devel
+Summary: Development files for building applications with the dialog library
+Group: Development/Libraries
+Requires(post): /sbin/ldconfig
+Requires(postun): /sbin/ldconfig
+
+%description dialog-devel
+A program that will let you present a variety of questions or
+display messages using dialog boxes from a shell script.
+
+
%prep
%setup -q
cp %{SOURCE1001} .
+cp %{SOURCE2} .
+tar --strip-components=1 -xvzf %{SOURCE2}
+
%build
+%configure \
+ --includedir=%{_includedir}/dialog \
+ --enable-included-msgs \
+ --enable-nls \
+ --enable-widec \
+ --with-libtool \
+ --with-ncurses \
+ --with-ncursesw
+make %{?_smp_mflags}
+
%install
-install -d %{buildroot}/%{_sbindir}
-install -d %{buildroot}/%{_sysconfdir}/installer
-install -d %{buildroot}/%{_unitdir}
+## for system-installer-dialog ##1
+make DESTDIR=%{buildroot} install
+
+find %{buildroot}%{_libdir} -name '*.la' -type f -delete -print
+find %{buildroot}%{_libdir} -name '*.a' -type f -delete -print
+rm -rf %{buildroot}%{_mandir}
+
+## for system-installer ##
+install -d %{buildroot}/%{_sbindir}
+install -d %{buildroot}/%{_unitdir}/default.target.wants
+install -d %{buildroot}/root
install -m 0644 systemd/system-installer.service %{buildroot}/%{_unitdir}
install -m 0775 scripts/system-installer %{buildroot}/%{_sbindir}/system-installer
-install -m 0775 scripts/installer-conf-creator %{buildroot}/%{_sbindir}/installer-conf-creator
+install -m 0775 scripts/dialog-helper %{buildroot}/%{_sbindir}/dialog-helper
+install -m 0775 scripts/select-disk-util %{buildroot}/%{_sbindir}/select-disk-util
+install -m 0775 scripts/url-utils %{buildroot}/%{_sbindir}/url-utils
+install -m 0775 scripts/wifi-config %{buildroot}/%{_sbindir}/wifi-config
+install -m 0775 scripts/installer.conf %{buildroot}/%{_sbindir}/installer.conf
+install -m 0775 scripts/wifi %{buildroot}/%{_sbindir}/wifi
+install -m 0775 scripts/select-keyboard-layout-util %{buildroot}/%{_sbindir}/select-keyboard-layout-util
+install -m 0644 scripts/.dialogrc %{buildroot}/root/.dialogrc
+ln -sf ../system-installer.service %{buildroot}/%{_unitdir}/default.target.wants/system-installer.service
+
+## for system-installer-dialog ##1
+%post dialog -p /sbin/ldconfig
+
+%postun dialog -p /sbin/ldconfig
+
+%post dialog-devel -p /sbin/ldconfig
+
+%postun dialog-devel -p /sbin/ldconfig
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
%files
%manifest %{name}.manifest
%defattr(-,root,root)
-%{_sbindir}/system-installer
-%{_sbindir}/installer-conf-creator
%{_unitdir}/system-installer.service
+%{_unitdir}/default.target.wants/system-installer.service
+%{_sbindir}/system-installer
+%{_sbindir}/dialog-helper
+%{_sbindir}/select-disk-util
+%{_sbindir}/url-utils
+%{_sbindir}/wifi-config
+%{_sbindir}/installer.conf
+%{_sbindir}/wifi
+%{_sbindir}/select-keyboard-layout-util
+/root/.dialogrc
+
+%files dialog
+%defattr(-,root,root)
+%doc README
+%license COPYING
+%{_bindir}/dialog
+%{_libdir}/libdialog.so.*
+
+%files dialog-devel
+%{_bindir}/dialog-config
+%{_includedir}/dialog
+%{_libdir}/libdialog.so
--- /dev/null
+#
+# Run-time configuration file for dialog
+#
+# Automatically generated by "dialog --create-rc <file>"
+#
+#
+# Types of values:
+#
+# Number - <number>
+# String - "string"
+# Boolean - <ON|OFF>
+# Attribute - (foreground,background,highlight?)
+
+# Set aspect-ration.
+aspect = 0
+
+# Set separator (for multiple widgets output).
+separate_widget = ""
+
+# Set tab-length (for textbox tab-conversion).
+tab_len = 8
+
+# Make tab-traversal for checklist, etc., include the list.
+visit_items = OFF
+
+# Shadow dialog boxes? This also turns on color.
+use_shadow = OFF
+
+# Turn color support ON or OFF
+use_colors = ON
+
+# Screen color
+screen_color = (BLACK,BLACK,ON)
+
+# Shadow color
+shadow_color = (BLACK,BLACK,ON)
+
+# Dialog box color
+dialog_color = (BLUE,WHITE,OFF)
+
+# Dialog box title color
+title_color = (BLUE,WHITE,ON)
+
+# Dialog box border color
+border_color = (WHITE,WHITE,ON)
+
+# Active button color
+button_active_color = (WHITE,BLUE,ON)
+
+# Inactive button color
+button_inactive_color = dialog_color
+
+# Active button key color
+button_key_active_color = button_active_color
+
+# Inactive button key color
+button_key_inactive_color = (RED,WHITE,OFF)
+
+# Active button label color
+button_label_active_color = (WHITE,BLUE,ON)
+
+# Inactive button label color
+button_label_inactive_color = (BLACK,WHITE,ON)
+
+# Input box color
+inputbox_color = dialog_color
+
+# Input box border color
+inputbox_border_color = dialog_color
+
+# Search box color
+searchbox_color = dialog_color
+
+# Search box title color
+searchbox_title_color = title_color
+
+# Search box border color
+searchbox_border_color = border_color
+
+# File position indicator color
+position_indicator_color = title_color
+
+# Menu box color
+menubox_color = dialog_color
+
+# Menu box border color
+menubox_border_color = border_color
+
+# Item color
+item_color = dialog_color
+
+# Selected item color
+item_selected_color = button_active_color
+
+# Tag color
+tag_color = title_color
+
+# Selected tag color
+tag_selected_color = button_label_active_color
+
+# Tag key color
+tag_key_color = button_key_inactive_color
+
+# Selected tag key color
+tag_key_selected_color = (YELLOW,BLUE,ON)
+
+# Check box color
+check_color = dialog_color
+
+# Selected check box color
+check_selected_color = button_active_color
+
+# Up arrow color
+uarrow_color = (BLUE,WHITE,ON)
+
+# Down arrow color
+darrow_color = uarrow_color
+
+# Item help-text color
+itemhelp_color = (WHITE,BLACK,OFF)
+
+# Active form text color
+form_active_text_color = button_active_color
+
+# Form text color
+form_text_color = (WHITE,CYAN,ON)
+
+# Readonly form item color
+form_item_readonly_color = (CYAN,WHITE,ON)
+
+# Dialog box gauge color
+gauge_color = (BLUE,WHITE,ON)
+
+# Dialog box border2 color
+border2_color = dialog_color
+
+# Input box border2 color
+inputbox_border2_color = dialog_color
+
+# Search box border2 color
+searchbox_border2_color = dialog_color
+
+# Menu box border2 color
+menubox_border2_color = dialog_color
--- /dev/null
+#!/bin/bash
+
+TMP_FILE="/tmp/dialog-helper.$$"
+
+export DIALOGRES
+
+# Used to retrieve the result of a menu selection.
+# DIALOGRES will hold the tag corresponding to the user's selection.
+dialog_helper() {
+ dialog --stderr --no-cancel "$@" 2> "$TMP_FILE"
+ local rc=$?
+ DIALOGRES=$(cat "$TMP_FILE")
+ rm -f "$TMP_FILE" 2>/dev/null
+ [[ $rc != 0 ]] && exit 1
+ return $rc
+}
+++ /dev/null
-#!/bin/sh -ef
-
-DEST=/etc/installer.conf
-
-pnum=0
-
-if [ ! -n "$INSTALLERFW_PART_COUNT" ]; then
- printf "INSTALLERFW_PART_COUNT unset, aborting\n" >&2
- exit 1
-fi
-
-echo CFG_DISTRO_NAME=\"${INSTALLERFW_DISTRO_NAME}\" > $DEST
-echo CFG_KERNEL_OPTS=\"${INSTALLERFW_KERNEL_OPTS}\" >> $DEST
-echo CFG_MOUNT_PREFIX=\"${INSTALLERFW_MOUNT_PREFIX}\" >> $DEST
-echo CFG_INSTALLER_NAME=\"${INSTALLERFW_INSTALLER_NAME}\" >> $DEST
-echo CFG_PTABLE_FORMAT=\"${INSTALLERFW_PTABLE_FORMAT}\" >> $DEST
-echo CFG_PART_COUNT=\"${INSTALLERFW_PART_COUNT}\" >> $DEST
-while [ "$pnum" -lt "$INSTALLERFW_PART_COUNT" ]; do
- echo CFG_PART${pnum}_FSTYPE=\"$(eval echo \${INSTALLERFW_PART${pnum}_FSTYPE})\" >> $DEST
- echo CFG_PART${pnum}_FSOPTS=\"$(eval echo \${INSTALLERFW_PART${pnum}_FSOPTS})\" >> $DEST
- echo CFG_PART${pnum}_UUID=\"$(eval echo \${INSTALLERFW_PART${pnum}_UUID})\" >> $DEST
- echo CFG_PART${pnum}_BOOTFLAG=\"$(eval echo \${INSTALLERFW_PART${pnum}_BOOTFLAG})\" >> $DEST
- echo CFG_PART${pnum}_PARTUUID=\"$(eval echo \${INSTALLERFW_PART${pnum}_PARTUUID})\" >> $DEST
- echo CFG_PART${pnum}_SIZE=\"$(eval echo \${INSTALLERFW_PART${pnum}_SIZE})\" >> $DEST
- echo CFG_PART${pnum}_MOUNTPOINT=\"$(eval echo \${INSTALLERFW_PART${pnum}_MOUNTPOINT})\" >> $DEST
- echo CFG_PART${pnum}_DEVNODE=\"$(eval echo \${INSTALLERFW_PART${pnum}_DEVNODE})\" >> $DEST
- echo CFG_PART${pnum}_LABEL=\"$(eval echo \${INSTALLERFW_PART${pnum}_LABEL})\" >> $DEST
- echo CFG_PART${pnum}_TYPE_ID=\"$(eval echo \${INSTALLERFW_PART${pnum}_TYPE_ID})\" >> $DEST
- echo CFG_PART${pnum}_ALIGN=\"$(eval echo \${INSTALLERFW_PART${pnum}_ALIGN})\" >> $DEST
-
- pnum="$((pnum+1))"
-done
-
--- /dev/null
+# The complete url to the raw.bz2 image you wish to flash on the output device
+IMAGE_URL=""
+
+# The output device used for installation
+OUTDEV=""
+
+# The keymap layout used if you need to write a password for the wifi configuration
+# and the default keymap layout for weston
+KEYBOARD_LAYOUT=""
--- /dev/null
+#!/bin/bash
+
+# List block devices that are not removable,
+# if multiple devices are found, the user will be invited to choose one.
+# If no devices are found, the program exit with error code 1
+
+outfile=${1:-/dev/stdout}
+. /usr/sbin/dialog-helper
+
+trap "exit 2" SIGINT
+
+target_array=()
+for i in $(ls /sys/block/*/device/model); do
+ dev=$(echo $i | cut -d'/' -f-4) ;
+ device=$(echo $i | cut -d'/' -f4)
+ grep -q 1 $dev/removable
+ if [ "$?" = "1" ]; then
+ target_array+=("/dev/$device")
+ fi
+done
+
+if (( "${#target_array[@]}" == "1" )); then
+ TARGET="${target_array[0]}"
+elif (( "${#target_array[@]}" > "1" )); then
+ dialog_helper --no-items --menu "Installation destinaion device:" 10 40 3 $( for i in "${target_array[@]}"; do echo "$i"; done )
+ TARGET="$DIALOGRES"
+else
+ dialog --msgbox "No devices could be found, no installation possible" 10 40
+ exit 1
+fi
+
+rm -f "${TMP_FILE}"
+
+cat << EOC > $outfile
+$TARGET
+EOC
+
+exit 0
--- /dev/null
+#!/bin/bash
+
+# Select a keyboard layout in a menu
+
+outfile=${1:-/dev/stdout}
+. /usr/sbin/dialog-helper
+
+trap "exit 1" SIGINT
+
+layouts=$(find /usr/lib/kbd/keymaps/ -type f |sed -e '/map.gz/!d' -e "s:.*/\(.*\).map.gz:\1:" | sort -u)
+dialog_helper --no-items --menu "Choose your keyboard layout" 200 30 40 $(for i in $layouts ; do echo "$i"; done)
+
+cat << EOC >> $outfile
+$(echo "$DIALOGRES")
+EOC
+
+exit 0
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
-# Own program name
-PROG="${0##*/}"
-
-show_usage()
-{
- cat <<-EOF
-Usage: $PROG [options]
-
-Options:
- -a, --automode do not ask any question and just proceed with installing to
- the first persistent storage device found
-EOF
-}
-
-# Print $1, show help message and error out
-fail_usage()
-{
- [ -z "$1" ] || printf "%s\n" "$1"
- show_usage
- exit 1
-}
-
-function message {
- if [ -n "$PLYMOUTH" -a "$PLYMOUTH" -eq 1 ]; then
- plymouth display-message --text "$1"
- else
- echo $1
- fi
-}
-
-function check_echo_reboot {
- read key
- if [[ $key != 'r' && $key != 'R' ]]; then
- check_echo_reboot
- fi
-}
-
+# This script will flash an output device with a downloaded raw image
+# from download.tizen.org.
+# Any missing configurations will be asked to the user.
+# Being connected to the internet before launching this script is
+# better. If you aren't connected, a wifi configuration script will be fired.
+
+chvt 2
+
+# The partition to resize after flashing the raw image
+partition=1
+# Used to retrieve output of the other scripts
+output_data_file="/tmp/system-installer.$$"
+# Mount point used to change the keymap layout of weston on the device
+mountpoint="/tmp/output_device_mount_point"
+# Configuration file of system-installer
+conf_file="/usr/sbin/installer.conf"
+# Used to signal a bmaptool failure during download/flash
+bmaptool_failure=""
+
+. /usr/sbin/dialog-helper
+
+# Simply read the configuration in $conf_file, exit if not found
function read_config {
- local CONF_FILE=""
- CONF_FILE="/etc/installer.conf"
- if [ ! -e $CONF_FILE ]; then
- message "Installation failure, missing /etc/installer.conf"
- test $REBOOT_ON_FAILURE -eq 1 && (
- sleep 5
- /usr/sbin/reboot
- )
+ if [ ! -e $conf_file ]; then
+ dialog --msgbox "Installation failure, missing $conf_file" 10 40
exit 1
else
- . $CONF_FILE
- fi
-}
-
-function set_mounts {
- SRCMNT=$(mktemp -d /media/srctmp.XXXXXX)
- TGTMNT=$(mktemp -d /media/tgttmp.XXXXXX)
- SRCOSMNT=$(mktemp -d /media/srcostmp.XXXXXX)
-}
-
-function find_devices {
- for i in $(ls /sys/block/*/device/model); do
- dev=$(echo $i | cut -d'/' -f-4) ;
- device=$(echo $i | cut -d'/' -f4)
- grep -q 1 $dev/removable
- if [ "$?" = "1" ]; then
- TARGET_DEV="/dev/$device";
- break
- fi
- done
-
- if [ -z "$TARGET_DEV" ]; then
- message "Installation failure, unable to find suitable install target media"
- test $REBOOT_ON_FAILURE -eq 1 && (
- sleep 5
- /usr/sbin/reboot
- )
- exit 1
- fi
-}
-
-# Global variable for storing the partition option parameters;
-params=
-
-function msdos_partition_options {
- # the partition number
- local i=$1
- # used for storing the per-part variables,
- # accessed via indirect referencing
- local tmp=""
-
- tmp="CFG_PART${i}_SIZE"
- local size=${!tmp}
- [ -z "$size" ] && size="1024"
- if [[ "$CFG_PART_COUNT" = "$((i+1))" ]]; then
- # an 'empty' value means that sfdisk will use
- # the defaults, in this case expanding to the
- # end of the disk
- size=""
- fi
- params=$(printf "${params}\n%s" ",${size}")
-
- tmp="CFG_PART${i}_FSTYPE"
- local fstype=${!tmp}
- local typeid='83'
- [ "$fstype" = "swap" ] && typeid='82'
- params=$(printf "${params}%s" ",${typeid}")
-
- # handle bootflag last
- tmp="CFG_PART${i}_BOOTFLAG"
- local bootflag=${!tmp}
- if [ "$bootflag" = "True" ]; then
- params=$(printf "${params}%s" ',*')
- else
- params=$(printf "${params}\n")
- fi
-}
-
-function gpt_partition_options {
- # the partition number
- local i=$1
- # used for storing the per-part variables,
- # accessed via indirect referencing
- local tmp=""
-
- tmp="CFG_PART${i}_ALIGN"
- local align=${!tmp}
- [ -n "$align" ] && params=$(printf "${params}%s" " --set-alignment=${align}")
-
- # sgdisk uses '0' to mean 'default value'
- params=$(printf "$params%s" " --new=0:0")
-
- tmp="CFG_PART${i}_SIZE"
- local size=${!tmp}
- if [[ "$CFG_PART_COUNT" = "$((i+1))" ]]; then
- size="0"
- fi
- [ -z "$size" ] && size="1024"
- [ -n "$size" ] && params=$(printf "${params}%s" ":${size}M")
-
- # TODO: need to handle swap partition types if encountered
-
- # the following GUID option does not accept default partition values,
- # so partition numbering must start at index 1, not 0
- local partnum="$((i+1))"
-
- tmp="CFG_PART${i}_TYPE_ID"
- local typeid=${!tmp}
- [ -n "$typeid" ] && params=$(printf "${params}%s" " --typecode=${partnum}:${typeid}")
-}
-
-function partition_msdos {
- # make sure there is a newline in the heredoc,
- # or else sfdisk fails to parse the input
- /usr/sbin/sfdisk --in-order -uM ${TARGET_DEV} << EOF
-${1}
-
-EOF
- sync
-}
-
-function partition_gpt {
- /usr/sbin/sgdisk -Z ${TARGET_DEV}
- /usr/sbin/sgdisk ${1} ${TARGET_DEV}
- sync
-}
-
-function format_device {
- local fstype=$1
- local instfw_pnum=$2
- # the actual partition numbers begin at index 1, not 0
- local partnum="$((instfw_pnum+1))"
-
- # TODO: need to handle swap partitions
-
- /usr/sbin/mkfs.${fstype} ${TARGET_DEV}${partnum}
-
- if [[ ${fstype} = "btrfs" ]]; then
- mount ${TARGET_DEV}${partnum} $TGTMNT
- /usr/sbin/btrfs subvolume create ${TGTMNT}/tizen
- /usr/sbin/btrfs subvolume create ${TGTMNT}/tizen/.snapshots
- SUBVOLID=$(/usr/sbin/btrfs subvolume list $TGTMNT | grep 'tizen$' | awk '{ print $2 }')
- echo "Setting subvolume ${SUBVOLID} as default"
- /usr/sbin/btrfs subvolume set-default $SUBVOLID $TGTMNT
- sync
- umount $TGTMNT
+ . $conf_file
fi
}
-function mount_device {
- local mountpoint=$1
- local instfw_pnum=$2
- # the actual partition numbers begin at index 1, not 0
- local partnum="$((instfw_pnum+1))"
-
- SRCOSMNT="/"
-
- # we make this substitution in extlinux.conf on the target device
- [ "$mountpoint" = "/" ] && ROOTFS="${TARGET_DEV}${partnum}"
-
- mkdir -p ${TGTMNT}/${mountpoint}
-
- # for this to work, the rootfs partition entry in installer.conf
- # must be first entry, or else some mount points will be hidden
- # during the rsync
- mount ${TARGET_DEV}${partnum} ${TGTMNT}/${mountpoint}
-}
-
-function install_extlinux {
- mkdir -p ${TGTMNT}/boot/extlinux
- cat > ${TGTMNT}/boot/extlinux/extlinux.conf << EOF
-default vesamenu.c32
-timeout 10
-
-menu background splash.png
-menu title Welcome to Tizen PC!
-menu color border 0 #ffffffff #00000000
-menu color sel 7 #ff000000 #ffffffff
-menu color title 0 #ffffffff #00000000
-menu color tabmsg 0 #ffffffff #00000000
-menu color unsel 0 #ffffffff #00000000
-menu color hotsel 0 #ff000000 #ffffffff
-menu color hotkey 7 #ffffffff #ff000000
-menu color timeout_msg 0 #ffffffff #00000000
-menu color timeout 0 #ffffffff #00000000
-menu color cmdline 0 #ffffffff #00000000
-menu hidden
-menu clear
-label tizen
- menu label Boot Tizen
- kernel ../vmlinuz
- append root=${ROOTFS} ${CFG_KERNEL_OPTS} ${ROOTFLAGS}
-menu default
-EOF
-
- cp /usr/share/branding/default/syslinux/syslinux-vesa-splash.jpg ${TGTMNT}/boot/extlinux/splash.png
-
- cat /usr/share/syslinux/mbr.bin > ${TARGET_DEV}
- /sbin/extlinux -i ${TGTMNT}/boot/extlinux
-}
-
-function fixup_fstab {
- local pnum=0
- local devpnum="$((pnum+1))"
- local tmp=""
- local srcuuid=""
- local tgtuuid=""
-
- while [ "$pnum" -lt "$CFG_PART_COUNT" ]; do
- tmp="CFG_PART${pnum}_UUID"
- srcuuid=${!tmp}
-
- tgtuuid=$(blkid ${TARGET_DEV}${devpnum} | sed 's/.* UUID="\([^"]*\)".*/\1/')
- sed -i "s/.*\(UUID=\).*${srcuuid}\(.*\)/\1${tgtuuid}\2/" ${TGTMNT}/etc/fstab
-
- pnum="$((pnum+1))"
- devpnum="$((devpnum+1))"
- done
-}
-
-function fixup_gummiboot {
- # expect the rootfs to be the last entry in installer.conf
- local pnum="$((CFG_PART_COUNT-1))"
- local devpnum="$((pnum+1))"
- local tmp=""
- local mntpoint=""
- local srcpuuid=""
- local tgtpuuid=""
- local confs="$(ls -1 "${TGTMNT}/boot/loader/entries/")"
-
- tmp="CFG_PART${pnum}_PARTUUID"
- srcpuuid=${!tmp}
-
- tgtpuuid=$(blkid ${TARGET_DEV}${devpnum} | sed 's/.* PARTUUID="\([^"]*\)".*/\1/')
-
- printf "%s\n" "$confs" | while IFS= read -r conf; do
- sed -i "s/\(.*PARTUUID=\).*${srcpuuid}\(.*\)/\1${tgtpuuid}\2/" "${TGTMNT}/boot/loader/entries/${conf}"
- done
-}
-
+# Download the raw image, decompress it and write it on the device
+# When the image is written, the partition size is modified
function install_os {
- rsync -WaHXSh --exclude='/dev/' --exclude='/lost+found/' --exclude='/media/*' --exclude='/sys/' --exclude='/proc/' --exclude="/tmp/" --exclude="/run/" $SRCOSMNT/ $TGTMNT
-
- mkdir ${TGTMNT}/dev/
- chmod 0755 ${TGTMNT}/dev
-
- # TODO: switch to using systemd mount units instead of the fstab
- #rm ${TGTMNT}/etc/fstab
-
- fixup_fstab
-
- if [ "$CFG_PTABLE_FORMAT" = "gpt" ]; then
- fixup_gummiboot
+ bmaptool copy "$IMAGE_URL" "$OUTDEV" |&
+ sed -u -e '/copied/!d;s/\r/\n/g;s/.* \([0-9]\{1,3\}\)% .*/\1/g' |
+ dialog --gauge "Downloading the image and copying on $OUTDEV" 10 100 0
+ if [[ ${PIPESTATUS[0]} != 0 ]]; then
+ bmaptool_failure="yes"
+ sigint_handler
fi
- if [[ $FILESYSTEM = "btrfs" ]]; then
- ROOTFLAGS="rootflags=subvol=tizen"
- else
- ROOTFLAGS=""
- fi
+ local RESIZEFS=yes
- if [ "$CFG_PTABLE_FORMAT" = "msdos" ]; then
- install_extlinux
- fi
+ if [ "$RESIZEFS" = "yes" ]; then
+ # resize first partition
+ # WARNING: this only works if the system is installed on a single partition
+ newsz=20 # GB
+ sfdisk -d $OUTDEV |
+ awk '$1=="'${OUTDEV}${partition}'" { sub("size=[^,]+","size="'${newsz}'*1024*1024*2)}1' >/tmp/newpart.lst
+ sfdisk $OUTDEV </tmp/newpart.lst || true
+ echo "Partition ${OUTDEV}${partition} resized to $newsz GB"
- if [[ $FILESYSTEM = "btrfs" ]]; then
- sed -i 's|SUBVOLUME="/"|SUBVOLUME="'${TGTMNT}'"|' /etc/snapper/configs/root
- snapper create -d "Factory Default"
- fi
-}
+ # force kernel to reread partitions
+ echo "Probing new partition table"
+ partprobe $OUTDEV
-function unmount_devices {
- sync
- sleep 2
- [ -d "$TGTMNT" ] && umount -R $TGTMNT
+ # resize filesystem
+ echo "Resizing filesystem"
+ resize2fs -f -p ${OUTDEV}${partition}
+ fi
}
-
-# Handle command line options
-tmp=`getopt -n "$PROG" -o a,h --long automode,help -- "$@"` || fail_usage ""
-eval set -- "$tmp"
-
-AUTOMODE=
-
-while true; do
- case "$1" in
- -a|--automode)
- AUTOMODE="1"
- ;;
- -h|--help)
- show_usage
- exit 0
- ;;
- --) shift; break
- ;;
- *) fail_usage "Unrecognized option: $1"
- ;;
- esac
- shift
-done
-
-if [ -z "$AUTOMODE" ]; then
- PLYMOUTH=0
- REBOOT_ON_FAILURE=0
-else
- PLYMOUTH=1
- REBOOT_ON_FAILURE=1
-fi
-
-message "This installation will wipe all data from the hard drive, hit Y key to continue or ctrl-alt-del to abort."
-if [ -n "$PLYMOUTH" -a "$PLYMOUTH" -eq 1 ]; then
- plymouth watch-keystroke --command="/usr/bin/test" --keys "yY"
-else
- read key
- if [[ $key != 'y' && $key != 'Y' ]]; then
- test $REBOOT_ON_FAILURE -eq 1 && /usr/sbin/reboot
- fi
-fi
-if [ -n "$PLYMOUTH" -a "$PLYMOUTH" -eq 1 ]; then
- plymouth hide-message --text "This installation will wipe all data from the hard drive, hit Y key to continue or ctrl-alt-del to abort."
-fi
+# Let the user choose between available keyboard layouts, then execute loadkeys
+function select_keyboard_layout {
+ while :; do
+ /usr/sbin/select-keyboard-layout-util "$output_data_file" && break
+ [ $? -eq 1 ] && sigint_handler
+ done
+ KEYBOARD_LAYOUT=$(cat "$output_data_file")
+ rm -f "$output_data_file" 2>/dev/null
+ loadkeys "$KEYBOARD_LAYOUT"
+}
+
+# Test connection to "http://download.tizen.org/",
+# if we can't connect, we configure the keyboard layout (if not yet set)
+# then we launch the wifi configuration script
+function test_connection {
+ curl --connect-timeout 10 -s "http://download.tizen.org/" > /dev/null
+ if [[ $? != 0 ]]; then
+ while :; do
+ /usr/sbin/wifi-config && break
+ [ $? -eq 1 ] && sigint_handler
+ done
+ fi
+}
+
+# Sets the keyboard layout accordingly to $KEYBOARD_LAYOUT
+# in weston.ini on the device
+function modify_weston_conf {
+ local file="${mountpoint}/etc/xdg/weston/weston.ini"
+ [ -f "$file" ] && sed -i -e "s/^#\[keyboard\]$/\[keyboard\]/; s/^#keymap_layout=.*/keymap_layout=$KEYBOARD_LAYOUT/" "$file"
+}
+
+function sigint_handler {
+ local txt=""
+ if [ "$bmaptool_failure" = "yes" ]; then
+ txt+="Bmaptool failed to flash your device."
+ else
+ txt+="The installation was interrupted."
+ fi
+ txt+=" Do you want to reboot ? press 'Yes' to reboot and 'No' to restart the installation."
+ dialog --yesno "$txt" 15 40 && /usr/sbin/reboot -f
+ rm -f "$output_data_file" 2>/dev/null
+ rm -rf "$mountpoint" 2>/dev/null
+ [ -d "${OUTDEV}${partition}" ] && umount -l "${OUTDEV}${partition}" 2>/dev/null
+ exec /usr/sbin/system-installer
+}
+
+trap "sigint_handler" SIGINT
read_config
-set_mounts
-find_devices
-message "Installing on to the hard disk now, this will take a few minutes..."
-
-pnum=0
-# first, generate the option list to pass to either 'sfdisk' or 'sgdisk'
-while [ "$pnum" -lt "$CFG_PART_COUNT" ]; do
- if [ "$CFG_PTABLE_FORMAT" = "msdos" ]; then
- msdos_partition_options $pnum
- elif [ "$CFG_PTABLE_FORMAT" = "gpt" ]; then
- gpt_partition_options $pnum
- fi
- pnum="$((pnum+1))"
-done
-# now, do the partitioning
-if [ "$CFG_PTABLE_FORMAT" = "msdos" ]; then
- partition_msdos "$params"
-elif [ "$CFG_PTABLE_FORMAT" = "gpt" ]; then
- partition_gpt "$params"
+[ -z "$KEYBOARD_LAYOUT" ] && select_keyboard_layout
+
+if [ -z "$IMAGE_URL" ] ;then
+ test_connection
+ while :; do
+ /usr/sbin/url-utils "$output_data_file" && break
+ [ $? -eq 1 ] && sigint_handler
+ done
+ IMAGE_URL=$(cat "$output_data_file")
+elif ! curl --fail -I "$IMAGE_URL" > /dev/null ; then
+ echo "The image url couldn't be reached, please verify that the url is correct."
+ exit 1
fi
-pnum="$((CFG_PART_COUNT-1))"
-# NOTE: for now, partitions are processed in reverse order, and we
-# expect the rootfs to be the last entry in installer.conf
-while [ "$pnum" -ge "0" ]; do
- tmp="CFG_PART${pnum}_FSTYPE"
- fstype=${!tmp}
-
- format_device $fstype $pnum
+if [ -z "$OUTDEV" ] ;then
+ while :; do
+ /usr/sbin/select-disk-util "$output_data_file" && break
+ [ $? -eq 1 ] && sigint_handler
+ done
+ OUTDEV=$(cat "$output_data_file")
+elif [ ! -b "$OUTDEV" ] ; then
+ echo "The output device is not a block device."
+ exit 1
+fi
- tmp="CFG_PART${pnum}_MOUNTPOINT"
- mountpoint=${!tmp}
+rm -f "$output_data_file" 2>/dev/null
- mount_device $mountpoint $pnum
+dialog --yesno "Do you whant to proceed with the installation ? All your data on the target device will be lost." 10 40 || exit 1
- pnum="$((pnum-1))"
-done
+# Download and install the image
+install_os
-unset fstype
-unset mountpoint
+# Mounting device
+mkdir -p "$mountpoint"
+mount "${OUTDEV}${partition}" "$mountpoint"
-install_os
-unmount_devices
+modify_weston_conf
-if [ -n "$PLYMOUTH" -a "$PLYMOUTH" -eq 1 ]; then
- plymouth hide-message --text "Installing on to the hard disk now, this will take a few minutes..."
-fi
-message "Hit R key to reboot and then remove the usb stick. Enjoy!"
+# Unmounting device
+sync && sync
+[ -d "${OUTDEV}${partition}" ] && umount -l "${OUTDEV}${partition}"
-if [ -n "$PLYMOUTH" -a "$PLYMOUTH" -eq 1 ]; then
- plymouth watch-keystroke --command="/usr/bin/test" --keys "rR"
-else
- check_echo_reboot
-fi
-/usr/sbin/reboot
+dialog --msgbox "The default password for all users is 'tizen'. Hit Enter to reboot and then remove the usb stick." 10 40 && /usr/sbin/reboot -f
--- /dev/null
+#!/bin/bash
+
+# Guide a user towards a image URL with questions and exploration of
+# http://download.tizen.org/.
+# If you supply a file as parameter, the output will be saved in it.
+# Exit with value 2 if SIGINT is sent.
+
+# Number of images to list (if arch x86_64, ia32 images will be also used)
+N=3
+
+# Some images are excluded
+BLACKLIST="-e unsafe -e emul -e efi -e testing -e installer"
+
+# Field number used to retrieve the href value in a listing
+# The fields are separated by "
+HREF_FIELD_NO=6
+
+outfile=${1:-/dev/stdout}
+. /usr/sbin/dialog-helper
+tmp_outfile="/tmp/url-utils.$$"
+
+# Print the href values of a directory listing
+# param #1: url of a directory listing
+function url_get_href_from_listing() {
+ curl -s -S "$1" |
+ grep '<img src="/icons/folder.gif" alt="\[DIR\]"> <a href="' |
+ cut -d '"' -f ${HREF_FIELD_NO}
+}
+
+# Print last N images url of a directory listing. The images url passed
+# the BLACKLIST filter
+# param #1: url like "http://download.tizen.org/snapshots/tizen/ivi/ivi/"
+function url_N_last_images() {
+ local base_url="$1"
+ local i=0
+
+ url_get_href_from_listing "${base_url}" |
+ tac |
+ while read url && [[ $i < $N ]]; do
+ img_dir_list_url="${base_url}${url}images/"
+ for img_dir_name in $(url_get_href_from_listing "${img_dir_list_url}"); do
+ if echo "${img_dir_name}"| grep -qv ${BLACKLIST}; then
+ final_img_name=$(
+ curl -s -S "${img_dir_list_url}${img_dir_name}" |
+ grep "raw.bz2" |
+ cut -d '"' -f ${HREF_FIELD_NO}
+ )
+ [ -n "$final_img_name" ] && echo "${img_dir_list_url}${img_dir_name}${final_img_name}" >> $tmp_outfile
+ fi
+ done
+ i=$(($i + 1))
+ done
+}
+
+trap "exit 2" SIGINT
+
+# Asks for profile
+dialog_helper --no-items --menu "Choose your profile" 10 30 2 "IVI" "Common"
+PROFIL="$DIALOGRES"
+
+# Asks for image type
+dialog_helper --no-items --menu "Choose your image type" 10 30 2 "snapshot" "release"
+TYPE="$DIALOGRES"
+
+# Deduces the architecture if not set
+[ -z "$ARCH" ] && ARCH=$(lscpu |grep -q "^CPU op-mode.*64-bit.*" && echo "x86_64")
+
+# "base" URL
+if [ "$TYPE" = "release" ]; then
+ # Only IVI profile is available in release/weekly
+ if [ "$PROFIL" = "IVI" ]; then
+ dialog_helper --no-items --menu "Choose your release" 10 30 2 "daily" "weekly"
+ URL="http://download.tizen.org/releases/$DIALOGRES/tizen/"
+ else
+ URL="http://download.tizen.org/releases/daily/tizen/"
+ fi
+else
+ URL="http://download.tizen.org/snapshots/tizen/"
+fi
+
+# This follow the (odd) naming conventions of download.tizen.org
+# Also, if you have ARCH = "x86_64", images of the "ia32" architecture also will be printed
+if [ "$PROFIL" = "IVI" ]; then
+ URL1="${URL}ivi/ivi/"
+else
+ URL+="common/common-"
+ if [ "$TYPE" = "snapshot" ]; then
+ # Asks for display server
+ dialog_helper --no-items --menu "Choose your display server" 10 30 2 "X11" "Wayland"
+ DISPLAY="$DIALOGRES"
+
+ if [ "$DISPLAY" = "X11" ]; then
+ URL+="x11-"
+ # For some reason a wayland folder is in a x11 image folder
+ BLACKLIST+=" -e wayland"
+ else
+ URL+="wayland-"
+ fi
+ else
+ URL+="wayland-"
+ fi
+
+ if [ "$ARCH" = "x86_64" ]; then
+ URL2="${URL}x86_64/"
+ $(url_N_last_images "$URL2")
+ fi
+
+ URL1="${URL}ia32/"
+fi
+
+# If we don't print anything, the screen will be black for few seconds
+dialog --infobox "Building urls..." 10 40
+$(url_N_last_images "$URL1")
+
+# We extract various informations from the url, the result is :
+# <URL> "Tizen common-wayland-mbr-x86_64 (MM/DD/YYYY #<build number>)"
+entry=$(
+ sed 's:\(.*/tizen_\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\.\([0-9]*\)/images/\(.*\)/.*\):\1 "Tizen \6 (\3/\4/\2 #\5)":' $tmp_outfile |
+ tr '\n' ' '
+)
+
+rm -f "$tmp_outfile" 2>/dev/null
+
+if [ -z "$entry" ]; then
+ dialog --msgbox "No suitable image could be found, exiting" 10 40
+ exit 1
+fi
+
+eval dialog_helper --notags --menu "\"Choose between the latests images that match your criterions\"" 16 60 6 $entry
+
+cat << EOC >> $outfile
+$(echo "$DIALOGRES")
+EOC
--- /dev/null
+#!/bin/bash
+
+# Helper script to activate/desactivate WLAN from command line
+
+# Usage :
+# wifi connect <ssid> <passphrase>
+# wifi disconnect <ssid>
+# wifi scan
+# wifi status
+
+#####################################################
+
+### global vars ###
+
+CONNMAN=/usr/sbin/connmanctl
+
+script=$(basename $0)
+configpath=/var/lib/connman # connman config directory
+ssid="" # ssid of wifi network to reach
+passphrase="" # passphrase of wifi network to reach
+service="" # service identifier of the network service to reach
+fullservice="" # <ssid><service>
+
+function error() {
+ echo ERROR: "$@" >&2
+ cat << EOF >&2
+Usage:
+ $script connect <ssid> [passphrase]
+ $script disconnect [ssid]
+ $script scan
+ $script status
+EOF
+ exit 1
+}
+
+function wifi_enable() {
+ command=$($CONNMAN technologies | grep -A 4 wifi | sed -n '4p')
+
+ if [[ $command == *True ]]; then
+ echo ">>> Wifi is already enabled ... Ok"
+ else
+ echo ">>> Enabling wifi ..."
+ command=$($CONNMAN enable wifi)
+ if [[ $command == Enabled* ]]; then
+ echo $command
+ else
+ echo ">>> Cannot enable wifi !"
+ exit 1
+ fi
+ fi
+}
+
+function wifi_disable() {
+ $CONNMAN disable wifi
+}
+
+function wifi_scan() {
+ echo -e "\n>>> Scanning for available wifi networks..."
+ $CONNMAN scan wifi
+}
+
+function wifi_connected() {
+ command=$($CONNMAN technologies | grep -A 4 wifi | sed -n '5p')
+
+ if [[ $command == *True ]];then
+ echo -e "\n>>> Already connected to a wifi network"
+ return 0
+ fi
+ return 1
+}
+
+function wifi_status() {
+ echo -e "\n>>> Wifi status:"
+ $CONNMAN technologies | grep -A 4 wifi
+ echo -e "\n>>> Available SSIDs:"
+ $CONNMAN services | grep wifi_
+}
+
+function wifi_config() {
+ echo -e "\n>>> Setting up wifi connection..."
+
+ retries=5
+
+ while [ 1 ]; do
+ $CONNMAN scan wifi
+ echo "\n>>> Available SSIDs:"
+ $CONNMAN services | grep wifi_
+
+ fullservice=$($CONNMAN services | cut -c 5- | sed 's/ \+ /:/g' | grep "$ssid:")
+ if [[ -n $fullservice ]]; then
+ break
+ fi
+
+ retries=$(( retries - 1 ))
+ if [[ $retries -gt 0 ]]; then
+ echo "waiting for $ssid to appear..."
+ sleep 5
+ continue
+ fi
+ echo "Target ssid not found !"
+ exit 1
+ done
+
+ ssid=$(echo "$fullservice" | awk -F: '{print $1}')
+ service=$(echo "$fullservice" | awk -F: '{print $2}')
+
+ echo "Target ssid found - config is :"
+ echo "SSID : $ssid"
+ echo "Service Id : $service"
+ echo "Passphrase : $passphrase"
+
+ cat <<EOF >"$configpath/$ssid.config"
+[service_$service]
+Name = $ssid
+Type = wifi
+Passphrase = $passphrase
+EOF
+
+ echo "Configuration written"
+}
+
+function wifi_connect() {
+ echo -e "\n>>> Performing connection ..."
+ output=$($CONNMAN connect $service)
+
+ if [[ $output == Connected* ]];then
+ echo "...Ok."
+ echo $output
+ else
+ echo "...connection failed !"
+ echo $output
+
+ wifi_disconnect
+ echo "Check your SSID or your passphrase"
+ exit 1
+ fi
+}
+
+function wifi_disconnect() {
+
+ if [[ -z "$ssid" ]]; then
+ $CONNMAN services | cut -c5- | sed 's/ \+ /:/g' | ( while read line; do
+ ssid=$(cut -f1 -d':' <<<$line)
+ serv=$(cut -f2 -d':' <<<$line)
+ if [[ "$serv" =~ ^wifi_ && -f "$configpath/$ssid.config" ]]; then
+ echo "Disconnecting $serv"
+ $CONNMAN disconnect $serv
+ echo "Cleaning config $ssid.config"
+ rm -rf "$configpath/$ssid.config"
+ fi
+ done )
+ return 0
+ fi
+
+ service=$($CONNMAN services | cut -c 5- | sed 's/ \+ /:/g' | grep "^$ssid:" | awk -F: '{print $2}')
+ if [[ -z "$service" ]]; then
+ echo "... unknown service"
+ rm -rf "$configpath/$ssid.config" # clear config in all cases
+ return 1
+ fi
+
+ output=$($CONNMAN disconnect $service)
+ rm -rf "$configpath/$ssid.config" # clear config in all cases
+ if [[ $output == Disconnected* ]];then
+ echo "...Ok."
+ echo $output
+ else
+ echo "...disconnection failed !"
+ echo $output
+ return 1
+ fi
+}
+
+case $1 in
+ connect)
+ ssid=$2
+ passphrase=$3
+ [ -z "$ssid" ] && error "No ssid defined !"
+ wifi_enable
+ wifi_connected && exit 0
+ wifi_config
+ wifi_connect
+ ;;
+ disconnect)
+ ssid=$2
+ wifi_disconnect
+ wifi_disable
+ ;;
+ scan)
+ wifi_enable
+ wifi_scan
+ wifi_status
+ ;;
+ status)
+ wifi_status
+ ;;
+ *)
+ error "Command line doesn't have any option !"
+esac
+
--- /dev/null
+#!/bin/bash
+
+# Offer a dialog interface for simple wifi connection
+# Exit with value 2 if SIGINT is sent.
+
+data_out="/tmp/wifi-config.$$"
+. /usr/sbin/dialog-helper
+
+ssid=""
+passphrase=""
+
+trap "exit 2" SIGINT
+
+while [ 1 ]; do
+ wifi scan > $data_out
+ ap=$(grep "wifi_" "$data_out" | sed "s/^\*A/\t/" | awk '{$(NF--)=""; print}' | sed "s/^\(.*\) $/\"\1\"/g")
+ rm -f $data_out 2> /dev/null
+
+ if [ -z "$ssid" ]; then
+ eval dialog_helper --no-items --menu "'choose your AP'" 20 40 20 $ap
+ ssid="$DIALOGRES"
+ fi
+
+ if [ -z "$passphrase" ]; then
+ dialog_helper --inputbox "Network's passphrase (leave empty if none)" 10 40
+ passphrase="$DIALOGRES"
+ fi
+
+ wifi connect "$ssid" "$passphrase" 2>1 | dialog --progressbox "Wifi connecting..." 40 100
+ if [ $? -eq 0 ]; then
+ dialog --msgbox "You are connected" 10 40
+ exit 0
+ else
+ ssid=""
+ passphrase=""
+ dialog --yesno "Connection failed. Do you want to retry ?" 10 40 && continue
+ exit 1
+ fi
+done
[Unit]
Description=Installer
+After=getty@tty2.service
[Service]
Type=oneshot
-ExecStart=/usr/sbin/system-installer -a
+ExecStart=/usr/sbin/system-installer
ExecStartPost=/usr/sbin/reboot
+StandardInput=tty
+TTYPath=/dev/tty2
+TTYReset=yes
+TTYVHangup=yes