· 6 years ago · Sep 11, 2019, 08:00 AM
1#!/bin/bash
2#
3# add the "-x" option to the shebang line if you want a more verbose output
4#
5#
6OPTSPEC=":hp:t:k:"
7
8show_help() {
9cat << EOF
10Usage: $0 [-p PATH] [-t TARGET_HOST] [-k API_KEY]
11Script to import dashboards into Grafana
12 -p Required. Root path containing JSON exports of the dashboards you want imported.
13 -t Required. The full URL of the target host
14 -k Required. The API key to use on the target host
15
16 -h Display this help and exit.
17EOF
18}
19
20###### Check script invocation options ######
21while getopts "$OPTSPEC" optchar; do
22 case "$optchar" in
23 h)
24 show_help
25 exit
26 ;;
27 p)
28 DASH_DIR="$OPTARG";;
29 t)
30 HOST="$OPTARG";;
31 k)
32 KEY="$OPTARG";;
33 \?)
34 echo "Invalid option: -$OPTARG" >&2
35 exit 1
36 ;;
37 :)
38 echo "Option -$OPTARG requires an argument." >&2
39 exit 1
40 ;;
41 esac
42done
43
44if [ -z "$DASH_DIR" ] || [ -z "$HOST" ] || [ -z "$KEY" ]; then
45 show_help
46 exit 1
47fi
48
49# set some colors for status OK, FAIL and titles
50SETCOLOR_SUCCESS="echo -en \\033[0;32m"
51SETCOLOR_FAILURE="echo -en \\033[1;31m"
52SETCOLOR_NORMAL="echo -en \\033[0;39m"
53SETCOLOR_TITLE_PURPLE="echo -en \\033[0;35m" # purple
54
55# usage log "string to log" "color option"
56function log_success() {
57 if [ $# -lt 1 ]; then
58 ${SETCOLOR_FAILURE}
59 echo "Not enough arguments for log function! Expecting 1 argument got $#"
60 exit 1
61 fi
62
63 timestamp=$(date "+%Y-%m-%d %H:%M:%S %Z")
64
65 ${SETCOLOR_SUCCESS}
66 printf "[%s] $1\n" "$timestamp"
67 ${SETCOLOR_NORMAL}
68}
69
70function log_failure() {
71 if [ $# -lt 1 ]; then
72 ${SETCOLOR_FAILURE}
73 echo "Not enough arguments for log function! Expecting 1 argument got $#"
74 exit 1
75 fi
76
77 timestamp=$(date "+%Y-%m-%d %H:%M:%S %Z")
78
79 ${SETCOLOR_FAILURE}
80 printf "[%s] $1\n" "$timestamp"
81 ${SETCOLOR_NORMAL}
82}
83
84function log_title() {
85 if [ $# -lt 1 ]; then
86 ${SETCOLOR_FAILURE}
87 log_failure "Not enough arguments for log function! Expecting 1 argument got $#"
88 exit 1
89 fi
90
91 ${SETCOLOR_TITLE_PURPLE}
92 printf "|-------------------------------------------------------------------------|\n"
93 printf "|%s|\n" "$1";
94 printf "|-------------------------------------------------------------------------|\n"
95 ${SETCOLOR_NORMAL}
96}
97
98if [ -d "$DASH_DIR" ]; then
99 DASH_LIST=$(find "$DASH_DIR" -mindepth 1 -name \*.json)
100 if [ -z "$DASH_LIST" ]; then
101 log_title "----------------- $DASH_DIR contains no JSON files! -----------------"
102 log_failure "Directory $DASH_DIR does not appear to contain any JSON files for import. Check your path and try again."
103 exit 1
104 else
105 FILESTOTAL=$(echo "$DASH_LIST" | wc -l)
106 log_title "----------------- Starting import of $FILESTOTAL dashboards -----------------"
107 fi
108else
109 log_title "----------------- $DASH_DIR directory not found! -----------------"
110 log_failure "Directory $DASH_DIR does not exist. Check your path and try again."
111 exit 1
112fi
113
114NUMSUCCESS=0
115NUMFAILURE=0
116COUNTER=0
117
118for DASH_FILE in $DASH_LIST; do
119 COUNTER=$((COUNTER + 1))
120 echo "Import $COUNTER/$FILESTOTAL: $DASH_FILE..."
121 RESULT=$(cat "$DASH_FILE" | jq '. * {overwrite: true, dashboard: {id: null}}' | curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $KEY" "$HOST"/api/dashboards/db -d @-)
122 if [[ "$RESULT" == *"success"* ]]; then
123 log_success "$RESULT"
124 NUMSUCCESS=$((NUMSUCCESS + 1))
125 else
126 log_failure "$RESULT"
127 NUMFAILURE=$((NUMFAILURE + 1))
128 fi
129done
130
131log_title "Import complete. $NUMSUCCESS dashboards were successfully imported. $NUMFAILURE dashboard imports failed.";
132log_title "------------------------------ FINISHED ---------------------------------";