linux-tools/modules/swap/module.py

130 lines
5.1 KiB
Python
Raw Normal View History

2020-01-17 19:21:48 +01:00
import subprocess
from AbstractModule import AbstractModule
2020-01-18 04:15:08 +01:00
from PyInquirer import prompt
2020-01-17 19:21:48 +01:00
2020-01-18 04:15:08 +01:00
class SwapModule(AbstractModule):
2020-01-17 19:21:48 +01:00
def __init__(self):
super().__init__()
2020-01-18 04:15:08 +01:00
def run(self):
2020-01-20 22:42:01 +01:00
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
2020-01-20 22:42:01 +01:00
}
2020-01-18 04:15:08 +01:00
menu = [
{
'type': 'list',
'message': 'Select action',
'name': 'action',
2020-01-20 22:42:01 +01:00
'choices': list(map(lambda x: {"name": x}, actions.keys()))
2020-01-18 04:15:08 +01:00
}
]
selected_action = prompt(menu)['action']
2020-01-20 22:42:01 +01:00
actions[selected_action]()
def _create_resize_persistent_swap(self):
self._create_resize_swap()
self._make_swap_persistent()
2020-01-17 19:21:48 +01:00
def _get_swap_location(self):
2020-01-18 04:15:08 +01:00
output_swaps = subprocess.check_output(['cat', '/proc/swaps']).decode("UTF-8")
try:
2020-01-25 02:38:12 +01:00
swap_location = output_swaps.split()[5]
2020-01-25 01:01:37 +01:00
print("Swap is located here:", swap_location)
return swap_location
2020-01-18 04:15:08 +01:00
except IndexError:
2020-01-21 23:58:34 +01:00
print("Swap file doesn´t exist!")
return None
def _get_swap_size(self):
swap_size = subprocess.check_output(['swapon', '--show']).decode("UTF-8")
try:
2020-01-25 02:38:12 +01:00
swap_size = swap_size.split()[7]
2020-01-25 01:01:37 +01:00
print("Swap is {}b big!".format(swap_size))
except IndexError:
print("Swap file doesn´t exist!")
2020-01-17 19:21:48 +01:00
def _create_resize_swap(self):
2020-01-18 04:15:08 +01:00
output_swapon = subprocess.check_output(['swapon', '--show']).decode("UTF-8")
if output_swapon:
swap_size = subprocess.check_output(['swapon', '--show']).decode("UTF-8")
2020-01-25 01:01:37 +01:00
swap_size = swap_size.split()[7]
2020-01-18 04:15:08 +01:00
print("")
print("Swap already installed! You can resize it!")
2020-01-25 01:01:37 +01:00
print("Curr. swap size: {}b".format(swap_size))
2020-01-25 02:38:41 +01:00
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"
2020-01-18 04:15:08 +01:00
subprocess.call(resize_swapfile, shell=True)
output_free = subprocess.check_output(['free', '-h']).decode("UTF-8")
print(output_free.strip())
2020-01-17 19:21:48 +01:00
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)
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):
2020-01-25 01:02:59 +01:00
options = {
2020-01-20 22:33:50 +01:00
"Light": 25,
"Default": 60,
"Aggressive": 100
}
2020-01-20 14:58:24 +01:00
menu = [
{
'type': 'list',
'message': 'Select action',
'name': 'action',
2020-01-25 01:02:59 +01:00
'choices': list(map(lambda x: {"name": x}, options.keys()))
2020-01-20 14:58:24 +01:00
}
]
selected_swapiness = prompt(menu)['action']
2020-01-25 01:02:59 +01:00
adjust = "sudo sysctl vm.swappiness=" + str(options[selected_swapiness])
2020-01-20 22:33:50 +01:00
subprocess.call(adjust, shell=True)
2020-01-25 01:02:59 +01:00
print("Temporary swapiness is " + str(options[selected_swapiness]))
2020-01-20 14:58:24 +01:00
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)
2020-01-25 02:12:10 +01:00
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())