linux-tools/modules/swap/module.py
2020-02-01 03:06:37 +01:00

155 lines
6.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import subprocess
from AbstractModule import AbstractModule
from PyInquirer import prompt
class SwapModule(AbstractModule):
def __init__(self):
super().__init__()
def run(self):
actions = {
"Create/Resize temp. swap": self._create_resize_swap,
"Create/Resize persistent swap": self._create_resize_persistent_swap,
"Delete swap": self._delete_swap,
"Make temp. swap persistent": self._make_swap_persistent,
"Get swap location": self._get_swap_location,
"Get swap size": self._get_swap_size,
"Show swapiness": self._show_swapiness,
"Adjust temp. swapiness": self._adjust_swapiness_temp,
"Check fstab for entry": self._check_fstab_entry
}
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]()
def _create_resize_persistent_swap(self):
self._create_resize_swap()
self._make_swap_persistent()
def _get_swap_location(self):
output_swaps = subprocess.check_output(['cat', '/proc/swaps']).decode("UTF-8")
try:
swap_location = output_swaps.split()[5]
print("Swap is located here:", swap_location)
return swap_location
except IndexError:
print("Swap file doesn´t exist!")
return None
def _get_swap_size(self):
swap_size = subprocess.check_output(['swapon', '--show']).decode("UTF-8")
try:
swap_size = swap_size.split()[7]
print("Swap is {}b big!".format(swap_size))
except IndexError:
print("Swap file doesn´t exist!")
def _create_resize_swap(self):
output_swapon = subprocess.check_output(['swapon', '--show']).decode("UTF-8")
if output_swapon:
swap_size = subprocess.check_output(['swapon', '--show']).decode("UTF-8")
swap_size = swap_size.split()[7]
print("")
print("Swap already installed! You can resize it!")
print("Curr. swap size: {}b".format(swap_size))
resize = input("How big should your swap become (numbers in Gigabyte)? ")
resize_swapfile = "sudo swapoff /swapfile && " + \
"sudo fallocate -l {}G /swapfile && ".format(resize) + \
"sudo mkswap /swapfile && " + \
"sudo swapon /swapfile"
subprocess.call(resize_swapfile, shell=True)
output_free = subprocess.check_output(['free', '-h']).decode("UTF-8")
print(output_free.strip())
else:
size = input("How big should the swap be (numbers in Gigabyte)? ")
create_swapfile = "sudo fallocate -l {}G /swapfile && ".format(size) + \
"sudo chmod 600 /swapfile && " + \
"sudo mkswap /swapfile && " + \
"sudo swapon /swapfile"
subprocess.call(create_swapfile, shell=True)
output_free = subprocess.check_output(['free', '-h']).decode("UTF-8")
print(output_free.strip())
def _make_swap_persistent(self):
swap_location = self._get_swap_location()
if swap_location is None:
print("Swap file doesn't exist!")
return
backup_fstab = "sudo cp /etc/fstab /etc/fstab.bak"
enable_persistence = "echo '{} none swap sw 0 0' | sudo tee -a /etc/fstab".format(swap_location)
if self._check_fstab_entry():
print("Swap is already persistent!")
else:
subprocess.call(backup_fstab, shell=True)
subprocess.call(enable_persistence, shell=True)
print("Swap is now persistent!")
def _show_swapiness(self):
get_swapiness = "cat /proc/sys/vm/swappiness"
subprocess.call(get_swapiness, shell=True)
def _adjust_swapiness_temp(self):
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 = "sudo sysctl vm.swappiness=" + str(options[selected_swapiness])
subprocess.call(adjust, shell=True)
print("Temporary swapiness is " + str(options[selected_swapiness]))
def _delete_swap(self):
swap_location = self._get_swap_location()
if swap_location is None:
return
disable_swapfile = "sudo swapoff {} && ".format(swap_location) + \
"sudo rm {}".format(swap_location)
if self._check_fstab_entry():
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("No entry in /etc/fstab!")
subprocess.call(disable_swapfile, shell=True)
output_swapon = subprocess.check_output(['swapon', '--show']).decode("UTF-8")
output_free = subprocess.check_output(['free', '-h']).decode("UTF-8")
if not output_swapon:
print("Swap deleted!")
print(output_free.strip())
def _check_fstab_entry(self):
swap_location = self._get_swap_location()
fstab_entry = "{} none swap sw 0 0\n".format(swap_location)
with open("/etc/fstab", "r") as fstab_file:
line = fstab_file.readlines()[-1]
if line != fstab_entry:
print("No entry in /etc/fstab")
return False
else:
print("fstab entry:", line.strip())
return True