#!/usr/bin/env bash ### ### arching-kaos-tools ### Tools to interact and build an Arching Kaos Infochain ### Copyright (C) 2021 - 2025 kaotisk ### ### This program is free software: you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation, either version 3 of the License, or ### (at your option) any later version. ### ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### ### You should have received a copy of the GNU General Public License ### along with this program. If not, see . ### ## ## Indexes, shows, imports, adds, sets and gets values from and to the ## zchain and files. ## ## Usage: ## ## -h, --help Prints this help message ## -l, --local-index Show current status ## --show Show profile entry from specified DATA ## IPFS CIDv0 ## -s, --set Sets a profile value ## -g, --get Gets a profile value from the on-disk ## file. ## ## Advanced (use with caution may produce duplicate entries): ## ## -a, --add Creates a data file from the profile file ## you point (file should already be in ## ZPROFILEDIR). ## -i, --import Import a folder to zchain #TODO ## fullprogrampath="$(realpath $0)" PROGRAM=$(basename $0) descriptionString="Profile module" ZPROFILEDIR="$AK_WORKDIR/profile" source $AK_LIBDIR/_ak_log source $AK_LIBDIR/_ak_script source $AK_LIBDIR/_ak_ipfs source $AK_LIBDIR/_ak_gpg source $AK_LIBDIR/_ak_zblock # Whatever the command is, we check if $ZPROFILEDIR is there. # If NOT we create it and we change dir there. if [ ! -d $ZPROFILEDIR ] then mkdir $ZPROFILEDIR _ak_log_info "zprofiledir created" else _ak_log_info "zprofiledir found" fi cd $ZPROFILEDIR # This is working with DATA blocks. DATA that matched profile/add ACTION # # The profile settings/configuration is part of the blockchain produced. # Hence, we need a specific DATA block that actually has the announcement of a # {"key":"value"} pair. _ak_modules_profile_show(){ if [ ! -z $1 ] then _ak_log_info "Working with $1" _ak_ipfs_cat $(echo $(_ak_ipfs_cat $1) | jq '.ipfs' -r) else _ak_log_error "No DATA provided" exit 1 fi } # This should retrieve a specific value from our profile otherwise it dumps the # whole profile values. _ak_modules_profile_propget(){ if [ ! -z $1 ] then if [ ! -f $ZPROFILEDIR/$1 ] then _ak_log_error "property not found $1" else cat $ZPROFILEDIR/$1 fi else _ak_log_error "No particular property... indexing" _ak_modules_profile_index fi } _ak_modules_profile_propwrite(){ cat > $ZPROPERTY_FILE << EOF { "$ZPROPERTY_KEY":"${ZPROPERTY_VALUE}" } EOF if [ $? == 0 ] then _ak_log_info "Added successfully... proceeding" IPFS_FILE=$(_ak_ipfs_add $ZPROPERTY_FILE) _ak_log_info "Prop writting,,, $IPFS_FILE" _ak_modules_profile_add $ZPROPERTY_KEY cd $ZPROFILEDIR else _ak_log_error "Couldn't write to file $ZPROFILEDIR/$TO_FILE" exit 1 fi } _ak_modules_profile_propset(){ if [ ! -z $1 ] then ZPROPERTY_FILE="$ZPROFILEDIR/$1" ZPROPERTY_KEY="$1" if [ ! -f $ZPROPERTY_FILE ] then _ak_log_warning "No such property: $ZPROPERTY_KEY ... creating" ZPROPERTY_VALUE="$2" if [ ! -z "$ZPROPERTY_VALUE" ] then touch $ZPROPERTY_FILE _ak_log_debug "$ZPROPERTY_KEY = $ZPROPERTY_VALUE in file $ZPROPERTY_FILE" _ak_modules_profile_propwrite #"$ZPROPERTY_FILE" "${ZPROPERTY_VALUE}" else _ak_log_error "No value for $1" fi else _ak_log_info "found $ZPROPERTY_FILE" _ak_log_debug "$ZPROPERTY_KEY = $ZPROPERTY_VALUE in file $ZPROPERTY_FILE" ZPROPERTY_VALUE="$2" read -p "Overwrite $1 with ${ZPROPERTY_VALUE} ? " yn case $yn in [Yy]* ) _ak_modules_profile_propwrite;;# "$ZPROPERTY_" "${ZPROPERTY_VALUE}";; [Nn]* ) exit 130;; * ) echo "Answer please";; esac _ak_log_debug $IPFS_FILE _ak_modules_profile_show $IPFS_FILE fi else _ak_log_error "conditions unmet" exit 244 fi } _ak_modules_profile_index(){ FILES="$(ls -1 $ZPROFILEDIR)" i=0 echo -n "{" for FILE in $FILES do if [ $FILE != "README" ]; then if [ $i != "0" ]; then echo -n ","; fi PROP=$(echo $(cat $ZPROFILEDIR/$FILE | ak-json2bash) | cut -d '=' -f 1 | awk '{print $0}') VAL=$(echo $(cat $ZPROFILEDIR/$FILE | ak-json2bash) | cut -d '=' -f 2 | awk '{print $1}') echo -n '"'$PROP'":"'$VAL'"'; let i+=1 fi done echo "}" } _ak_modules_profile_import(){ if [ ! -z $1 ] then if [ ! -d $1 ] then _ak_log_error "Profile folder check: Folder $1 does not exist. Stopping..." exit 4 else _ak_log_info "Profile folder check: Folder $1 exists." fl="$(ls -1 $1)" for f in $fl do _ak_modules_profile_add $1/$f done fi else _ak_log_error "No value" exit 6 fi exit 224 } # Adds a file as a profile/add ACTION on the zchain. _ak_modules_profile_add(){ TEMPASSIN="$(_ak_make_temp_directory)" cd $TEMPASSIN if [ -f $ZPROFILEDIR/$1 ]; then FILE="$ZPROFILEDIR/$1" _ak_log_info "Adding from " $FILE FILE_IPFS_HASH=$(_ak_ipfs_add $FILE) FILE_SIGN_FILE=$(pwd)/$1".asc" _ak_gpg_sign_detached $FILE_SIGN_FILE $FILE FILE_SIGNATURE=$(_ak_ipfs_add $FILE_SIGN_FILE) cat > data <