2020-08-02 23:24:08 +02:00
|
|
|
|
import subprocess
|
|
|
|
|
from typing import List
|
|
|
|
|
|
|
|
|
|
from PyInquirer import prompt
|
|
|
|
|
|
|
|
|
|
from print_helpers import print_bold, print_warn, print_gr
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def run_shell_command(cmd: List[str]) -> str:
|
|
|
|
|
return subprocess.check_output(cmd).decode("UTF-8").strip()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_resize_persistent_swap():
|
|
|
|
|
create_resize_swap()
|
|
|
|
|
make_swap_persistent()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_swap_location():
|
|
|
|
|
output_swaps = run_shell_command(["cat", "/proc/swaps"])
|
|
|
|
|
try:
|
|
|
|
|
swap_location = output_swaps.split()[5]
|
|
|
|
|
print_bold(f"Swap is located here: {swap_location}")
|
|
|
|
|
return swap_location
|
|
|
|
|
except IndexError:
|
|
|
|
|
print_warn("Swap file doesn´t exist!")
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_swap_size():
|
|
|
|
|
swap_size = run_shell_command(['swapon', '--show'])
|
|
|
|
|
try:
|
|
|
|
|
swap_size = swap_size.split()[7]
|
|
|
|
|
print_gr(f"Swap is {swap_size}b big!")
|
|
|
|
|
except IndexError:
|
|
|
|
|
print_warn("Swap file doesn´t exist!")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_resize_swap():
|
|
|
|
|
output_swapon = run_shell_command(['swapon', '--show'])
|
|
|
|
|
if output_swapon is not "":
|
|
|
|
|
swap_size = output_swapon.split()[7]
|
|
|
|
|
print("")
|
|
|
|
|
print_bold("Swap already installed! You can resize it!")
|
|
|
|
|
print_bold(f"Curr. swap size: {swap_size}b")
|
|
|
|
|
resize = input("How big should your swap become (numbers in Gigabyte)? ")
|
|
|
|
|
resize_swapfile = "swapoff /swapfile && " + \
|
|
|
|
|
f"fallocate -l {resize}G /swapfile && " + \
|
|
|
|
|
"mkswap /swapfile && " + \
|
|
|
|
|
"swapon /swapfile"
|
|
|
|
|
subprocess.call(resize_swapfile, shell=True)
|
|
|
|
|
output_free = run_shell_command(["free", "-h"])
|
|
|
|
|
print_gr(output_free)
|
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
size = input("How big should the swap be (numbers in Gigabyte)? ")
|
|
|
|
|
create_swapfile = f"fallocate -l {size}G /swapfile && " + \
|
|
|
|
|
"chmod 600 /swapfile && " + \
|
|
|
|
|
"mkswap /swapfile && " + \
|
|
|
|
|
"swapon /swapfile"
|
|
|
|
|
subprocess.call(create_swapfile, shell=True)
|
|
|
|
|
|
|
|
|
|
output_free = run_shell_command(["free", "-h"])
|
|
|
|
|
print_gr(output_free)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def make_swap_persistent():
|
|
|
|
|
swap_location = get_swap_location()
|
|
|
|
|
if swap_location is None:
|
|
|
|
|
print_warn("Swap file doesn't exist!")
|
|
|
|
|
return
|
|
|
|
|
backup_fstab = "cp /etc/fstab /etc/fstab.bak"
|
|
|
|
|
enable_persistence = f"echo '{swap_location} none swap sw 0 0' | tee -a /etc/fstab"
|
|
|
|
|
if fstab_entry_exists():
|
|
|
|
|
print_warn("Swap is already persistent!")
|
|
|
|
|
else:
|
|
|
|
|
subprocess.call(backup_fstab, shell=True)
|
|
|
|
|
subprocess.call(enable_persistence, shell=True)
|
|
|
|
|
print_gr("Swap is now persistent!")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def show_swapiness():
|
|
|
|
|
print_gr(run_shell_command(["cat", "/proc/sys/vm/swappiness"]))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def adjust_swapiness_temp():
|
|
|
|
|
options = {
|
|
|
|
|
"Light": 25,
|
|
|
|
|
"Default": 60,
|
|
|
|
|
"Aggressive": 100
|
|
|
|
|
}
|
|
|
|
|
menu = [
|
|
|
|
|
{
|
|
|
|
|
'type': 'list',
|
|
|
|
|
'message': 'Select action',
|
|
|
|
|
'name': 'action',
|
|
|
|
|
'choices': list(map(lambda x: {"name": x}, options.keys()))
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
selected_swapiness = prompt(menu)['action']
|
|
|
|
|
|
|
|
|
|
adjust = "sysctl vm.swappiness=" + str(options[selected_swapiness])
|
|
|
|
|
subprocess.call(adjust, shell=True)
|
|
|
|
|
print_gr("Temporary swapiness is " + str(options[selected_swapiness]))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def delete_swap():
|
|
|
|
|
swap_location = get_swap_location()
|
|
|
|
|
if swap_location is None:
|
|
|
|
|
return
|
|
|
|
|
disable_swapfile = f"swapoff {swap_location} && " + \
|
|
|
|
|
f"rm {swap_location}"
|
|
|
|
|
if fstab_entry_exists():
|
|
|
|
|
with open("/etc/fstab", "r") as fstab_out:
|
|
|
|
|
content = fstab_out.readlines()
|
|
|
|
|
with open("/etc/fstab", "w") as fstab_in:
|
|
|
|
|
content = content[:-1]
|
|
|
|
|
for line in content:
|
|
|
|
|
fstab_in.write(line)
|
|
|
|
|
else:
|
|
|
|
|
print_warn("No entry in /etc/fstab!")
|
|
|
|
|
subprocess.call(disable_swapfile, shell=True)
|
|
|
|
|
output_swapon = run_shell_command(['swapon', '--show'])
|
|
|
|
|
output_free = run_shell_command(["free", "-h"])
|
|
|
|
|
if not output_swapon:
|
|
|
|
|
print_gr("Swap deleted!")
|
|
|
|
|
print_gr(output_free)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def fstab_entry_exists():
|
|
|
|
|
swap_location = get_swap_location()
|
|
|
|
|
fstab_entry = f"{swap_location} none swap sw 0 0\n"
|
|
|
|
|
with open("/etc/fstab", "r") as fstab_file:
|
|
|
|
|
line = fstab_file.readlines()[-1]
|
|
|
|
|
if line != fstab_entry:
|
|
|
|
|
print_warn("No entry in /etc/fstab")
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
print_gr(f"fstab entry: {line.strip()}")
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def run():
|
|
|
|
|
actions = {
|
|
|
|
|
"Create/Resize temp. swap": create_resize_swap,
|
|
|
|
|
"Create/Resize persistent swap": create_resize_persistent_swap,
|
|
|
|
|
"Delete swap": delete_swap,
|
|
|
|
|
"Make temp. swap persistent": make_swap_persistent,
|
|
|
|
|
"Get swap location": get_swap_location,
|
|
|
|
|
"Get swap size": get_swap_size,
|
|
|
|
|
"Show swapiness": show_swapiness,
|
|
|
|
|
"Adjust temp. swapiness": adjust_swapiness_temp,
|
|
|
|
|
"Check fstab for entry": fstab_entry_exists,
|
|
|
|
|
}
|
|
|
|
|
menu = [
|
|
|
|
|
{
|
|
|
|
|
'type': 'list',
|
|
|
|
|
'message': 'Select action',
|
|
|
|
|
'name': 'action',
|
|
|
|
|
'choices': list(map(lambda x: {"name": x}, actions.keys()))
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
selected_action = prompt(menu)['action']
|
|
|
|
|
actions[selected_action]()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
functions = run
|