Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
A
aisbf
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexlab
aisbf
Commits
d9772366
Commit
d9772366
authored
Feb 07, 2026
by
Stefy Lanza (nextime / spora )
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update wrapper script
parent
8f07c660
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
86 additions
and
4 deletions
+86
-4
aisbf.sh
aisbf.sh
+26
-2
main.py
main.py
+60
-2
No files found.
aisbf.sh
View file @
d9772366
...
...
@@ -60,11 +60,25 @@ ensure_venv() {
fi
}
# Function to update venv packages silently
update_venv
()
{
# Update requirements if requirements.txt exists
if
[
-f
"
$SHARE_DIR
/requirements.txt"
]
;
then
"
$VENV_DIR
/bin/pip"
install
--upgrade
-r
"
$SHARE_DIR
/requirements.txt"
-q
2>/dev/null
fi
# Update aisbf package silently
"
$VENV_DIR
/bin/pip"
install
--upgrade
aisbf
-q
2>/dev/null
}
# Function to start the server
start_server
()
{
# Ensure venv exists
ensure_venv
# Update venv packages silently
update_venv
# Activate the virtual environment
source
$VENV_DIR
/bin/activate
...
...
@@ -72,7 +86,13 @@ start_server() {
cd
$SHARE_DIR
# Start the proxy server with logging
uvicorn main:app
--host
0.0.0.0
--port
8000 2>&1 |
tee
-a
"
$LOG_DIR
/aisbf_stdout.log"
# Redirect stderr to suppress BrokenPipeError during shutdown
uvicorn main:app
--host
127.0.0.1
--port
17765 2>&1 |
while
IFS
=
read
-r
line
;
do
# Filter out BrokenPipeError logging errors
if
[[
"
$line
"
!=
*
"--- Logging error ---"
*
]]
&&
[[
"
$line
"
!=
*
"BrokenPipeError"
*
]]
&&
[[
"
$line
"
!=
*
"Call stack:"
*
]]
&&
[[
"
$line
"
!=
*
"File "
*
"/python"
*
]]
&&
[[
"
$line
"
!=
*
"Message:"
*
]]
&&
[[
"
$line
"
!=
*
"Arguments:"
*
]]
;
then
echo
"
$line
"
|
tee
-a
"
$LOG_DIR
/aisbf_stdout.log"
fi
done
}
# Function to start as daemon
...
...
@@ -92,8 +112,12 @@ start_daemon() {
# Ensure venv exists
ensure_venv
# Update venv packages silently
update_venv
# Start in background with nohup and logging
nohup
bash
-c
"source
$VENV_DIR
/bin/activate && cd
$SHARE_DIR
&& uvicorn main:app --host 0.0.0.0 --port 8000"
>>
"
$LOG_DIR
/aisbf_stdout.log"
2>&1 &
# Filter out BrokenPipeError logging errors
nohup
bash
-c
"source
$VENV_DIR
/bin/activate && cd
$SHARE_DIR
&& uvicorn main:app --host 127.0.0.1 --port 17765 2>&1 | grep -v '--- Logging error ---' | grep -v 'BrokenPipeError' | grep -v 'Call stack:' | grep -v 'File .*python' | grep -v 'Message:' | grep -v 'Arguments:'"
>>
"
$LOG_DIR
/aisbf_stdout.log"
2>&1 &
PID
=
$!
echo
$PID
>
"
$PIDFILE
"
echo
"AISBF started in background (PID:
$PID
)"
...
...
main.py
View file @
d9772366
...
...
@@ -39,6 +39,54 @@ from datetime import datetime, timedelta
from
collections
import
defaultdict
from
pathlib
import
Path
class
BrokenPipeFilter
(
logging
.
Filter
):
"""Filter to suppress BrokenPipeError logging errors"""
def
filter
(
self
,
record
):
# Filter out BrokenPipeError and related logging errors
if
record
.
getMessage
()
.
startswith
(
'--- Logging error ---'
):
return
False
if
'BrokenPipeError'
in
record
.
getMessage
():
return
False
return
True
class
SafeStderr
:
"""Safe stderr wrapper that handles BrokenPipeError gracefully"""
def
__init__
(
self
,
original_stderr
,
log_file_path
):
self
.
original_stderr
=
original_stderr
self
.
log_file
=
None
try
:
self
.
log_file
=
open
(
log_file_path
,
'a'
)
except
Exception
:
pass
def
write
(
self
,
data
):
# Filter out BrokenPipeError and related logging errors
if
'--- Logging error ---'
in
data
or
'BrokenPipeError'
in
data
:
return
if
self
.
log_file
:
try
:
self
.
log_file
.
write
(
data
)
self
.
log_file
.
flush
()
except
(
BrokenPipeError
,
OSError
):
pass
else
:
try
:
self
.
original_stderr
.
write
(
data
)
except
(
BrokenPipeError
,
OSError
):
pass
def
flush
(
self
):
if
self
.
log_file
:
try
:
self
.
log_file
.
flush
()
except
(
BrokenPipeError
,
OSError
):
pass
else
:
try
:
self
.
original_stderr
.
flush
()
except
(
BrokenPipeError
,
OSError
):
pass
def
setup_logging
():
"""Setup logging with rotating file handlers"""
# Determine log directory based on user
...
...
@@ -102,8 +150,18 @@ def setup_logging():
root_logger
.
addHandler
(
error_handler
)
root_logger
.
addHandler
(
console_handler
)
# Redirect stderr to error log
sys
.
stderr
=
open
(
log_dir
/
'aisbf_stderr.log'
,
'a'
)
# Add BrokenPipeError filter to all handlers
broken_pipe_filter
=
BrokenPipeFilter
()
file_handler
.
addFilter
(
broken_pipe_filter
)
error_handler
.
addFilter
(
broken_pipe_filter
)
console_handler
.
addFilter
(
broken_pipe_filter
)
# Redirect stderr to error log with error handling and BrokenPipeError filtering
try
:
sys
.
stderr
=
SafeStderr
(
sys
.
stderr
,
log_dir
/
'aisbf_stderr.log'
)
except
Exception
as
e
:
logger
=
logging
.
getLogger
(
__name__
)
logger
.
warning
(
f
"Could not redirect stderr: {e}"
)
return
logging
.
getLogger
(
__name__
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment