finally actually writing the config file, although the peerid and private key are not included
This commit is contained in:
parent
d30fa55af7
commit
cba5d5cf20
7 changed files with 187 additions and 6 deletions
|
@ -52,7 +52,7 @@ struct RepoConfig {
|
||||||
* @param result the full filename including the path
|
* @param result the full filename including the path
|
||||||
* @returns true(1) on success, false(0) otherwise
|
* @returns true(1) on success, false(0) otherwise
|
||||||
*/
|
*/
|
||||||
int config_get_file_name(char* path, char* result);
|
int repo_config_get_file_name(char* path, char** result);
|
||||||
|
|
||||||
/***
|
/***
|
||||||
* Returns the path "extension" relative to the configuration root.
|
* Returns the path "extension" relative to the configuration root.
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
#define fs_repo_h
|
#define fs_repo_h
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include "ipfs/repo/config/config.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* a structure to hold the repo info
|
* a structure to hold the repo info
|
||||||
|
@ -32,4 +34,13 @@ int fs_repo_open(char* repo_path, struct FSRepo* repo);
|
||||||
*/
|
*/
|
||||||
int fs_repo_is_initialized(char* repo_path);
|
int fs_repo_is_initialized(char* repo_path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* write the config file to disk
|
||||||
|
* @param path the path to the file
|
||||||
|
* @param config the config structure
|
||||||
|
* @returns true(1) on success
|
||||||
|
*/
|
||||||
|
int fs_repo_write_config_file(char* path, struct RepoConfig* config);
|
||||||
|
|
||||||
|
|
||||||
#endif /* fs_repo_h */
|
#endif /* fs_repo_h */
|
||||||
|
|
|
@ -72,8 +72,13 @@ int config_path(char* config_root, char* extension, char* result, int max_len) {
|
||||||
* @param result the full filename including the path
|
* @param result the full filename including the path
|
||||||
* @returns true(1) on success, false(0) otherwise
|
* @returns true(1) on success, false(0) otherwise
|
||||||
*/
|
*/
|
||||||
int config_get_file_name(char* path, char* result) {
|
int repo_config_get_file_name(char* path, char** result) {
|
||||||
|
unsigned long max_len = strlen(path) + 8;
|
||||||
|
*result = malloc(sizeof(char) * max_len);
|
||||||
|
if (result == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
return os_utils_filepath_join(path, "/config", *result, max_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***
|
/***
|
||||||
|
|
|
@ -28,6 +28,8 @@ int repo_config_swarm_address_init(struct SwarmAddresses* swarm_addresses, char*
|
||||||
swarm_addresses->addresses[i] = newString;
|
swarm_addresses->addresses[i] = newString;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
swarm_addresses->num_addresses = array_length;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,12 +7,90 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "fs_repo.h"
|
#include "fs_repo.h"
|
||||||
#include "ipfs/repo/config/config.h"
|
|
||||||
#include "ipfs/os/utils.h"
|
#include "ipfs/os/utils.h"
|
||||||
/**
|
/**
|
||||||
* private methods
|
* private methods
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* writes the config file
|
||||||
|
* @param full_filename the full filename of the config file in the OS
|
||||||
|
* @param config the details to put into the file
|
||||||
|
* @returns true(1) on success, else false(0)
|
||||||
|
*/
|
||||||
|
int repo_config_write_config_file(char* full_filename, struct RepoConfig* config) {
|
||||||
|
FILE* out_file = fopen(full_filename, "w");
|
||||||
|
if (out_file == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
fprintf(out_file, "{\n");
|
||||||
|
fprintf(out_file, " \"Identity\": {\n");
|
||||||
|
fprintf(out_file, " \"PeerID\": \"%s\",\n", config->identity.peer_id);
|
||||||
|
// TODO: print correct format of private key
|
||||||
|
//fprintf(out_file, " \"PrivKey\": \"%s\"\n", config->identity.private_key.base64);
|
||||||
|
fprintf(out_file, " },\n");
|
||||||
|
fprintf(out_file, " \"Datastore\": {\n");
|
||||||
|
fprintf(out_file, " \"Type\": \"%s\",\n", config->datastore.type);
|
||||||
|
fprintf(out_file, " \"Path\": \"%s\",\n", config->datastore.path);
|
||||||
|
fprintf(out_file, " \"StorageMax\": \"%s\",\n", config->datastore.storage_max);
|
||||||
|
fprintf(out_file, " \"StorageGCWatermark\": %d,\n", config->datastore.storage_gc_watermark);
|
||||||
|
fprintf(out_file, " \"GCPeriod\": \"%s\",\n", config->datastore.gc_period);
|
||||||
|
fprintf(out_file, " \"Params\": null,\n");
|
||||||
|
fprintf(out_file, " \"NoSync\": %s,\n", config->datastore.no_sync ? "true" : "false");
|
||||||
|
fprintf(out_file, " \"HashOnRead\": %s,\n", config->datastore.hash_on_read ? "true" : "false");
|
||||||
|
fprintf(out_file, " \"BloomFilterSize\": %d\n", config->datastore.bloom_filter_size);
|
||||||
|
fprintf(out_file, " },\n \"Addresses\": {\n");
|
||||||
|
fprintf(out_file, " \"Swarm\": [\n");
|
||||||
|
for(int i = 0; i < config->addresses.swarm.num_addresses; i++) {
|
||||||
|
fprintf(out_file, " \"%s\"", config->addresses.swarm.addresses[i]);
|
||||||
|
if (i != (config->addresses.swarm.num_addresses - 1))
|
||||||
|
fprintf(out_file, ",\n");
|
||||||
|
else
|
||||||
|
fprintf(out_file, "\n");
|
||||||
|
}
|
||||||
|
fprintf(out_file, " ],\n");
|
||||||
|
fprintf(out_file, " \"API\": \"%s\",\n", config->addresses.api);
|
||||||
|
fprintf(out_file, " \"Gateway\": \"%s\"\n", config->addresses.gateway);
|
||||||
|
fprintf(out_file, " }\n \"Mounts\": {\n");
|
||||||
|
fprintf(out_file, " \"IPFS\": \"%s\",\n", config->mounts.ipfs);
|
||||||
|
fprintf(out_file, " \"IPNS\": \"%s\",\n", config->mounts.ipns);
|
||||||
|
fprintf(out_file, " \"FuseAllowOther\": %s\n", "false");
|
||||||
|
fprintf(out_file, " },\n \"Discovery\": {\n \"MDNS\": {\n");
|
||||||
|
fprintf(out_file, " \"Enabled\": %s,\n", config->discovery.mdns.enabled ? "true" : "false");
|
||||||
|
fprintf(out_file, " \"Interval\": %d\n }\n },\n", config->discovery.mdns.interval);
|
||||||
|
fprintf(out_file, " \"Ipns\": {\n");
|
||||||
|
fprintf(out_file, " \"RepublishedPeriod\": \"\",\n");
|
||||||
|
fprintf(out_file, " \"RecordLifetime\": \"\",\n");
|
||||||
|
fprintf(out_file, " \"ResolveCacheSize\": %d\n", config->ipns.resolve_cache_size);
|
||||||
|
fprintf(out_file, " },\n \"Bootstrap\": [\n");
|
||||||
|
for(int i = 0; i < config->peer_addresses.num_peers; i++) {
|
||||||
|
fprintf(out_file, " \"%s\"", config->peer_addresses.peers[i]->entire_string);
|
||||||
|
if (i < config->peer_addresses.num_peers - 1)
|
||||||
|
fprintf(out_file, ",\n");
|
||||||
|
else
|
||||||
|
fprintf(out_file, "\n");
|
||||||
|
}
|
||||||
|
fprintf(out_file, " ],\n \"Tour\": {\n \"Last\": \"\"\n },\n");
|
||||||
|
fprintf(out_file, " \"Gateway\": {\n");
|
||||||
|
fprintf(out_file, " \"HTTPHeaders\": {\n");
|
||||||
|
for (int i = 0; i < config->gateway.http_headers.num_elements; i++) {
|
||||||
|
fprintf(out_file, " \"%s\": [\n \"%s\"\n ]", config->gateway.http_headers.headers[i]->header, config->gateway.http_headers.headers[i]->value);
|
||||||
|
if (i < config->gateway.http_headers.num_elements - 1)
|
||||||
|
fprintf(out_file, ",\n");
|
||||||
|
else
|
||||||
|
fprintf(out_file, "\n");
|
||||||
|
}
|
||||||
|
fprintf(out_file, " \"RootRedirect\": \"%s\"\n", config->gateway.root_redirect);
|
||||||
|
fprintf(out_file, " \"Writable\": %s\n", config->gateway.writable ? "true" : "false");
|
||||||
|
fprintf(out_file, " \"PathPrefixes\": []\n");
|
||||||
|
fprintf(out_file, " },\n \"SupernodeRouting\": {\n");
|
||||||
|
fprintf(out_file, " \"Servers\": null\n },");
|
||||||
|
fprintf(out_file, " \"API\": {\n \"HTTPHeaders\": null\n },\n");
|
||||||
|
fprintf(out_file, " \"Swarm\": {\n \"AddrFilters\": null\n }\n}");
|
||||||
|
fclose(out_file);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* constructs the FSRepo struct. Basically fills in the FSRepo.path
|
* constructs the FSRepo struct. Basically fills in the FSRepo.path
|
||||||
* Remember: the path must be freed
|
* Remember: the path must be freed
|
||||||
|
@ -37,11 +115,16 @@ int repo_new_fs_repo(char* repo_path, struct FSRepo* repo) {
|
||||||
*/
|
*/
|
||||||
int repo_config_is_initialized(char* full_path) {
|
int repo_config_is_initialized(char* full_path) {
|
||||||
char* config_file_full_path;
|
char* config_file_full_path;
|
||||||
int retVal = config_get_file_name(full_path, config_file_full_path);
|
int retVal = repo_config_get_file_name(full_path, &config_file_full_path);
|
||||||
if (!retVal)
|
if (!retVal)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (os_utils_file_exists(config_file_full_path))
|
if (os_utils_file_exists(config_file_full_path))
|
||||||
retVal = 1;
|
retVal = 1;
|
||||||
|
else
|
||||||
|
retVal = 0;
|
||||||
|
|
||||||
|
free(config_file_full_path);
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,7 +168,6 @@ int fs_repo_open_datastore(struct FSRepo* repo) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* public methods
|
* public methods
|
||||||
*/
|
*/
|
||||||
|
@ -128,3 +210,45 @@ int fs_repo_is_initialized(char* repo_path) {
|
||||||
return fs_repo_is_initialized_unsynced(repo_path);
|
return fs_repo_is_initialized_unsynced(repo_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int fs_repo_init(char* path, struct RepoConfig* config) {
|
||||||
|
// TODO: Do a lock so 2 don't do this at the same time
|
||||||
|
|
||||||
|
// return error if this has already been done
|
||||||
|
if (fs_repo_is_initialized_unsynced(path))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
int retVal = fs_repo_write_config_file(path, config);
|
||||||
|
if (retVal == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// TODO: Implement this method
|
||||||
|
retVal = fs_repo_defaultds_init(path, config);
|
||||||
|
if (retVal == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// write the version to a file for migrations (see repo/fsrepo/migrations/mfsr.go)
|
||||||
|
//TODO: mfsr.RepoPath(repo_path).WriteVersion(RepoVersion)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* write the config file to disk
|
||||||
|
* @param path the path to the file
|
||||||
|
* @param config the config structure
|
||||||
|
* @returns true(1) on success
|
||||||
|
*/
|
||||||
|
int fs_repo_write_config_file(char* path, struct RepoConfig* config) {
|
||||||
|
if (fs_repo_is_initialized(path))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
char* buff = NULL;
|
||||||
|
if (!repo_config_get_file_name(path, &buff))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
int retVal = repo_config_write_config_file(buff, config);
|
||||||
|
|
||||||
|
free(buff);
|
||||||
|
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
#define test_repo_config_h
|
#define test_repo_config_h
|
||||||
|
|
||||||
#include "ipfs/repo/config/config.h"
|
#include "ipfs/repo/config/config.h"
|
||||||
|
#include "ipfs/repo/fsrepo/fs_repo.h"
|
||||||
|
#include "ipfs/os/utils.h"
|
||||||
|
|
||||||
int test_repo_config_init() {
|
int test_repo_config_init() {
|
||||||
struct RepoConfig repoConfig;
|
struct RepoConfig repoConfig;
|
||||||
|
@ -27,6 +29,17 @@ int test_repo_config_init() {
|
||||||
if (retVal != 0)
|
if (retVal != 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (repoConfig.addresses.swarm.num_addresses != 2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
retVal = strncmp(repoConfig.addresses.swarm.addresses[0], "/ip4/0.0.0.0/tcp/4001", 21);
|
||||||
|
if (retVal != 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
retVal = strncmp(repoConfig.addresses.swarm.addresses[1], "/ip6/::/tcp/4001", 16);
|
||||||
|
if (retVal != 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
// datastore
|
// datastore
|
||||||
retVal = strncmp(repoConfig.datastore.path, "/Users/JohnJones/.ipfs/datastore", 32);
|
retVal = strncmp(repoConfig.datastore.path, "/Users/JohnJones/.ipfs/datastore", 32);
|
||||||
if (retVal != 0)
|
if (retVal != 0)
|
||||||
|
@ -37,4 +50,29 @@ int test_repo_config_init() {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* test the writing of the config file
|
||||||
|
*/
|
||||||
|
int test_repo_config_write() {
|
||||||
|
// first delete the existing one
|
||||||
|
unlink("/tmp/config");
|
||||||
|
|
||||||
|
// now build a new one
|
||||||
|
struct RepoConfig repoConfig;
|
||||||
|
if (!repo_config_init(&repoConfig, 2048, "/tmp")) {
|
||||||
|
repo_config_free(&repoConfig);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fs_repo_write_config_file("/tmp", &repoConfig)) {
|
||||||
|
repo_config_free(&repoConfig);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
repo_config_free(&repoConfig);
|
||||||
|
|
||||||
|
// check to see if the file exists
|
||||||
|
return os_utils_file_exists("/tmp/config");
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* test_repo_config_h */
|
#endif /* test_repo_config_h */
|
||||||
|
|
|
@ -16,6 +16,7 @@ int testit(const char* name, int (*func)(void)) {
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
testit("test_repo_config_init", test_repo_config_init);
|
testit("test_repo_config_init", test_repo_config_init);
|
||||||
|
testit("test_repo_config_write", test_repo_config_write);
|
||||||
testit("test_repo_config_identity_new", test_repo_config_identity_new);
|
testit("test_repo_config_identity_new", test_repo_config_identity_new);
|
||||||
testit("test_repo_config_identity_private_key", test_repo_config_identity_private_key);
|
testit("test_repo_config_identity_private_key", test_repo_config_identity_private_key);
|
||||||
testit("test_reop_bootstrap_peers_init", test_repo_bootstrap_peers_init);
|
testit("test_reop_bootstrap_peers_init", test_repo_bootstrap_peers_init);
|
||||||
|
|
Loading…
Reference in a new issue