kippo/utils/createfs.py

66 lines
2.0 KiB
Python
Executable File

#!/usr/bin/env python
import os, pickle, sys, locale
from stat import *
def recurse(root, tree, count = 0):
A_NAME, A_TYPE, A_UID, A_GID, A_SIZE, A_MODE, \
A_CTIME, A_CONTENTS, A_TARGET, A_REALFILE = range(0, 10)
T_LINK, T_DIR, T_FILE, T_BLK, T_CHR, T_SOCK, T_FIFO = range(0, 7)
for name in os.listdir(root):
path = os.path.join(root, name)
if path in (
'/root/fs.pickle',
'/root/createfs.py',
'/root/.bash_history',
):
continue
try:
if os.path.islink(path):
s = os.lstat(path)
else:
s = os.stat(path)
except OSError:
continue
entry = [name, T_FILE, s.st_uid, s.st_gid, s.st_size, s.st_mode, \
int(s.st_ctime), [], None, None]
if S_ISLNK(s[ST_MODE]):
entry[A_TYPE] = T_LINK
entry[A_TARGET] = os.path.realpath(path)
elif S_ISDIR(s[ST_MODE]):
entry[A_TYPE] = T_DIR
if not path.startswith('/proc/'):
recurse(path, entry[A_CONTENTS])
elif S_ISREG(s[ST_MODE]):
entry[A_TYPE] = T_FILE
elif S_ISBLK(s[ST_MODE]):
entry[A_TYPE] = T_BLK
elif S_ISCHR(s[ST_MODE]):
entry[A_TYPE] = T_CHR
elif S_ISSOCK(s[ST_MODE]):
entry[A_TYPE] = T_SOCK
elif S_ISFIFO(s[ST_MODE]):
entry[A_TYPE] = T_FIFO
else:
sys.stderr.write('We should handle %s' % path)
sys.exit(1)
tree.append(entry)
if __name__ == '__main__':
A_NAME, A_TYPE, A_UID, A_GID, A_SIZE, A_MODE, \
A_CTIME, A_CONTENTS, A_TARGET, A_REALFILE = range(0, 10)
T_LINK, T_DIR, T_FILE, T_BLK, T_CHR, T_SOCK, T_FIFO = range(0, 7)
tree = ['/', T_DIR, 0, 0, 0, 0, 0, [], '']
# change to / to recurse a whole server:
recurse('/', tree[A_CONTENTS], tree[A_CONTENTS])
sys.stderr.write('Doing stuff\n')
print pickle.dumps(tree)