Skip to content

Commit 10e823a

Browse files
committed
feat(odoo_scripts): refactor uninstall script for improved reliability and user feedback
- Refactored `docker-odoo-uninstall` script to fetch and validate installed modules before uninstallation - Added checks to skip uninstall for modules that are not installed - Improved help message formatting and parameter validation - Enhanced error handling and exit codes for better script reliability - Maintains colored output for clear user feedback during module operations - Bumped version from 1.0.0 to 1.0.1
1 parent e408664 commit 10e823a

File tree

1 file changed

+83
-48
lines changed

1 file changed

+83
-48
lines changed
Lines changed: 83 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,108 @@
11
#!/usr/bin/env bash
22
set -e
33

4-
# Get script name
4+
# Metadata
55
script=$(basename "$0")
6-
version="1.0.0"
6+
version="1.0.1"
77

88
# Display Help
99
help() {
1010
echo
1111
echo "$script"
1212
echo
1313
echo 'Description: Uninstall Odoo modules in Docker container.'
14-
echo "Syntax: $script [-c|-d|-u|-V|help]"
15-
echo 'Example: $script -c odoo01 -d erp -u hr,note'
16-
echo 'options:'
17-
echo ' -c Docker container. Defaults to '\''odoo'\''.'
18-
echo ' -d Database name.'
19-
echo ' -u Name of Odoo module to uninstall.'
20-
echo ' -V Show $script version.'
21-
echo " help Show $script manual."
14+
echo "Syntax: $script [-c CONTAINER] [-d DATABASE] [-u MODULES] [-V | help]"
15+
echo 'Example: '"$script"' -c odoo01 -d erp -u hr,note'
16+
echo 'Options:'
17+
echo ' -c Docker container name (default: odoo)'
18+
echo ' -d Database name'
19+
echo ' -u Comma-separated list of Odoo modules to uninstall'
20+
echo ' -V Show script version'
21+
echo " help Show this help message"
2222
echo
2323
}
2424

2525
# Show help and exit
26-
if [[ "$1" == 'help' ]]; then
26+
if [[ "${1:-}" == "help" ]]; then
2727
help
28-
exit
28+
exit 0
2929
fi
3030

31-
# Process params
32-
while getopts ':c: :d: :u: :V' opt; do
31+
# Default values
32+
container="odoo"
33+
34+
# Parse options
35+
while getopts ':c:d:u:V' opt; do
3336
case $opt in
34-
c) container="$OPTARG";;
35-
d) database="$OPTARG";;
36-
u) modules="$OPTARG";;
37-
V) echo "$script version $version"
38-
exit 0
39-
;;
40-
\?) echo "Invalid option -$OPTARG" >&2
41-
help
42-
exit;;
37+
c) container="$OPTARG" ;;
38+
d) database="$OPTARG" ;;
39+
u) modules="$OPTARG" ;;
40+
V) echo "$script version $version"; exit 0 ;;
41+
\?) echo "Invalid option: -$OPTARG" >&2; help; exit 1 ;;
4342
esac
4443
done
4544

46-
# Fallback to environment vars and default values
47-
: "${container:=odoo}"
45+
# Validate required parameters
46+
if [[ -z "${database:-}" ]]; then
47+
echo "Error: Parameter -d (database) is required." >&2
48+
exit 1
49+
fi
50+
if [[ -z "${modules:-}" ]]; then
51+
echo "Error: Parameter -u (modules) is required." >&2
52+
exit 1
53+
fi
4854

49-
# Verify variables
50-
[[ -z "$database" ]] && { echo 'Parameter -d|database is empty' ; exit 1; }
51-
[[ -z "$modules" ]] && { echo 'Parameter -u|module is empty' ; exit 1; }
55+
# Get list of installed modules from Odoo
56+
echo "Fetching list of installed modules..."
57+
installed_modules_list=$(docker exec "$container" /bin/bash -c "
58+
echo \"
59+
print(','.join([m.name for m in env['ir.module.module'].search([('state', '=', 'installed')])]))
60+
\" | odoo shell -d '$database' \
61+
--db_host=\$HOST \
62+
--db_user=\$USER \
63+
--db_password=\$PASSWORD \
64+
--no-http 2>/dev/null
65+
")
5266

53-
# Split modules by comma and loop through them
54-
IFS=',' read -ra MODULES <<< "$modules"
55-
for module in "${MODULES[@]}"; do
56-
module=$(echo "$module" | xargs)
57-
[[ -z "$module" ]] && continue
67+
# Convert comma-separated list to associative array for fast lookup
68+
declare -A installed_modules_map
69+
if [[ -n "$installed_modules_list" ]]; then
70+
# Remove any trailing newlines and whitespace
71+
installed_modules_list=$(echo "$installed_modules_list" | tr -d '\n\r')
72+
if [[ -n "$installed_modules_list" ]]; then
73+
IFS=',' read -ra installed_array <<< "$installed_modules_list"
74+
for module in "${installed_array[@]}"; do
75+
module=$(echo "$module" | xargs) # trim whitespace
76+
[[ -n "$module" ]] && installed_modules_map["$module"]=1
77+
done
78+
fi
5879

59-
echo -e "\033[38;5;214mWarning:\033[0m Removing module '$module' on database '$database' on container '$container'."
60-
docker exec $container /bin/bash -c "
61-
echo \"module = self.env['ir.module.module'].search([('name', '=', '$module')]);
62-
print('Module state:', module.state if module else 'not found');
63-
if module and module.state != 'uninstalled':
64-
print('Uninstalling...');
65-
module.filtered(lambda m: m.state != 'uninstalled').button_immediate_uninstall();
66-
else:
67-
print('Skipping uninstall...');\" | odoo shell -d $database \
68-
--db_host=\$HOST \
69-
--db_user=\$USER \
70-
--db_password=\$PASSWORD \
71-
--no-http
72-
"
73-
done
80+
fi
81+
82+
# Split input modules
83+
IFS=',' read -ra uninstall_modules <<< "$modules"
84+
85+
# Loop through requested modules and uninstall only those that are installed
86+
for module in "${uninstall_modules[@]}"; do
87+
module=$(echo "$module" | xargs) # trim spaces
88+
[[ -z "$module" ]] && continue
89+
if [[ ${installed_modules_map[$module]:-} ]]; then
90+
echo -e "\033[38;5;76mUninstalling\033[0m module '$module' on database '$database' in container '$container'."
91+
docker exec "$container" /bin/bash -c "
92+
echo \"def uninstall_module():
93+
module = env['ir.module.module'].search([('name', '=', '$module')])
94+
if module and module.state != 'uninstalled':
95+
print('Uninstalling...')
96+
module.button_immediate_uninstall()
97+
else:
98+
print('Module already uninstalled or not found.')
99+
uninstall_module()\" | odoo shell -d '$database' \
100+
--db_host=\$HOST \
101+
--db_user=\$USER \
102+
--db_password=\$PASSWORD \
103+
--no-http
104+
"
105+
else
106+
echo -e "\033[38;5;214mSkipping\033[0m module '$module': Not installed."
107+
fi
108+
done

0 commit comments

Comments
 (0)