diff --git a/python/mine/install_xml.py b/interface/mine/install_xml.py similarity index 100% rename from python/mine/install_xml.py rename to interface/mine/install_xml.py diff --git a/python/ri_cmd.py b/interface/ri_cmd.py similarity index 100% rename from python/ri_cmd.py rename to interface/ri_cmd.py diff --git a/python/ri_data.py b/interface/ri_data.py similarity index 100% rename from python/ri_data.py rename to interface/ri_data.py diff --git a/python/ri_dep.py b/interface/ri_dep.py similarity index 100% rename from python/ri_dep.py rename to interface/ri_dep.py diff --git a/python/ri_seq.py b/interface/ri_seq.py similarity index 100% rename from python/ri_seq.py rename to interface/ri_seq.py diff --git a/python/ri_tk.py b/interface/ri_tk.py similarity index 100% rename from python/ri_tk.py rename to interface/ri_tk.py diff --git a/python/ri_tk_cmd.py b/interface/ri_tk_cmd.py similarity index 100% rename from python/ri_tk_cmd.py rename to interface/ri_tk_cmd.py diff --git a/python/ri_widget.py b/interface/ri_widget.py similarity index 100% rename from python/ri_widget.py rename to interface/ri_widget.py diff --git a/python/test.py b/interface/test.py similarity index 100% rename from python/test.py rename to interface/test.py diff --git a/python/test_data.py b/interface/test_data.py similarity index 100% rename from python/test_data.py rename to interface/test_data.py diff --git a/operation/99finish_install.sh b/operation/99finish_install.sh new file mode 100755 index 0000000..b754ea8 --- /dev/null +++ b/operation/99finish_install.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# run post_add scripts +# +pkg_dir=/var/lib/pkg +ls -rt ${pkg_dir}/*.post_add | while read pa_file +do + source ${pa_file} + rm ${pa_file} +done + +rm $pkg_dir/*-serv.conf + +# +# +# Destroy itself +# + +rm -f $0 + diff --git a/operation/configure_fstab.sh b/operation/configure_fstab.sh new file mode 100755 index 0000000..f762a6a --- /dev/null +++ b/operation/configure_fstab.sh @@ -0,0 +1,113 @@ +#!/bin/bash +# +# DESCRIPTION: configure fstab +# this script will modify $TARGT/etc/fstab, +# append the mountpoint to $TARGET/etc/fstab. +# +# SCRIPT NAME: configure_fstab.sh +# +# Usage: echo "/dev/hda2 /home ext3"|./configure_fstab.sh +# +# Input: stdin +# 1. partition +# 2. mountpoint +# 3. filesystem type +# below input is optional, if not set, we configure default, +# more about these argument read man fstab. +# 4. fs_mntops +# 5. fs_freq +# 6. fs_passno +# +# Output: +# 1 fstab doesn't exist +# 2 lack input (reserve) +# 3 device node doesn't exist +# +# AUTHOR: Qin Bo +# +# EMAIL: bqin@linx-info.com +# +# DATE: 2010-08-12 +# +# HISTORY: +# REVISOR DATE MODIFICATION +# Qin Bo 2010-08-12 create +# +# +# + +source ./functions + +# +# if you redirect to /etc/fstab, don't print redundant to stdout in this function +# +configure_fstab () +{ + local devname="$1" + local mountpoint="$2" + local fs_type="$3" + + local fs_mntops="$4" + local fs_freq="$5" + local fs_passno="$6" + + if [ ! -e "$devname" ];then + err "$devname node doesn't exist !" + return 3 + fi + + # if partition is not swap, md, /, we use uuid instead device node + # / and swap partition use device node is decide by mkinitrd, this + # fstab will use by mkinitrd first ,if use UUID in fstab, mkinitrd will dead loop. + if [ "$mountpoint" != "/" -a "$(echo $devname | grep md)" = "" -a "$fs_type" != "swap" ];then + DEV_UUID=$(vol_id "$devname" | grep "ID_FS_UUID=" | cut -d "=" -f2) + devname="UUID=$DEV_UUID" + else + devname="$devname" + fi + + # configure fstab options here + # fs_mntops, fs_freq, fs_passno has given, we use function argument, + # or we set default configuration, this default configuration according + # to old Rocky installer. + case $fs_type in + ext2|ext3|reiserfs) + [ -z "$fs_mntops" ] && fs_mntops="acl" + [ -z "$fs_freq" ] && fs_freq=1 + [ -z "$fs_passno" ] && fs_passno=1 ;; + swap) + [ -z "$fs_mntops" ] && fs_mntops="defaults" + [ -z "$fs_freq" ] && fs_freq=0 + [ -z "$fs_passno" ] && fs_passno=0 ;; + *) + [ -z "$fs_mntops" ] && fs_mntops="defaults" + [ -z "$fs_freq" ] && fs_freq=1 + [ -z "$fs_passno" ] && fs_passno=1 ;; + esac + + printf "%-60s %-10s %-10s %-25s %-1s %-1s\n" $devname $mountpoint $fs_type $fs_mntops $fs_freq $fs_passno + +} + + +main () +{ + if [ -e "$TARGET/etc/fstab" ];then + sed -i '/^#devpts/ s/#// + /^#sysfs/ s/#// + /^#shm/ s/#shm /tmpfs/ ' "$TARGET/etc/fstab" + + while read line;do + if [ -n "$line" ];then + configure_fstab $line >> "$TARGET/etc/fstab" + erv + fi + done + else + err "$TARGET/etc/fstab doesn't exist" + exit 1 + fi +} + +main $@ + diff --git a/operation/configure_network.sh b/operation/configure_network.sh new file mode 100755 index 0000000..11c8885 --- /dev/null +++ b/operation/configure_network.sh @@ -0,0 +1,255 @@ +#!/bin/bash +# +# DESCRIPTION: configure network services +# +# SCRIPT NAME: configure_network.sh +# +# Input: argument +# [--help] show usage +# [-t|--type] \"manual\" or \"dynamic\" +# manual argument: +# [-h|--hostname] hostname +# [-d|--domainname] domainname +# [-i|--ip] ip address +# [-n|--netmask] netmask +# [-g|--gateway] gateway +# [-p|--pdns] priamaryDNS +# [-s|--sdns] secondaryDNS +# <-e|--device> network device. if no configure, default is eth0. +# dynamic argument: +# [-h|--hostname] hostname +# <-e|--device> network device. if no configure, default is eth0. +# +# Output: +# 1 argument error +# 2 ip/netmask/gateway address incorrect +# +# AUTHOR: Qin Bo +# +# EMAIL: bqin@linx-info.com +# +# DATE: 2010-08-23 +# +# HISTORY: +# REVISOR DATE MODIFICATION +# Qin Bo 2010-08-23 create +# +# +# + +source ./functions + +usage () +{ + if [ "$1" == "-n" ];then + cmd="info" + ret=0 + else + cmd="err" + ret=1 + fi + + $cmd " +This script will configure your network + +Usage: $0 options: + +options: + [--help] show this message + [-t|--type] \"manual\" or \"dynamic\" + manual argument: + [-h|--hostname] hostname + [-d|--domainname] domainname + [-i|--ip] ip address + [-n|--netmask] netmask + [-g|--gateway] gateway + [-p|--pdns] priamaryDNS + [-s|--sdns] secondaryDNS + <-e|--device> network device. if no configure, default is eth0. + dynamic argument: + [-h|--hostname] hostname + <-e|--device> network device. if no configure, default is eth0. + " + return $ret +} + +check_ip () +{ + + if [ $# -ne 1 ];then + err "$FUNCNAME function argument error, it must be 1" + return 1; + fi + + local ip=$1 + local ret=2 + + # "=~" use for match regular expression, only use in bash 3.0 or higher + if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then + + # IFS is a separator for read builtin command, we save old IFS + OIFS=$IFS + IFS='.' + # set $ip to ip array + ip=($ip) + # restore IFS + IFS=$OIFS + [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \ + && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] + ret=$? + fi + + return $ret + +} + +parse_arg () +{ + tmp=$(getopt -o t:h:d:i:n:g:p:s:e:? --long type:,hostname:,ip:,netmask:,gateway:,pdns:,sdns:,device:,help -- "$@" 2>$dev_LOG) + if [ $? -ne 0 ];then + usage + return 1 + fi + + # set all argument to arg variable + eval set -- "$tmp" + + while true ; do + case $1 in + -t|--type) type="$2" ; + info "network configure type: $type" ; + shift 2;; + -h|--hostname) hostname="$2"; + info "hostname: $hostname" ; + shift 2 ;; + -d|--domainname) domainname="$2"; + info "domainname: $domainname" ; + shift 2 ;; + -i|--ip) ip="$2"; + info "ip: $ip" ; + shift 2 ;; + -n|--netmask) netmask="$2"; + info "netmask: $netmask" ; + shift 2 ;; + -g|--gateway) gateway="$2"; + info "gateway: $gateway" ; + shift 2 ;; + -p|--pdns) primaryDNS="$2"; + info "primaryDNS: $primaryDNS" ; + shift 2 ;; + -s|--sdns) secondaryDNS="$2"; + info "secondaryDNS: $secondaryDNS" ; + shift 2 ;; + # may be have mulit-network devices + -e|--device) device="$2"; + info "device: $device" ; + shift 2 ;; + # shift the last "--", this dash is define by getopt (more information see man getopt) + --) shift ;break;; + --help) usage -n ;return 0;; + *) usage ;return 1;; + esac + done + + + if [ "$type" != "manual" -a "$type" != "dynamic" ];then + usage + return 1 + fi + + if [ -z "$hostname" ];then + err "you must specify hostname" + return 1 + fi + + # default device is eth0 + if [ -z "$device" ];then + device="eth0" + fi + + if [ "$type" == "manual" ];then + if [ -z "$ip" ];then + err "manual configure network, IP address can't be empty" + return 1 + else + info "checking ip: $ip" + if ! check_ip "$ip"; then + return 2 + fi + fi + if [ -z "$netmask" ];then + err "manual configure network, netmask address can't be empty" + return 1 + else + info "checking netmask: $netmask" + if ! check_ip "$netmask"; then + return 2 + fi + fi + if [ -z "$gateway" ];then + err "manual configure network, gateway address can't be empty" + return 1 + else + info "checking gateway: $gateway" + if ! check_ip "$gateway"; then + return 2 + fi + fi + fi + +} + +configure_network () +{ + if [ "$type" == "manual" ];then + # configure /etc/hosts + printf "%s %s.%s %s\n" $ip $hostname $domainname $hostname >>"$TARGET/etc/hosts" + + # configure /etc/resolv.conf + printf "search %s\n" $domainname >>"$TARGET/etc/resolv.conf" + if [ -n "$primaryDNS" ];then + printf "nameserver %s\n" $primaryDNS >>"$TARGET/etc/resolv.conf" + fi + if [ -n "$secondaryDNS" ];then + printf "nameserver %s\n" $secondaryDNS >> "$TARGET/etc/resolv.conf" + fi + printf "domainname %s\n" $domainname >> "$TARGET/etc/resolv.conf" + + # configure /etc/sysconfig/network-devices/ifcfg-eth0 + broadcast=$(./ipcalc.pl -n $ip/$netmask| grep Broadcast|awk '{ print $2 }') + sed -i '/IPADDR/ c\IPADDR='$ip' + /NETMASK/ c\NETMASK='$netmask' + /DEVICE/ c\DEVICE='$device' + /GATEWAY/ c\GATEWAY='$gateway' + /BROADCAST/ c\BROADCAST='$broadcast'' "$TARGET/etc/sysconfig/network-devices/ifcfg-eth0" + + sed -i '/HOSTNAME/ c\HOSTNAME='$hostname'' "$TARGET/etc/sysconfig/network" + + else [ "$type" == "dynamic" ] + printf "%s\n" $hostname >> "$TARGET/etc/hosts" + + sed -i '/BOOTPROTO/ c\BOOTPROTO=dhcp + /DEVICE/ c\DEVICE='$device' + /SERVICE/ c\SERVICE=dhcpcd + /IPADDR/ c\IPADDR= + /NETMASK/ c\NETMASK= + /GATEWAY/ c\GATEWAY= + /BROADCAST/ c\BROADCAST=' "$TARGET/etc/sysconfig/network-devices/ifcfg-eth0" + + sed -i '/HOSTNAME/ c\HOSTNAME='$hostname'' "$TARGET/etc/sysconfig/network" + fi + if [ "$device" != "eth0" ];then + mv "$TARGET/etc/sysconfig/network-devices/ifcfg-eth0" "$TARGET/etc/sysconfig/network-devices/ifcfg-$device" + fi +} + +main () +{ + parse_arg $@ + erv + configure_network +} + +main $* + + diff --git a/operation/copy_kernels.sh b/operation/copy_kernels.sh new file mode 100755 index 0000000..af5e53a --- /dev/null +++ b/operation/copy_kernels.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# +# DESCRIPTION: copying kernel and modules to system +# +# SCRIPT NAME: copy_kernel.sh +# +# Input: stdin +# 1. +# 2. +# +# Output: +# 1 +# 2 +# +# AUTHOR: Qin Bo +# +# EMAIL: bqin@linx-info.com +# +# DATE: 2010-08-23 +# +# HISTORY: +# REVISOR DATE MODIFICATION +# Qin Bo 2010-08-23 create +# +# +# + +source ./functions + +main () +{ + cp -r /Rocky/kernels/* $TARGET/boot/ 2>$dev_LOG + cp -r /Rocky/modules/* $TARGET/lib/modules/ 2>$dev_LOG + cp /Rocky/initrd/initrd.gz $TARGET/boot/initrd.gz.old 2>$dev_LOG + + ./makeinitrd +} + +main $@ diff --git a/operation/exec_finish_install.sh b/operation/exec_finish_install.sh new file mode 100755 index 0000000..3de0c39 --- /dev/null +++ b/operation/exec_finish_install.sh @@ -0,0 +1,83 @@ +#!/bin/bash +# +# DESCRIPTION: chroot $TARGET excute script under /var/finish_install/. +# copy 99finish_install to /var/finish_install/, then one +# by one copy the script in /var/finish_install/ to $TARGET +# with sequence, and then chroot $TARGET to execte it. +# +# SCRIPT NAME: exec_finish_install.sh +# +# Input: stdin +# 1. script name which need run after installation +# +# Output: +# 1 +# 2 +# +# AUTHOR: Qin Bo +# +# EMAIL: bqin@linx-info.com +# +# DATE: 2010-08-27 +# +# HISTORY: +# REVISOR DATE MODIFICATION +# Qin Bo 2010-08-27 create +# +# +# + +source ./functions + +prep () +{ + if [ ! -d $finish_install_dir ];then + mkdir -p $finish_install_dir + fi + + for mp in /dev /proc /sys + do + mount --bind -n $mp "$TARGET$mp" + done +} + +exec_script () +{ + src="$1" + src_name=$(basename $src) + cp $src "$TARGET/opt" + chroot $TARGET "/opt/$src_name" >$dev_LOG 2>&1 && rm -f "$TARGET/opt/$src_name" +} + + + +main () +{ + prep + + while read line ;do + if [ -n "$line" ];then + cp $line $finish_install_dir/ + else + break + fi + done + + # run all the script in /var/finish_install, + # execute sequence through number of script name + for script in "$finish_install_dir"/*; do + base=$(basename $script | sed 's/[0-9]*//') + if [ -x "$script" ];then + info "Running $base" + exec_script $script + erv + else + warn "Unable to execute $script" + fi + done +} + +finish_install_dir="/var/finish_install" + +main $@ + diff --git a/operation/format_partition.sh b/operation/format_partition.sh new file mode 100755 index 0000000..c4fcaff --- /dev/null +++ b/operation/format_partition.sh @@ -0,0 +1,106 @@ +#!/bin/bash +# +# DESCRIPTION: formating partition with a filesystem +# NOTICE: if have duplicate partition, it will format the final filesystem type. +# +# SCRIPT NAME: format_partition.sh +# +# Usage: echo "/dev/sda1 ext2" | ./format_partition.sh +# +# Input: stdin +# 1. partition +# 2. filesystem type +# 1,2 separate with space +# +# Output: +# 0 success +# 1 argument error +# 2 lack input (reserve) +# 3 deivce node doesn't exist +# 4 filesystem no implement +# 127 format partition utils not found +# +# AUTHOR: Qin Bo +# +# EMAIL: bqin@linx-info.com +# +# DATE: 2010-08-05 +# +# HISTORY: +# REVISOR DATE MODIFICATION +# Qin Bo 2010-08-05 create +# +# +# + +source ./functions + +# ex: format_partition /dev/sda1 ext3 +format_partition () +{ + if [ $# -ne 2 ];then + err "$FUNCNAME function argument error, it must be 2 !" + return 1 + fi + + devname="$1" + fs_type="$2" + + if [ ! -e "$devname" ];then + err "$devname node doesn't exist !" + return 3 + fi + + # partition may be used to swap, or has already mounted + if grep -q "^$devname " /proc/swaps ;then + swapoff "$devname" + elif grep -q "^$devname " /proc/mounts;then + reumount $devname >"$dev_LOG" 2>&1 + fi + + info "formating device "$devname" as "$fs_type" filesystem" + case ${fs_type} in + ext2) + mkfs.ext2 -F "$devname" 1>"$dev_LOG" 2>&1 + ;; + ext3) + mkfs.ext3 -F "$devname" 1>"$dev_LOG" 2>&1 + ;; + reiserfs) + yes | mkfs.reiserfs -f "$devname" 1>"$dev_LOG" 2>&1 + ;; + xfs) + yes | mkfs.xfs -f "$devname" 1>"$dev_LOG" 2>&1 + ;; + jfs) + yes | mkfs.jfs -q "$devname" 1>"$dev_LOG" 2>&1 + ;; + swap) + mkswap -f "$devname" 1>"$dev_LOG" 2>&1 + swapon "$devname" + ;; + fat) + mkfs.vfat "$devname" 1>"$dev_LOG" 2>&1 + ;; + *) + err ""$fs_type" filesystem no implement yet !" + return 4 + ;; + esac +} + +main () +{ + while read line;do + if [ -n "$line" ];then + # Notice: don't use "$line" + format_partition $line + erv + fi + done +} + +main $@ + +# vim:set ts=4 sw=4; + diff --git a/operation/functions b/operation/functions new file mode 100644 index 0000000..7751b54 --- /dev/null +++ b/operation/functions @@ -0,0 +1,147 @@ +LOG_FILE="/var/log/install.log" +dev_LOG="/dev/tty6" +TARGET="/mnt" +TMP_DIR="/tmp" + +# just for debug, also can use in run time +LOG="stdout" +#PKG_SOURCE_DIR="/Rocky/packages" + + +DATE=$(date "+%Y/%m/%d %T") + +log () +{ + case "$LOG" in + true) printf "$DATE $*\n" >>"$LOG_FILE" ;; + stdout) printf "$DATE $*\n" ;; + *) : ;; + esac +} + +err () +{ + log "error: $0: $*" >&2 +} + +warn () +{ + log "warning: $0: $*" >&2 +} + +info () +{ + log "info: $0: $*" +} + +# erv stands for "Evaluate Return Value" +erv () +{ + ret="${?}" + if [ "$ret" -ne 0 ];then + exit $ret + fi +} + +cleanup () +{ + rm -f $* +} + +# +# check mountpoint whether is duplicate +# +check_duplicate_mountpoint () +{ + if [ -s "$MOUNTPOINT_CONF" ];then + dup=$(awk '{print $2}' "$MOUNTPOINT_CONF" | sort | uniq -d) + + if [ -n "$dup" ];then + err "mountpoint: \""$(echo $dup|tr " " "," )"\" is duplicate !" + return 4 + fi + return 0 + else + err "$MOUNTPOINT_CONF file is empty or doesn't exist !" + return 8 + fi +} + +# +# check partition whether is duplicate +# +check_duplicate_partition () +{ + if [ -s "$MOUNTPOINT_CONF" ];then + dup=$(awk '{print $1}' "$MOUNTPOINT_CONF" | sort | uniq -d) + + if [ -n "$dup" ];then + err "partition: \""$(echo $dup|tr " " "," )"\" is duplicate !" + return 5 + fi + return 0 + else + err "$MOUNTPOINT_CONF file is empty or doesn't exist !" + return 8 + fi +} + +# +# check root whether will mounted +# +check_root () +{ + if [ -s "$MOUNTPOINT_CONF" ];then + if ! grep -q "[[:space:]]/[[:space:]]" $MOUNTPOINT_CONF;then + err "\"/\" partition can not be empty!" + return 6 + fi + return 0 + else + err "$MOUNTPOINT_CONF file is empty or doesn't exist !" + return 8 + fi +} + +# +# check /boot partition whether exist, if root partition is mounted by raid device +# +check_boot () +{ + if [ -s "$MOUNTPOINT_CONF" ];then + if grep " / " $MOUNTPOINT_CONF|grep -q "md" && ! grep -q " /boot " $MOUNTPOINT_CONF; then + err "boot parition mustn't mount alone, when root partition mount at raid devices !" + return 7 + fi + return 0 + else + err "$MOUNTPOINT_CONF file is empty or doesn't exist !" + return 8 + fi +} + + +# recursively umount +# arg can is a device node or mountpoint +# ex: 1.reumount /dev/hda5 +# 2.reumount /mnt/ +reumount () +{ + if [ $# -ne 1 ];then + err "$FUNCNAME function argument error, it must be 1 !" + return 1 + fi + + local arg="$1" + local mountpoint + + # if arg is a device node + if [ ! -d "$arg" ];then + mountpoint=$(dirname `grep "^$arg " /proc/mounts|awk '{print $2}'`) + else + mountpoint="$arg" + fi + for mp in $(grep "$mountpoint" /proc/mounts|sort -k2 -r |awk '{print $2}');do + umount $mp 1>"$dev_LOG" 2>&1 + done +} diff --git a/operation/generate_issue.sh b/operation/generate_issue.sh new file mode 100755 index 0000000..b31aa3a --- /dev/null +++ b/operation/generate_issue.sh @@ -0,0 +1,106 @@ +#!/bin/bash +# +# DESCRIPTION: generate system issue file +# +# SCRIPT NAME: generate_issue.sh +# +# Input: argument +# 1.version +# 2.arch +# 3.release +# 4.date +# +# Output: +# 1 argument error +# +# AUTHOR: Qin Bo +# +# EMAIL: bqin@linx-info.com +# +# DATE: 2010-08-13 +# +# HISTORY: +# REVISOR DATE MODIFICATION +# Qin Bo 2010-08-13 create +# +# +# + +source ./functions + +usage () +{ + if [ "$1" == "-n" ];then + cmd="info" + ret=0 + else + cmd="err" + ret=1 + fi + $cmd " +This script will generate issue + +Usage: $0 options + +options: + [--help] show this message + [-v | --version] version of OS + [-a | --arch] architecture of OS + [-r | --release] release of OS + [-d | --date] date of generate OS + + " + return $ret +} + +generate_issue () { + + local version="$1" + local arch="$2" + local release="$3" + local date="$4" + + echo -e "\033[H\033[J" + echo "Welcome to Rocky OS ${version} ${arch} ${release} ($date) (\n) (\l)" + echo + echo + +} + +main() +{ + + tmp=$(getopt -o v:a:r:d: --long version:,arch:,release:,date:,help -- "$@" 2>$dev_LOG) + if [ "$?" -ne 0 ];then + usage + erv + fi + + # set all argument to arg variable + eval set -- "$tmp" + + while true ;do + case "$1" in + -v|--version) local version="$2"; shift 2 ;; + -a|--arch) local arch="$2"; shift 2 ;; + -r|--release) local release="$2"; shift 2 ;; + -d|--date) local date="$2"; shift 2 ;; + --help) usage -n; exit 0 ;; + # shift the last "--", this dash is define by getopt (more information see man getopt) + --) shift; break;; + *) usage; erv ;; + esac + done + + if [ -z "$version" -a -z "$arch" -a -z "$release" -a -z "$date" ];then + usage + erv + fi + + generate_issue "$version" "$arch" "$release" "$date" >"$TARGET/etc/issue" + +} + +main $@ + + diff --git a/operation/install_pkg.sh b/operation/install_pkg.sh new file mode 100755 index 0000000..516b8c2 --- /dev/null +++ b/operation/install_pkg.sh @@ -0,0 +1,175 @@ +#!/bin/bash +# +# DESCRIPTION: install package +# +# SCRIPT NAME: install_pkg.sh +# +# Usage: echo "acl" |./install_pkg.sh -s /Rocky/packages +# +# Input: stdin +# 1. pkgname +# argument: +# [--help] show usage +# [-s|--source] Package source directory +# +# Output: +# 1 argument error +# 2 pkgname doesn't exist in source directory +# +# TODO: +# 1. need handle more case for install package (use pkgadd utils) +# 1). if package has already installed. +# 2). if devices near no spaces left. +# +# 2. add install package from below media: +# 1). install from network. +# (1). get packages.txt from mirror. +# (2). download package from mirror to hardisk /var/lib/pkg/cache, +# make sure cache is have enough spaces to store download package. +# Notice: download package, need convert package name of #->%23 +# 2). install from nfs. +# (1). mount nfs directory as package source directory. +# +# +# AUTHOR: Qin Bo +# +# EMAIL: bqin@linx-info.com +# +# DATE: 2010-08-09 +# +# HISTORY: +# REVISOR DATE MODIFICATION +# Qin Bo 2010-08-09 create +# +# +# + +source ./functions + +usage () +{ + if [ "$1" == "-n" ];then + cmd="info" + ret=0 + else + cmd="err" + ret=1 + fi + $cmd " +This script will install a package + +Usage: $0 options + +options: + [--help] Show this message + [-s | --source] Package source directory + + (ex: echo make|install_pkg.sh -s /Rocky/packages) + " + return $ret +} + +# get the package file in source directory +get_pkg_file () +{ + if [ $# -ne 1 ];then + err "$FUNCNAME function argument error , it must be 1 !" + return 1 + fi + + local pkg_name="$1" + + if [ -e "$PKG_SOURCE_DIR"/"$pkgname"'#'*tar.gz ]; then + ls "$PKG_SOURCE_DIR"/"$pkgname"'#'*tar.gz|head -n 1 + else + err "package \"$pkgname\" doesn't exist in "$PKG_SOURCE_DIR" " + return 2 + fi +} + +add_pkg () +{ + if [ $# -ne 1 ];then + err "$FUNCNAME function argument error , it must be 1 !" + return 1 + fi + + local pkg_src=$1 + pkgadd -f -r $TARGET $pkg_src 1>$dev_LOG 2>&1 +} + +install_pkg () +{ + if [ $# -ne 1 ];then + err "$FUNCNAME function argument error , it must be 1 !" + return 1 + fi + + local pkgname="$1" + + # create db for pkgutils + db_dir="/var/lib/pkg" + db="$TARGET$db_dir/db" + + if [ ! -e "$db" ];then + info "create $TARGET$db_dir ..." + mkdir -p "$TARGET$db_dir" + touch "$db" + fi + + local pkg_src=$(get_pkg_file $pkgname) + erv + + info "install $pkgname to $TARGET" + add_pkg $pkg_src + erv +} + +main () +{ + tmp=$(getopt -o s: --long source:,help -- "$@" 2>$dev_LOG) + if [ $? -ne 0 ];then + usage + erv + fi + + # set all argument to arg variable + eval set -- "$tmp" + + while true ;do + case "$1" in + -s|--source) + PKG_SOURCE_DIR="$2" + shift 2 + ;; + --help) usage -n; exit 0 ;; + # shift the last "--", this dash is define by getopt (more information see man getopt) + --) shift; break;; + *) usage; erv ;; + esac + done + + if [ -z "$PKG_SOURCE_DIR" ];then + usage + erv + elif [ ! -e "$PKG_SOURCE_DIR" ];then + err "$PKG_SOURCE_DIR doen't exist !" + exit 1 + fi + + while read line ;do + echo "$line" + done | sort -u | + while read pkgname;do + if [ -n "$pkgname" ];then + install_pkg "$pkgname" + erv + fi + done + +} + +PKG_SOURCE_DIR="" + +main "$@" + diff --git a/operation/ipcalc.pl b/operation/ipcalc.pl new file mode 100755 index 0000000..a688e00 --- /dev/null +++ b/operation/ipcalc.pl @@ -0,0 +1,625 @@ +#!/usr/bin/perl -w + +# 2/2000 krischan at jodies.cx +# +# 0.14 Release +# 0.14.1 Allow netmasks given as dotted quads +# 0.15 Colorize Classbits, Mark new bits in network +# 0.16 25.9.2000 Accept / as first argument +# Print
 tag in the script
+# 0.17    Bugfix
+# 0.18    Replace \n with 
in HTML to make konqueror work. Argh. +# 0.19 HTML modified again to make Internet Exploder work. Argh ** 2 +# Added -v Option +# 0.2 New Tabular Format. Idea by Kevin Ivory +# 0.21 +# 0.22 Don't show -1 if netmask is 32 (Sven Anderson) +# 0.23 Removed broken prototyping. Thanks to Scott Davis sdavis(a)austin-texas.net +# 0.31 4/1/2001 Print cisco wildcard (inverse netmask). +# Idea by Denis Alan Hainsworth denis(a)ans.net +# 0.32 5/21/2001 - Accepts now inverse netmask as argument (Alan's idea again) +# Fixed missing trailing zeros in sub/supernets +# Warns now when given netmasks are illegal +# Added option to suppress the binary output +# Added help text +# 0.33 5/21/2001 Cosmetic +# 0.34 6/19/2001 Use default netmask of class when no netmask is given +# 0.35 12/2/2001 Fixed big-endian bug in subnets(). This was reported +# by Igor Zozulya and Steve Kent. Thank you for your help +# and access to your sparc machine! + +use strict; + +my $version = '0.35 12/2/2001'; + + +my $private = "(Private Internet RFC 1918)"; + +my @privmin = qw (10.0.0.0 172.16.0.0 192.168.0.0); +my @privmax = qw (10.255.255.255 172.31.255.255 192.168.255.255); +my @class = qw (0 8 16 24 4 5 5); + +my $allhosts; +my $mark_newbits = 0; +my $print_html = 0; +my $print_bits = 1; +my $print_only_class = 0; + +my $qcolor = "\033[34m"; # dotted quads, blue +my $ncolor = "\033[m"; # normal, black +my $bcolor = "\033[33m"; # binary, yellow +my $mcolor = "\033[31m"; # netmask, red +my $ccolor = "\033[35m"; # classbits, magenta +my $dcolor = "\033[32m"; # subnet bits, green +my $break ="\n"; + +my $h; # Host address + +foreach (@privmin) { + $_ = &bintoint(&dqtobin("$_")); +} + +foreach (@privmax) { + $_ = &bintoint(&dqtobin("$_")); +} + + +if (! defined ($ARGV[0])) { + &usage; + exit(); +} + + +if (defined ($ARGV[0]) && $ARGV[0] eq "-help") { + help(); +} + +if (defined ($ARGV[0]) && $ARGV[0] eq "-b") { + $ARGV[0] = "-n"; + $print_bits = 0; +} + +if (defined ($ARGV[0]) && $ARGV[0] eq "-v") { + print "$version\n"; + exit 0; +} + +if (defined ($ARGV[0]) && $ARGV[0] eq "-n") { + shift @ARGV; + $qcolor = ''; + $ncolor = ''; + $bcolor = ''; + $mcolor = ''; + $ccolor = ''; + $dcolor = ''; +} + +if (defined ($ARGV[0]) && $ARGV[0] eq "-c") { + shift @ARGV; + $print_only_class = 1; +} + +if (defined ($ARGV[0]) && $ARGV[0] eq "-h") { + shift @ARGV; + $print_html = 1; + $qcolor = '' ; + $ncolor = ''; + $bcolor = ''; + $mcolor = ''; + $ccolor = ''; + $dcolor = ''; + $break = "
"; + $private = "(Private Internet)"; + print "
\n";
+    print "\n";
+}
+
+
+my $host  = "192.168.0.1";
+my $mask  = '';
+my $mask2 = '';
+my @arg;
+
+
+if ((defined $ARGV[0]) &&($ARGV[0] =~ /^(.+?)\/(.+)$/)) {
+  $arg[0] = $1;
+  $arg[1] = $2;
+  if (defined($ARGV[1])) {
+   $arg[2] = $ARGV[1];
+  }
+} else {
+  @arg = @ARGV;
+}
+
+if (defined $arg[0]) {
+    $host = $arg[0];
+}
+if (! ($host = &is_valid_dq($host)) ) {
+    print "$mcolor Illegal value for ADDRESS ($arg[0])$ncolor\n";
+}
+
+
+
+if (defined $arg[1]) {
+    $mask = $arg[1];
+    if (! ($mask = is_valid_netmask($mask)) ) {
+	print "$mcolor Illegal value for NETMASK ($arg[1])$ncolor\n";
+    }
+} 
+else 
+{
+# if mask is not defined - take the default mask of the network class
+   $mask = $class[getclass(dqtobin($host))];
+}
+
+if ($print_only_class) {
+   print $class[getclass(dqtobin($host))];
+   exit 0;
+}
+
+if (defined ($arg[2])) {
+    $mask2 = $arg[2];
+    if (! ($mask2 = is_valid_netmask($mask2)) ) {
+	print "$mcolor Illegal value for second NETMASK ($arg[2])$ncolor\n";
+    }	
+} else {
+    $mask2 = $mask;
+} 
+
+print "\n";
+
+printline ("Address",   $host                      , (&dqtobin($host),$mask,$bcolor,0) );
+my $m  = cidrtobin($mask);
+#pack( "B*",("1" x $mask) . ("0" x (32 - $mask)) );
+
+print_netmask($m,$mask);
+print "=>\n";
+
+$h = dqtobin($host);
+
+my $n = $h & $m;
+
+
+
+&printnet($n,$mask);
+
+
+if ( $mask2 == $mask ) {
+    &end;
+}
+if ($mask2 > $mask) {
+    print "Subnets\n\n";
+    $mark_newbits = 1;
+    &subnets;
+} else {
+    print "Supernet\n\n";
+    &supernet;
+}
+
+&end;
+
+sub end {
+ if ($print_html) {
+   print "\n
\n"; + } + exit; +} + +sub supernet { + $m = cidrtobin($mask2); + ##pack( "B*",("1" x $mask2) . ("0" x (32 - $mask2)) ); + $n = $h & $m; + print_netmask($m,$mask2); + print "\n"; + printnet($n,$mask2); +} + +sub subnetsREMOVED { + my $subnets = 0; + my @oldnet; + my $oldnet; + my $k; + my @nr; + my $nextnet; + my $l; + + + $m = cidrtobin($mask2); + ##pack( "B*",("1" x $mask2) . ("0" x (32 - $mask2)) ); + print_netmask($m,$mask2); + print "\n"; #*** ?? + + @oldnet = split //,unpack("B*",$n); + for ($k = 0 ; $k < $mask ; $k++) { + $oldnet .= $oldnet[$k]; + } + for ($k = 0 ; $k < ( 2 ** ($mask2 - $mask)) ; $k++) { + @nr = split //,unpack("b*",pack("L",$k)); + $nextnet = $oldnet; + for ($l = 0; $l < ($mask2 - $mask) ; $l++) { + $nextnet .= $nr[$mask2 - $mask - $l - 1] ; + } + $n = pack "B32",$nextnet; + &printnet($n,$mask2); + ++$subnets; + if ($subnets >= 1000) { + print "... stopped at 1000 subnets ...$break"; + last; + } + } + + if ( ($subnets < 1000) && ($mask2 > $mask) ){ + print "\nSubnets: $qcolor$subnets $ncolor$break"; + print "Hosts: $qcolor" . ($allhosts * $subnets) . "$ncolor$break"; + } +} + + +sub subnets +{ + my $subnet=0; + $m = cidrtobin($mask2); + print_netmask($m,$mask2); + print "\n"; + + for ($subnet=0; $subnet < 2**($mask2 - $mask); $subnet++) + { + my $net = inttobin((bintoint($n) | ($subnet << (32-$mask2)))); + printnet($net,$mask2); + if ($subnet >= 1000) { + print "... stopped at 1000 subnets ...$break"; + return; + } + } + if ($mask2 > $mask) { + print "\nSubnets: $qcolor$subnet $ncolor$break"; + print "Hosts: $qcolor" . ($allhosts * $subnet) . "$ncolor$break"; + } +} + +sub print_netmask { + my ($m,$mask2) = @_; + printline ("Netmask", &bintodq($m) . " = $mask2", ($m,$mask2,$mcolor,0) ); + printline ("Wildcard", &bintodq(~$m) , (~$m,$mask2,$bcolor,0) ); +} + +sub getclass { + my $n = $_[0]; + my $class = 1; + while (unpack("B$class",$n) !~ /0/) { + $class++; + if ($class > 5) { + last; + } + } + return $class; +} + +sub printnet { + my ($n,$mask) = @_; + my $nm; + my $type; + my $hmin; + my $hmax; + my $hostn; + my $p; + my $i; + + + ## $m = pack( "B*",("1" x $mask) . ("0" x (32 - $mask)) ); + $nm = ~cidrtobin($mask); + ##pack( "B*",("0" x $mask) . ("1" x (32 - $mask)) ); + + $b = $n | $nm; + + #$type = 1; + #while (unpack("B$type",$n) !~ /0/) { + # $type++; + #} + #if ($type > 5) { + # $type = ''; + #} else { + # $type = "Class " . chr($type+64); + #} + + $type = getclass($n); + if ($type > 5 ) { + $type = "Undefined Class"; + } else { + $type = "Class " . chr($type+64); + } + + $hmin = pack("B*",("0"x31) . "1") | $n; + $hmax = pack("B*",("0"x $mask) . ("1" x (31 - $mask)) . "0" ) | $n; + $hostn = (2 ** (32 - $mask)) -2 ; + + $hostn = 1 if $hostn == -1; + + + $p = 0; + for ($i=0; $i<3; $i++) { + if ( (&bintoint($hmax) <= $privmax[$i]) && + (&bintoint($hmin) >= $privmin[$i]) ) { + $p = $i +1; + last; + } + } + + if ($p) { + $p = $private; + } else { + $p = ''; + } + + + printline ("Network", &bintodq($n) . "/$mask", ($n,$mask,$bcolor,1), " ($ccolor" . $type. "$ncolor)" ); + printline ("Broadcast", &bintodq($b) , ($b,$mask,$bcolor,0) ); + printline ("HostMin", &bintodq($hmin) , ($hmin,$mask,$bcolor,0) ); + printline ("HostMax", &bintodq($hmax) , ($hmax,$mask,$bcolor,0) ); + printf "Hosts/Net: $qcolor%-22s$ncolor",$hostn; + + if ($p) { + print "$p"; + } + + print "$break$break\n"; + + $allhosts = $hostn; +} + +sub printline { + my ($label,$dq,$mask,$mask2,$color,$mark_classbit,$class) = @_; + $class = "" unless $class; + printf "%-11s$qcolor","$label:"; + printf "%-22s$ncolor", "$dq"; + if ($print_bits) + { + print formatbin($mask,$mask2,$color,$mark_classbit); + if ($class) { + print $class; + } + } + print $break; +} + +sub formatbin { + my ($bin,$actual_mask,$color,$mark_classbits) = @_; + my @dq; + my $dq; + my @dq2; + my $is_classbit = 1; + my $bit; + my $i; + my $j; + my $oldmask; + my $newmask; + + if ($mask2 > $mask) { + $oldmask = $mask; + $newmask = $mask2; + + } else { + $oldmask = $mask2; + $newmask = $mask; + } + + + + @dq = split //,unpack("B*",$bin); + if ($mark_classbits) { + $dq = $ccolor; + } else { + $dq = $color; + } + for ($j = 0; $j < 4 ; $j++) { + for ($i = 0; $i < 8; $i++) { + if (! defined ($bit = $dq[$i+($j*8)]) ) { + $bit = '0'; + } + + if ( $mark_newbits &&((($j*8) + $i + 1) == ($oldmask + 1)) ) { + $dq .= "$dcolor"; + } + + + $dq .= $bit; + if ( ($mark_classbits && + $is_classbit && $bit == 0)) { + $dq .= $color; + $is_classbit = 0; + } + + if ( (($j*8) + $i + 1) == $actual_mask ) { + $dq .= " "; + } + + if ( $mark_newbits &&((($j*8) + $i + 1) == $newmask) ) { + $dq .= "$color"; + } + + } + push @dq2, $dq; + $dq = ''; + } + return (join ".",@dq2) . $ncolor; + ; +} + +sub dqtobin { + my @dq; + my $q; + my $i; + my $bin; + + foreach $q (split /\./,$_[0]) { + push @dq,$q; + } + for ($i = 0; $i < 4 ; $i++) { + if (! defined $dq[$i]) { + push @dq,0; + } + } + $bin = pack("CCCC",@dq); # 4 unsigned chars + return $bin; +} + +sub bintodq { + my $dq = join ".",unpack("CCCC",$_[0]); +print + return $dq; +} + +sub inttobin { + return pack("N",$_[0]); +} + +sub bintoint { + return unpack("N",$_[0]); +} + + +sub is_valid_dq { + my $value = $_[0]; + my $test = $value; + my $i; + my $corrected; + $test =~ s/\.//g; + if ($test !~ /^\d+$/) { + return 0; + } + my @value = split /\./, $value, 4; + for ($i = 0; $i<4; $i++) { + if (! defined ($value[$i]) ) { + $value[$i] = 0; + } + if ( ($value[$i] !~ /^\d+$/) || + ($value[$i] < 0) || + ($value[$i] > 255) ) + { + return 0; + } + } + $corrected = join ".", @value; + return $corrected; +} + +sub is_valid_netmask { + my $mask = $_[0]; + if ($mask =~ /^\d+$/) { + if ( ($mask > 32) || ($mask < 1) ) { + return 0; + } + } else { + if (! ($mask = &is_valid_dq($mask)) ) { + return 0; + } + $mask = dqtocidr($mask); + } + return $mask; + +} + + +sub cidrtobin { + my $cidr = $_[0]; + pack( "B*",(1 x $cidr) . (0 x (32 - $cidr)) ); +} + +sub dqtocidr { + my $dq = $_[0]; + $b = &dqtobin($dq); + my $cidr = 1; + my $firstbit = unpack("B1",$b) ^ 1; + while (unpack("B$cidr",$b) !~ /$firstbit/) { + $cidr++; + last if ($cidr == 33); + } + $cidr--; + #print "CIDR: $cidr\n"; + #print "DQ: $dq\n"; + my $m = cidrtobin($cidr); + #print "NM: " . bintodq($m) . "\n"; + #print "NM2: " . bintodq(~$m) . "\n"; + if (bintodq($m) ne $dq && bintodq(~$m) ne $dq) { + print "$mcolor Corrected illegal netmask: $dq" . "$ncolor\n"; + } + return $cidr; + +} + +sub usage { + print << "EOF"; +Usage: ipcalc [-n|-h|-v|-help]
[[/]] [NETMASK] + +ipcalc takes an IP address and netmask and calculates the resulting broadcast, +network, Cisco wildcard mask, and host range. By giving a second netmask, you +can design sub- and supernetworks. It is also intended to be a teaching tool +and presents the results as easy-to-understand binary values. + + + -n Don't display ANSI color codes + -b Suppress the bitwise output + -c Just print bit-count-mask of given address + -h Display results as HTML + -help Longer help text + -v Print Version + +Examples: + +ipcalc 192.168.0.1/24 +ipcalc 192.168.0.1/255.255.128.0 +ipcalc 192.168.0.1 255.255.128.0 255.255.192.0 +ipcalc 192.168.0.1 0.0.63.255 + +EOF +} + +sub help { + print << "EOF"; + +IP Calculator $version + +Enter your netmask(s) in CIDR notation (/25) or dotted decimals (255.255.255.0). +Inverse netmask are recognized. If you mmit the netmask, ipcalc uses the default +netmask for the class of your network. + +Look at the space between the bits of the addresses: The bits before it are +the network part of the address, the bits after it are the host part. You can +see two simple facts: In a network address all host bits are zero, in a +broadcast address they are all set. + +The class of your network is determined by its first bits. + +If your network is a private internet according to RFC 1918 this is remarked. +When displaying subnets the new bits in the network part of the netmask are +marked in a different color. + +The wildcard is the inverse netmask as used for access control lists in Cisco +routers. You can also enter netmasks in wildcard notation. + +Do you want to split your network into subnets? Enter the address and netmask +of your original network and play with the second netmask until the result +matches your needs. + + +Questions? Comments? Drop me a mail... +krischan at jodies.de +http://jodies.de/ipcalc + +Thanks for your nice ideas and help to make this tool more useful: + +Hermann J. Beckers hj.beckers(a)kreis-steinfurt.de +Kevin Ivory ki(a)sernet.de +Frank Quotschalla gutschy(a)netzwerkinfo.de +Sven Anderson sven(a)anderson.de +Scott Davis sdavis(a)austin-texas.net +Denis A. Hainsworth denis(a)ans.net +Steve Kent stevek(a)onshore.com +Igor Zozulya izozulya(a)yahoo.com + + +EOF +usage(); +exit; +} + diff --git a/operation/makeinitrd b/operation/makeinitrd new file mode 100755 index 0000000..39aeca5 --- /dev/null +++ b/operation/makeinitrd @@ -0,0 +1,4 @@ +#!/bin/bash + +modules=$(ls /Rocky/modules/|grep -v .bak|grep -v .old) +mkinitrd /mnt/boot/initrd.gz $modules --without-usb --without-multipath --fstab=/mnt/etc/fstab -f diff --git a/operation/mk_serv_autoboot.sh b/operation/mk_serv_autoboot.sh new file mode 100755 index 0000000..4dd588f --- /dev/null +++ b/operation/mk_serv_autoboot.sh @@ -0,0 +1,129 @@ + +#!/bin/bash +# +# DESCRIPTION: this script use for start system autoboot services. +# have to make a sysmbol link to script of autotboot services, +# and generate $pkgname-serv.conf, this configure file use by post_add. +# +# Usage: echo "netkit-base inetd rsh S310"|./mk_serv_autoboot.sh +# +# SCRIPT NAME: mk_serv_autoboot.sh +# +# Input: stdin +# 1. package name of autoboot services +# 2. boot script +# 3. boot service +# 4. boot number +# +# Output: +# 1 argument error +# 2 boot script doesn't exist +# +# AUTHOR: Qin Bo +# +# EMAIL: bqin@linx-info.com +# +# DATE: 2010-08-23 +# +# HISTORY: +# REVISOR DATE MODIFICATION +# Qin Bo 2010-08-23 create +# +# +# + +source ./functions + +make_sysmbol_link () +{ + + if [ $# -ne 2 ];then + err "$FUNCNAME function argument error, it must be 2 !" + return 1 + fi + + local script="$1" + local number="$2" + + for dir in $rc_dir; do + pushd $dir >$dev_LOG && + if [ -e $init_dir/$script ];then + if [ -L "$dir/$number$script" ];then + # may be the symbol link has already exist, skip it, + # mulit-services, may have common script to boot it. + # ex: rsh and rlogin service start through inetd script. + : + else + ln -sf ../init.d/$script ./$number$script + fi + else + err "$script doesn't exist in $init_dir" + return 2 + fi + popd >$dev_LOG + done + +} + +# generate $pkgname-serv.conf, use by $pkgname.post_add +gen_serv_cnf () +{ + if [ $# -ne 2 ];then + err "$FUNCNAME function argument error, it must be 2 !" + return 1 + fi + + local pkgname="$1" + local service="$2" + + # may be some boot services needn't configure also generate pkgname-serv.conf + # ex: at service, if it need autoboot, it also generate at-serv.conf, + # although it needn't configure + if [ -e "$serv_cfg_dir/$pkgname-serv.conf" ];then + # to avoid duplicate-line in $pkgname-serv.conf, we only append it when $service=yes + # not exist in $pkgname-serv.conf + if [ -z "$(grep "$service=yes" "$serv_cfg_dir/$pkgname-serv.conf")" ];then + printf "%s=yes\n" $service >> "$serv_cfg_dir"/"$pkgname-serv.conf" + fi + else + printf "%s=yes\n" $service > "$serv_cfg_dir"/"$pkgname-serv.conf" + fi + +} + + +mk_serv_autoboot () +{ + + local pkgname="$1" + local script="$2" + local service="$3" + local number="$4" + + make_sysmbol_link "$script" "$number" + erv + gen_serv_cnf "$pkgname" "$service" + erv + +} + +main () +{ + while read line;do + if [ -n "$line" ];then + mk_serv_autoboot $line + erv + fi + done +} + + +rcd="$TARGET/etc/rc.d" +init_dir="$rcd/init.d" +# according old Rocky installer, make symbol link in rc3.d and rc5.d +rc_dir="$rcd/rc3.d $rcd/rc5.d" +serv_cfg_dir="$TARGET/var/lib/pkg" + +main $@ + + diff --git a/operation/mount_partition.sh b/operation/mount_partition.sh new file mode 100755 index 0000000..40e8689 --- /dev/null +++ b/operation/mount_partition.sh @@ -0,0 +1,96 @@ +#!/bin/bash +# +# DESCRIPTION: mounting all partitions which from stdin +# +# SCRIPT NAME: mount_partition.sh +# +# Usage: echo "/dev/sda1 / ext3" |./mount_partition.sh +# +# Notice: don't expect mount swap partition : ) +# +# Input: stdin +# 1. partition +# 2. mountpoint +# 3. filesystem type +# below input is optional, if not set, we mount default configure, +# 4. fs_mntops: set mount options +# Output: +# 1 argument error +# 2 lack input (reserve) +# 3 device node doesn't exist +# 32 mount failure +# +# AUTHOR: Qin Bo +# +# EMAIL: bqin@linx-info.com +# +# DATE: 2010-08-06 +# +# HISTORY: +# REVISOR DATE MODIFICATION +# Qin Bo 2010-08-06 create +# +# +# + +source ./functions + +mount_partition () +{ + local devname="$1" + local mountpoint="$2" + local fs_type="$3" + local fs_mntops="$4" + + if [ ! -e "$devname" ];then + err "$devname node doesn't exist !" + return 3 + fi + + if [ "$mountpoint" == "/" ];then + mount_pos="$TARGET" + else + mount_pos="$TARGET$mountpoint" + fi + + # mount filesystem for default option + # after install will set acl, so we use acl option mount here + # this configure according old Rocky installer + case $fs_type in + ext2|ext3|reiserfs) + [ -z "$fs_mntops" ] && fs_mntops="acl" ;; + *) + [ -z "$fs_mntops" ] && fs_mntops="defaults" ;; + esac + + if [ ! -d "$mount_pos" ];then + info "create directory $mount_pos ..." + mkdir -p "$mount_pos" + fi + + # mountpoint has already mounted, umount it + if mountpoint -q $mount_pos;then + # may be have mountpoint under the mountpoint directory + reumount $mount_pos + fi + + info "mount $devname on $mount_pos with $fs_type filesystem" + mount -t "$fs_type" -o $fs_mntops "$devname" "$mount_pos" 1>"$dev_LOG" 2>&1 +} + +main() +{ + while read line; do + echo $line + done|sort -k 2 -u| + while read line; do + if [ -n "$line" ];then + mount_partition $line + erv + fi + done +} + +main "$@" + +