Skip to content

Commit daf2f4b

Browse files
authored
Release 1.2.0
2 parents 4df6db5 + 2f2ddd9 commit daf2f4b

3 files changed

Lines changed: 166 additions & 1 deletion

File tree

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.1.0
1+
1.2.0

packaging/rpm/redborder-common.spec

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ exit 0
4949
%doc
5050

5151
%changelog
52+
* Mon Jul 21 2025 Vicente Mesa <vimesa@redborder.com>
53+
- Add rb_backup_chef
54+
5255
* Mon Sep 16 2024 Miguel Negrón <manegron@redborder.com>
5356
- Add xmlstarlet and iotop
5457

resources/bin/rb_backup_chef.sh

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
#!/bin/bash
2+
3+
set -euo pipefail
4+
5+
# ======================
6+
# INITIAL CONFIGURATION
7+
# ======================
8+
9+
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
10+
DEFAULT_BACKUP_DIR="/var/chef"
11+
BACKUP_DIR="$DEFAULT_BACKUP_DIR"
12+
FILENAME=""
13+
SCRIPT=$(basename "$0")
14+
15+
# Export flags
16+
EXPORT_NODES=false
17+
EXPORT_ROLES=false
18+
19+
# ======================
20+
# GENERAL FUNCTIONS
21+
# ======================
22+
23+
log() {
24+
local level="$1"
25+
local msg="$2"
26+
echo "[$level] $(date '+%Y-%m-%d %H:%M:%S') - $msg"
27+
}
28+
29+
usage() {
30+
echo "Chef Backup"
31+
echo ""
32+
echo "Usage:"
33+
echo " $SCRIPT -e [options]"
34+
echo ""
35+
echo "Options:"
36+
echo " -e, --export Export Chef data"
37+
echo " -d, --directory <dir> Backup directory (default: $DEFAULT_BACKUP_DIR)"
38+
echo " -f, --file <name> Backup filename (timestamp will be appended)"
39+
echo " -n, --nodes-only Export nodes only"
40+
echo " -r, --roles-only Export roles only"
41+
echo " -h, --help Show help"
42+
echo ""
43+
echo "Examples:"
44+
echo " $SCRIPT -e # Export everything (nodes and roles)"
45+
echo " $SCRIPT -e -n # Export nodes only"
46+
echo " $SCRIPT -e -r # Export roles only"
47+
echo " $SCRIPT -e -d /backup/path # Export to specific directory"
48+
echo " $SCRIPT -e -f backupname # Use filename backupname_<timestamp>.json"
49+
exit 1
50+
}
51+
52+
check_dependencies() {
53+
if ! command -v knife >/dev/null 2>&1; then
54+
log "ERROR" "knife not found in PATH. Please install Chef Workstation."
55+
exit 1
56+
fi
57+
if ! command -v jq >/dev/null 2>&1; then
58+
log "ERROR" "jq not found. Please install jq for JSON handling."
59+
exit 1
60+
fi
61+
}
62+
63+
# ========================
64+
# ARGUMENT PARSER
65+
# ========================
66+
67+
parse_args() {
68+
local MODE_SET=false
69+
while [[ $# -gt 0 ]]; do
70+
case "$1" in
71+
-e|--export) MODE_SET=true; shift ;;
72+
-d|--directory) BACKUP_DIR="$2"; shift 2 ;;
73+
-n|--nodes-only) EXPORT_NODES=true; shift ;;
74+
-r|--roles-only) EXPORT_ROLES=true; shift ;;
75+
-f|--file) FILENAME="$2"; shift 2 ;;
76+
-h|--help) usage ;;
77+
*) echo "Unknown option: $1"; usage ;;
78+
esac
79+
done
80+
81+
if [[ "$MODE_SET" = false ]]; then
82+
log "ERROR" "You must specify --export (-e)"
83+
usage
84+
fi
85+
86+
# If no filter specified, export all (nodes + roles)
87+
if [[ "$EXPORT_NODES" = false && "$EXPORT_ROLES" = false ]]; then
88+
EXPORT_NODES=true
89+
EXPORT_ROLES=true
90+
fi
91+
}
92+
93+
# ===================
94+
# EXPORT FUNCTIONS
95+
# ===================
96+
97+
export_data() {
98+
mkdir -p "$BACKUP_DIR"
99+
100+
if [[ -n "$FILENAME" ]]; then
101+
BACKUP_FILE="$BACKUP_DIR/${FILENAME}_$TIMESTAMP.json"
102+
else
103+
BACKUP_FILE="$BACKUP_DIR/backup_chef_$TIMESTAMP.json"
104+
fi
105+
106+
log "INFO" "Exporting Chef data to $BACKUP_FILE"
107+
108+
metadata=$(jq -n \
109+
--arg timestamp "$TIMESTAMP" \
110+
--arg created_at "$(date -Iseconds)" \
111+
--arg hostname "$(hostname)" \
112+
--arg user "$USER" \
113+
'{timestamp: $timestamp, created_at: $created_at, hostname: $hostname, user: $user}'
114+
)
115+
116+
echo '{' > "$BACKUP_FILE"
117+
echo " \"metadata\": $metadata," >> "$BACKUP_FILE"
118+
119+
# ---- Export NODES ----
120+
if [[ "$EXPORT_NODES" = true ]]; then
121+
log "INFO" "Exporting nodes..."
122+
echo " \"nodes\": {" >> "$BACKUP_FILE"
123+
first=true
124+
for node in $(knife node list 2>/dev/null | grep -vE '^(INFO|WARN|ERROR):'); do
125+
json=$(knife node show "$node" -F json 2>/dev/null | grep -vE '^(INFO|WARN|ERROR):')
126+
$first || echo "," >> "$BACKUP_FILE"
127+
echo -n " \"$node\": $json" >> "$BACKUP_FILE"
128+
first=false
129+
done
130+
echo "" >> "$BACKUP_FILE"
131+
echo " }," >> "$BACKUP_FILE"
132+
fi
133+
134+
# ---- Export ROLES ----
135+
if [[ "$EXPORT_ROLES" = true ]]; then
136+
log "INFO" "Exporting roles..."
137+
echo " \"roles\": {" >> "$BACKUP_FILE"
138+
first=true
139+
for role in $(knife role list 2>/dev/null | grep -vE '^(INFO|WARN|ERROR):'); do
140+
json=$(knife role show "$role" -F json 2>/dev/null | grep -vE '^(INFO|WARN|ERROR):')
141+
$first || echo "," >> "$BACKUP_FILE"
142+
echo -n " \"$role\": $json" >> "$BACKUP_FILE"
143+
first=false
144+
done
145+
echo "" >> "$BACKUP_FILE"
146+
echo " }" >> "$BACKUP_FILE"
147+
else
148+
# Remove trailing comma if no roles but nodes exist
149+
sed -i '$ s/,$//' "$BACKUP_FILE"
150+
fi
151+
152+
echo "}" >> "$BACKUP_FILE"
153+
log "INFO" "Backup completed successfully."
154+
}
155+
156+
# ==========
157+
# MAIN
158+
# ==========
159+
160+
parse_args "$@"
161+
check_dependencies
162+
export_data

0 commit comments

Comments
 (0)