From 686c09379fb72480a28a33dca367d185d9f0c98b Mon Sep 17 00:00:00 2001 From: Stefan Fiedler Date: Mon, 6 Nov 2006 11:24:31 +0000 Subject: [PATCH] Stefan Fiedler: sysfiles: move all stone related files to a separate package (part 2) NOT TESTED yet; rediffed (build stone in stage 1 this time) [2006101212244885800] (https://www.rocklinux.net/submaster) git-svn-id: http://www.rocklinux.org/svn/rock-linux/trunk@7979 c5f82cb5-29bc-0310-9cd0-bff59a50e3bc --- package/base/stone/stone.conf | 13 ++ package/base/stone/stone.desc | 42 ++++ package/base/stone/stone.sh | 71 +++++++ package/base/stone/stone_gui_dialog.sh | 187 +++++++++++++++++ package/base/stone/stone_gui_text.sh | 115 +++++++++++ package/base/stone/stone_gui_x11.sh | 56 ++++++ package/base/stone/stone_mod_gas.sh | 108 ++++++++++ package/base/stone/stone_mod_general.sh | 215 ++++++++++++++++++++ package/base/stone/stone_mod_install.sh | 245 +++++++++++++++++++++++ package/base/stone/stone_mod_network.sh | 116 +++++++++++ package/base/stone/stone_mod_packages.sh | 143 +++++++++++++ package/base/stone/stone_mod_runlevel.sh | 130 ++++++++++++ package/base/stone/stone_mod_setup.sh | 128 ++++++++++++ package/base/stone/stone_mod_user.sh | 181 +++++++++++++++++ 14 files changed, 1750 insertions(+) create mode 100644 package/base/stone/stone.conf create mode 100644 package/base/stone/stone.desc create mode 100644 package/base/stone/stone.sh create mode 100644 package/base/stone/stone_gui_dialog.sh create mode 100644 package/base/stone/stone_gui_text.sh create mode 100644 package/base/stone/stone_gui_x11.sh create mode 100644 package/base/stone/stone_mod_gas.sh create mode 100644 package/base/stone/stone_mod_general.sh create mode 100644 package/base/stone/stone_mod_install.sh create mode 100644 package/base/stone/stone_mod_network.sh create mode 100644 package/base/stone/stone_mod_packages.sh create mode 100644 package/base/stone/stone_mod_runlevel.sh create mode 100644 package/base/stone/stone_mod_setup.sh create mode 100644 package/base/stone/stone_mod_user.sh diff --git a/package/base/stone/stone.conf b/package/base/stone/stone.conf new file mode 100644 index 000000000..283a8615b --- /dev/null +++ b/package/base/stone/stone.conf @@ -0,0 +1,13 @@ +stone_custmain() { + echo "Installing the stone setup tool ..." + cp -v $confdir/stone.sh $root/usr/sbin/stone + chmod +x $root/usr/sbin/stone + for x in $( cd $confdir ; echo stone_*.sh ) ; do + cp -v $confdir/$x $root/etc/stone.d/${x#stone_} + done +} + +custmain="stone_custmain" + +srctar=none +autoextract=0 diff --git a/package/base/stone/stone.desc b/package/base/stone/stone.desc new file mode 100644 index 000000000..4ccdb70e0 --- /dev/null +++ b/package/base/stone/stone.desc @@ -0,0 +1,42 @@ + +[COPY] --- ROCK-COPYRIGHT-NOTE-BEGIN --- +[COPY] +[COPY] This copyright note is auto-generated by ./scripts/Create-CopyPatch. +[COPY] Please add additional copyright information _after_ the line containing +[COPY] the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by +[COPY] the ./scripts/Create-CopyPatch script. Do not edit this copyright text! +[COPY] +[COPY] ROCK Linux: rock-src/package/base/sysfiles/sysfiles.desc +[COPY] ROCK Linux is Copyright (C) 1998 - 2006 Clifford Wolf +[COPY] +[COPY] This program is free software; you can redistribute it and/or modify +[COPY] it under the terms of the GNU General Public License as published by +[COPY] the Free Software Foundation; either version 2 of the License, or +[COPY] (at your option) any later version. A copy of the GNU General Public +[COPY] License can be found at Documentation/COPYING. +[COPY] +[COPY] Many people helped and are helping developing ROCK Linux. Please +[COPY] have a look at http://www.rocklinux.org/ and the Documentation/TEAM +[COPY] file for details. +[COPY] +[COPY] --- ROCK-COPYRIGHT-NOTE-END --- + +[I] the ROCK Linux system configuration tool and installer + +[T] stone is a simple configuration tool for common system configuration +[T] tasks. It can be used via text-, dialog- or menu-based interfaces. +[T] It is also the ROCK Linux installer. + +[A] Clifford Wolf +[M] Clifford Wolf + +[C] base/system +[F] DIETLIBC +[F] CORE + +[L] GPL +[S] Stable +[V] 0000 +[P] X -1-------9 204.200 + +[CV-URL] none diff --git a/package/base/stone/stone.sh b/package/base/stone/stone.sh new file mode 100644 index 000000000..216d70909 --- /dev/null +++ b/package/base/stone/stone.sh @@ -0,0 +1,71 @@ +#!/bin/bash +# +# --- ROCK-COPYRIGHT-NOTE-BEGIN --- +# +# This copyright note is auto-generated by ./scripts/Create-CopyPatch. +# Please add additional copyright information _after_ the line containing +# the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by +# the ./scripts/Create-CopyPatch script. Do not edit this copyright text! +# +# ROCK Linux: rock-src/package/base/sysfiles/stone.sh +# ROCK Linux is Copyright (C) 1998 - 2006 Clifford Wolf +# +# This program 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 2 of the License, or +# (at your option) any later version. A copy of the GNU General Public +# License can be found at Documentation/COPYING. +# +# Many people helped and are helping developing ROCK Linux. Please +# have a look at http://www.rocklinux.org/ and the Documentation/TEAM +# file for details. +# +# --- ROCK-COPYRIGHT-NOTE-END --- + +recreate_initrd=0 +export SETUPD="${SETUPD:-/etc/stone.d}" +if type -p dialog > /dev/null ; then + export SETUPG="${SETUPG:-dialog}" +else + export SETUPG="${SETUPG:-text}" +fi +export STONE="`type -p $0`" + +if [ "$1" = "-text" ] ; then SETUPG="text" ; shift ; fi +if [ "$1" = "-dialog" ] ; then SETUPG="dialog" ; shift ; fi +if [ "$1" = "-x11" ] ; then SETUPG="x11" ; shift ; fi + +. ${SETUPD}/gui_${SETUPG}.sh + +if [ "$1" -a -f "${SETUPD}/mod_$1.sh" ] +then + . ${SETUPD}/mod_$1.sh ; shift + if [ -z "$*" ] ; then + main + else + eval "$*" + fi +elif [ "$#" = 0 -a -f ${SETUPD}/default.sh ] +then + . ${SETUPD}/default.sh +elif [ "$#" = 0 ] +then + while + command="gui_menu main 'Main Menu - Select the Subsystem you want to configure'" + while read a b c cmd name ; do + x="'" ; cmd="${cmd//,/ }" + command="$command '${name//$x/$x\\$x$x}'" + command="$command '$STONE ${cmd//$x/$x\\$x$x}'" + done < <( grep -h '^# \[MAIN\] [0-9][0-9] ' \ + $SETUPD/mod_*.sh | sort ) + eval "$command" + do : ; done +else + echo + echo "STONE - Setup Tool ONE - ROCK Linux System Configuration" + echo + echo "Usage: $0 [ -text | -dialog | -x11 ] [ module [ command ] ]" + echo +fi + +[ "${recreate_initrd}" == "1" ] && /sbin/mkinitrd diff --git a/package/base/stone/stone_gui_dialog.sh b/package/base/stone/stone_gui_dialog.sh new file mode 100644 index 000000000..aea35b365 --- /dev/null +++ b/package/base/stone/stone_gui_dialog.sh @@ -0,0 +1,187 @@ +# --- ROCK-COPYRIGHT-NOTE-BEGIN --- +# +# This copyright note is auto-generated by ./scripts/Create-CopyPatch. +# Please add additional copyright information _after_ the line containing +# the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by +# the ./scripts/Create-CopyPatch script. Do not edit this copyright text! +# +# ROCK Linux: rock-src/package/base/sysfiles/stone_gui_dialog.sh +# ROCK Linux is Copyright (C) 1998 - 2006 Clifford Wolf +# +# This program 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 2 of the License, or +# (at your option) any later version. A copy of the GNU General Public +# License can be found at Documentation/COPYING. +# +# Many people helped and are helping developing ROCK Linux. Please +# have a look at http://www.rocklinux.org/ and the Documentation/TEAM +# file for details. +# +# --- ROCK-COPYRIGHT-NOTE-END --- +# +# Filename: gui_dialog.sh +# Description: +# ============ +# This file provides the gui-functions implemented with +# the use of dialog, i.e. a curses based menu-frontend. + +gui_dialog_lines="$( stty size | cut -d' ' -f1 )" +gui_dialog_columns="$( stty size | cut -d' ' -f2 )" + +gui_dialog_s70=$(( gui_dialog_columns - 10 )) +gui_dialog_s62=$(( gui_dialog_columns - 18 )) +gui_dialog_s15=$(( gui_dialog_lines - 10 )) + +gui_dialog() { + dialog --stdout --title 'STONE - Setup Tool ONE - ROCK Linux System Configuration' "$@" +} + + +# [ the following variables act as staticly declared variables in functions (in +# C), i.e. they keep their content even after return of the certain function +# to be used again and again in this function. ] +# +# Important is to know that an element of `gui_menu_tree_name' corresponds +# to an element of `gui_menu_tree_value' by the same number, i.e. +# gui_menu_tree_value[0] contains the value of gui_menu_tree_name[0] +# +declare -a gui_menu_tree_name +declare -a gui_menu_tree_value +gui_menu_tree_id=-1 + +# Use: gui_menu "ID" "Title" "Text" "Action" [ "Text" "Action" [ .. ] ] +# +gui_menu() { + # `cmd_ar' acts as a kind of mapper between the choosen category + # and the function's/command's name that is responsible for what + # next is to do. This command/function is finally executed. + local -a cmd_ar + + # Although dialog does folding itself, we're forced + # to do it directly, because we need the number of + # lines to compute the size of a widget. + local id="$1" title="$( echo "$2" | fmt -$gui_dialog_s62 )" + local y_text=$( echo "$title" | wc -l ) y_menu=$(( ($#-2) / 2 )) + local nr=1 x="'" y choosen='' ; shift 2 + + [ $(( $y_text + $y_menu )) -gt $gui_dialog_s15 ] && \ + y_menu=$(( gui_dialog_s15 - y_text )) + + if [ $id = main ] ; then local cmd="gui_dialog --cancel-label Exit" + elif [ "$gui_nocancel" = 1 ] ; then cmd="gui_dialog --no-cancel" + else local cmd="gui_dialog --cancel-label Back" ; fi + + # In case of having been in the current menu before (found out by + # checking the current ID for the ones saved in `gui_menu_tree_name[]'), + # make the old item be cursored again. + local default='' count + for (( count=$gui_menu_tree_id; $count >= 0; count-- )) + do + if [ "${gui_menu_tree_name[$count]}" = $id ] ; then + default="${gui_menu_tree_value[$count]}" + gui_menu_tree_id=$(( $count - 1 )) + break + fi + done + + cmd="$cmd --default-item \${default:-1}" + cmd="$cmd --menu '${title//$x/$x\\$x$x}'" + cmd="$cmd $(( $y_text + $y_menu + 6 )) $gui_dialog_s70 $y_menu" + + while [ $# -gt 0 ] ; do + y="${2#\*}" + if [ -z "$default" -a "$y" != "$2" ] ; then + default="$nr" + fi + if [ -z "$y" ] ; then + if [ -z "$1" ] ; then + # this line should become a blank one + cmd="$cmd ' ' ' '" + else + # the purpose of this line is only to + # display additional information about + # the item before + cmd="$cmd '-' '${1//$x/$x\\$x$x}'" + fi + else + cmd="$cmd $nr '${1//$x/$x\\$x$x}'" + cmd_ar[$nr]="$y" + ((nr++)) + fi + + shift ; shift + done + + # `choosen' gets the choosen item that represents in fact + # the dereferencer for `cmd_ar'. + choosen="$(eval "$cmd")" + + if [ $? -eq 0 ]; then + # if enter is pressed on an ``additional information line'', + # do nothing. + [ "$choosen" = "-" ] && return 0 + + gui_menu_tree_id=$(( $gui_menu_tree_id + 1 )) + gui_menu_tree_name[$gui_menu_tree_id]=$id + gui_menu_tree_value[$gui_menu_tree_id]=$choosen + + eval "${cmd_ar[$choosen]}" + return 0 + else + return 1 + fi +} + +# Use: gui_input "Text" "Default" "VarName" +# +gui_input() { + local headlines="$( echo "$1" | fmt -$gui_dialog_s62 )" \ + height=$(( $(echo "$headlines" | wc -l) + 7 )) tmp cmd + + if [ "$gui_nocancel" = 1 ] ; then cmd="gui_dialog --no-cancel" + else local cmd="gui_dialog --cancel-label Back" ; fi + + if tmp="$($cmd --inputbox "$headlines" $height $gui_dialog_s70 "$2")"; then + eval "$3='$tmp'" + fi +} + +# Use: gui_message "Text" +# +gui_message() { + local headlines="$( echo "$1" | fold -w $gui_dialog_s62 )" + gui_dialog --msgbox "$headlines" \ + $(( $( echo "$headlines" | wc -l ) + 5 )) $gui_dialog_s70 +} + +# Use: gui_yesno "Text" +# +gui_yesno() { + local headlines="$( echo "$1" | fmt -$gui_dialog_s62 )" + gui_dialog --yesno "$headlines" \ + $(( $( echo "$headlines" | wc -l ) + 4 )) $gui_dialog_s70 +} + + +# Use: gui_edit "Text" "File" +# +gui_edit() { + # find editor + for x in $EDITOR vi nvi emacs xemacs pico ; do + if type -p $x > /dev/null + then xx=$x ; break ; fi + done + if [ "$xx" ] ; then + eval "$xx $2" + else + gui_message "Cannot find any editor. Make sure \$EDITOR is set." + fi +} + +# Use: gui_cmd "Title" "Command" +# (Title isn't used in this GUI type) +gui_cmd() { + shift ; eval "$@" + read -p "Press ENTER to continue." +} diff --git a/package/base/stone/stone_gui_text.sh b/package/base/stone/stone_gui_text.sh new file mode 100644 index 000000000..48c08e77c --- /dev/null +++ b/package/base/stone/stone_gui_text.sh @@ -0,0 +1,115 @@ +# --- ROCK-COPYRIGHT-NOTE-BEGIN --- +# +# This copyright note is auto-generated by ./scripts/Create-CopyPatch. +# Please add additional copyright information _after_ the line containing +# the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by +# the ./scripts/Create-CopyPatch script. Do not edit this copyright text! +# +# ROCK Linux: rock-src/package/base/sysfiles/stone_gui_text.sh +# ROCK Linux is Copyright (C) 1998 - 2006 Clifford Wolf +# +# This program 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 2 of the License, or +# (at your option) any later version. A copy of the GNU General Public +# License can be found at Documentation/COPYING. +# +# Many people helped and are helping developing ROCK Linux. Please +# have a look at http://www.rocklinux.org/ and the Documentation/TEAM +# file for details. +# +# --- ROCK-COPYRIGHT-NOTE-END --- + +# Use: gui_menu "ID" "Title" "Text" "Action" [ "Text" "Action" [ .. ] ] +# +gui_menu() { + echo ; echo "+---" ; echo "$2" | fold -s -w70 | sed 's,^,| ,' + echo "+---" ; echo ; shift ; shift ; local nr=1 xnr=1 y in + + while [ $# -ge 2 ] ; do + y="${2#\*}" + if [ -z "$y" ] ; then + if [ -z "$1" ] ; then + echo " $1" ; shift ; shift + else + echo " - $1" ; shift ; shift + fi + else + printf '%5d. %s\n' "$nr" "$1" + eval "local action_$nr=\"\$y\"" + nr=$(( $nr + 1 )) ; shift ; shift + fi + xnr=$(( $xnr + 1 )) + if [ $(( $xnr % 20 )) -eq 0 -a $# -gt 4 ] ; then + echo ; echo -n ">> " ; read in || return 1 + [ "$in" ] && break + echo + fi + done + + if [ -z "$in" ] ; then echo ; echo -n "> " ; read in ; fi + in="action_$in" ; [ -z "${!in}" ] && return 1 + eval "${!in}" ; return 0 +} + +# Use: gui_input "Text" "Default" "VarName" +# +gui_input() { + echo ; echo "+---" ; echo "$1" | fold -s -w66 | sed 's,^,| ,' + echo "+---" ; echo ; echo -n "[ $2 ] > " ; local tmp + read tmp && [ -z "$tmp" ] && tmp="$2" ; eval "$3=\"\$tmp\"" +} + +# Use: gui_yesno "Text" +# +# [returns 0 if yes, 1 if no] +gui_yesno() { + local input y="[y]" n=" n " + + echo ; echo "+---"; echo "$1" | fold -s -w66 | sed 's,^,| ,' + echo "+---" ; echo + + while :; do + echo -en "\r? $y\t$n" + read -sr -n 1 input + + if [ "$input" = "" ]; then break + elif [ "$input" = "y" ]; then y="[y]"; n=" n " + elif [ "$input" = "n" ]; then y=" y "; n="[n]" + fi + done + + [ "$input" = "[y]" ] && return 0 + return 1 +} + +# Use: gui_message "Text" +# +gui_message() { + echo ; echo "+---" ; echo "$1" | fold -s -w66 | sed 's,^,| ,' + echo "+---" ; echo ; echo "== Press ENTER to continue ==" ; read +} + +# Use: gui_edit "Text" "File" +# +gui_edit() { + # find editor + for x in $EDITOR vi nvi emacs xemacs pico ; do + if type -p $x > /dev/null + then xx=$x ; break ; fi + done + if [ "$xx" ] ; then + eval "$xx $2" + else + gui_message "Cannot find any editor. Make sure \$EDITOR is set." + fi +} + +# Use: gui_cmd "Title" "Command" +# +gui_cmd() { + shift ; eval "$@" + read -p "Press ENTER to continue." +} + + diff --git a/package/base/stone/stone_gui_x11.sh b/package/base/stone/stone_gui_x11.sh new file mode 100644 index 000000000..ae23e4223 --- /dev/null +++ b/package/base/stone/stone_gui_x11.sh @@ -0,0 +1,56 @@ +# --- ROCK-COPYRIGHT-NOTE-BEGIN --- +# +# This copyright note is auto-generated by ./scripts/Create-CopyPatch. +# Please add additional copyright information _after_ the line containing +# the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by +# the ./scripts/Create-CopyPatch script. Do not edit this copyright text! +# +# ROCK Linux: rock-src/package/base/sysfiles/stone_gui_x11.sh +# ROCK Linux is Copyright (C) 1998 - 2006 Clifford Wolf +# +# This program 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 2 of the License, or +# (at your option) any later version. A copy of the GNU General Public +# License can be found at Documentation/COPYING. +# +# Many people helped and are helping developing ROCK Linux. Please +# have a look at http://www.rocklinux.org/ and the Documentation/TEAM +# file for details. +# +# --- ROCK-COPYRIGHT-NOTE-END --- + +if ! Xdialog --infobox 'Test' 0 0 1 ; then + echo + echo "Fatal ERROR: Can't display Xdialog windows!" + echo + echo "Maybe the \$DISPLAY variable is not set or you don't have" + echo "permissions to connect to the X-Server." + exit 1 +fi + +. ${SETUPD}/gui_dialog.sh + +gui_dialog() { + Xdialog --stdout --title 'STONE - Setup Tool ONE - ROCK Linux System Configuration' "$@" +} + +gui_edit() { + # find editor + for x in $EDITOR vi nvi emacs xemacs pico ; do + if which $x > /dev/null + then xx=$x ; break ; fi + done + if [ "$xx" ] ; then + xterm -T "STONE - $1" -n "STONE" -e bash -c "$xx $2" + else + gui_message "Cannot find any editor. Make sure \$EDITOR is set." + fi +} + +gui_cmd() { + title="$1" ; shift + xterm -T "STONE - $title" -n "STONE" -e bash -c "$@ + read -p 'Press ENTER to continue'" +} + diff --git a/package/base/stone/stone_mod_gas.sh b/package/base/stone/stone_mod_gas.sh new file mode 100644 index 000000000..25e0904ed --- /dev/null +++ b/package/base/stone/stone_mod_gas.sh @@ -0,0 +1,108 @@ +# --- ROCK-COPYRIGHT-NOTE-BEGIN --- +# +# This copyright note is auto-generated by ./scripts/Create-CopyPatch. +# Please add additional copyright information _after_ the line containing +# the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by +# the ./scripts/Create-CopyPatch script. Do not edit this copyright text! +# +# ROCK Linux: rock-src/package/base/sysfiles/stone_mod_gas.sh +# ROCK Linux is Copyright (C) 1998 - 2006 Clifford Wolf +# +# This program 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 2 of the License, or +# (at your option) any later version. A copy of the GNU General Public +# License can be found at Documentation/COPYING. +# +# Many people helped and are helping developing ROCK Linux. Please +# have a look at http://www.rocklinux.org/ and the Documentation/TEAM +# file for details. +# +# --- ROCK-COPYRIGHT-NOTE-END --- + +select_packages() { + local namever installed uninstalled + + for (( ; ; )) ; do + cmd="gui_menu gastone 'Install/Remove packages: $5 + +Note: any (un)installations are done immediately'" + + installed="" + uninstalled="" + for (( i=${#pkgs[@]} - 1; i >= 0; i-- )) ; do + if echo "${cats[$i]}" | grep -q -F "$5" ; then + namever="${pkgs[$i]}-${vers[$i]}" + if [ -f $2/var/adm/packages/${pkgs[$i]} ] ; then + cmd="$cmd '[*] $namever' '$packager -r -R $2 ${pkgs[$i]}'" + installed="$installed ${pkgs[$i]}" + elif [ -f "$4/$1/pkgs/$namever$ext" ] ; then + cmd="$cmd '[ ] $namever' '$packager -i -R $2 $4/$1/pkgs/$namever$ext'" + uninstalled="$uninstalled $namever$ext" + elif [ -f "$4/$1/pkgs/${pkgs[$i]}$ext" ] ; then + cmd="$cmd '[ ] $namever' '$packaher -i -R $2 $4/$1/pkgs/${pkgs[$i]}$ext'" + uninstalled="$uninstalled ${pkgs[$i]}$ext" + fi + fi + done + [ "$uninstalled$installed" ] && cmd="$cmd '' ''" + [ "$uninstalled" ] && \ + cmd="$cmd 'Install all packages marked as [ ]' '(cd $4/$1/pkgs ; $packager -i -R $2 $uninstalled)'" + [ "$installed" ] && \ + cmd="$cmd 'Uninstall all packages marked as [*]' '$packager -r -R $2 $installed'" + + eval "$cmd" || break + done +} + +main() { + if ! [ -f $4/$1/pkgs/packages.db ] ; then + gui_message "gas: package database not accessible." + return + fi + + if ! [ -d $2 ] ; then + gui_message "gas: target directory not accessible." + return + fi + + if [ $2 = "${2#/}" ] ; then + gui_message "gas: target directory not absolute." + return + fi + + local packager ext + + if type -p bize > /dev/null && ! type -p mine > /dev/null ; then + packager=bize + ext=.tar.bz2 + else + packager=mine + ext=.gem + fi + + declare -a pkgs vers cats + local a b category + unset package + + while read a b ; do + if [ "$a" = "[C]" ] ; then cats[${#pkgs[@]}]="${cats[${#pkgs[@]}]} $b" + elif [ "$a" = "[V]" ] ; then vers[${#pkgs[@]}]="$b" + elif [ -z "$b" ] ; then + pkgs[${#pkgs[@]}]="$package" + vers[${#pkgs[@]}]="0.0" + cats[${#pkgs[@]}]="all/all" + package="$a" + else + gui_message "gas: invalid package database input '$a $b'." + return + fi + done < <( gzip -d < $4/$1/pkgs/packages.db | grep "^[a-zA-Z0-9_+.-]\+$\|^\[[CV]\]") + [ "$package" ] && pkgs[${#pkgs[@]}]="$package" + + category="gui_menu category 'Select category'" + for i in `echo ${cats[@]} | sed -e 's/ /\n/g' | sort -u` ; do + category="$category $i 'select_packages $1 $2 $3 $4 $i'" + done + while eval "$category" ; do : ; done +} diff --git a/package/base/stone/stone_mod_general.sh b/package/base/stone/stone_mod_general.sh new file mode 100644 index 000000000..aa95761c7 --- /dev/null +++ b/package/base/stone/stone_mod_general.sh @@ -0,0 +1,215 @@ +# --- ROCK-COPYRIGHT-NOTE-BEGIN --- +# +# This copyright note is auto-generated by ./scripts/Create-CopyPatch. +# Please add additional copyright information _after_ the line containing +# the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by +# the ./scripts/Create-CopyPatch script. Do not edit this copyright text! +# +# ROCK Linux: rock-src/package/base/sysfiles/stone_mod_general.sh +# ROCK Linux is Copyright (C) 1998 - 2006 Clifford Wolf +# +# This program 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 2 of the License, or +# (at your option) any later version. A copy of the GNU General Public +# License can be found at Documentation/COPYING. +# +# Many people helped and are helping developing ROCK Linux. Please +# have a look at http://www.rocklinux.org/ and the Documentation/TEAM +# file for details. +# +# --- ROCK-COPYRIGHT-NOTE-END --- +# +# [MAIN] 10 general,main Various general system configurations + +set_keymap() { + keymap=$(ls -l /etc/default.keymap 2> /dev/null | sed 's,.*/,,') + [ -z "$keymap" ] && keymap="none" ; keymap="${keymap%.map.gz}" + + case "`uname -m`" in + i*86|x86_64) + mapdir="/usr/share/kbd/keymaps/i386" + ;; + ppc) + mapdir="/usr/share/kbd/keymaps/mac" # ppc is a symlink + ;; + sparc*) + mapdir="/usr/share/kbd/keymaps/sun" + ;; + *) + gui_message "Can't auto-detect your architecture and so I can't find the right /usr/share/kbd/keymaps sub-directory for your system. Sorry." + return + ;; + esac + + cmd="gui_menu 'general_keymap' 'Select one of the" + cmd="$cmd following keyboard mappings. (Current: $keymap)'" + cmd="$cmd 'none (kernel defaults)' 'rm -f /etc/default.keymap ; loadkeys defkeymap'" + + cmd="$cmd $( find $mapdir -type f ! -path '*/include/*' -name '*.map.gz' -printf '%P\n' | sed 's,\(.*\)/\(.*\).map.gz$,"\2 (\1)" "ln -sf '$mapdir'/& /etc/default.keymap ; loadkeys \1/\2.map.gz",' | expand -t30 | sort | tr '\n' ' ')" + + eval "$cmd" +} + +set_vcfont() { + vcfont=$(ls -l /etc/default.vcfont 2> /dev/null | sed 's,.*/,,') + if [ -z "$vcfont" ] ; then vcfont="none" + else vcfont="`echo $vcfont | sed -e "s,\.\(fnt\|psf.*\)\.gz$,,"`" ; fi + fontdir="/usr/share/kbd/consolefonts" + + cmd="gui_menu 'general_vcfont' 'Select one of the" + cmd="$cmd following console fonts. (Current: $vcfont)'" + cmd="$cmd 'none (kernel defaults)' 'rm -f /etc/default.vcfont ; setfont'" + + cmd="$cmd $( find $fontdir -type f \( -name '*.fnt.gz' -or -name '*.psf*.gz' \) -printf '%P\n' | sed 's,\(.*\).\(fnt\|psf.*\)\.gz$,"\1" "ln -sf '$fontdir'/& /etc/default.vcfont ; setfont \1",' | expand -t30 | sort | tr '\n' ' ')" + + eval "$cmd" +} + +store_kbd(){ + if [ -f /etc/conf/kbd ] ; then + sed -e "s/kbd_rate=.*/kbd_rate=$kbd_rate/" \ + -e "s/kbd_delay=.*/kbd_delay=$kbd_delay/" < /etc/conf/kbd \ + > /etc/conf/kbd.tmp + grep -q kbd_rate= /etc/conf/kbd.tmp || echo kbd_rate=$kbd_rate \ + >> /etc/conf/kbd.tmp + grep -q kbd_delay= /etc/conf/kbd.tmp || echo kbd_delay=$kbd_delay \ + >> /etc/conf/kbd.tmp + mv /etc/conf/kbd.tmp /etc/conf/kbd + else + echo -e "kbd_rate=$kbd_rate\nkbd_delay=$kbd_delay\n" \ + > /etc/conf/kbd + fi + [ "$kbd_rate" -a "$kbd_delay" ] && kbdrate -r $kbd_rate -d $kbd_delay +} + +set_kbd_rate() { + gui_input "Set new console keyboard auto-repeat rate" \ + "$kbd_rate" "kbd_rate" + store_kbd +} + +set_kbd_delay() { + gui_input "Set new console keyboard auto-repeat delay" \ + "$kbd_delay" "kbd_delay" + store_kbd +} + +store_con(){ + if [ -f /etc/conf/console ] ; then + sed -e "s/con_term=.*/con_term=$con_term/" \ + -e "s/con_blank=.*/con_blank=$con_blank/" \ + < /etc/conf/console > /etc/conf/console.tmp + grep -q con_term= /etc/conf/console.tmp || \ + echo con_term=$con_term >> /etc/conf/console.tmp + grep -q con_blank= /etc/conf/console.tmp || \ + echo con_blank=$con_blank >> /etc/conf/console.tmp + mv /etc/conf/console.tmp /etc/conf/console + else + echo -e "con_term=$con_term\ncon_blank=$con_blank\n" \ + > /etc/conf/console + fi + [ "$con_term" -a "$con_blank" ] && \ + setterm -term $con_term -blank $con_blank > /dev/console +} + +set_con_term() { + gui_input "Set new console screen terminal type" \ + "$con_term" "con_term" + store_con +} + +set_con_blank() { + gui_input "Set new console screen blank interval" \ + "$con_blank" "con_blank" + store_con +} + +set_tmzone() { + tz="$( ls -l /etc/localtime | cut -f8 -d/ )" + cmd="gui_menu 'general_tmzone' 'Select one of the" + cmd="$cmd following time zones. (Current: $tz)'" + + cmd="$cmd $( grep "$1/" /usr/share/zoneinfo/zone.tab | cut -f3 | \ + cut -f2 -d/ | sort -u | tr '\n' ' ' | sed 's,[^ ]\+,& '` + `'"ln -sf ../usr/share/zoneinfo/$1/& /etc/localtime",g' )" + + eval "$cmd" +} + +set_tmarea() { + tz="$( ls -l /etc/localtime | cut -f7 -d/ )" + cmd="gui_menu 'general_tmarea' 'Select one of the" + cmd="$cmd following time areas. (Current: $tz)'" + + cmd="$cmd $( grep '^[^#]' /usr/share/zoneinfo/zone.tab | cut -f3 | \ + cut -f1 -d/ | sort -u | tr '\n' ' ' | sed 's,[^ ]\+,& '` + `'"if set_tmzone & ; then tzset=1 ; fi",g' )" + + tzset=0 + while eval "$cmd" && [ $tzset = 0 ] ; do : ; done +} + +set_dtime() { + dtime="`date '+%m-%d %H:%M %Y'`" ; newdtime="$dtime" + [ -f /etc/conf/clock ] && . /etc/conf/clock + [ "$clock_tz" != localtime ] && clock_tz=utc + gui_input "Set new date and time (MM-DD hh:mm YYYY, $clock_tz)" \ + "$dtime" "newdtime" + if [ "$dtime" != "$newdtime" ] ; then + echo "Setting new date and time ($newdtime) ..." + date "$( echo $newdtime | sed 's,[^0-9],,g' )" + hwclock --systohc --$clock_tz + fi +} + +set_locale_sub() { + rm -f /etc/profile.d/locale + [ "$1" != "none" ] && echo "export LANG='$1'" > /etc/profile.d/locale +} + +set_locale() { + unset LANG ; [ -f /etc/profile.d/locale ] && . /etc/profile.d/locale + locale="${LANG:-none}" ; cmd="gui_menu 'general_locale' 'Select one of the following locales. (Current: $locale)' 'none' 'set_locale_sub none'" + + x="$( echo -e "POSIX\tC" | expand -t52 )" + cmd="$cmd '$x' 'set_locale_sub C' $( + grep -H ^title /usr/share/i18n/locales/* 2> /dev/null | \ + awk -F '"' '{ sub(".*/", "", $1); sub("[\\.:].*", "", $1); '" + printf \" '%-52s%s' 'set_locale_sub %s'\", \$2, \$1, \$1; }" + )" + + eval "$cmd" +} + +main() { + while + unset LANG ; [ -f /etc/profile.d/locale ] && . /etc/profile.d/locale + locale="${LANG:-none}" ; tz="$( ls -l /etc/localtime | cut -f7- -d/ )" + keymap=$(ls -l /etc/default.keymap 2> /dev/null | sed 's,.*/,,') + [ "$keymap" ] || keymap="none" ; keymap="${keymap%.map.gz}" + vcfont=$(ls -l /etc/default.vcfont 2> /dev/null | sed 's,.*/,,') + if [ -z "$vcfont" ] ; then vcfont="none" + else vcfont="`echo $vcfont | sed -e "s,\.\(fnt\|psf.*\)\.gz$,,"`" ; fi + dtime="`date '+%m-%d %H:%M %Y'`" + [ -f /etc/conf/kbd ] && . /etc/conf/kbd + [ "$kbd_rate" ] || kbd_rate=30 + [ "$kbd_delay" ] || kbd_delay=250 + [ -f /etc/conf/console ] && . /etc/conf/console + [ "$con_term" ] || con_term=linux + [ "$con_blank" ] || con_blank=0 + + gui_menu general 'Various general system configurations' \ + "Set console keyboard mapping ....... $keymap" "set_keymap" \ + "Set console screen font ............ $vcfont" "set_vcfont" \ + "Set system-wide time zone .......... $tz" "set_tmarea" \ + "Set date and time (utc/localtime) .. $dtime" "set_dtime" \ + "Set system-wide locale (language) .. $locale" "set_locale" \ + "Set console keyboard repeat rate ... $kbd_rate" "set_kbd_rate" \ + "Set console keyboard repeat delay .. $kbd_delay" "set_kbd_delay" \ + "Set console screen terminal type ... $con_term" "set_con_term" \ + "Set console screen blank interval .. $con_blank" "set_con_blank" \ + "Run the (daily) 'cron.run' script now" "cron.run" + do : ; done +} + diff --git a/package/base/stone/stone_mod_install.sh b/package/base/stone/stone_mod_install.sh new file mode 100644 index 000000000..4ea836d4b --- /dev/null +++ b/package/base/stone/stone_mod_install.sh @@ -0,0 +1,245 @@ +# --- ROCK-COPYRIGHT-NOTE-BEGIN --- +# +# This copyright note is auto-generated by ./scripts/Create-CopyPatch. +# Please add additional copyright information _after_ the line containing +# the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by +# the ./scripts/Create-CopyPatch script. Do not edit this copyright text! +# +# ROCK Linux: rock-src/package/base/sysfiles/stone_mod_install.sh +# ROCK Linux is Copyright (C) 1998 - 2006 Clifford Wolf +# +# This program 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 2 of the License, or +# (at your option) any later version. A copy of the GNU General Public +# License can be found at Documentation/COPYING. +# +# Many people helped and are helping developing ROCK Linux. Please +# have a look at http://www.rocklinux.org/ and the Documentation/TEAM +# file for details. +# +# --- ROCK-COPYRIGHT-NOTE-END --- + +part_mounted_action() { + if gui_yesno "Do you want to un-mount the filesystem on $1/$2?" + then umount /dev/$1/$2; fi +} + +part_swap_action() { + if gui_yesno "Do you want to de-activate the swap space on $1/$2?" + then swapoff /dev/$1/$2; fi +} + +part_mount() { + local dir + gui_input "Mount device $1/$2 on directory +(for example /, /home, /var, ...)" '/' dir + if [ "$dir" ] ; then + dir="$( echo $dir | sed 's,^/*,,; s,/*$,,' )" + if [ -z "$dir" ] || grep -q " /mnt/target " /proc/mounts + then + mkdir -p /mnt/target/$dir + mount /dev/$1/$2 /mnt/target/$dir + else + gui_message "Please mount a root filesystem first." + fi + fi +} + +part_mkfs() { + cmd="gui_menu part_mkfs 'Create filesystem on $1/$2'" + + cmd="$cmd 'ext3fs (journaling filesystem)'" + cmd="$cmd 'mke2fs -j /dev/$1/$2'" + + cmd="$cmd 'ext2fs (non-journaling fs)'" + cmd="$cmd 'mke2fs /dev/$1/$2'" + + cmd="$cmd 'reiserfs (journaling filesystem)'" + cmd="$cmd 'mkreiserfs /dev/$1/$2'" + + if type -p jfs_mkfs > /dev/null ; then + cmd="$cmd 'IBM JFS (journaling filesystem)'" + cmd="$cmd 'jfs_mkfs /dev/$1/$2'" + fi + + if type -p mkfs.xfs > /dev/null ; then + cmd="$cmd 'SGI XFS (journaling filesystem)'" + cmd="$cmd 'mkfs.xfs -f /dev/$1/$2'" + fi + + eval "$cmd" && part_mount $1 $2 +} + +part_unmounted_action() { + gui_menu part "$1/$2" \ + "Create a filesystem on the partition" \ + "part_mkfs $1 $2" \ + "Mount an existing filesystem from the partition" \ + "part_mount $1 $2" \ + "Create a swap space on the partition" \ + "mkswap /dev/$1/$2; swapon /dev/$1/$2" \ + "Activate an existing swap space on the partition" \ + "swapon /dev/$1/$2" +} + +part_add() { + local action="unmounted" location="currently not mounted" + if grep -q "^/dev/$1/$2 " /proc/swaps; then + action=swap ; location="swap " + elif grep -q "^/dev/$1/$2 " /proc/mounts; then + action=mounted + location="`grep "^/dev/$1/$2 " /proc/mounts | cut -d ' ' -f 2 | \ + sed "s,^/mnt/target,," `" + [ "$location" ] || location="/" + fi + + # save partition information + disktype /dev/$1/$2 > /tmp/stone-install + type="`grep /tmp/stone-install -v -e '^ ' -e '^Block device' \ + -e '^Partition' -e '^---' | \ + sed -e 's/[,(].*//' -e '/^$/d' -e 's/ $//' | tail -n 1`" + size="`grep 'Block device, size' /tmp/stone-install | \ + sed 's/.* size \(.*\) (.*/\1/'`" + + [ "$type" ] || type="undetected" + cmd="$cmd '`printf "%-6s %-24s %-10s" $2 "$location" "$size"` $type' 'part_${action}_action $1 $2'" +} + +disk_action() { + if grep -q "^/dev/$1/" /proc/swaps /proc/mounts; then + gui_message "Partitions from $1 are currently in use, so you +can't modify this disks partition table." + return + fi + + cmd="gui_menu disk 'Edit partition table of $1'" + for x in cfdisk fdisk pdisk mac-fdisk ; do + fn="" + [ -f /bin/$x ] && fn="/bin/$x" + [ -f /sbin/$x ] && fn="/sbin/$x" + [ -f /usr/bin/$x ] && fn="/usr/bin/$x" + [ -f /usr/sbin/$x ] && fn="/usr/sbin/$x" + [ "$fn" ] && \ + cmd="$cmd \"Edit partition table using '$x'\" \"$x /dev/$1/disc\"" + done + + eval $cmd +} + +vg_action() { + cmd="gui_menu vg 'Volume Group $1'" + + + if [ -e /proc/lvm/VGs/$1 ]; then + cmd="$cmd 'Display attributes of $1' 'gui_cmd \"display $1\" vgdisplay $1'" + + if grep -q "^/dev/$1/" /proc/swaps /proc/mounts; then + cmd="$cmd \"LVs of $1 are currently in use, so you can't +de-activate it.\" ''" + else + cmd="$cmd \"De-activate VG '$1'\" 'vgchange -an $1'" + fi + else + cmd="$cmd 'Display attributes of $1' 'gui_cmd \"display $1\" vgdisplay -D $1'" + + cmd="$cmd \"Activate VG '$1'\" 'vgchange -ay $1'" + fi + + eval $cmd +} + +disk_add() { + local x y=0 + cmd="$cmd 'Edit partition table of $1' 'disk_action $1'" + for x in $( cd /dev/$1 ; ls part* 2> /dev/null ) + do + part_add $1 $x ; y=1 + done + if [ $y = 0 ]; then + cmd="$cmd 'This disks partition table is empty.' ''" + fi + cmd="$cmd '' ''" +} + +vg_add() { + local x y=0 + cmd="$cmd 'Logical volumes of $1:' 'vg_action $1'" + if [ -e /proc/lvm/VGs/$1 ] ; then + for x in $( cd /proc/lvm/VGs/$1/LVs; ls -1 ) + do + part_add $1 $x ; y=1 + done + if [ $y = 0 ]; then + cmd="$cmd 'No logical volumes.' ''" + fi + else + cmd="$cmd 'Volume Group is not active.' ''" + fi + cmd="$cmd '' ''" +} + +main() { + local cmd install_now=0 + while + cmd="gui_menu install 'Partitioning your discs + +This dialog allows you to modify your discs partition layout and to create filesystems and swap space - as well as mounting / activating it. Everything you can do using this tool can also be done manually on the command line.'" + + # protect for the case no discs are present ... + if [ -e /dev/discs ] ; then + for x in $( cd /dev/discs + ls -l */disc | grep ' -> ' | cut -f4- -d/ ; ) + do + disk_add ${x%/disc} + done + for x in $( cat /etc/lvmtab 2> /dev/null ) + do + vg_add "$x" + done + else + cmd="$cmd 'No hard-disc found!' ''" + fi + + cmd="$cmd 'Install the system ...' 'install_now=1'" + + eval "$cmd" && [ "$install_now" -eq 0 ] + do : ; done + + if [ "$install_now" -ne 0 ] ; then + $STONE packages + cat > /mnt/target/tmp/stone_postinst.sh << EOT +#!/bin/sh +mount -v -t proc proc /proc +mount -v -t sysfs sysfs /sys +. /etc/profile +stone setup +umount -v /sys +umount -v /proc +EOT + chmod +x /mnt/target/tmp/stone_postinst.sh + grep ' /mnt/target[/ ]' /proc/mounts | \ + sed 's,/mnt/target/\?,/,' > /mnt/target/etc/mtab + mount --bind /dev /mnt/target/dev + cd /mnt/target ; chroot . ./tmp/stone_postinst.sh + rm -fv ./tmp/stone_postinst.sh + if gui_yesno "Do you want to un-mount the filesystems and reboot now?" + then + cd / + sync + umount -adrv + shutdown -r now + else + echo + echo "You might want to umount all filesystems now and reboot" + echo "the system now using the commands:" + echo + echo " umount -adrv" + echo " reboot -f" + echo + echo "Or by executing 'shutdown -r now' which will run the above commands." + echo + fi + fi +} + diff --git a/package/base/stone/stone_mod_network.sh b/package/base/stone/stone_mod_network.sh new file mode 100644 index 000000000..b5470dad1 --- /dev/null +++ b/package/base/stone/stone_mod_network.sh @@ -0,0 +1,116 @@ +# --- ROCK-COPYRIGHT-NOTE-BEGIN --- +# +# This copyright note is auto-generated by ./scripts/Create-CopyPatch. +# Please add additional copyright information _after_ the line containing +# the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by +# the ./scripts/Create-CopyPatch script. Do not edit this copyright text! +# +# ROCK Linux: rock-src/package/base/sysfiles/stone_mod_network.sh +# ROCK Linux is Copyright (C) 1998 - 2006 Clifford Wolf +# +# This program 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 2 of the License, or +# (at your option) any later version. A copy of the GNU General Public +# License can be found at Documentation/COPYING. +# +# Many people helped and are helping developing ROCK Linux. Please +# have a look at http://www.rocklinux.org/ and the Documentation/TEAM +# file for details. +# +# --- ROCK-COPYRIGHT-NOTE-END --- +# +# [MAIN] 20 network Network Configuration + +set_name() { + old1="$HOSTNAME" old2="$HOSTNAME.$DOMAINNAME" old3="$DOMAINNAME" + if [ $1 = HOSTNAME ] ; then + gui_input "Set a new hostname (without domain part)" \ + "${!1}" "$1" + else + gui_input "Set a new domainname (without host part)" \ + "${!1}" "$1" + fi + new="$HOSTNAME.$DOMAINNAME $HOSTNAME" + + echo "$HOSTNAME" > /etc/HOSTNAME ; hostname "$HOSTNAME" + + #ip="`echo $IPADDR | sed 's,[/ ].*,,'`" + #if grep -q "^$ip\\b" /etc/hosts ; then + # tmp="`mktemp`" + # sed -e "/^$ip\\b/ s,\\b$old2\\b[ ]*,,g" \ + # -e "/^$ip\\b/ s,\\b$old1\\b[ ]*,,g" \ + # -e "/^$ip\\b/ s,[ ]\\+,&$new ," < /etc/hosts > $tmp + # cat $tmp > /etc/hosts ; rm -f $tmp + #else + # echo -e "$ip\\t$new" >> /etc/hosts + #fi + + if [ $1 = DOMAINNAME ] ; then + tmp="`mktemp`" + grep -vx "search $old3" /etc/resolv.conf > $tmp + [ -n "$DOMAINNAME" ] && echo "search $DOMAINNAME" >> $tmp + cat $tmp > /etc/resolv.conf + rm -f $tmp + fi +} + +set_dns() { + gui_input "Set a new (space seperated) list of DNS Servers" "$DNSSRV" "DNSSRV" + DNSSRV="`echo $DNSSRV`" ; [ -z "$DNSSRV" ] && DNSSRV="none" + + tmp="`mktemp`" ; grep -v '^nameserver\b' /etc/resolv.conf > $tmp + for x in $DNSSRV ; do + [ "$x" != "none" ] && echo "nameserver $x" >> $tmp + done + cat $tmp > /etc/resolv.conf + rm -f $tmp +} + +HOSTNAME="`hostname`" +DOMAINNAME="`hostname -d 2> /dev/null`" + +tmp="`mktemp`" +grep '^nameserver ' /etc/resolv.conf | tr '\t' ' ' | tr -s ' ' | \ + sed 's,^nameserver *\([^ ]*\),DNSSRV="$DNSSRV \1",' > $tmp +DNSSRV='' ; . $tmp ; DNSSRV="`echo $DNSSRV`" +[ -z "$DNSSRV" ] && DNSSRV="none" ; rm -f $tmp + +main_detailed() { + while + cmd="gui_menu network 'Network Configuration'" + + cmd="$cmd 'Static hostname: $HOSTNAME' 'set_name HOSTNAME'" + cmd="$cmd 'Static domainname: $DOMAINNAME' 'set_name DOMAINNAME'" + cmd="$cmd 'Static DNS-Server: $DNSSRV' 'set_dns' '' ''" + + cmd="$cmd 'Configure runlevels for network service'" + cmd="$cmd '$STONE runlevel edit_srv network'" + cmd="$cmd '(Re-)Start network init script'" + cmd="$cmd '$STONE runlevel restart network'" + cmd="$cmd '' ''" + + cmd="$cmd 'View/Edit /etc/resolv.conf file' 'gui_edit /etc/resolv.conf /etc/resolv.conf'" + cmd="$cmd 'View/Edit /etc/hosts file' 'gui_edit /etc/hosts /etc/hosts'" + cmd="$cmd 'View/Edit /etc/network/config file' 'gui_edit /etc/network/config /etc/network/config'" + + cmd="$cmd '' ''" + + cmd="$cmd 'Read the /etc/network/README file' 'gui_edit /etc/network/README /etc/network/README'" + + eval "$cmd" + do : ; done +} + +main() { + while + cmd="gui_menu network 'Network Configuration'" + + cmd="$cmd 'Just edit /etc/network/config' 'gui_edit /etc/network/config /etc/network/config'" + cmd="$cmd 'Read the /etc/network/README file' 'gui_edit /etc/network/README /etc/network/README'" + cmd="$cmd 'Detailed Networking configuration' 'exec $0 network main_detailed'" + + eval "$cmd" + do : ; done +} + diff --git a/package/base/stone/stone_mod_packages.sh b/package/base/stone/stone_mod_packages.sh new file mode 100644 index 000000000..2e0e0fcf4 --- /dev/null +++ b/package/base/stone/stone_mod_packages.sh @@ -0,0 +1,143 @@ +# --- ROCK-COPYRIGHT-NOTE-BEGIN --- +# +# This copyright note is auto-generated by ./scripts/Create-CopyPatch. +# Please add additional copyright information _after_ the line containing +# the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by +# the ./scripts/Create-CopyPatch script. Do not edit this copyright text! +# +# ROCK Linux: rock-src/package/base/sysfiles/stone_mod_packages.sh +# ROCK Linux is Copyright (C) 1998 - 2006 Clifford Wolf +# +# This program 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 2 of the License, or +# (at your option) any later version. A copy of the GNU General Public +# License can be found at Documentation/COPYING. +# +# Many people helped and are helping developing ROCK Linux. Please +# have a look at http://www.rocklinux.org/ and the Documentation/TEAM +# file for details. +# +# --- ROCK-COPYRIGHT-NOTE-END --- +# +# [MAIN] 90 packages Package Management (Install, Update and Remove) + +if [ -n "$ROCK_INSTALL_SOURCE_DEV" ] ; then + dev="$ROCK_INSTALL_SOURCE_DEV" + dir="/mnt/source" ; root="/mnt/target" + gasguiopt="-F" + + ROCKCFG_SHORTID="Automatically choose first" +elif [ -n "$ROCK_INSTALL_SOURCE_URL" ] ; then + dev="NETWORK INSTALL" + dir="$ROCK_INSTALL_SOURCE_URL" + root="/mnt/target" + gasguiopt="-F" + + ROCKCFG_SHORTID="$( grep '^export ROCKCFG_SHORTID=' \ + /etc/ROCK-CONFIG/config 2> /dev/null | cut -f2- -d= )" + ROCKCFG_SHORTID="${ROCKCFG_SHORTID//\'/}" + + tmpfile=`mktemp` + if wget -q -O "$tmpfile" "${ROCK_INSTALL_SOURCE_URL}/index.txt" ; then + ROCKCFG_SHORTID=`grep -v "${ROCKCFG_SHORTID}" $tmpfile | \ + grep '/pkgs/' | head -n 1 | \ + cut -f2 -d' ' | cut -f1 -d/` + fi ; + rm -f $tmpfile +else + dev="/dev/cdroms/cdrom0" + dir="/mnt/cdrom" ; root="/" + gasguiopt="" + + ROCKCFG_SHORTID="$( grep '^export ROCKCFG_SHORTID=' \ + /etc/ROCK-CONFIG/config 2> /dev/null | cut -f2- -d= )" + ROCKCFG_SHORTID="${ROCKCFG_SHORTID//\'/}" +fi + +read_ids() { + mnt="`mktemp`" + rm -f $mnt ; mkdir $mnt + + cmd="$cmd '' ''" + + if mount $opt $dev $mnt ; then + for x in `cd $mnt; ls -d */{,ROCK/}pkgs 2> /dev/null | sed -e 's,/pkgs$,,'` + do + cmd="$cmd '$x' 'ROCKCFG_SHORTID=\"$x\"'" + done + umount $mnt + else + cmd="$cmd 'The medium could not be mounted!' ''" + fi + + rmdir $mnt +} + +startgas() { + [ -z "$( cd $dir; ls )" ] && mount $opt -v -o ro $dev $dir + if [ "$ROCKCFG_SHORTID" = "Automatically choose first" ]; then + ROCKCFG_SHORTID="$( cd $dir; ls -d */{,ROCK/}pkgs 2> /dev/null | \ + sed -e 's,/pkgs$,,' | head -n 1 )" + echo "Using Config-ID <${ROCKCFG_SHORTID:-None}> .." + fi + if [ $startgas = 1 ] ; then + echo + echo "Running: gasgui $gasguiopt \\" + echo " -c '$ROCKCFG_SHORTID' \\" + echo " -t '$root' \\" + echo " -d '$dev' \\" + echo " -s '$dir'" + echo + gasgui $gasguiopt -c "$ROCKCFG_SHORTID" -t "$root" -d "$dev" -s "$dir" + elif [ $startgas = 2 ] ; then + echo + echo "Running: stone gas main \\" + echo " '$ROCKCFG_SHORTID' \\" + echo " '$root' \\" + echo " '$dev' \\" + echo " '$dir'" + $STONE gas main "$ROCKCFG_SHORTID" "$root" "$dev" "$dir" + fi +} + +main() { + local startgas=0 + while : ; do + cmd="gui_menu packages 'Package Management + +Note: You can install, update and remove packages (as well as query +package information) with the command-line tool \"mine\". This is just +a simple frontend for the \"mine\" program.'" + + type -p gasgui > /dev/null && + cmd="$cmd 'Start gasgui Package Manager (recommended)' 'startgas=1'" + cmd="$cmd 'Start gastone Package manager (minimal)' 'startgas=2'" + cmd="$cmd '' ''" + + cmd="$cmd 'Mount Options: $opt'" + cmd="$cmd 'gui_input \"Mount Options (e.g. -s -o sync) \" \"\$opt\" opt'" + + cmd="$cmd 'Source Device: $dev'" + cmd="$cmd 'gui_input \"Source Device\" \"\$dev\" dev'" + + cmd="$cmd 'Mountpoint: $dir'" + cmd="$cmd 'gui_input \"Mountpoint\" \"\$dir\" dir'" + + cmd="$cmd 'ROCK Config ID: $ROCKCFG_SHORTID'" + cmd="$cmd 'gui_input \"ROCK Config ID\"" + cmd="$cmd \"\$ROCKCFG_SHORTID\" ROCKCFG_SHORTID'" + + read_ids + + if eval "$cmd" ; then + if [ $startgas != 0 ]; then + startgas $startgas + break + fi + else + break + fi + done +} + diff --git a/package/base/stone/stone_mod_runlevel.sh b/package/base/stone/stone_mod_runlevel.sh new file mode 100644 index 000000000..221ff70c3 --- /dev/null +++ b/package/base/stone/stone_mod_runlevel.sh @@ -0,0 +1,130 @@ +# --- ROCK-COPYRIGHT-NOTE-BEGIN --- +# +# This copyright note is auto-generated by ./scripts/Create-CopyPatch. +# Please add additional copyright information _after_ the line containing +# the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by +# the ./scripts/Create-CopyPatch script. Do not edit this copyright text! +# +# ROCK Linux: rock-src/package/base/sysfiles/stone_mod_runlevel.sh +# ROCK Linux is Copyright (C) 1998 - 2006 Clifford Wolf +# +# This program 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 2 of the License, or +# (at your option) any later version. A copy of the GNU General Public +# License can be found at Documentation/COPYING. +# +# Many people helped and are helping developing ROCK Linux. Please +# have a look at http://www.rocklinux.org/ and the Documentation/TEAM +# file for details. +# +# --- ROCK-COPYRIGHT-NOTE-END --- +# +# [MAIN] 80 runlevel Runlevel Configuration (Services) + +# Remove dead symlinks +for x in /etc/rc.d/rc[0-6].d/* ; do + [ -L "$x" -a ! -e "$x" ] && rm -f "$x" +done + +chrlv() { + local srv=$1 rl=$2 pri=$3 + if [ ! -e /etc/rc.d/rc$rl.d/S??$srv ] + then + ln -sf ../init.d/$srv /etc/rc.d/rc$rl.d/S$pri$srv + kpr=`printf "%02d" $(( 100 - $pri ))` + ln -sf ../init.d/$srv /etc/rc.d/rc$rl.d/K$kpr$srv + else + rm -f /etc/rc.d/rc$rl.d/[SK]??$srv + fi +} + +chpri() { + local srv=$1 pri=$2 + + gui_input "Changing priority for service $1" "$pri" pri + + if [ ! -z "${pri#[0-9][0-9]}" ] + then + gui_message "The value you entered is not valid." + return + fi + + rm -f /etc/rc.d/rcX.d/X??$srv + echo "The script '$srv' has the priority $pri." \ + > /etc/rc.d/rcX.d/X$pri$srv + + for x in 0 1 2 3 4 5 6 ; do + if [ -e /etc/rc.d/rc$x.d/S??$srv ] ; then + rm -f /etc/rc.d/rc$x.d/[SK]??$srv + ln -sf ../init.d/$srv /etc/rc.d/rc$x.d/S$pri$srv + kpr=`printf "%02d" $(( 100 - $pri ))` + ln -sf ../init.d/$srv /etc/rc.d/rc$x.d/K$kpr$srv + fi + done +} + +edit_srv() { + local srv=$1 id="runlevel_$RANDOM" cmd="" + + while + cmd="gui_menu $id 'Runlevel Editor - $srv'" + pri=`ls /etc/rc.d/rc?.d/[SX]??$srv 2> /dev/null | \ + cut -c18-19 | head -n 1` + [ -z "$pri" ] && pri=99 + + for rl in 1 2 3 4 5 ; do + if [ -e /etc/rc.d/rc$rl.d/S??$srv ] + then cmd="$cmd '[*] " ; else cmd="$cmd '[ ] " ; fi + cmd="$cmd Run this script in runlevel $rl'" + cmd="$cmd 'chrlv $srv $rl $pri'" + done + + cmd="$cmd '$pri This scripts priority (01-99)'" + cmd="$cmd 'chpri $srv $pri' '' ''" + + cmd="$cmd 'Edit /etc/rc.d/init.d/$srv script'" + cmd="$cmd \"gui_edit 'SysV Init Script $srv'" + cmd="$cmd /etc/rc.d/init.d/$srv\"" + cmd="$cmd \"(Re-)Start the '$srv' system service\"" + cmd="$cmd '$STONE runlevel restart $srv'" + eval "$cmd" + do : ; done +} + +restart() { + gui_cmd "(Re-)Starting System Service '$1'" \ + "/sbin/rc $1 stop ; /sbin/rc $1 start" +} + +main() { + while + cmd="gui_menu runlevel 'Runlevel Editor - Select an" + cmd="$cmd item to change the priority or runlevels'" + + x=`mktemp` + for srv in $( ls /etc/rc.d/init.d/ ) + do + [ -f /etc/rc.d/init.d/$srv ] || continue + + pri=`ls /etc/rc.d/rc?.d/[SX]??$srv \ + 2> /dev/null | cut -c18-19 | head -n 1` + [ -z "$pri" ] && pri=99 + + rlv='' + for x in 1 2 3 4 5 ; do + if [ -e /etc/rc.d/rc$x.d/S??$srv ] + then rlv="${rlv}$x" ; else rlv="${rlv}-" ; fi + done + + desc=`grep '# *Desc:' /etc/rc.d/init.d/$srv | \ + cut -f2- -d: | tr -d "'" | cut -c1-45` + desc="$( printf "%-10s %s" "$srv" "$desc" )" + + echo "$pri$srv '$pri $rlv $desc' 'edit_srv $srv'" + done | sort > $x + cmd="$cmd $(cut -f2- -d' ' < $x | tr '\n' ' ')" + rm -f $x ; eval "$cmd" + do : ; done +} + diff --git a/package/base/stone/stone_mod_setup.sh b/package/base/stone/stone_mod_setup.sh new file mode 100644 index 000000000..30009290b --- /dev/null +++ b/package/base/stone/stone_mod_setup.sh @@ -0,0 +1,128 @@ +# --- ROCK-COPYRIGHT-NOTE-BEGIN --- +# +# This copyright note is auto-generated by ./scripts/Create-CopyPatch. +# Please add additional copyright information _after_ the line containing +# the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by +# the ./scripts/Create-CopyPatch script. Do not edit this copyright text! +# +# ROCK Linux: rock-src/package/base/sysfiles/stone_mod_setup.sh +# ROCK Linux is Copyright (C) 1998 - 2006 Clifford Wolf +# +# This program 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 2 of the License, or +# (at your option) any later version. A copy of the GNU General Public +# License can be found at Documentation/COPYING. +# +# Many people helped and are helping developing ROCK Linux. Please +# have a look at http://www.rocklinux.org/ and the Documentation/TEAM +# file for details. +# +# --- ROCK-COPYRIGHT-NOTE-END --- +# +# This module should only be executed once directly after the installation + +make_fstab() { + tmp1=`mktemp` ; tmp2=`mktemp` + + cat <<- EOT > $tmp2 +/dev/root / auto defaults 0 0 +proc /proc proc defaults 0 0 +devpts /dev/pts devpts defaults 0 0 +tmpfs /dev/shm tmpfs defaults 0 0 +sysfs /sys sysfs defaults 0 0 +/dev/bus/usb /proc/bus/usb bind bind 0 0 +#tmpfs /tmp tmpfs defaults 0 0 +EOT + + for x in /dev/cdroms/cdrom[0-9] ; do + if [ -e $x ] ; then + trg=/mnt/${x/*\//} ; trg=${trg/cdrom0/cdrom} + mkdir -p $trg + [ -L "$x" ] && x="`readlink -f $x`" + echo "$x $trg iso9660 ro,noauto 0 0" >> $tmp2 + fi + done + + for x in /dev/floppy/[0-9] ; do + if [ -e $x ] ; then + trg=/mnt/floppy${x/*\//} ; trg=${trg/floppy0/floppy} + mkdir -p $trg + [ -L "$x" ] && x="`readlink -f $x`" + echo "$x $trg auto sync,noauto 0 0" >> $tmp2 + fi + done + + sed -e "s/ nfs [^ ]\+/ nfs rw/" < /etc/mtab | \ + sed "s/ rw,/ /; s/ rw / defaults /" >> $tmp2 + grep '^/dev/' /proc/swaps | cut -f1 -d' ' | \ + sed 's,$, swap swap defaults 0 0,' >> $tmp2 + + cut -f2 -d' ' < $tmp2 | sort -u | while read dn ; do + grep " $dn " $tmp2 | tail -n 1; done > $tmp1 + + fsregex="$( echo -n $( ls /sbin/fsck.* | \ + cut -f2- -d. ) | sed 's, ,\\|,g' )" + gawk '{ printf("%-58s %d %d\n", + sprintf("%-45s ", sprintf("%-35s ", + sprintf("%-20s ", $1) $2) $3) $4, + $5, $6); }' < $tmp1 | \ + sed "/ \/[^ ].*\($fsregex\) / s, 0$, 1," > /etc/fstab + tr ' ' '\240' < /etc/fstab > $tmp1 + + gui_message $'Auto-created /etc/fstab file:\n\n'"$( cat $tmp1 )" + rm -f $tmp1 $tmp2 +} + +set_rootpw() { + if [ "$SETUPG" = dialog ] ; then + tmp1="`mktemp`" ; tmp2="`mktemp`" ; rc=0 + gui_dialog --nocancel --passwordbox "Setting a root password. ` + `Type password:" 8 70 > $tmp1 + gui_dialog --nocancel --passwordbox "Setting a root password. ` + `Retype password:" 8 70 > $tmp2 + if [ -s $tmp1 ] && cmp -s $tmp1 $tmp2 ; then + echo -n "root:" > $tmp1 ; echo >> $tmp2 + cat $tmp1 $tmp2 | chpasswd + else + gui_message "Password 1 and password 2 are ` + `not the same" ; rc=1 + fi + rm $tmp1 $tmp2 + return $rc + else + passwd root + return $? + fi +} + +main() { + ldconfig + export gui_nocancel=1 + + make_fstab + $STONE general set_keymap + while ! set_rootpw; do :; done + $STONE general set_tmarea + $STONE general set_dtime + $STONE general set_locale + $STONE general set_vcfont + + # source postinstall scripts added by misc packages + for x in ${SETUPD}/setup_*.sh ; do + [ -f $x ] && . $x + done + + # postinstall is called by cron.run / 00-updates - it wouldn't get + # called at all if cron isn't installed, so let's call it at lease + # once after installing / chrooting. + if [ -n "`which cron.run`" ] ; then + cron.run + else + postinstall -a + fi + + unset gui_nocancel + exec $STONE +} + diff --git a/package/base/stone/stone_mod_user.sh b/package/base/stone/stone_mod_user.sh new file mode 100644 index 000000000..92728102a --- /dev/null +++ b/package/base/stone/stone_mod_user.sh @@ -0,0 +1,181 @@ +# --- ROCK-COPYRIGHT-NOTE-BEGIN --- +# +# This copyright note is auto-generated by ./scripts/Create-CopyPatch. +# Please add additional copyright information _after_ the line containing +# the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by +# the ./scripts/Create-CopyPatch script. Do not edit this copyright text! +# +# ROCK Linux: rock-src/package/blindcoder/ezipupdate/mod_ezipupdate.sh +# ROCK Linux is Copyright (C) 1998 - 2005 Clifford Wolf +# +# This program 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 2 of the License, or +# (at your option) any later version. A copy of the GNU General Public +# License can be found at Documentation/COPYING. +# +# Many people helped and are helping developing ROCK Linux. Please +# have a look at http://www.rocklinux.org/ and the Documentation/TEAM +# file for details. +# +# --- ROCK-COPYRIGHT-NOTE-END --- +# +# [MAIN] 20 user User and Group management + +user_edit_user_change_shell() { # {{{ + IFS=: read username haspwd uid gid desc home shell < <( grep ^${1}: /etc/passwd ) + cmd="'Do not change' 'shell=${shell}'" + while read validshell ; do + cmd="${cmd} '${validshell}' 'shell=${validshell}'" + done < /etc/shells + eval "gui_menu user_edit_user_change_shell 'Change login shell for ${username}' ${cmd}" +} # }}} +user_edit_user() { # {{{ + IFS=: read username haspwd uid gid desc home shell < <( grep ^${1}: /etc/passwd ) + read oldline < <( grep ^${1}: /etc/passwd ) + groups="`egrep -e"[:,]$1[, $]?" /etc/group | cut -f1 -d: | tr '\n' ' '`" + run=0 + while [ ${run} -eq 0 ] ; do + cmd="'Login: ${username}' 'gui_input \"Enter new login for ${username}\" \"${username}\" username'" + cmd="${cmd} 'Has a password: $( [ -n "${haspwd}" ] && echo "yes" || echo "no" )' 'gui_yesno \"Must ${username} supply a password to login?\" && haspwd=x || unset haspwd'" + cmd="${cmd} 'User ID: ${uid}' 'gui_input \"Enter new user ID for ${username}\" \"${uid}\" uid'" + cmd="${cmd} 'Group ID: ${gid}' 'gui_input \"Enter new primary group ID for ${username}\" \"${gid}\" gid'" + cmd="${cmd} 'Long description: ${desc}' 'gui_input \"Enter new description for ${username}\" \"${desc}\" desc'" + cmd="${cmd} 'Home directory: ${home}' 'gui_input \"Enter new home directory for ${username}\" \"${home}\" home'" + cmd="${cmd} 'Shell: ${shell}' 'user_edit_user_change_shell ${username}'" + cmd="${cmd} 'Groups: ${groups}' 'user_edit_user_groups ${username}'" + cmd="${cmd} 'Set new password' 'passwd \"${username}\" ; read -p \"Press -- to continue\"'" + eval "gui_menu user_edit_user 'Manage account ${username}' ${cmd}" + run=${?} + done + sed -i /etc/passwd -e "s,^${oldline}$,${username}:${haspwd}:${uid}:${gid}:${desc}:${home}:${shell}," +} # }}} +user_add_user() { # {{{ + unset username haspwd uid gid desc home shell + while [ -z "${username}" ] ; do + gui_input "Enter new username" "" username || return + if grep -q ^${username}: /etc/passwd ; then + gui_message "Username ${username} already exists!" + unset username + fi + done + gui_yesno "Does ${username} need a password to log in?" && haspwd=x + uid=0 + while IFS=: read a a id a ; do + [ ${uid} -lt ${id} ] && uid=${id} + done < <( grep -v ^nobody: /etc/passwd ) + uid=$(( ${uid} + 1 )) + gui_input "Enter new User ID" "${uid}" uid || return + IFS=: read a a gid a < <( grep ^users: /etc/group ) + gui_input "Enter new Group ID" "${gid:-100}" gid || return + gui_input "Enter new User Description" "" desc || return + gui_input "Enter home directory" "/home/${username}" home || return + gui_input "Enter new shell" "/bin/bash" shell || return + tmp="`mktemp`" + useradd -u "${uid}" -g "${gid}" -p "${haspwd}" -d "${home}" -m -s "${shell}" \ + -c "${desc}" "${username}" >${tmp} 2>&1 || \ + gui_message "Error creating user: `cat ${tmp}`" + rm "${tmp}" +} # }}} +user_edit_user_groups() { # {{{ + run=0 + while [ ${run} -eq 0 ] ; do + cmd="" + while IFS=: read group groupid members ; do + members=" ${members/,/ } " + status="" + if [[ "${groupid}" == "${gid}" ]] ; then + status="1" + elif [[ "${members}" == *\ ${1}\ * ]] ; then + status="X" + members="${members// ${1} / }" + else + status=" " + members="${members} ${1} " + fi + members="$( echo "${members}" | sed -e 's,^ *,,g' -e 's, *$,,g' -e 's, *, ,g' )" + members="${members// /,}" + cmd="${cmd} '[${status}] ${group}' 'sed -i /etc/group -e \"s/^\(${group}.*:\).*$/\1${members}/\"'" + done < <( cut -f 1,3,4 -d: /etc/group ) + groups="`egrep -e"[:,]$1[, $]?" /etc/group | cut -f1 -d: | tr '\n' ' '`" + eval "gui_menu user_edit_user_groups 'Manage Group Memberships of User ${1}' ${cmd}" + run=${?} + done +} # }}} +user_edit_group_members() { # {{{ + IFS=: read groupname haspwd gid members < <( grep ^${1}: /etc/group ) + read oldline < <( grep ^${1}: /etc/group ) + run=0 + members=" ${members//,/ } " + while [ ${run} -eq 0 ] ; do + cmd="" + while read x ; do + if [[ "${members}" == *\ ${x}\ * ]] ; then + cmd="${cmd} '[X] ${x}' 'members=\${members// ${x} / }'" + else + cmd="${cmd} '[ ] ${x}' 'members=\"\${members} ${x} \"'" + fi + done < <( cut -f 1 -d: /etc/passwd ) + eval "gui_menu user_edit_group_members 'Manage Members of group ${groupname}' ${cmd}" + run=${?} + done + members="$( echo "${members}" | sed -e 's,^ *,,g' -e 's, *$,,g' -e 's, *, ,g' )" + members=${members// /,} + sed -i /etc/group -e "s/^${oldline}$/${groupname}:${haspwd}:${gid}:${members}/" + echo ${members} >&2 +} # }}} +user_edit_group() { # {{{ + IFS=:, read groupname haspwd gid members < <( grep ^${1}: /etc/group ) + read oldline < <( grep ^${1}: /etc/group ) + run=0 + while [ ${run} -eq 0 ] ; do + cmd="'Group name: ${groupname}' 'gui_input \"Enter new group name\" \"${groupname}\" groupname'" + cmd="${cmd} 'Group ID: ${gid}' 'gui_input \"Enter new group ID\" \"${gid}\" gid'" + memb="${members:0:25}" + [ -n "${members:25}" ] && memb="${memb}..." + cmd="${cmd} 'Members: ${memb}' 'exec 3>&2 ; members=\`user_edit_group_members ${groupname} 2>&1 1>&3\`'" +# fake says this line is unmaintainable. I say it's not. Anyway: +# I modify the variable members from within the function user_edit_group_members +# that's all :) + eval "gui_menu user_edit_group 'Manage group ${groupname}' ${cmd}" + run=${?} + done + sed -i /etc/group -e "s/^${oldline}$/${groupname}:${haspwd}:${gid}:${members// /,}/" +} # }}} +user_add_group() { # {{{ + unset groupname gid + while [ -z "${groupname}" ] ; do + gui_input "Enter new Group Name" "" groupname || return + if grep -q "^${groupname}:" /etc/group ; then + gui_message "Group ${groupname} already exists!" + unset groupname + fi + done + gid=0 + while IFS=: read a a id a ; do + [ ${gid} -lt ${id} ] && gid=${id} + done < <( grep -v ^nobody: /etc/passwd | grep -v ^nogroup: ) + gid=$(( ${gid} + 1 )) + gui_input "Enter new Group ID" "${gid}" gid || return + tmp="`mktemp`" + groupadd -g "${gid}" "${groupname}" > ${tmp} 2>&1 || \ + gui_message "Error creating group: `cat ${tmp}`" + rm "${tmp}" +} # }}} +main() { # {{{ + run=0 + while [ ${run} -eq 0 ] ; do + cmd="'User Management' ''" + while IFS=: read username haspwd uid gid desc home shell ; do + cmd="${cmd} '${desc:-No description} (${username})' 'user_edit_user ${username}'" + done < /etc/passwd + cmd="${cmd} 'Add new user' 'user_add_user' '' ''" + cmd="${cmd} 'Group Management' ''" + while IFS=: read groupname haspwd gid members ; do + cmd="${cmd} '${groupname}' 'user_edit_group ${groupname}'" + done < /etc/group + cmd="${cmd} 'Add new group' 'user_add_group'" + eval "gui_menu user 'User and Group management' ${cmd}" + run=${?} + done +} # }}}