-
Notifications
You must be signed in to change notification settings - Fork 0
/
autodelete-ramdisk.py
117 lines (100 loc) · 3.29 KB
/
autodelete-ramdisk.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#! /usr/bin/python
#
# A Linux-based solution allowing temporary files to exist for a few seconds
# before being disposed. Orders of magnitude faster than rm -rf.
# -------------------------------------------------
#
# Written and maintained by Paul S. Ziegler
#
# Copyright 2017 Reflare Ltd. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
# http://www.apache.org/licenses/LICENSE-2.0
#
from sys import argv,exit
from os import path, system
from commands import getstatusoutput
from time import sleep
import signal
def printUsage():
print """Usage: ./autodelete-ramdisk.py symlink mountpoint_a mountpoint_b size_in_mb rotation_time
symlink:\tThe symlink pointing to the currently active ramdisk.
mountpoint_a:\tMountpoint for the first ramdisk.
mountpoint_b:\tMountpoint for the second ramdisk.
size_in_mb:\tSize of each ramdisk in MB.
rotation_time:\tSwitch between ramdisks every X seconds.
"""
if len(argv) != 6:
printUsage()
exit()
SYMLINK = argv[1]
MOUNTPOINT_A = argv[2]
MOUNTPOINT_B = argv[3]
SIZE = argv[4]
ROTATIONTIME = argv[5]
# Sanity checks
if path.isdir(SYMLINK) or path.isfile(SYMLINK):
print "[ERROR] Symlink exists. Please specify a non-existing path for the symlink."
exit()
if not path.isdir(MOUNTPOINT_A):
print "[ERROR] Mountpoint A does not exist."
exit()
if not path.isdir(MOUNTPOINT_B):
print "[ERROR] Mountpoint B does not exist."
exit()
try:
SIZE = int(SIZE)
except:
print "[ERROR] Invalid size_in_mb."
exit()
if SIZE <= 0:
print "[ERROR] Invalid size_in_mb."
exit()
try:
ROTATIONTIME = int(ROTATIONTIME)
except:
print "[ERROR] Invalid rotation_time."
exit()
if ROTATIONTIME <= 0:
print "[ERROR] Invalid rotation_time."
exit()
def cleanup():
system("fuser -km %s" % MOUNTPOINT_A)
system("umount -f %s" % MOUNTPOINT_A)
system("fuser -km %s" % MOUNTPOINT_B)
system("umount -f %s" % MOUNTPOINT_B)
system("rm -f %s" % SYMLINK)
exit()
# Mount both disks
if getstatusoutput("mount -t tmpfs -o size=%dm tmpfs %s" % (SIZE, MOUNTPOINT_A))[0] != 0:
print "[ERROR] Somethign went wrong while mounting ramdisk A."
cleanup()
if getstatusoutput("mount -t tmpfs -o size=%dm tmpfs %s" % (SIZE, MOUNTPOINT_B))[0] != 0:
print "[ERROR] Somethign went wrong while mounting ramdisk B."
cleanup()
# Create symlink
if getstatusoutput("ln -s -f -n %s %s" % (MOUNTPOINT_A, SYMLINK))[0] != 0:
print "[ERROR] Couldn't create symlink."
cleanup()
def signal_handler(signal, frame):
cleanup()
signal.signal(signal.SIGINT, signal_handler)
HALFTIME = ROTATIONTIME / 2.0
print "Initialization complete. Will rotate disks every %d seconds and clean unused disk after %.2f seconds." % (ROTATIONTIME, HALFTIME)
CLEANDISK = MOUNTPOINT_B
ACTIVEDISK = MOUNTPOINT_A
while True:
sleep(HALFTIME)
print "Cleaning %s..." % CLEANDISK
system("fuser -km %s" % CLEANDISK)
system("umount -f %s" % CLEANDISK)
system("mount -t tmpfs -o size=%dm tmpfs %s" % (SIZE,CLEANDISK))
sleep(HALFTIME)
print "Switching disks to %s" % CLEANDISK
system("ln -s -f -n %s %s" % (CLEANDISK, SYMLINK))
TMPDISK = CLEANDISK
CLEANDISK = ACTIVEDISK
ACTIVEDISK = TMPDISK