File: btrfs-snap.py

package info (click to toggle)
python-cffi 1.12.2-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 2,540 kB
  • sloc: python: 26,777; ansic: 13,858; asm: 116; makefile: 103; sh: 28
file content (52 lines) | stat: -rw-r--r-- 1,119 bytes parent folder | download | duplicates (6)
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
"""
btrfs-snap.py: source target newname

creates a exactly named snapshots and bails out if they exist
"""

import argparse
import fcntl
import os
import sys

import cffi

ffi = cffi.FFI()

ffi.cdef("""
    #define BTRFS_IOC_SNAP_CREATE_V2 ...
    struct btrfs_ioctl_vol_args_v2 {
        int64_t fd;
        char name[];
        ...;
    };
""")

ffi.set_source("_btrfs_cffi", "#include <btrfs/ioctl.h>")
ffi.compile()

# ____________________________________________________________


from _btrfs_cffi import ffi, lib

parser = argparse.ArgumentParser(usage=__doc__.strip())
parser.add_argument('source', help='source subvolume')
parser.add_argument('target', help='target directory')
parser.add_argument('newname', help='name of the new snapshot')
opts = parser.parse_args()

source = os.open(opts.source, os.O_DIRECTORY)
target = os.open(opts.target, os.O_DIRECTORY)


args = ffi.new('struct btrfs_ioctl_vol_args_v2 *')
args.name = opts.newname
args.fd = source
args_buffer = ffi.buffer(args)
try:
    fcntl.ioctl(target, lib.BTRFS_IOC_SNAP_CREATE_V2, args_buffer)
except IOError as e:
    print e
    sys.exit(1)