This repository has been archived by the owner on Apr 25, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pancake.sh
executable file
·415 lines (352 loc) · 8.78 KB
/
pancake.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
#!/bin/bash
WORKDIR=$(pwd)
KB_PATHS='kb/repo.path'
KB_DIR='kb'
mkdir -p $KB_DIR
touch $KB_PATHS # create if not exist
GIT_KB_PATHS='git.repo.path'
export GIT_TERMINAL_PROMPT=0
function usage() {
cat <<USAGE
Usage:
$0 [command] [options]
Commands:
install Install necessary components (sc-web, sc-machine) and clone knowledge bases
clean Remove all knowledge base folders
add Add a knowledge base from a local directory or a remote git repository
run Run ostis
unplug Remove a knowledge base from repo.path without deleting the directory
info Display information about the knowledge bases in use
help Show usage information
Description:
pancake - script that allows you to install and manage knowledge bases.
It can install the required components, clean up existing knowledge bases,
and add new knowledge bases from git repositories.
USAGE
exit 1
}
function run_usage() {
cat <<USAGE
Usage:
$0 run [-d]
Options:
d Detached run. Run docker containers in detached mod.
USAGE
exit 1
}
function add_usage() {
cat <<USAGE
Usage:
$0 add [-u]
Options:
u Install from remote repository
USAGE
exit 1
}
# ==============================================
# COMPONENTS PREPARE (SC-machine SC-web ProblemSover)
# clone / pull any component
function prepare_component() {
REPO=$1
NAME=$2
BRANCH=$3
echo -e "\033[1m[$NAME]\033[0m":
if [ -e "$NAME" ]; then
cd $NAME
git pull
else
if [ "$BRANCH" ]; then
git clone --branch "$BRANCH" "$REPO" "$NAME"
else
git clone "$REPO" "$NAME"
fi
fi
cd $WORKDIR
}
# clone / pull problem solver
# specific, cause its installation requires
# injection to sc-machine CMakeList.txt
function prepare_problem_solver() {
echo -e "\033[1m[problem-solver]\033[0m":
if [ -e "sc-machine/problem-solver" ]; then
cd sc-machine/problem-solver
git pull
else
cd sc-machine
git clone https://github.com/semantic-pie/problem-solver
echo 'add_subdirectory(${SC_MACHINE_ROOT}/problem-solver)' >> CMakeLists.txt
fi
cd $WORKDIR
}
# ==============================================
# UTILITIES
# check if repo ever exist and clone
function clone_git_repo() {
REPO=$1
NAME=$2
if git ls-remote --exit-code $REPO > /dev/null 2>&1; then
# if repo exist - clone
git clone --depth=1 "$REPO" "$NAME"
else
echo "Repo: [$REPO] not exist."
exit 1
fi
}
# add to repo.path if it's not there yet
function add_to_KB_PATHS() {
if ! grep -Fxq "$1" "$KB_PATHS"; then
echo "$1" >> $KB_PATHS
echo "ADDED SUCCESSFULLY [$1]"
else
echo "ALREDY EXIST [$1]"
exit 1
fi
}
# add to git.repo.path if it's not there yet
function add_to_GIT_KB_PATHS() {
REPO=$1
NAME=$2
if git ls-remote --exit-code https://github.com/$REPO > /dev/null 2>&1; then
if ! grep -q -E "$REPO|$NAME" "$GIT_KB_PATHS"; then
echo "$REPO $NAME" >> $GIT_KB_PATHS
else
echo "Repository [$REPO=$NAME] alredy exists"
fi
else
echo "Repo: [https://github.com/$REPO] not exist."
exit 1
fi
}
# remove from repo.path
function remove_from_KB_PATHS() {
TEMP="path.temp"
sed "/$1/d" "$KB_PATHS" >> $TEMP
mv $TEMP "$KB_PATHS"
}
# remove from git.repo.path
function remove_from_GIT_KB_PATHS() {
TEMP="path.temp"
sed "/$1/d" "$GIT_KB_PATHS" >> $TEMP
mv $TEMP "$GIT_KB_PATHS"
}
# add to repo.path
function add_local_kb() {
for kb_name in "$@"
do
if [[ -e $kb_name ]];then
add_to_KB_PATHS $kb_name
else
echo "Directory: [$kb_name] not exist. (move your kb folder to the kb directory)"
fi
done
}
# add to git.repo.path
function add_remote_kb() {
for arg in "$@"
do
IFS=":" read -r repo_url repo_name <<< "$arg"
if [[ ! $repo_url ]]; then
exit
fi
if [[ ! $repo_name ]]; then
repo_name=$(basename "$repo_url")
fi
add_to_GIT_KB_PATHS $repo_url $repo_name
# install remote kb
prepare_kb "https://github.com/$repo_url" "$repo_name"
done
}
# remove from repo.path
function safe_remove_local_kb() {
for kb_name in "$@"
do
remove_from_KB_PATHS $kb_name
done
}
# remove from git.repo.path
function safe_remove_remote_kb() {
for kb_name in "$@"
do
remove_from_GIT_KB_PATHS $kb_name
done
}
# ==============================================
# KNOWlEDGE BASES PREPARE
# clone / pull any kb
function prepare_kb() {
REPO=$1
NAME=$2
NORMAL_NAME=$NAME
echo -e "\033[1m[$NAME]\033[0m":
if [ -e "$NAME" ]; then
cd "$NAME"
git pull
else
# clone repo and (if success) add repo name to repo.path
clone_git_repo "$REPO" "$KB_DIR/$NAME" && add_to_KB_PATHS "$NORMAL_NAME"
fi
cd $WORKDIR
}
# clones all kb-repositories from git.repo.path
function prepare_all_kb() {
# If the file exists
if [ ! -f "$GIT_KB_PATHS" ]; then
echo "git.repo.path not found!"
exit 1
fi
# Loop through the file line by line
while read -r repo_url repo_name || [[ -n "$repo_url" ]]; do
# simple comments
if [[ $repo_url == \#* ]]; then
continue
fi
# if empty line
if [ -z "$repo_url" ]; then
continue
elif [ -z "$repo_name" ]; then
repo_name=$(basename "$repo_url")
fi
prepare_kb "https://github.com/$repo_url" "$repo_name"
done < "$GIT_KB_PATHS"
}
# remove all local kb-repositories
function remove_all_kb() {
# If the file exists
if [ ! -f "$KB_PATHS" ]; then
echo "[repo.path] not found!"
exit 1
fi
read -p "Are you sure you want to delete all knowledge bases? (y/n):" answer
if [[ $answer == "y" || $answer == "Y" ]]; then
while read -r repo_name; do
if [[ $repo_name == \#* ]]; then
continue
fi
rm -rf "$repo_name"
remove_from_KB_PATHS "$repo_name"
done < "$KB_PATHS"
echo "Removed."
else
echo "Canceled."
fi
}
# display content of repo.path and git.repo.path
function show_info() {
echo -e "\033[1m[LOCAL STORAGES]\033[0m":
while read -r repo_name; do
if [[ $repo_name == \#* ]]; then
continue
fi
if [[ -z "$repo_name" ]]; then
continue
fi
echo $repo_name
done < "$KB_PATHS"
echo ""
echo -e "\033[1m[SYNCHRONIZED GIT STORAGES]\033[0m":
while read -r repo_url repo_name; do
if [[ $repo_url == \#* ]]; then
continue
fi
# if empty line
if [ -z "$repo_url" ]; then
continue
elif [ -z "$repo_name" ]; then
repo_name=$(basename "$repo_url")
fi
echo -e "$repo_name\t[$repo_url]"
done < "$GIT_KB_PATHS"
}
# ==============================================
# COMMAND SWITCHER
case $1 in
# clone components
install)
# clone vitally important components
prepare_component https://github.com/NikitaZotov/sc-machine-1 sc-machine fix/deadlocks
prepare_component https://github.com/ostis-ai/sc-web sc-web
prepare_problem_solver
# clone knowledge bases
prepare_all_kb
;;
# clean project (remove all kbs)
clean)
remove_all_kb
;;
# add kb. Remote or local
add)
shift 1;
while getopts "uh" opt; do
case $opt in
u) IS_GIT_URL=1 ;;
h) add_usage ;;
\?) echoerr "Invalid option -$OPTARG" && add_usage ;;
esac
done
shift $((OPTIND - 1))
if [[ $IS_GIT_URL ]]; then
add_remote_kb $@
else
add_local_kb $@
fi
;;
# run ostis
run)
shift 1;
while getopts "dh" opt; do
case $opt in
d) DETACHED=1 ;;
h) run_usage ;;
\?) echo "Invalid option -$OPTARG" && run_usage
exit 1
;;
esac
done
shift $((OPTIND - 1))
if [[ $DETACHED ]]; then
echo "STARTING..."
docker compose up -d
else
docker compose up
fi
;;
# stop ostis
stop)
shift 1;
docker compose down
;;
# restart ostis
restart)
shift 1;
docker compose down
prepare_all_kb
docker compose up -d
echo "[RESTARTED]"
;;
# unplug kb without complete removal
unplug)
shift 1;
for kb_name in "$@"
do
safe_remove_local_kb $@
safe_remove_remote_kb $@
done
;;
info)
show_info
;;
# show help
--help)
usage
;;
help)
usage
;;
-h)
usage
;;
# All invalid commands will invoke usage page
*)
usage
;;
esac