summarylogtreecommitdiffstats
path: root/PKGBUILD
blob: ee308b8e8e469c9f62b9b8371c376232609f4310 (plain)
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
# Maintainer: Vladislav Minakov <v@minakov.pro>

pkgbase=aivpn
pkgname=('aivpn-client' 'aivpn-server' 'aivpn-kernel-dkms')
pkgver=0.9.2
pkgrel=1
arch=('x86_64')
url="https://github.com/infosave2007/aivpn"
license=('MIT')
makedepends=('rust' 'cargo')
source=(
    "$pkgbase-$pkgver.tar.gz::https://github.com/infosave2007/aivpn/archive/refs/tags/v${pkgver}.tar.gz"
    'aivpn-server.service'
    'aivpn-server.sysusers'
    'aivpn-server.tmpfiles'
    'aivpn-server.install'
    'aivpn-client@.service'
)
sha512sums=('SKIP'
            'SKIP'
            'SKIP'
            'SKIP'
            'SKIP'
            'SKIP')

prepare() {
    cd "$pkgbase-$pkgver"
    export RUSTUP_TOOLCHAIN=stable
    cargo fetch --locked --target "$(rustc -vV | sed -n 's/host: //p')"
}

build() {
    cd "$pkgbase-$pkgver"
    export RUSTUP_TOOLCHAIN=stable
    export CARGO_TARGET_DIR=target
    cargo build --frozen --release --bin aivpn-server
    cargo build --frozen --release --bin aivpn-client
}

package_aivpn-client() {
    pkgdesc='AIVPN client — connects to an aivpn-server endpoint'
    depends=()
    optdepends=('aivpn-kernel-dkms: optional kernel-accelerated data path')

    install -Dm755 "$pkgbase-$pkgver/target/release/aivpn-client" \
        "$pkgdir/usr/bin/aivpn-client"
    install -Dm644 'aivpn-client@.service' \
        "$pkgdir/usr/lib/systemd/system/aivpn-client@.service"
    install -dm750 "$pkgdir/etc/aivpn/keys"
}

package_aivpn-server() {
    pkgdesc='AIVPN server — gateway with traffic mimicry and DPI evasion'
    depends=()
    optdepends=('aivpn-kernel-dkms: optional kernel-accelerated data path')
    backup=(
        'etc/aivpn/server.json'
        'etc/aivpn/clients.json'
    )
    install='aivpn-server.install'

    install -Dm755 "$pkgbase-$pkgver/target/release/aivpn-server" \
        "$pkgdir/usr/bin/aivpn-server"
    install -Dm644 'aivpn-server.service' \
        "$pkgdir/usr/lib/systemd/system/aivpn-server.service"
    install -Dm644 'aivpn-server.sysusers' \
        "$pkgdir/usr/lib/sysusers.d/aivpn-server.conf"
    install -Dm644 'aivpn-server.tmpfiles' \
        "$pkgdir/usr/lib/tmpfiles.d/aivpn-server.conf"
    install -Dm640 "$pkgbase-$pkgver/deploy/config/server.json.example" \
        "$pkgdir/etc/aivpn/server.json"
    # Empty client DB placeholder — preserved across upgrades via backup=
    echo '{}' | install -Dm640 /dev/stdin \
        "$pkgdir/etc/aivpn/clients.json"

    local mask
    for mask in "$pkgbase-$pkgver/assets/masks/"*.json; do
        install -Dm644 "$mask" \
            "$pkgdir/var/lib/aivpn/masks/$(basename "$mask")"
    done
}

package_aivpn-kernel-dkms() {
    pkgdesc='AIVPN kernel module (DKMS) — in-kernel fast path (Linux 6.1+, CONFIG_RUST=y required)'
    arch=('any')
    depends=('dkms')
    optdepends=(
        'linux-headers: build against the default kernel'
        'linux-lts-headers: build against linux-lts'
        'rust-bindgen: required for Rust-for-Linux module compilation'
        'clang: optional — enables XDP fast-path filter'
    )

    local ksrc="$pkgbase-$pkgver/platforms/linux-kernel"
    local dst="$pkgdir/usr/src/aivpn-$pkgver"

    install -dm755 "$dst"
    cp -r "$ksrc/src"     "$dst/"
    cp -r "$ksrc/include" "$dst/" 2>/dev/null || true
    cp -r "$ksrc/scripts" "$dst/" 2>/dev/null || true
    install -Dm644 "$ksrc/Makefile" "$dst/Makefile"
    install -Dm644 "$ksrc/Kbuild"   "$dst/Kbuild"

    sed "s/@VERSION@/$pkgver/g" "$ksrc/dkms.conf" > "$dst/dkms.conf"
    chmod 644 "$dst/dkms.conf"
}