forked from open-webui/pipelines
-
Notifications
You must be signed in to change notification settings - Fork 1
/
start.sh
executable file
·133 lines (110 loc) · 3.98 KB
/
start.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
#!/usr/bin/env bash
PORT="${PORT:-9099}"
HOST="${HOST:-0.0.0.0}"
# Default value for PIPELINES_DIR
PIPELINES_DIR=${PIPELINES_DIR:-./pipelines}
# Function to reset pipelines
reset_pipelines_dir() {
if [ "$RESET_PIPELINES_DIR" = true ]; then
echo "Resetting pipelines directory: $PIPELINES_DIR"
# Check if the directory exists
if [ -d "$PIPELINES_DIR" ]; then
# Remove all contents of the directory
rm -rf "${PIPELINES_DIR:?}"/*
echo "All contents in $PIPELINES_DIR have been removed."
# Optionally recreate the directory if needed
mkdir -p "$PIPELINES_DIR"
echo "$PIPELINES_DIR has been recreated."
else
echo "Directory $PIPELINES_DIR does not exist. No action taken."
fi
else
echo "RESET_PIPELINES_DIR is not set to true. No action taken."
fi
}
# Example usage of the function
reset_pipelines_dir
# Function to install requirements if requirements.txt is provided
install_requirements() {
if [[ -f "$1" ]]; then
echo "requirements.txt found at $1. Installing requirements..."
pip install -r "$1"
else
echo "requirements.txt not found at $1. Skipping installation of requirements."
fi
}
# Check if the PIPELINES_REQUIREMENTS_PATH environment variable is set and non-empty
if [[ -n "$PIPELINES_REQUIREMENTS_PATH" ]]; then
# Install requirements from the specified requirements.txt
install_requirements "$PIPELINES_REQUIREMENTS_PATH"
else
echo "PIPELINES_REQUIREMENTS_PATH not specified. Skipping installation of requirements."
fi
# Function to download the pipeline files
download_pipelines() {
local path=$1
local destination=$2
# Remove any surrounding quotes from the path
path=$(echo "$path" | sed 's/^"//;s/"$//')
echo "Downloading pipeline files from $path to $destination..."
if [[ "$path" =~ ^https://github.com/.*/.*/blob/.* ]]; then
# It's a single file
dest_file=$(basename "$path")
curl -L "$path?raw=true" -o "$destination/$dest_file"
elif [[ "$path" =~ ^https://github.com/.*/.*/tree/.* ]]; then
# It's a folder
git_repo=$(echo "$path" | awk -F '/tree/' '{print $1}')
subdir=$(echo "$path" | awk -F '/tree/' '{print $2}')
git clone --depth 1 --filter=blob:none --sparse "$git_repo" "$destination"
(
cd "$destination" || exit
git sparse-checkout set "$subdir"
)
elif [[ "$path" =~ \.py$ ]]; then
# It's a single .py file (but not from GitHub)
dest_file=$(basename "$path")
curl -L "$path" -o "$destination/$dest_file"
else
echo "Invalid URL format: $path"
exit 1
fi
}
# Function to parse and install requirements from frontmatter
install_frontmatter_requirements() {
local file=$1
local file_content=$(cat "$1")
# Extract the first triple-quoted block
local first_block=$(echo "$file_content" | awk '/"""/{flag=!flag; if(flag) count++; if(count == 2) {exit}} flag' )
# Check if the block contains requirements
local requirements=$(echo "$first_block" | grep -i 'requirements:')
if [ -n "$requirements" ]; then
# Extract the requirements list
requirements=$(echo "$requirements" | awk -F': ' '{print $2}' | tr ',' ' ' | tr -d '\r')
# Construct and echo the pip install command
local pip_command="pip install $requirements"
echo "$pip_command"
pip install $requirements
else
echo "No requirements found in frontmatter of $file."
fi
}
# Check if PIPELINES_URLS environment variable is set and non-empty
if [[ -n "$PIPELINES_URLS" ]]; then
if [ ! -d "$PIPELINES_DIR" ]; then
mkdir -p "$PIPELINES_DIR"
fi
# Split PIPELINES_URLS by ';' and iterate over each path
IFS=';' read -ra ADDR <<< "$PIPELINES_URLS"
for path in "${ADDR[@]}"; do
download_pipelines "$path" "$PIPELINES_DIR"
done
for file in "$pipelines_dir"/*; do
if [[ -f "$file" ]]; then
install_frontmatter_requirements "$file"
fi
done
else
echo "PIPELINES_URLS not specified. Skipping pipelines download and installation."
fi
# Start the server
uvicorn main:app --host "$HOST" --port "$PORT" --forwarded-allow-ips '*'