tailscale+tailscaled now completely obsoletes relaynode, so let's let it finally go away.main
parent
73fccd8b06
commit
a56e853b72
@ -1,14 +0,0 @@ |
||||
/*.tar.gz |
||||
/*.deb |
||||
/*.rpm |
||||
/*.spec |
||||
/pkgver |
||||
debian/changelog |
||||
debian/debhelper-build-stamp |
||||
debian/files |
||||
debian/*.log |
||||
debian/*.substvars |
||||
debian/*.debhelper |
||||
debian/tailscale-relay |
||||
/tailscale-relay/ |
||||
/tailscale-relay-* |
||||
@ -1 +0,0 @@ |
||||
rm -f debian/changelog *~ debian/*~ |
||||
@ -1,13 +0,0 @@ |
||||
exec >&2 |
||||
read -r package <package |
||||
rm -f *~ .*~ \ |
||||
debian/*~ debian/changelog debian/debhelper-build-stamp \ |
||||
debian/*.log debian/files debian/*.substvars debian/*.debhelper \ |
||||
*.tar.gz *.deb *.rpm *.spec pkgver relaynode *.exe |
||||
[ -n "$package" ] && rm -rf "debian/$package" |
||||
for d in */.stamp; do |
||||
if [ -e "$d" ]; then |
||||
dir=$(dirname "$d") |
||||
rm -rf "$dir" |
||||
fi |
||||
done |
||||
@ -1,10 +0,0 @@ |
||||
exec >&2 |
||||
dir=${1%/*} |
||||
redo-ifchange "$S/$dir/package" "$S/oss/version/short.txt" |
||||
read -r package <"$S/$dir/package" |
||||
read -r version <"$S/oss/version/short.txt" |
||||
arch=$(dpkg --print-architecture) |
||||
|
||||
redo-ifchange "$dir/${package}_$arch.deb" |
||||
rm -f "$dir/${package}"_*_"$arch.deb" |
||||
ln -sf "${package}_$arch.deb" "$dir/${package}_${version}_$arch.deb" |
||||
@ -1 +0,0 @@ |
||||
Tailscale IPN relay daemon. |
||||
@ -1,5 +0,0 @@ |
||||
redo-ifchange ../../../version/short.txt gen-changelog |
||||
( |
||||
cd .. |
||||
debian/gen-changelog |
||||
) >$3 |
||||
@ -1 +0,0 @@ |
||||
9 |
||||
@ -1,14 +0,0 @@ |
||||
Source: tailscale-relay |
||||
Section: net |
||||
Priority: extra |
||||
Maintainer: Avery Pennarun <apenwarr@tailscale.com> |
||||
Build-Depends: debhelper (>= 10.2.5), dh-systemd (>= 1.5) |
||||
Standards-Version: 3.9.2 |
||||
Homepage: https://tailscale.com/ |
||||
Vcs-Git: https://github.com/tailscale/tailscale |
||||
Vcs-Browser: https://github.com/tailscale/tailscale |
||||
|
||||
Package: tailscale-relay |
||||
Architecture: any |
||||
Depends: ${shlibs:Depends}, ${misc:Depends} |
||||
Description: Traffic relay node for Tailscale IPN |
||||
@ -1,11 +0,0 @@ |
||||
Format: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=173 |
||||
Upstream-Name: tailscale-relay |
||||
Upstream-Contact: Avery Pennarun <apenwarr@tailscale.com> |
||||
Source: https://github.com/tailscale/tailscale/ |
||||
|
||||
Files: * |
||||
Copyright: © 2019 Tailscale Inc. <info@tailscale.com> |
||||
License: Proprietary |
||||
* |
||||
* Copyright 2019 Tailscale Inc. All rights reserved. |
||||
* |
||||
@ -1,25 +0,0 @@ |
||||
#!/bin/sh |
||||
read junk pkgname <debian/control |
||||
read shortver <../../version/short.txt |
||||
git log --pretty='format:'"$pkgname"' (SHA:%H) unstable; urgency=low |
||||
|
||||
* %s |
||||
|
||||
-- %aN <%aE> %aD |
||||
' . | |
||||
python -Sc ' |
||||
import os, re, subprocess, sys |
||||
|
||||
first = True |
||||
def Describe(g): |
||||
global first |
||||
if first: |
||||
s = sys.argv[1] |
||||
first = False |
||||
else: |
||||
sha = g.group(1) |
||||
s = subprocess.check_output(["git", "describe", "--always", "--", sha]).strip().decode("utf-8") |
||||
return re.sub(r"^\D*", "", s) |
||||
|
||||
print(re.sub(r"SHA:([0-9a-f]+)", Describe, sys.stdin.read())) |
||||
' "$shortver" |
||||
@ -1,3 +0,0 @@ |
||||
relaynode /usr/sbin |
||||
tailscale-login /usr/sbin |
||||
taillogin /usr/sbin |
||||
@ -1,8 +0,0 @@ |
||||
#DEBHELPER# |
||||
|
||||
f=/var/lib/tailscale/relay.conf |
||||
if ! [ -e "$f" ]; then |
||||
echo |
||||
echo "Note: Run tailscale-login to configure $f." >&2 |
||||
echo |
||||
fi |
||||
@ -1,10 +0,0 @@ |
||||
#!/usr/bin/make -f |
||||
DESTDIR=debian/tailscale-relay |
||||
|
||||
override_dh_auto_test: |
||||
override_dh_auto_install: |
||||
mkdir -p "${DESTDIR}/etc/default" |
||||
cp tailscale-relay.defaults "${DESTDIR}/etc/default/tailscale-relay" |
||||
|
||||
%: |
||||
dh $@ --with=systemd |
||||
@ -1,12 +0,0 @@ |
||||
[Unit] |
||||
Description=Traffic relay node for Tailscale IPN |
||||
After=network.target |
||||
ConditionPathExists=/var/lib/tailscale/relay.conf |
||||
|
||||
[Service] |
||||
EnvironmentFile=/etc/default/tailscale-relay |
||||
ExecStart=/usr/sbin/relaynode --config=/var/lib/tailscale/relay.conf --tun=wg0 $PORT $FLAGS |
||||
Restart=on-failure |
||||
|
||||
[Install] |
||||
WantedBy=multi-user.target |
||||
@ -1,21 +0,0 @@ |
||||
exec >&2 |
||||
dir=${1%/*} |
||||
redo-ifchange "$S/oss/version/short.txt" "$S/$dir/package" "$dir/debtmp.dir" |
||||
read -r package <"$S/$dir/package" |
||||
read -r version <"$S/oss/version/short.txt" |
||||
arch=$(dpkg --print-architecture) |
||||
|
||||
( |
||||
cd "$S/$dir" |
||||
git ls-files debian | xargs redo-ifchange debian/changelog |
||||
) |
||||
cp -a "$S/$dir/debian" "$dir/debtmp/" |
||||
rm -f "$dir/debtmp/debian/$package.debhelper.log" |
||||
rm -f "$dir/${package}_${version}_${arch}.deb" |
||||
( |
||||
cd "$dir/debtmp" && |
||||
debian/rules build && |
||||
fakeroot debian/rules binary |
||||
) |
||||
|
||||
mv "$dir/${package}_${version}_${arch}.deb" "$3" |
||||
@ -1,20 +0,0 @@ |
||||
# Generate a directory tree suitable for forming a tarball of |
||||
# this package. |
||||
exec >&2 |
||||
dir=${1%/*} |
||||
outdir=$PWD/${1%.dir} |
||||
rm -rf "$outdir" |
||||
mkdir "$outdir" |
||||
touch $outdir/.stamp |
||||
sfiles=" |
||||
tailscale-login |
||||
debian/*.service |
||||
*.defaults |
||||
" |
||||
ofiles=" |
||||
relaynode |
||||
../taillogin/taillogin |
||||
" |
||||
redo-ifchange "$outdir/.stamp" |
||||
(cd "$S/$dir" && redo-ifchange $sfiles && cp $sfiles "$outdir/") |
||||
(cd "$dir" && redo-ifchange $ofiles && cp $ofiles "$outdir/") |
||||
@ -1,15 +0,0 @@ |
||||
exec >&2 |
||||
dir=${1%/*} |
||||
pkg=${1##*/} |
||||
pkg=${pkg%.rpm} |
||||
redo-ifchange "$S/oss/version/short.txt" "$dir/$pkg.tar.gz" "$dir/$pkg.spec" |
||||
read -r pkgver junk <"$S/oss/version/short.txt" |
||||
|
||||
machine=$(uname -m) |
||||
rpmbase=$HOME/rpmbuild |
||||
|
||||
mkdir -p "$rpmbase/SOURCES/" |
||||
cp "$dir/$pkg.tar.gz" "$rpmbase/SOURCES/" |
||||
rm -f "$rpmbase/RPMS/$machine/$pkg-$pkgver.$machine.rpm" |
||||
rpmbuild -bb "$dir/$pkg.spec" |
||||
mv "$rpmbase/RPMS/$machine/$pkg-$pkgver.$machine.rpm" $3 |
||||
@ -1,7 +0,0 @@ |
||||
redo-ifchange "$S/$1.in" "$S/oss/version/short.txt" |
||||
read -r pkgver junk <"$S/oss/version/short.txt" |
||||
basever=${pkgver%-*} |
||||
subver=${pkgver#*-} |
||||
sed -e "s/Version: 0.00$/Version: $basever/" \ |
||||
-e "s/Release: 0$/Release: $subver/" \ |
||||
<"$S/$1.in" >"$3" |
||||
@ -1,8 +0,0 @@ |
||||
exec >&2 |
||||
xdir=${1%.tar.gz} |
||||
base=${xdir##*/} |
||||
updir=${xdir%/*} |
||||
redo-ifchange "$xdir.dir" |
||||
OUT="$PWD/$3" |
||||
|
||||
cd "$updir" && tar -czvf "$OUT" --exclude "$base/.stamp" "$base" |
||||
@ -1,15 +0,0 @@ |
||||
# Build packages for customer distribution. |
||||
dir=${1%/*} |
||||
cd "$dir" |
||||
targets="tarball" |
||||
if which dh_clean fakeroot dpkg >/dev/null; then |
||||
targets="$targets deb" |
||||
else |
||||
echo "Skipping debian packages: debhelper and/or dpkg build tools missing." >&2 |
||||
fi |
||||
if which rpm >/dev/null; then |
||||
targets="$targets rpm" |
||||
else |
||||
echo "Skipping rpm packages: rpm build tools missing." >&2 |
||||
fi |
||||
redo-ifchange $targets |
||||
@ -1 +0,0 @@ |
||||
/relaynode |
||||
@ -1,17 +0,0 @@ |
||||
# Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved. |
||||
# Use of this source code is governed by a BSD-style |
||||
# license that can be found in the LICENSE file. |
||||
|
||||
# Build with: docker build -t tailcontrol-alpine . |
||||
# Run with: docker run --cap-add=NET_ADMIN --device=/dev/net/tun:/dev/net/tun -it tailcontrol-alpine |
||||
|
||||
FROM debian:stretch-slim |
||||
|
||||
RUN apt-get update && apt-get -y install iproute2 iptables |
||||
RUN apt-get -y install ca-certificates |
||||
RUN apt-get -y install nginx-light |
||||
|
||||
COPY relaynode / |
||||
|
||||
# tailcontrol -tun=wg0 -dbdir=$HOME/taildb >> tailcontrol.log 2>&1 & |
||||
CMD ["/relaynode", "-R", "--config", "relay.conf"] |
||||
@ -1 +0,0 @@ |
||||
redo-ifchange build |
||||
@ -1,3 +0,0 @@ |
||||
exec >&2 |
||||
redo-ifchange Dockerfile relaynode |
||||
docker build -t tailscale . |
||||
@ -1,2 +0,0 @@ |
||||
redo-ifchange ../relaynode |
||||
cp ../relaynode $3 |
||||
@ -1,10 +0,0 @@ |
||||
#!/bin/sh |
||||
# Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved. |
||||
# Use of this source code is governed by a BSD-style |
||||
# license that can be found in the LICENSE file. |
||||
|
||||
set -e |
||||
redo-ifchange build |
||||
docker run --cap-add=NET_ADMIN \ |
||||
--device=/dev/net/tun:/dev/net/tun \ |
||||
-it tailscale |
||||
@ -1 +0,0 @@ |
||||
tailscale-relay |
||||
@ -1,236 +0,0 @@ |
||||
// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Relaynode is the old Linux Tailscale daemon.
|
||||
//
|
||||
// Deprecated: this program will be soon deleted. The replacement is
|
||||
// cmd/tailscaled.
|
||||
package main // import "tailscale.com/cmd/relaynode"
|
||||
|
||||
import ( |
||||
"context" |
||||
"encoding/json" |
||||
"fmt" |
||||
"io/ioutil" |
||||
"log" |
||||
"net/http" |
||||
"net/http/pprof" |
||||
"os" |
||||
"os/signal" |
||||
"strings" |
||||
"syscall" |
||||
"time" |
||||
|
||||
"github.com/apenwarr/fixconsole" |
||||
"github.com/klauspost/compress/zstd" |
||||
"github.com/pborman/getopt/v2" |
||||
"github.com/tailscale/wireguard-go/wgcfg" |
||||
"tailscale.com/atomicfile" |
||||
"tailscale.com/control/controlclient" |
||||
"tailscale.com/logpolicy" |
||||
"tailscale.com/version" |
||||
"tailscale.com/wgengine" |
||||
"tailscale.com/wgengine/filter" |
||||
"tailscale.com/wgengine/magicsock" |
||||
) |
||||
|
||||
func main() { |
||||
err := fixconsole.FixConsoleIfNeeded() |
||||
if err != nil { |
||||
log.Printf("fixConsoleOutput: %v\n", err) |
||||
} |
||||
config := getopt.StringLong("config", 'f', "", "path to config file") |
||||
server := getopt.StringLong("server", 's', "https://login.tailscale.com", "URL to tailcontrol server") |
||||
listenport := getopt.Uint16Long("port", 'p', magicsock.DefaultPort, "WireGuard port (0=autoselect)") |
||||
tunname := getopt.StringLong("tun", 0, "wg0", "tunnel interface name") |
||||
alwaysrefresh := getopt.BoolLong("always-refresh", 0, "force key refresh at startup") |
||||
fake := getopt.BoolLong("fake", 0, "fake tunnel+routing instead of tuntap") |
||||
nuroutes := getopt.BoolLong("no-single-routes", 'N', "disallow (non-subnet) routes to single nodes") |
||||
rroutes := getopt.BoolLong("remote-routes", 'R', "allow routing subnets to remote nodes") |
||||
droutes := getopt.BoolLong("default-routes", 'D', "allow default route on remote node") |
||||
routes := getopt.StringLong("routes", 0, "", "list of IP ranges this node can relay") |
||||
debug := getopt.StringLong("debug", 0, "", "Address of debug server") |
||||
getopt.Parse() |
||||
if len(getopt.Args()) > 0 { |
||||
log.Fatalf("too many non-flag arguments: %#v", getopt.Args()[0]) |
||||
} |
||||
uflags := controlclient.UFlagsHelper(!*nuroutes, *rroutes, *droutes) |
||||
if *config == "" { |
||||
log.Fatal("no --config file specified") |
||||
} |
||||
if *tunname == "" { |
||||
log.Printf("Warning: no --tun device specified; routing disabled.\n") |
||||
} |
||||
|
||||
pol := logpolicy.New("tailnode.log.tailscale.io") |
||||
|
||||
logf := wgengine.RusagePrefixLog(log.Printf) |
||||
|
||||
// The wgengine takes a wireguard configuration produced by the
|
||||
// controlclient, and runs the actual tunnels and packets.
|
||||
var e wgengine.Engine |
||||
if *fake { |
||||
e, err = wgengine.NewFakeUserspaceEngine(logf, *listenport) |
||||
} else { |
||||
e, err = wgengine.NewUserspaceEngine(logf, *tunname, *listenport) |
||||
} |
||||
if err != nil { |
||||
log.Fatalf("Error starting wireguard engine: %v\n", err) |
||||
} |
||||
|
||||
e = wgengine.NewWatchdog(e) |
||||
|
||||
// Default filter blocks everything, until Start() is called.
|
||||
e.SetFilter(filter.NewAllowNone()) |
||||
|
||||
var lastNetMap *controlclient.NetworkMap |
||||
statusFunc := func(new controlclient.Status) { |
||||
if new.URL != "" { |
||||
fmt.Fprintf(os.Stderr, "To authenticate, visit:\n\n\t%s\n\n", new.URL) |
||||
return |
||||
} |
||||
if new.Err != "" { |
||||
log.Print(new.Err) |
||||
return |
||||
} |
||||
if new.Persist != nil { |
||||
if err := saveConfig(*config, *new.Persist); err != nil { |
||||
log.Println(err) |
||||
} |
||||
} |
||||
|
||||
if m := new.NetMap; m != nil { |
||||
if lastNetMap != nil { |
||||
logf("netmap diff:\n%v\n", new.NetMap.ConciseDiffFrom(lastNetMap)) |
||||
} |
||||
lastNetMap = m |
||||
|
||||
if m.Equal(&controlclient.NetworkMap{}) { |
||||
return |
||||
} |
||||
|
||||
log.Printf("packet filter: %v\n", m.PacketFilter) |
||||
e.SetFilter(filter.New(m.PacketFilter)) |
||||
|
||||
wgcfg, err := m.WGCfg(uflags, m.DNS) |
||||
if err != nil { |
||||
log.Fatalf("Error getting wg config: %v\n", err) |
||||
} |
||||
err = e.Reconfig(wgcfg, m.DNSDomains) |
||||
if err != nil { |
||||
log.Fatalf("Error reconfiguring engine: %v\n", err) |
||||
} |
||||
} |
||||
} |
||||
|
||||
cfg, err := loadConfig(*config) |
||||
if err != nil { |
||||
log.Fatal(err) |
||||
} |
||||
|
||||
hi := controlclient.NewHostinfo() |
||||
hi.FrontendLogID = pol.PublicID.String() |
||||
hi.BackendLogID = pol.PublicID.String() |
||||
if *routes != "" { |
||||
for _, routeStr := range strings.Split(*routes, ",") { |
||||
cidr, err := wgcfg.ParseCIDR(routeStr) |
||||
if err != nil { |
||||
log.Fatalf("--routes: not an IP range: %s", routeStr) |
||||
} |
||||
hi.RoutableIPs = append(hi.RoutableIPs, cidr) |
||||
} |
||||
} |
||||
|
||||
c, err := controlclient.New(controlclient.Options{ |
||||
Persist: cfg, |
||||
ServerURL: *server, |
||||
Hostinfo: hi, |
||||
NewDecompressor: func() (controlclient.Decompressor, error) { |
||||
return zstd.NewReader(nil) |
||||
}, |
||||
KeepAlive: true, |
||||
}) |
||||
c.SetStatusFunc(statusFunc) |
||||
if err != nil { |
||||
log.Fatal(err) |
||||
} |
||||
lf := controlclient.LoginDefault |
||||
if *alwaysrefresh { |
||||
lf |= controlclient.LoginInteractive |
||||
} |
||||
c.Login(nil, lf) |
||||
|
||||
// Print the wireguard status when we get an update.
|
||||
e.SetStatusCallback(func(s *wgengine.Status, err error) { |
||||
if err != nil { |
||||
log.Fatalf("Wireguard engine status error: %v\n", err) |
||||
} |
||||
var ss []string |
||||
for _, p := range s.Peers { |
||||
if p.LastHandshake.IsZero() { |
||||
ss = append(ss, "x") |
||||
} else { |
||||
ss = append(ss, fmt.Sprintf("%d/%d", p.RxBytes, p.TxBytes)) |
||||
} |
||||
} |
||||
logf("v%v peers: %v\n", version.LONG, strings.Join(ss, " ")) |
||||
c.UpdateEndpoints(0, s.LocalAddrs) |
||||
}) |
||||
|
||||
if *debug != "" { |
||||
go runDebugServer(*debug) |
||||
} |
||||
|
||||
sigCh := make(chan os.Signal, 1) |
||||
signal.Notify(sigCh, os.Interrupt) |
||||
signal.Notify(sigCh, syscall.SIGTERM) |
||||
|
||||
<-sigCh |
||||
logf("signal received, exiting") |
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) |
||||
defer cancel() |
||||
|
||||
e.Close() |
||||
pol.Shutdown(ctx) |
||||
} |
||||
|
||||
func loadConfig(path string) (cfg controlclient.Persist, err error) { |
||||
b, err := ioutil.ReadFile(path) |
||||
if os.IsNotExist(err) { |
||||
log.Printf("config %s does not exist", path) |
||||
return controlclient.Persist{}, nil |
||||
} |
||||
if err := json.Unmarshal(b, &cfg); err != nil { |
||||
return controlclient.Persist{}, fmt.Errorf("load config: %v", err) |
||||
} |
||||
return cfg, nil |
||||
} |
||||
|
||||
func saveConfig(path string, cfg controlclient.Persist) error { |
||||
b, err := json.MarshalIndent(cfg, "", "\t") |
||||
if err != nil { |
||||
return fmt.Errorf("save config: %v", err) |
||||
} |
||||
if err := atomicfile.WriteFile(path, b, 0666); err != nil { |
||||
return fmt.Errorf("save config: %v", err) |
||||
} |
||||
return nil |
||||
} |
||||
|
||||
func runDebugServer(addr string) { |
||||
mux := http.NewServeMux() |
||||
mux.HandleFunc("/debug/pprof/", pprof.Index) |
||||
mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline) |
||||
mux.HandleFunc("/debug/pprof/profile", pprof.Profile) |
||||
mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) |
||||
mux.HandleFunc("/debug/pprof/trace", pprof.Trace) |
||||
srv := http.Server{ |
||||
Addr: addr, |
||||
Handler: mux, |
||||
} |
||||
if err := srv.ListenAndServe(); err != nil { |
||||
log.Fatal(err) |
||||
} |
||||
} |
||||
@ -0,0 +1 @@ |
||||
# placeholder to work around redo bug |
||||
@ -1,9 +0,0 @@ |
||||
exec >&2 |
||||
dir=${2%/*} |
||||
redo-ifchange "$S/$dir/package" "$S/oss/version/short.txt" |
||||
read -r package <"$S/$dir/package" |
||||
read -r pkgver <"$S/oss/version/short.txt" |
||||
machine=$(uname -m) |
||||
redo-ifchange "$dir/$package.rpm" |
||||
rm -f "$dir/${package}"-*."$machine.rpm" |
||||
ln -sf "$package.rpm" "$dir/$package-$pkgver.$machine.rpm" |
||||
@ -1,4 +0,0 @@ |
||||
#!/bin/sh |
||||
cfg=/var/lib/tailscale/relay.conf |
||||
dir=$(dirname "$0") |
||||
"$dir/taillogin" --config="$cfg" |
||||
@ -1,8 +0,0 @@ |
||||
# Set the port to listen on for incoming VPN packets. |
||||
# Remote nodes will automatically be informed about the new port number, |
||||
# but you might want to configure this in order to set external firewall |
||||
# settings. |
||||
PORT="--port=41641" |
||||
|
||||
# Extra flags you might want to pass to relaynode. |
||||
FLAGS="" |
||||
@ -1,40 +0,0 @@ |
||||
Name: tailscale-relay |
||||
Version: 0.00 |
||||
Release: 0 |
||||
Summary: Traffic relay node for Tailscale |
||||
Group: Network |
||||
License: Proprietary |
||||
URL: https://tailscale.com/ |
||||
Vendor: Tailscale Inc. |
||||
#Source: https://github.com/tailscale/tailscale |
||||
Source0: tailscale-relay.tar.gz |
||||
#Prefix: %{_prefix} |
||||
Packager: Avery Pennarun <apenwarr@tailscale.com> |
||||
BuildRoot: %{_tmppath}/%{name}-root |
||||
|
||||
%description |
||||
Traffic relay node for Tailscale. |
||||
|
||||
%prep |
||||
%setup -n tailscale-relay |
||||
|
||||
%build |
||||
|
||||
%install |
||||
D=$RPM_BUILD_ROOT |
||||
[ "$D" = "/" -o -z "$D" ] && exit 99 |
||||
rm -rf "$D" |
||||
mkdir -p $D/usr/sbin $D/lib/systemd/system $D/etc/default $D/etc/tailscale |
||||
cp taillogin tailscale-login relaynode $D/usr/sbin |
||||
cp tailscale-relay.service $D/lib/systemd/system/ |
||||
cp tailscale-relay.defaults $D/etc/default/tailscale-relay |
||||
|
||||
%clean |
||||
|
||||
%files |
||||
%defattr(-,root,root) |
||||
%config(noreplace) /etc/default/tailscale-relay |
||||
/lib/systemd/system/tailscale-relay.service |
||||
/usr/sbin/taillogin |
||||
/usr/sbin/tailscale-login |
||||
/usr/sbin/relaynode |
||||
@ -1,7 +0,0 @@ |
||||
dir=${1%/*} |
||||
redo-ifchange "$S/$dir/package" "$S/oss/version/short.txt" |
||||
read -r package <"$S/$dir/package" |
||||
read -r version <"$S/oss/version/short.txt" |
||||
redo-ifchange "$dir/$package.tar.gz" |
||||
rm -f "$dir/$package"-*.tar.gz |
||||
ln -sf "$package.tar.gz" "$dir/$package-$version.tar.gz" |
||||
Loading…
Reference in new issue