Skip to content

Instantly share code, notes, and snippets.

@andrewrk
Created April 20, 2018 21:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andrewrk/011f5bca2a3ccdb77f663c480af663cd to your computer and use it in GitHub Desktop.
Save andrewrk/011f5bca2a3ccdb77f663c480af663cd to your computer and use it in GitHub Desktop.
#!/usr/bin/env node
var fs = require('fs');
var s3 = require('s3');
var ini = require('ini');
var osenv = require('osenv');
var path = require('path');
var http = require('http');
var https = require('https');
var url = require('url');
var bucket = "ziglang.org";
var master = "builds/zig-linux-x86_64-master.tar.xz";
fs.readFile(path.join(osenv.home(), '.s3cfg'), {encoding: 'utf8'}, function(err, contents) {
if (err) {
if (process.env.AWS_SECRET_KEY && process.env.AWS_ACCESS_KEY) {
setup(process.env.AWS_SECRET_KEY, process.env.AWS_ACCESS_KEY);
} else {
console.error("This utility needs a config file formatted the same as for s3cmd");
console.error("or AWS_SECRET_KEY and AWS_ACCESS_KEY environment variables.");
process.exit(1);
}
return;
}
var config = ini.parse(contents);
var accessKeyId, secretAccessKey;
if (config && config.default) {
accessKeyId = config.default.access_key;
secretAccessKey = config.default.secret_key;
}
if (!secretAccessKey || !accessKeyId) {
console.error("Config file missing access_key or secret_key");
process.exit(1);
return;
}
setup(secretAccessKey, accessKeyId);
});
function setup(secretAccessKey, accessKeyId) {
var maxSockets = 20;
http.globalAgent.maxSockets = maxSockets;
https.globalAgent.maxSockets = maxSockets;
client = s3.createClient({
s3Options: {
accessKeyId: accessKeyId,
secretAccessKey: secretAccessKey,
sslEnabled: true,
region: 'us-east-1',
},
});
main(client);
}
function main(client) {
https.get(url.parse("https://ziglang.org/" + master), function(res) {
var preserve_loc = res.headers['location'];
preserve_loc = preserve_loc.substring(1);
console.error("preserving: " + master);
console.error("preserving: " + preserve_loc);
res.destroy();
var params = {
recursive: false,
s3Params: {
Bucket: bucket,
Prefix: 'builds/',
Delimiter: '/',
},
};
var finder = client.listObjects(params);
var toDelete = [];
var foundMaster = false;
var foundMasterDest = false;
finder.on('data', function(data) {
var i;
for (i = 0; i < data.Contents.length; i += 1) {
var obj = data.Contents[i];
if (obj.Key == preserve_loc) {
foundMasterDest = true;
} else if (obj.Key == master) {
foundMaster = true;
} else {
toDelete.push(obj.Key);
}
}
if (foundMaster && foundMasterDest) {
doDeletes(client, toDelete);
} else {
if (!foundMaster) {
console.error("did not find master branch object");
}
if (!foundMasterDest) {
console.error("did not find master branch destination object");
}
}
});
});
}
function doDeletes(client, toDelete) {
if (toDelete.length == 0) {
console.error("nothing to delete");
return;
}
var params = {
Bucket: bucket,
Delete: {
Objects: [],
},
};
toDelete.forEach(function(x) {
console.error("deleting " + x);
});
var i;
for (i = 0; i < toDelete.length; i += 1) {
params.Delete.Objects.push({Key: toDelete[i]});
}
client.deleteObjects(params);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment