-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathramdisk.py
More file actions
205 lines (161 loc) Β· 5.91 KB
/
ramdisk.py
File metadata and controls
205 lines (161 loc) Β· 5.91 KB
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#!/usr/bin/env python3
import os
import sys
import json
import subprocess
import shutil
USER_HOME = os.path.expanduser("~")
CONFIG_PATH = os.path.join(USER_HOME, ".config", "ramdisk-manager", "config.json")
RAMDISK_PATH = os.path.join(USER_HOME, "RAMDisk")
RAMDISK_DATA = os.path.join(USER_HOME, "RAMDisk_data")
DEFAULT_CONFIG = {"size_gb": 4, "interval_min": 1}
# ---------------- CONFIG ----------------
def load_config():
if not os.path.exists(CONFIG_PATH):
os.makedirs(os.path.dirname(CONFIG_PATH), exist_ok=True)
save_config(DEFAULT_CONFIG)
return DEFAULT_CONFIG
try:
with open(CONFIG_PATH, "r") as f:
return json.load(f)
except (json.JSONDecodeError, ValueError):
print("ββββ Warning: config.json corrupted, restoring default")
save_config(DEFAULT_CONFIG)
return DEFAULT_CONFIG
def save_config(config):
os.makedirs(os.path.dirname(CONFIG_PATH), exist_ok=True)
with open(CONFIG_PATH, "w") as f:
json.dump(config, f, indent=4)
# ---------------- SYNC ----------------
def sync_to_data():
if not os.path.exists(RAMDISK_PATH):
return
os.makedirs(RAMDISK_DATA, exist_ok=True)
subprocess.run([
"rsync",
"-rl",
"--delete",
RAMDISK_PATH + "/",
RAMDISK_DATA + "/"
], check=True)
def restore_to_ramdisk():
if not os.path.exists(RAMDISK_DATA):
return
if not os.path.exists(RAMDISK_PATH):
return
subprocess.run([
"rsync",
"-rl",
RAMDISK_DATA + "/",
RAMDISK_PATH + "/"
], check=True)
# ---------------- RAMDISK ----------------
def mount_ramdisk(size_gb):
os.makedirs(RAMDISK_PATH, exist_ok=True)
mounts = subprocess.getoutput("mount")
if RAMDISK_PATH in mounts:
print("ββββ RAMDisk already mounted")
return
try:
subprocess.run(
[
"pkexec",
"mount", "-t", "tmpfs", "-o", f"size={size_gb}G", "tmpfs", RAMDISK_PATH
],
check=True
)
print(f"ββββ RAMDisk created: {size_gb} GB")
print(f"ββββ Path: {RAMDISK_PATH}")
except subprocess.CalledProcessError as e:
print(f"ββββ Error mounting RAMDisk: {e}")
except FileNotFoundError:
print("ββββ Error: pkexec not available - install `polkit` or use sudo in terminal")
def remove_ramdisk():
if os.path.exists(RAMDISK_PATH):
try:
subprocess.run(
["pkexec", "umount", RAMDISK_PATH],
check=True
)
except subprocess.CalledProcessError:
try:
subprocess.run(
["pkexec", "umount", "-l", RAMDISK_PATH],
check=True
)
except subprocess.CalledProcessError:
print("ββββ Unmounting RAMDisk failed - try manually")
return
shutil.rmtree(RAMDISK_PATH, ignore_errors=True)
print("ββββ RAMDisk unmounted & deleted")
# ---------------- COMMANDS ----------------
def start_ramdisk(size_gb=None):
config = load_config()
if size_gb is not None:
config["size_gb"] = size_gb
save_config(config)
mount_size = size_gb
else:
mount_size = config["size_gb"]
mount_ramdisk(mount_size)
restore_to_ramdisk()
print("ββββ Sync: RAMDisk_data βΊ RAMDisk")
def stop_ramdisk():
sync_to_data()
print("ββββ Sync: RAMDisk βΊ RAMDisk_data")
remove_ramdisk()
def sync_ramdisk():
os.makedirs(RAMDISK_DATA, exist_ok=True)
sync_to_data()
print("ββββ Sync: RAMDisk βΊ RAMDisk_data")
def launch_gui():
gui_path = os.path.join(os.path.dirname(__file__), "gui.py")
if not os.path.exists(gui_path):
print("ββββ Error: gui.py not found")
sys.exit(1)
try:
subprocess.Popen(["python3", gui_path])
except Exception as e:
print(f"ββββ Error launching GUI: {e}")
# ---------------- CLI ----------------
def parse_size_arg():
if len(sys.argv) < 3:
return None
raw = sys.argv[2].strip()
if raw == "":
return None
try:
return int(raw)
except ValueError:
print("ββββ Error: size must be an integer")
sys.exit(1)
if __name__ == "__main__":
if len(sys.argv) < 2:
print(" ββββββββββββββββββββββββββββββββββ")
print(" β Usage: β")
print(" ββββββββββββββββββββββββββββββββββ€")
print(" β ramdisk-manager start [sizeGB] β")
print(" β ramdisk-manager stop β")
print(" β ramdisk-manager sync β")
print(" β ramdisk-manager gui β")
print(" ββββββββββββββββββββββββββββββββββ")
sys.exit(1)
cmd = sys.argv[1]
if cmd == "start":
size = parse_size_arg()
start_ramdisk(size)
elif cmd == "stop":
stop_ramdisk()
elif cmd == "sync":
sync_ramdisk()
elif cmd == "gui":
launch_gui()
else:
print(" ββββββββββββββββββββββββββββββββββ")
print(" β Usage: β")
print(" ββββββββββββββββββββββββββββββββββ€")
print(" β ramdisk-manager start [sizeGB] β")
print(" β ramdisk-manager stop β")
print(" β ramdisk-manager sync β")
print(" β ramdisk-manager gui β")
print(" ββββββββββββββββββββββββββββββββββ")