Verified Commit e7e3fd8f authored by Andrei Kirushchanka's avatar Andrei Kirushchanka
Browse files

swap.sh

parent b9385e43
Pipeline #48223 passed with stage
in 59 seconds
#!/bin/sh
# System utilities: dd, mount, mkswap, swapon, swapoff, chmod, cat, grep, echo, rm, cp, mv, exit
# Global variables
SWAP_FILE="${SWAP_FILE:=/swapfile}"
SWAP_FILE_PERM=0600
SWAP_ACTION_DEFAULT='help'
SWAP_ACTION="${SWAP_ACTION:=$1}"
SWAP_SIZE_DEFAULT_MAX=64
SWAP_SIZE_DEFAULT_MIN=1
SWAP_SIZE_DEFAULT=$((SWAP_SIZE_DEFAULT_MAX / 16))
SWAP_SIZE=${SWAP_SIZE:=$2}
SWAP_BLOCK_SIZE_DEFAULT_MAX=16384
SWAP_BLOCK_SIZE_DEFAULT_MIN=512
SWAP_BLOCK_SIZE_DEFAULT=$SWAP_BLOCK_SIZE_DEFAULT_MIN
SWAP_BLOCK_SIZE=${SWAP_BLOCK_SIZE:=$3}
FSTAB_FILE='/etc/fstab'
FSTAB_BAKCUP_FILE="${FSTAB_FILE}.back"
FSTAB_SWAP_FILE="${FSTAB_FILE}.swapfile"
FSTAB_SWAP_FILE_LINE="${SWAP_FILE} none swap sw 0 0"
#### HELP
# Help message
swap_file_help_message()
{
cat << _H_E_L_P
Usage: swap.sh [action] [swap_size] [swap_block_size]
SWAP file create/remove on the system.
Actions (by default: help):
c, create SWAP file create. By default: ${SWAP_FILE}
r, remove SWAP file remove. By default: ${SWAP_FILE}
h, help Print this message.
Arguments:
[swap_size] Set size of SWAP file (gigabytes).
By default: ${SWAP_SIZE_DEFAULT}, min=${SWAP_SIZE_DEFAULT_MIN}, max=${SWAP_SIZE_DEFAULT_MAX}.
[swap_block_size] Set block size of SWAP file (bytes).
By default: ${SWAP_BLOCK_SIZE_DEFAULT}, min=${SWAP_BLOCK_SIZE_DEFAULT_MIN}, max=${SWAP_BLOCK_SIZE_DEFAULT_MAX}.
Environment variables:
SWAP_FILE Set full path of SWAP file.
SWAP_ACTION Set action for the script running.
SWAP_SIZE Set size of SWAP file.
SWAP_BLOCK_SIZE Set block size of SWAP file.
SWAP_FILE Set SWAP file path.
_H_E_L_P
}
# Print help message
swap_file_help()
{
swap_file_help_message
exit 0
}
# Print help, error message and exit
swap_file_error()
{
swap_file_help_message
echo ''
echo "ERROR: $*"
exit 1
}
#### DEFINITION (action, size, block size)
# SWAP size check as integer
_size_check_as_integer()
{
if [ -z "$1" ]; then
swap_file_error "SWAP ${2}size is empty"
else
echo "$1" | grep -Eq '^[0-9]+$' > /dev/null
if [ ! $? -eq 0 ]; then
swap_file_error "Invalid SWAP ${2}size '$1'." "Must be integer"
fi
fi
}
# Min size check
_size_check_as_min()
{
if [ $2 -gt $1 ]; then
swap_file_error "Invalid SWAP ${3}size '$1'." "Must be min=$2"
fi
}
# Max size check
_size_check_as_max()
{
if [ $1 -gt $2 ]; then
swap_file_error "Invalid SWAP ${3}size '$1'." "Must be max=$2"
fi
}
# SWAP action define/check
swap_file_action_define()
{
case "$SWAP_ACTION" in
create | c )
SWAP_ACTION='create'
;;
remove | r )
SWAP_ACTION='remove'
;;
help | h | '' )
SWAP_ACTION="$SWAP_ACTION_DEFAULT"
;;
* )
swap_file_error "Invalid action '$SWAP_ACTION'"
;;
esac
}
# SWAP size define/check
swap_file_size_define()
{
case "$SWAP_SIZE" in
'' )
SWAP_SIZE=$SWAP_SIZE_DEFAULT
;;
* )
swap_file_size_check
;;
esac
}
# SWAP size check
swap_file_size_check()
{
_size_check_as_integer "$SWAP_SIZE" ''
_size_check_as_min "$SWAP_SIZE" "$SWAP_SIZE_DEFAULT_MIN" ''
_size_check_as_max "$SWAP_SIZE" "$SWAP_SIZE_DEFAULT_MAX" ''
}
# SWAP block size define/check
swap_file_block_size_define()
{
case "$SWAP_BLOCK_SIZE" in
'' )
SWAP_BLOCK_SIZE=$SWAP_BLOCK_SIZE_DEFAULT
;;
* )
swap_file_block_size_check
;;
esac
}
# SWAP block size check
swap_file_block_size_check()
{
local x_block_size=$SWAP_BLOCK_SIZE_DEFAULT_MIN
local str_block='block '
_size_check_as_integer "$SWAP_BLOCK_SIZE" "$str_block"
_size_check_as_min "$SWAP_BLOCK_SIZE" "$SWAP_BLOCK_SIZE_DEFAULT_MIN" "$str_block"
_size_check_as_max "$SWAP_BLOCK_SIZE" "$SWAP_BLOCK_SIZE_DEFAULT_MAX" "$str_block"
# Validation
while true; do
if [ "$x_block_size" = "$SWAP_BLOCK_SIZE" ]; then
break
else
# Block size error
if [ $x_block_size -gt $SWAP_BLOCK_SIZE ]; then
swap_file_error "Invalid SWAP block size '$SWAP_BLOCK_SIZE'." \
"Must be '$x_block_size'"
fi
fi
x_block_size=$(($x_block_size * 2))
done
}
#### SWAP CREATION
# SWAP file create on system
swap_file_create_on_system()
{
local block_size=$(($SWAP_SIZE * 1024 * 1024 * 1024 / $SWAP_BLOCK_SIZE))
echo "SWAP file creating..."
dd if=/dev/zero of=$SWAP_FILE bs=$SWAP_BLOCK_SIZE count=$block_size status=progress
if [ $? -eq 0 ]; then
chmod $SWAP_FILE_PERM "$SWAP_FILE"
echo "File '$SWAP_FILE' has been created"
else
swap_file_error "File '$SWAP_FILE' has not been created"
fi
}
# SWAP make
swap_file_make()
{
mkswap "$SWAP_FILE"
if [ ! $? -eq 0 ]; then
swap_file_error "SWAP has not been maked"
fi
swapon "$SWAP_FILE"
if [ ! $? -eq 0 ]; then
swap_file_error "SWAP file has not been swiched on"
fi
}
# SWAP file create
swap_file_create()
{
if [ -f "$SWAP_FILE" ]; then
swap_file_error "File '$SWAP_FILE' already exists"
fi
swap_file_create_on_system
swap_file_make
cp "$FSTAB_FILE" "$FSTAB_BAKCUP_FILE"
if [ ! $? -eq 0 ]; then
echo "WARNING: Backup file '$FSTAB_BAKCUP_FILE' has not been created"
fi
echo "$FSTAB_SWAP_FILE_LINE" >> "$FSTAB_FILE"
if [ $? -eq 0 ]; then
mount -a
echo "SWAP file has been created"
else
swap_file_error "SWAP file has not been added in '$FSTAB_FILE'"
fi
}
#### SWAP REMOVING
# /etc/fstab (FSTAB_FILE) restore
swap_file_restore_fstab()
{
cp "$FSTAB_FILE" "$FSTAB_SWAP_FILE"
if [ -f "$FSTAB_BAKCUP_FILE" ]; then
mv "$FSTAB_BAKCUP_FILE" "$FSTAB_FILE"
else
grep -vwE "$SWAP_FILE" "$FSTAB_SWAP_FILE" > "$FSTAB_FILE"
if [ ! $? -eq 0 ]; then
swap_file_error "File '$FSTAB_FILE' has not been updated without SWAP file"
fi
fi
mount -a
}
# SWAP file remove from /etc/fstab (FSTAB_FILE)
swap_file_remove_from_fstab()
{
cat $FSTAB_FILE | grep "$SWAP_FILE" > /dev/null
if [ $? -eq 0 ]; then
swap_file_restore_fstab
else
echo "WARNING: File '$SWAP_FILE' does not exist in '$FSTAB_FILE'"
fi
}
# SWAP file remove
swap_file_remove()
{
echo "SWAP file removing..."
swap_file_remove_from_fstab
if [ ! -f "$SWAP_FILE" ]; then
swap_file_error "File '$SWAP_FILE' does not exist"
fi
swapoff "$SWAP_FILE"
if [ $? -eq 0 ]; then
rm -f "$SWAP_FILE"
echo "File '$SWAP_FILE' has been removed"
else
swap_file_error "SWAP OFF is failed"
fi
}
#### MAIN
# Main function
swap_file()
{
swap_file_action_define
swap_file_block_size_define
swap_file_size_define
swap_file_$SWAP_ACTION
}
# Execution if defined that
if [ -f "$0" ]; then
swap_file
exit 0
fi
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment