mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-23 01:55:10 +00:00
move ccpackage/ contents into network script
Signed-off-by: Josh Kneubuhl <jkneubuh@us.ibm.com>
This commit is contained in:
parent
a48aa0a46f
commit
827e30cf30
9 changed files with 111 additions and 132 deletions
|
|
@ -26,7 +26,7 @@ network up
|
||||||
network channel create
|
network channel create
|
||||||
```
|
```
|
||||||
```
|
```
|
||||||
network chaincode deploy ${PWD}
|
network chaincode deploy asset-transfer-basic basic_1.0 ${PWD}
|
||||||
```
|
```
|
||||||
```
|
```
|
||||||
network chaincode metadata asset-transfer-basic
|
network chaincode metadata asset-transfer-basic
|
||||||
|
|
@ -44,22 +44,22 @@ network channel create
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
# Build the chaincode docker image
|
# Build the chaincode docker image
|
||||||
docker build -t hyperledger/fabric-samples/asset-transfer-basic/chaincode-java .
|
docker build -t fabric-samples/asset-transfer-basic/chaincode-java .
|
||||||
|
|
||||||
# Load the docker image directly to the KIND control plane.
|
# Load the docker image directly to the KIND control plane.
|
||||||
# (Alternately, build/tag/push the image to a remote container registry, e.g. localhost:5000)
|
# (Alternately, build/tag/push the image to a remote container registry, e.g. localhost:5000)
|
||||||
kind load docker-image hyperledger/fabric-samples/asset-transfer-basic/chaincode-java
|
kind load docker-image fabric-samples/asset-transfer-basic/chaincode-java
|
||||||
```
|
```
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
# Assemble the chaincode package archive
|
# Assemble the chaincode package archive
|
||||||
network chaincode package $PWD/ccpackage/ $PWD/build/asset-transfer.tgz
|
network chaincode package basic_1.0 asset-transfer-basic $PWD/build/asset-transfer.tgz
|
||||||
|
|
||||||
# Determine the ID for the chaincode package
|
# Determine the ID for the chaincode package
|
||||||
CORE_CHAINCODE_ID_NAME=$(network chaincode id $PWD/build/asset-transfer.tgz)
|
CORE_CHAINCODE_ID_NAME=$(network chaincode id $PWD/build/asset-transfer.tgz)
|
||||||
|
|
||||||
# Launch the chaincode in k8s as Deployment + Service
|
# Launch the chaincode in k8s as Deployment + Service
|
||||||
network chaincode launch $PWD/build/asset-transfer.tgz
|
network chaincode launch asset-transfer-basic $CORE_CHAINCODE_ID_NAME fabric-samples/asset-transfer-basic/chaincode-java
|
||||||
|
|
||||||
# Complete the chaincode lifecycle
|
# Complete the chaincode lifecycle
|
||||||
network chaincode install $PWD/build/asset-transfer.tgz
|
network chaincode install $PWD/build/asset-transfer.tgz
|
||||||
|
|
@ -75,7 +75,7 @@ network chaincode query asset-transfer-basic '{"Args":["ReadAsset","asset1"]
|
||||||
```
|
```
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
kubectl -n test-network logs -f deployment/org1peer1-cc-asset-transfer-basic
|
kubectl -n test-network logs -f deployment/org1peer1-ccaas-asset-transfer-basic
|
||||||
```
|
```
|
||||||
|
|
||||||
## Debugging
|
## Debugging
|
||||||
|
|
@ -96,20 +96,16 @@ docker build -t fabric-samples/asset-transfer-basic/chaincode-java .
|
||||||
By instructing the peer to connect to chaincode at the Docker host alias `host.docker.internal`, pods running in
|
By instructing the peer to connect to chaincode at the Docker host alias `host.docker.internal`, pods running in
|
||||||
Kubernetes will access the local process via a special loopback interface established by KIND.
|
Kubernetes will access the local process via a special loopback interface established by KIND.
|
||||||
|
|
||||||
Set the "address" attribute in the project's [ccpackage/connection.json](ccpackage/connection.json) descriptor and assemble the chaincode package:
|
Set the "address" attribute in the package connection.json descriptor and assemble the chaincode package:
|
||||||
```json
|
|
||||||
{
|
|
||||||
"address": "host.docker.internal:9999",
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
network cc package $PWD/ccpackage/ $PWD/build/asset-transfer-debug.tgz
|
export TEST_NETWORK_CHAINCODE_ADDRESS=host.docker.internal:9999
|
||||||
|
|
||||||
|
network cc package basic_1.0 asset-transfer-debug $PWD/build/asset-transfer-debug.tgz
|
||||||
```
|
```
|
||||||
|
|
||||||
### Launch
|
### Launch
|
||||||
|
|
||||||
When chaincode is launched locally, it must declare the package ID in the enviroment as if the process had been managed
|
When chaincode is launched locally, it must declare the package ID in the environment as if the process had been managed
|
||||||
by the peer's chaincode lifecycle manager. Calculate the package ID and start the chaincode, binding to port 9999
|
by the peer's chaincode lifecycle manager. Calculate the package ID and start the chaincode, binding to port 9999
|
||||||
on the local system:
|
on the local system:
|
||||||
|
|
||||||
|
|
@ -117,7 +113,7 @@ on the local system:
|
||||||
export CHAINCODE_SERVER_ADDRESS=0.0.0.0:9999
|
export CHAINCODE_SERVER_ADDRESS=0.0.0.0:9999
|
||||||
export CORE_CHAINCODE_ID_NAME=$(network chaincode id $PWD/build/asset-transfer-debug.tgz)
|
export CORE_CHAINCODE_ID_NAME=$(network chaincode id $PWD/build/asset-transfer-debug.tgz)
|
||||||
|
|
||||||
java -jar build/libs/chaincode.jar
|
java -jar build/libs/chaincode.jar
|
||||||
```
|
```
|
||||||
|
|
||||||
Or using the editor/debugger/IDE of your choice, create a launch target for `ContractMain.main()`, specifying the
|
Or using the editor/debugger/IDE of your choice, create a launch target for `ContractMain.main()`, specifying the
|
||||||
|
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Scratch notes - Ignore - ... `fabric-cli` redux
|
|
||||||
|
|
||||||
`fabric [options] peer <group> <command> [parameters]`
|
|
||||||
|
|
||||||
```
|
|
||||||
fabric => network
|
|
||||||
peer => implicit (from env/context)
|
|
||||||
channel => implicit (from env/context)
|
|
||||||
group => chaincode
|
|
||||||
[params] => --param=value or NETWORK_$GROUP_$COMMAND_$PARAM=value from env
|
|
||||||
```
|
|
||||||
|
|
||||||
```shell
|
|
||||||
network chaincode package <folder-path> <bundle-path>
|
|
||||||
network chaincode id <bundle-path>
|
|
||||||
network chaincode install <bundle-path>
|
|
||||||
network chaincode approve <name> <id>
|
|
||||||
network chainocde commit <name>
|
|
||||||
```
|
|
||||||
|
|
||||||
```shell
|
|
||||||
network chaincode list
|
|
||||||
network chaincode delete <name>
|
|
||||||
network chaincode describe <name>
|
|
||||||
network chaincode invoke <name> <payload>
|
|
||||||
network chaincode query <name> <payload>
|
|
||||||
```
|
|
||||||
|
|
||||||
meta / fictitious targets:
|
|
||||||
```
|
|
||||||
network chaincode launch <name> <CC_IMAGE>
|
|
||||||
network chaincode deploy <name> <folder-path> # package, install, LAUNCH, approve, commit
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
ordinal position args vs. named parameters vs. env overrides
|
|
||||||
```shell
|
|
||||||
network chaincode package asset-transfer my-chaincode.tar.gz
|
|
||||||
|
|
||||||
network cc package --name=asset-transfer (or NETWORK_CHAINCODE_PACKAGE_NAME=asset-transfer)
|
|
||||||
network cc package --name= (or NETWORK_${GROUP}_${COMMAND}_${PARAM}=<value>)
|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
{
|
|
||||||
"name": "asset-transfer-basic",
|
|
||||||
"image": "hyperledger/fabric-samples/asset-transfer-basic/chaincode-java:latest"
|
|
||||||
}
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"address": "{{.peername}}-cc-asset-transfer-basic:9999",
|
|
||||||
"dial_timeout": "10s",
|
|
||||||
"tls_required": false
|
|
||||||
}
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
{
|
|
||||||
"type": "ccaas",
|
|
||||||
"label": "basic_1.0"
|
|
||||||
}
|
|
||||||
|
|
@ -67,7 +67,7 @@ function createNetwork() {
|
||||||
./network channel create
|
./network channel create
|
||||||
|
|
||||||
print "Deploying chaincode"
|
print "Deploying chaincode"
|
||||||
./network chaincode deploy $TEST_NETWORK_CHAINCODE_PATH
|
./network chaincode deploy asset-transfer-basic basic_1.0 $TEST_NETWORK_CHAINCODE_PATH
|
||||||
}
|
}
|
||||||
|
|
||||||
function stopNetwork() {
|
function stopNetwork() {
|
||||||
|
|
@ -82,7 +82,8 @@ trap "quitterLaScene" EXIT
|
||||||
createNetwork
|
createNetwork
|
||||||
|
|
||||||
print "Inserting and querying assets"
|
print "Inserting and querying assets"
|
||||||
( ./network chaincode invoke $CHAINCODE_NAME '{"Args":["InitLedger"]}' \
|
( ./network chaincode metadata $CHAINCODE_NAME \
|
||||||
|
&& ./network chaincode invoke $CHAINCODE_NAME '{"Args":["InitLedger"]}' \
|
||||||
&& sleep 5 \
|
&& sleep 5 \
|
||||||
&& ./network chaincode query $CHAINCODE_NAME '{"Args":["ReadAsset","asset1"]}' )
|
&& ./network chaincode query $CHAINCODE_NAME '{"Args":["ReadAsset","asset1"]}' )
|
||||||
print "OK"
|
print "OK"
|
||||||
|
|
|
||||||
|
|
@ -7,16 +7,16 @@
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: org1{{PEER_NAME}}-cc-{{CHAINCODE_NAME}}
|
name: org1{{PEER_NAME}}-ccaas-{{CHAINCODE_NAME}}
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: org1{{PEER_NAME}}-cc-{{CHAINCODE_NAME}}
|
app: org1{{PEER_NAME}}-ccaas-{{CHAINCODE_NAME}}
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
app: org1{{PEER_NAME}}-cc-{{CHAINCODE_NAME}}
|
app: org1{{PEER_NAME}}-ccaas-{{CHAINCODE_NAME}}
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: main
|
- name: main
|
||||||
|
|
@ -36,11 +36,11 @@ spec:
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: org1{{PEER_NAME}}-cc-{{CHAINCODE_NAME}}
|
name: org1{{PEER_NAME}}-ccaas-{{CHAINCODE_NAME}}
|
||||||
spec:
|
spec:
|
||||||
ports:
|
ports:
|
||||||
- name: chaincode
|
- name: chaincode
|
||||||
port: 9999
|
port: 9999
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
selector:
|
selector:
|
||||||
app: org1{{PEER_NAME}}-cc-{{CHAINCODE_NAME}}
|
app: org1{{PEER_NAME}}-ccaas-{{CHAINCODE_NAME}}
|
||||||
|
|
@ -7,21 +7,35 @@
|
||||||
|
|
||||||
# Convenience routine to "do everything" required to bring up a sample CC.
|
# Convenience routine to "do everything" required to bring up a sample CC.
|
||||||
function deploy_chaincode() {
|
function deploy_chaincode() {
|
||||||
|
local cc_name=$1
|
||||||
|
local cc_label=$2
|
||||||
|
local cc_folder=$(absolute_path $3)
|
||||||
|
|
||||||
|
local temp_folder=$(mktemp -d)
|
||||||
|
local cc_package=${temp_folder}/${cc_name}.tgz
|
||||||
|
|
||||||
|
package_chaincode ${cc_label} ${cc_name} ${cc_package}
|
||||||
|
|
||||||
|
set_chaincode_id ${cc_package}
|
||||||
|
set_chaincode_image ${cc_folder}
|
||||||
|
|
||||||
|
build_chaincode_image ${cc_folder} ${CHAINCODE_IMAGE}
|
||||||
|
kind_load_image ${CHAINCODE_IMAGE}
|
||||||
|
launch_chaincode ${cc_name} ${CHAINCODE_ID} ${CHAINCODE_IMAGE}
|
||||||
|
|
||||||
|
activate_chaincode ${cc_name} ${cc_package}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Infer a reasonable name for the chaincode image based on the folder path conventions, or
|
||||||
|
# allow the user to override with TEST_NETWORK_CHAINCODE_IMAGE.
|
||||||
|
function set_chaincode_image() {
|
||||||
local cc_folder=$1
|
local cc_folder=$1
|
||||||
local build_folder=${cc_folder}/build
|
|
||||||
local cc_package=${build_folder}/chaincode.tgz
|
|
||||||
|
|
||||||
build_chaincode_image ${cc_folder}
|
if [ -z "$TEST_NETWORK_CHAINCODE_IMAGE" ]; then
|
||||||
|
CHAINCODE_IMAGE=${cc_folder/*fabric-samples/fabric-samples}
|
||||||
mkdir -p ${build_folder}
|
else
|
||||||
|
CHAINCODE_IMAGE=${TEST_NETWORK_CHAINCODE_IMAGE}
|
||||||
package_chaincode ${cc_folder}/ccpackage ${cc_package}
|
fi
|
||||||
extract_chaincode_image ${cc_package}
|
|
||||||
extract_chaincode_name ${cc_package}
|
|
||||||
|
|
||||||
launch_chaincode ${cc_package}
|
|
||||||
|
|
||||||
activate_chaincode ${CHAINCODE_NAME} ${cc_package}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Convenience routine to "do everything other than package and launch" a sample CC.
|
# Convenience routine to "do everything other than package and launch" a sample CC.
|
||||||
|
|
@ -73,8 +87,6 @@ function invoke_chaincode() {
|
||||||
local cc_name=$1
|
local cc_name=$1
|
||||||
shift
|
shift
|
||||||
|
|
||||||
# set -x
|
|
||||||
|
|
||||||
export_peer_context org1 peer1
|
export_peer_context org1 peer1
|
||||||
|
|
||||||
peer chaincode invoke \
|
peer chaincode invoke \
|
||||||
|
|
@ -89,24 +101,58 @@ function invoke_chaincode() {
|
||||||
|
|
||||||
function build_chaincode_image() {
|
function build_chaincode_image() {
|
||||||
local cc_folder=$1
|
local cc_folder=$1
|
||||||
local cc_image=$(jq -r .image ${cc_folder}/ccpackage/ccaas.json)
|
local cc_image=$2
|
||||||
|
|
||||||
push_fn "Building chaincode image ${cc_image}"
|
push_fn "Building chaincode image ${cc_image}"
|
||||||
|
|
||||||
docker build -t ${cc_image} ${cc_folder}
|
docker build -t ${cc_image} ${cc_folder}
|
||||||
|
|
||||||
|
pop_fn
|
||||||
|
}
|
||||||
|
|
||||||
|
function kind_load_image() {
|
||||||
|
local cc_image=$1
|
||||||
|
|
||||||
|
push_fn "Loading chaincode to kind image plane"
|
||||||
|
|
||||||
kind load docker-image ${cc_image}
|
kind load docker-image ${cc_image}
|
||||||
|
|
||||||
pop_fn
|
pop_fn
|
||||||
}
|
}
|
||||||
|
|
||||||
function package_chaincode() {
|
function package_chaincode() {
|
||||||
local cc_folder=$1
|
local cc_label=$1
|
||||||
local cc_archive=$2
|
local cc_name=$2
|
||||||
local archive_name=$(basename $cc_archive)
|
local cc_archive=$3
|
||||||
push_fn "Packaging chaincode ${archive_name}"
|
|
||||||
|
|
||||||
tar -C ${cc_folder} -zcf ${cc_folder}/code.tar.gz connection.json ccaas.json
|
local cc_folder=$(dirname $cc_archive)
|
||||||
|
local archive_name=$(basename $cc_archive)
|
||||||
|
|
||||||
|
push_fn "Packaging chaincode ${cc_label}"
|
||||||
|
|
||||||
|
mkdir -p ${cc_folder}
|
||||||
|
|
||||||
|
# Allow the user to override the service URL for the endpoint. This allows, for instance,
|
||||||
|
# local debugging at the 'host.docker.internal' DNS alias.
|
||||||
|
local cc_default_address="{{.peername}}-ccaas-${cc_name}:9999"
|
||||||
|
local cc_address=${TEST_NETWORK_CHAINCODE_ADDRESS:-$cc_default_address}
|
||||||
|
|
||||||
|
cat << EOF > ${cc_folder}/connection.json
|
||||||
|
{
|
||||||
|
"address": "${cc_address}",
|
||||||
|
"dial_timeout": "10s",
|
||||||
|
"tls_required": false
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat << EOF > ${cc_folder}/metadata.json
|
||||||
|
{
|
||||||
|
"type": "ccaas",
|
||||||
|
"label": "${cc_label}"
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
tar -C ${cc_folder} -zcf ${cc_folder}/code.tar.gz connection.json
|
||||||
tar -C ${cc_folder} -zcf ${cc_archive} code.tar.gz metadata.json
|
tar -C ${cc_folder} -zcf ${cc_archive} code.tar.gz metadata.json
|
||||||
|
|
||||||
rm ${cc_folder}/code.tar.gz
|
rm ${cc_folder}/code.tar.gz
|
||||||
|
|
@ -116,26 +162,37 @@ function package_chaincode() {
|
||||||
|
|
||||||
function launch_chaincode_service() {
|
function launch_chaincode_service() {
|
||||||
local org=$1
|
local org=$1
|
||||||
local cc_id=$2
|
local peer=$2
|
||||||
local cc_image=$3
|
local cc_name=$3
|
||||||
local peer=$4
|
local cc_id=$4
|
||||||
|
local cc_image=$5
|
||||||
push_fn "Launching chaincode container \"${cc_image}\""
|
push_fn "Launching chaincode container \"${cc_image}\""
|
||||||
|
|
||||||
# The chaincode endpoint needs to have the generated chaincode ID available in the environment.
|
# The chaincode endpoint needs to have the generated chaincode ID available in the environment.
|
||||||
# This could be from a config map, a secret, or by directly editing the deployment spec. Here we'll keep
|
# This could be from a config map, a secret, or by directly editing the deployment spec. Here we'll keep
|
||||||
# things simple by using sed to substitute script variables into a yaml template.
|
# things simple by using sed to substitute script variables into a yaml template.
|
||||||
cat kube/${org}/${org}-cc-template.yaml \
|
cat kube/${org}/${org}-cc-template.yaml \
|
||||||
| sed 's,{{CHAINCODE_NAME}},'${CHAINCODE_NAME}',g' \
|
| sed 's,{{CHAINCODE_NAME}},'${cc_name}',g' \
|
||||||
| sed 's,{{CHAINCODE_ID}},'${cc_id}',g' \
|
| sed 's,{{CHAINCODE_ID}},'${cc_id}',g' \
|
||||||
| sed 's,{{CHAINCODE_IMAGE}},'${cc_image}',g' \
|
| sed 's,{{CHAINCODE_IMAGE}},'${cc_image}',g' \
|
||||||
| sed 's,{{PEER_NAME}},'${peer}',g' \
|
| sed 's,{{PEER_NAME}},'${peer}',g' \
|
||||||
| exec kubectl -n $NS apply -f -
|
| exec kubectl -n $NS apply -f -
|
||||||
|
|
||||||
kubectl -n $NS rollout status deploy/${org}${peer}-cc-${CHAINCODE_NAME}
|
kubectl -n $NS rollout status deploy/${org}${peer}-ccaas-${cc_name}
|
||||||
|
|
||||||
pop_fn
|
pop_fn
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function launch_chaincode() {
|
||||||
|
local org=org1
|
||||||
|
local cc_name=$1
|
||||||
|
local cc_id=$2
|
||||||
|
local cc_image=$3
|
||||||
|
|
||||||
|
launch_chaincode_service ${org} peer1 ${cc_name} ${cc_id} ${cc_image}
|
||||||
|
launch_chaincode_service ${org} peer2 ${cc_name} ${cc_id} ${cc_image}
|
||||||
|
}
|
||||||
|
|
||||||
function install_chaincode_for() {
|
function install_chaincode_for() {
|
||||||
local org=$1
|
local org=$1
|
||||||
local peer=$2
|
local peer=$2
|
||||||
|
|
@ -202,27 +259,6 @@ function commit_chaincode() {
|
||||||
pop_fn
|
pop_fn
|
||||||
}
|
}
|
||||||
|
|
||||||
# The chaincode docker image is stored in the code.tar.gz ccaas.json
|
|
||||||
function extract_chaincode_image() {
|
|
||||||
CHAINCODE_IMAGE=$(tar zxfO $1 code.tar.gz | tar zxfO - ccaas.json | jq -r .image)
|
|
||||||
}
|
|
||||||
|
|
||||||
function extract_chaincode_name() {
|
|
||||||
CHAINCODE_NAME=$(tar zxfO $1 code.tar.gz | tar zxfO - ccaas.json | jq -r .name)
|
|
||||||
}
|
|
||||||
|
|
||||||
function launch_chaincode() {
|
|
||||||
local cc_package=$1
|
|
||||||
|
|
||||||
set_chaincode_id ${cc_package}
|
|
||||||
|
|
||||||
extract_chaincode_image ${cc_package}
|
|
||||||
extract_chaincode_name ${cc_package}
|
|
||||||
|
|
||||||
launch_chaincode_service org1 $CHAINCODE_ID $CHAINCODE_IMAGE peer1
|
|
||||||
launch_chaincode_service org1 $CHAINCODE_ID $CHAINCODE_IMAGE peer2
|
|
||||||
}
|
|
||||||
|
|
||||||
function set_chaincode_id() {
|
function set_chaincode_id() {
|
||||||
local cc_package=$1
|
local cc_package=$1
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -102,3 +102,11 @@ function export_peer_context() {
|
||||||
export CORE_PEER_MSPCONFIGPATH=${TEMP_DIR}/enrollments/${org}/users/${org}admin/msp
|
export CORE_PEER_MSPCONFIGPATH=${TEMP_DIR}/enrollments/${org}/users/${org}admin/msp
|
||||||
export CORE_PEER_TLS_ROOTCERT_FILE=${TEMP_DIR}/channel-msp/peerOrganizations/${org}/msp/tlscacerts/tlsca-signcert.pem
|
export CORE_PEER_TLS_ROOTCERT_FILE=${TEMP_DIR}/channel-msp/peerOrganizations/${org}/msp/tlscacerts/tlsca-signcert.pem
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function absolute_path() {
|
||||||
|
local relative_path=$1
|
||||||
|
|
||||||
|
local abspath="$( cd "${relative_path}" && pwd )"
|
||||||
|
|
||||||
|
echo $abspath
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue