11#! /usr/bin/env bash
22set -e
33
4- # Get script name
4+ # Metadata
55script=$( basename " $0 " )
6- version=" 1.0.0 "
6+ version=" 1.0.1 "
77
88# Display Help
99help () {
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
2929fi
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
4443done
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