#!/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 <