astroport-docker/ipfs-swarm-cleaner/index.js

153 lines
5.0 KiB
JavaScript

const ipfsClient = require('ipfs-http-client');
const ssbClient = require('ssb-client');
const FS = require('fs');
const Path = require('path');
const pull = require('pull-stream');
const sbotOpts = {host:"oasis", port:8008};
const ipfsOpts = { host: 'ipfs', port: '5001', protocol: 'http' };
const homePath = "/root/.zen";
const ipfsWebUiHash = "bafybeidatpz2hli6fgu3zul5woi27ujesdf5o5a7bu622qj6ugharciwjq";
let clearSwarmPeers = async(ipfs) => {
const peersInfo = await ipfs.swarm.addrs();
peersInfo.forEach((peer) => {
ipfs.swarm.disconnect(peer.addrs[0]).then(() => {
console.log(`${peer.id} disconnected`)
}).catch((err) => {
console.log(`${peer.id} not disconnect : ${err.message}`)
} )
});
}
let clearBootstrapPeers = async(ipfs) => {
const bootstraps = await ipfs.bootstrap.list()
bootstraps.Peers.forEach((bootstrap) => {
ipfs.bootstrap.rm(bootstrap)
.then((done) => {console.log(`${bootstrap} disconnected`)})
.catch((err) => {console.log(`${bootstrap} not diconnect : ${error.message}`)})
});
}
let connectOnSwarm = async(ipfs, addr) => {
ipfs.swarm.connect(addr)
.then((done) => {console.log(`${addr} connected`)})
.catch((err) => { console.log(`${addr} not connected error : ${err.message}`)})
}
let whoami = () => {
return new Promise((resolve, reject) => {
ssbClient(sbotOpts, (err, sbot) => {
if(err) reject(err);
sbot.whoami((err, id) => {
if(err) reject(err);
sbot.close();
resolve(id);
})
});
})
}
let ssbRequest = (query) => {
return new Promise((resolve, reject) => {
ssbClient(sbotOpts, (err, sbot) => {
if(err) reject(err);
pull(sbot.query.read(query), pull.collect((error, results) => {
if(error) reject(error);
sbot.close();
resolve(results);
}));
});
});
}
let ssbFriends = () => {
return new Promise((resolve, reject) => {
ssbClient(sbotOpts, (err, sbot) => {
if(err) reject(err);
pull(sbot.friends.createFriendStream(), pull.collect((err, friends) => {
if(err) reject(err);
sbot.close();
resolve(friends);
}));
});
});
};
let findRecent = (arr) => {
let recent = arr[0];
arr.forEach((a) => {
if(a.timestamp > recent.timestamp) {
recent = a;
}
});
return recent;
}
excludeLan = (addrs) => {
return addrs.filter((a) => !a.toString().match( /(127\.)|(10\.)|(172\.1[6-9]\.)|(172\.2[0-9]\.)|172\.3[0-1]\.|(192\.168\.)/gm))
}
let publish = (message) => {
return new Promise((resolve, reject) => {
ssbClient(sbotOpts, (err, sbot) => {
if(err) reject(err);
sbot.publish(message)
.then((d) => {
console.log(`your message : ${JSON.stringify(message)} plubished`);
sbot.close();
resolve();
})
.catch((err) => {
reject(err)
});
})
});
}
let main = async() => {
const ipfs = ipfsClient(ipfsOpts);
let identity = await ipfs.id();
let addrs = await ipfs.swarm.localAddrs();
let ipfsWebUIpinSet = await ipfs.pin.add(ipfsWebUiHash);
let wholeAddrs = excludeLan(addrs);
let ssbId = await whoami();
let friends = await ssbFriends();
let localRepositoryPath = Path.join(homePath, identity.id);
console.log(`Checking local repository ${localRepositoryPath}`)
console.log(`pin set webui ${JSON.stringify(ipfsWebUIpinSet)}`)
if(!FS.existsSync(localRepositoryPath)){
console.log(`Create ${localRepositoryPath}`)
FS.mkdirSync(localRepositoryPath);
FS.mkdirSync(Path.join(localRepositoryPath, 'G1SSB'))
}else {
console.log(`${localRepositoryPath} exist`)
}
let ipfsNodeIdRequest = await ssbRequest({"query":[{"$filter":{"value":{"content":{"type":"ipfsnodeid"}}}}]});
publish({"type":"ipfsnodeid", "text": identity.id});
for(var i = 0; i < wholeAddrs.length; i++) {
publish({"type": "ipfstryme", "text": wholeAddrs[i].toString() + "/p2p/"+identity.id})
}
console.log(`${identity.id} checking bootstrap peer`);
clearBootstrapPeers(ipfs);
console.log(`${identity.id} checking swarm peers`);
clearSwarmPeers(ipfs);
console.log(`${identity.id} all bootstrap peers and swarm peers are disconnected`)
console.log(`your ssb id ${ssbId.id}`)
for(var i = 0; i < friends.length; i++) {
console.log(`checking ${friends[i]} have ipfs node`);
let ipfsTryMes = await ssbRequest({"query":[{"$filter":{"value":{"author": friends[i], "content":{"type":"ipfstryme"}}}}]});
let recentIpfsTryMe = findRecent(ipfsTryMes);
if(recentIpfsTryMe)
connectOnSwarm(ipfs, recentIpfsTryMe.value.content.text);
else
console.log(`checking ${friends[i]} haven't ipfs node`)
}
}
main();