|
6 | 6 | import sys |
7 | 7 | import subprocess |
8 | 8 | import shutil |
| 9 | +import hashlib |
9 | 10 | from pathlib import Path |
10 | 11 |
|
11 | 12 | RELEASE = '1' |
|
49 | 50 | """.lstrip() |
50 | 51 | }) |
51 | 52 |
|
| 53 | + |
| 54 | +def calc_sizes(): |
| 55 | + md5sums = '' |
| 56 | + total_size = 0 |
| 57 | + buffer = bytearray(4096) |
| 58 | + view = memoryview(buffer) |
| 59 | + for item in stagedir.rglob('*'): |
| 60 | + if not item.is_file(): |
| 61 | + continue |
| 62 | + relpath = item.relative_to(stagedir) |
| 63 | + if not relpath.parts[0] == 'etc': |
| 64 | + md5 = hashlib.md5() |
| 65 | + with open(item, "rb") as f: |
| 66 | + while True: |
| 67 | + size = f.readinto(buffer) |
| 68 | + if size == 0: |
| 69 | + break |
| 70 | + total_size += size |
| 71 | + md5.update(view[:size]) |
| 72 | + md5sums += f'{md5.hexdigest()} {item.relative_to(stagedir)}\n' |
| 73 | + else: |
| 74 | + total_size += item.stat().st_size |
| 75 | + total_size = int(round(total_size / 1024.)) |
| 76 | + return total_size, md5sums |
| 77 | + |
| 78 | +total_size, md5sums = calc_sizes() |
| 79 | + |
52 | 80 | debiandir = stagedir/ 'DEBIAN' |
53 | 81 | debiandir.mkdir() |
54 | 82 |
|
55 | | -(stagedir/ 'debian').symlink_to(debiandir.absolute()) |
| 83 | +# on case insensitive filesystem we don't need and cannot create lowercase 'debian' |
| 84 | +if not (stagedir / 'debian').exists(): |
| 85 | + (stagedir / 'debian').symlink_to(debiandir.absolute()) |
56 | 86 |
|
57 | 87 | control = debiandir / 'control' |
58 | 88 |
|
|
62 | 92 | Source: wsddn |
63 | 93 | Version: {VERSION} |
64 | 94 | Architecture: {ARCH} |
| 95 | +Installed-Size: {total_size} |
65 | 96 | Depends: {{shlibs_Depends}} |
66 | 97 | Conflicts: wsdd |
67 | 98 | Replaces: wsdd |
|
72 | 103 |
|
73 | 104 | """.lstrip()) |
74 | 105 |
|
75 | | -#shutil.copy(mydir / 'pre', debiandir / 'preinst') |
| 106 | +shutil.copy(mydir / 'preinst', debiandir / 'preinst') |
76 | 107 | shutil.copy(mydir / 'prerm', debiandir / 'prerm') |
77 | 108 | shutil.copy(mydir / 'postinst', debiandir / 'postinst') |
78 | 109 | shutil.copy(mydir / 'postrm', debiandir / 'postrm') |
79 | 110 | shutil.copy(mydir / 'copyright', debiandir / 'copyright') |
80 | 111 |
|
81 | 112 | (debiandir / 'conffiles').write_text(""" |
| 113 | +/etc/init.d/wsddn |
| 114 | +/etc/ufw/applications.d/wsddn |
82 | 115 | /etc/wsddn.conf |
83 | 116 | """.lstrip()) |
84 | 117 |
|
| 118 | +(debiandir / 'md5sums').write_text(md5sums) |
| 119 | + |
85 | 120 | deps = subprocess.run(['dpkg-shlibdeps', '-O', '-eusr/bin/wsddn'], |
86 | 121 | check=True, cwd=stagedir, stdout=subprocess.PIPE, encoding="utf-8").stdout.strip() |
87 | 122 | key, val = deps.split('=', 1) |
88 | 123 | key = key.replace(':', "_") |
89 | 124 | control.write_text(control.read_text().format_map({key: val})) |
90 | 125 |
|
91 | | -(stagedir/ 'debian').unlink() |
| 126 | +if (stagedir / 'debian').is_symlink(): |
| 127 | + (stagedir / 'debian').unlink() |
| 128 | + |
92 | 129 | subprocess.run(['dpkg-deb', '--build', '--root-owner-group', stagedir, workdir], check=True) |
93 | 130 |
|
94 | 131 | subprocess.run(['gzip', '--keep', '--force', builddir / 'wsddn'], check=True) |
|
0 commit comments