Skip to content

Commit 8a4bd55

Browse files
committed
fix: client updater
1 parent af7bbed commit 8a4bd55

File tree

1 file changed

+58
-36
lines changed

1 file changed

+58
-36
lines changed

clientupdate/clientupdate.go

Lines changed: 58 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,19 +1217,17 @@ func isExitError(err error) bool {
12171217
return errors.As(err, &exitErr)
12181218
}
12191219

1220-
const (
1220+
var (
12211221
repoURL = "https://api.github.com/repos/anasfanani/tailscale-magisk-build/releases"
12221222
downloadDir = "/data/adb/tailscale/tmp/tailscale-android-update"
12231223
dirExtract = "/data/adb/tailscale/bin/"
12241224
)
12251225

12261226
func (up *Updater) updateAndroid() error {
12271227
if up.Version != "" {
1228-
return errors.New("installing a specific version on Android currently not supported")
1229-
}
1230-
1231-
if up.Track != StableTrack {
1232-
return errors.New("only stable track currently supported on Android")
1228+
repoURL = fmt.Sprintf(repoURL+"/tags/v%s-android", up.Version)
1229+
} else {
1230+
repoURL = fmt.Sprintf(repoURL + "/latest")
12331231
}
12341232
resp, err := http.Get(repoURL)
12351233
if err != nil {
@@ -1241,29 +1239,38 @@ func (up *Updater) updateAndroid() error {
12411239
return fmt.Errorf("unexpected status code: %d", resp.StatusCode)
12421240
}
12431241
// Decode the JSON response
1244-
var releases []struct {
1242+
var release struct {
12451243
TagName string `json:"tag_name"`
12461244
Assets []struct {
12471245
Name string `json:"name"`
12481246
URL string `json:"browser_download_url"`
12491247
} `json:"assets"`
12501248
Prerelease bool `json:"prerelease"`
12511249
}
1252-
if err := json.NewDecoder(resp.Body).Decode(&releases); err != nil {
1250+
if err := json.NewDecoder(resp.Body).Decode(&release); err != nil {
12531251
return fmt.Errorf("failed to decode release metadata: %w", err)
12541252
}
12551253

12561254
var ver string
1257-
1258-
for _, release := range releases {
1259-
if release.Prerelease {
1260-
continue
1261-
}
1262-
ver = strings.TrimPrefix(release.TagName, "v")
1263-
break
1264-
}
1265-
1266-
if !up.confirm(ver) {
1255+
ver = strings.TrimPrefix(release.TagName, "v")
1256+
ver = strings.TrimSuffix(ver, "-android")
1257+
1258+
// for _, release := range releases {
1259+
// if release.Prerelease && up.Track != StableTrack {
1260+
// ver = strings.TrimPrefix(release.TagName, "v")
1261+
// ver = strings.TrimSuffix(ver, "-android")
1262+
// break
1263+
// } else if release.Prerelease {
1264+
// up.Logf("Skipping pre-release version: %s", release.TagName)
1265+
// continue
1266+
// } else {
1267+
// ver = strings.TrimPrefix(release.TagName, "v")
1268+
// ver = strings.TrimSuffix(ver, "-android")
1269+
// break
1270+
// }
1271+
// }
1272+
1273+
if !up.Confirm(ver) {
12671274
return nil
12681275
}
12691276
// Determine the appropriate release based on the track
@@ -1273,26 +1280,37 @@ func (up *Updater) updateAndroid() error {
12731280
return fmt.Errorf("unsupported architecture: %s", runtime.GOARCH)
12741281
}
12751282

1276-
assetsName := fmt.Sprintf(`tailscale.combined-%s-%s.tar.gz`, runtime.GOARCH, ver)
1277-
for _, release := range releases {
1278-
// Iterate through the assets to find the matching one
1279-
for _, asset := range release.Assets {
1280-
// Match the asset name format: Magisk-Tailscaled-arch-version
1281-
matched, err := regexp.MatchString(`^`+assetsName+`$`, asset.Name)
1282-
if err != nil {
1283-
return fmt.Errorf("failed to match asset name: %w", err)
1284-
}
1285-
if matched {
1286-
assetURL = asset.URL
1287-
break
1288-
}
1283+
assetsName := fmt.Sprintf(`tailscale.combined.%s.%s.tar.gz`, runtime.GOARCH, ver)
1284+
for _, asset := range release.Assets {
1285+
// Match the asset name format: Magisk-Tailscaled-arch-version
1286+
matched, err := regexp.MatchString(`^`+assetsName+`$`, asset.Name)
1287+
if err != nil {
1288+
return fmt.Errorf("failed to match asset name: %w", err)
12891289
}
1290-
1291-
// Stop searching if a suitable release is found
1292-
if assetURL != "" {
1290+
if matched {
1291+
assetURL = asset.URL
12931292
break
12941293
}
12951294
}
1295+
// for _, release := range releases {
1296+
// // Iterate through the assets to find the matching one
1297+
// for _, asset := range release.Assets {
1298+
// // Match the asset name format: Magisk-Tailscaled-arch-version
1299+
// matched, err := regexp.MatchString(`^`+assetsName+`$`, asset.Name)
1300+
// if err != nil {
1301+
// return fmt.Errorf("failed to match asset name: %w", err)
1302+
// }
1303+
// if matched {
1304+
// assetURL = asset.URL
1305+
// break
1306+
// }
1307+
// }
1308+
1309+
// // Stop searching if a suitable release is found
1310+
// if assetURL != "" {
1311+
// break
1312+
// }
1313+
// }
12961314

12971315
if assetURL == "" {
12981316
return fmt.Errorf("error while fetch release for arch %q, asset name %q, download manually on %q", runtime.GOARCH, assetsName, repoURL)
@@ -1358,7 +1376,7 @@ func (up *Updater) updateAndroid() error {
13581376
}
13591377
// Create the destination file
13601378
destPath := filepath.Join(dirExtract, header.Name)
1361-
destFile, err := os.Create(destPath)
1379+
destFile, err := os.Create(destPath + ".new")
13621380
if err != nil {
13631381
return fmt.Errorf("failed to create destination file: %w", err)
13641382
}
@@ -1368,9 +1386,13 @@ func (up *Updater) updateAndroid() error {
13681386
return fmt.Errorf("failed to extract file: %w", err)
13691387
}
13701388
// Set the file permissions
1371-
if err := os.Chmod(destPath, os.FileMode(0755)|os.ModePerm); err != nil {
1389+
if err := os.Chmod(destPath+".new", os.FileMode(0755)|os.ModePerm); err != nil {
13721390
return fmt.Errorf("failed to set executable permissions: %w", err)
13731391
}
1392+
// Rename the new file to replace the old one
1393+
if err := os.Rename(destPath+".new", destPath); err != nil {
1394+
return fmt.Errorf("failed to rename file: %w", err)
1395+
}
13741396
up.Logf("Extracted %s to %s", header.Name, destPath)
13751397
}
13761398

0 commit comments

Comments
 (0)