Delete Users » History » Version 4
Zaffre, 05/31/2023 06:34 AM
1 | 1 | ragna | h1. Delete Users (SQLite) |
---|---|---|---|
2 | 1 | ragna | |
3 | 4 | Zaffre | Script to remove Quassel users from a SQLite database backend. Code below copied to "pastebin.com/MxAujj47":https://pastebin.com/MxAujj47 for your wget needs. |
4 | 1 | ragna | |
5 | 1 | ragna | <pre><code class="text"> |
6 | 1 | ragna | #!/bin/sh |
7 | 1 | ragna | # |
8 | 1 | ragna | # Delete Quasselcore users from your SQLite database |
9 | 1 | ragna | # |
10 | 1 | ragna | # File: deleteuser-sqlite.sh |
11 | 1 | ragna | # Author: Robbe Van der Gucht |
12 | 1 | ragna | # License: BSD-3-Clause, GPLv2, GPLv3 |
13 | 1 | ragna | # License statements can be found at the bottom. |
14 | 1 | ragna | # Any of the indicated licenses can be chosen for redistribution |
15 | 1 | ragna | # and only requires one of the license statements to be preserved. |
16 | 1 | ragna | |
17 | 1 | ragna | exeq() |
18 | 1 | ragna | { |
19 | 1 | ragna | # Execute SQL Query |
20 | 1 | ragna | result=$(sqlite3 "${QUASSELDB}" "${1}") |
21 | 1 | ragna | echo "${result}" |
22 | 1 | ragna | } |
23 | 1 | ragna | |
24 | 1 | ragna | usage() |
25 | 1 | ragna | { |
26 | 1 | ragna | echo "Usage: ${SCRIPT} username [database]" |
27 | 1 | ragna | } |
28 | 1 | ragna | |
29 | 1 | ragna | print_users() |
30 | 1 | ragna | { |
31 | 1 | ragna | sqlite3 "${QUASSELDB}" "SELECT quasseluser.userid, quasseluser.username FROM quasseluser ORDER BY quasseluser.userid;" |
32 | 1 | ragna | } |
33 | 1 | ragna | |
34 | 1 | ragna | # Main body |
35 | 1 | ragna | |
36 | 1 | ragna | SCRIPT="${0}" |
37 | 1 | ragna | QUASSELDB="" |
38 | 1 | ragna | USER="" |
39 | 1 | ragna | |
40 | 1 | ragna | if [ -z "${2}" ] ; then |
41 | 1 | ragna | # No file supplied. |
42 | 1 | ragna | QUASSELDB="quassel-storage.sqlite" |
43 | 1 | ragna | else |
44 | 1 | ragna | QUASSELDB="${2}" |
45 | 1 | ragna | fi |
46 | 1 | ragna | |
47 | 1 | ragna | if [ -z "${1}" ] ; then |
48 | 1 | ragna | echo "No user supplied." |
49 | 1 | ragna | echo "Pick one: " |
50 | 1 | ragna | print_users |
51 | 1 | ragna | usage |
52 | 1 | ragna | exit 1 |
53 | 1 | ragna | else |
54 | 1 | ragna | USER="${1}" |
55 | 1 | ragna | fi |
56 | 1 | ragna | |
57 | 1 | ragna | if [ -e "${QUASSELDB}" ] ; then |
58 | 1 | ragna | echo "SELECTED DB: ${QUASSELDB}" |
59 | 1 | ragna | else |
60 | 1 | ragna | echo "SELECTED DB '${QUASSELDB}' does not exist." |
61 | 1 | ragna | usage |
62 | 1 | ragna | exit 2 |
63 | 1 | ragna | fi |
64 | 1 | ragna | |
65 | 1 | ragna | if [ -z $(exeq "SELECT quasseluser.username FROM quasseluser WHERE username = '${USER}';") ] ; then |
66 | 1 | ragna | echo "SELECTED USER '${USER}' does not exist." |
67 | 1 | ragna | print_users |
68 | 1 | ragna | usage |
69 | 1 | ragna | exit 3 |
70 | 1 | ragna | else |
71 | 1 | ragna | echo "SELECTED USER: ${USER}" |
72 | 1 | ragna | fi |
73 | 1 | ragna | |
74 | 1 | ragna | # Sadly SQLITE does not allow DELETE statements that JOIN tables. |
75 | 1 | ragna | # All queries are written with a subquery. |
76 | 1 | ragna | # Contact me if you know a better way. |
77 | 1 | ragna | |
78 | 1 | ragna | backlogq="DELETE |
79 | 1 | ragna | FROM backlog |
80 | 1 | ragna | WHERE backlog.bufferid in ( |
81 | 1 | ragna | SELECT bufferid |
82 | 1 | ragna | FROM buffer, quasseluser |
83 | 1 | ragna | WHERE buffer.userid = quasseluser.userid |
84 | 1 | ragna | AND quasseluser.username = '${USER}' |
85 | 1 | ragna | );" |
86 | 1 | ragna | |
87 | 1 | ragna | bufferq="DELETE |
88 | 1 | ragna | FROM buffer |
89 | 1 | ragna | WHERE buffer.userid in ( |
90 | 1 | ragna | SELECT userid |
91 | 1 | ragna | FROM quasseluser |
92 | 1 | ragna | WHERE quasseluser.username = '${USER}' |
93 | 1 | ragna | );" |
94 | 1 | ragna | |
95 | 1 | ragna | ircserverq="DELETE |
96 | 1 | ragna | FROM ircserver |
97 | 1 | ragna | WHERE ircserver.userid in ( |
98 | 1 | ragna | SELECT userid |
99 | 1 | ragna | FROM quasseluser |
100 | 1 | ragna | WHERE quasseluser.username = '${USER}' |
101 | 1 | ragna | );" |
102 | 1 | ragna | |
103 | 1 | ragna | identity_nickq="DELETE |
104 | 1 | ragna | FROM identity_nick |
105 | 1 | ragna | WHERE identity_nick.identityid in ( |
106 | 1 | ragna | SELECT identityid |
107 | 1 | ragna | FROM quasseluser, identity |
108 | 1 | ragna | WHERE quasseluser.userid = identity.userid |
109 | 1 | ragna | AND quasseluser.username = '${USER}' |
110 | 1 | ragna | );" |
111 | 1 | ragna | |
112 | 1 | ragna | identityq="DELETE |
113 | 1 | ragna | FROM identity |
114 | 1 | ragna | WHERE identity.userid in ( |
115 | 1 | ragna | SELECT userid |
116 | 1 | ragna | FROM quasseluser |
117 | 1 | ragna | WHERE quasseluser.username = '${USER}' |
118 | 1 | ragna | );" |
119 | 1 | ragna | |
120 | 1 | ragna | networkq="DELETE |
121 | 1 | ragna | FROM network |
122 | 1 | ragna | WHERE network.userid in ( |
123 | 1 | ragna | SELECT userid |
124 | 1 | ragna | FROM quasseluser |
125 | 1 | ragna | WHERE quasseluser.username = '${USER}' |
126 | 1 | ragna | );" |
127 | 1 | ragna | |
128 | 1 | ragna | usersettingq="DELETE |
129 | 1 | ragna | FROM user_setting |
130 | 1 | ragna | WHERE user_setting.userid in ( |
131 | 1 | ragna | SELECT userid |
132 | 1 | ragna | FROM quasseluser |
133 | 1 | ragna | WHERE quasseluser.username = '${USER}' |
134 | 1 | ragna | );" |
135 | 1 | ragna | |
136 | 1 | ragna | quasseluserq="DELETE |
137 | 1 | ragna | FROM quasseluser |
138 | 1 | ragna | WHERE quasseluser.username = '${USER}' |
139 | 1 | ragna | ;" |
140 | 1 | ragna | |
141 | 1 | ragna | |
142 | 1 | ragna | exeq "${backlogq}" |
143 | 1 | ragna | exeq "${bufferq}" |
144 | 1 | ragna | exeq "${ircserverq}" |
145 | 1 | ragna | exeq "${identity_nickq}" |
146 | 1 | ragna | exeq "${identityq}" |
147 | 1 | ragna | exeq "${networkq}" |
148 | 1 | ragna | exeq "${usersettingq}" |
149 | 1 | ragna | exeq "${quasseluserq}" |
150 | 1 | ragna | |
151 | 1 | ragna | |
152 | 1 | ragna | #-----------------------------------------------------------------------------# |
153 | 1 | ragna | # BSD-3-Clause |
154 | 1 | ragna | # Copyright (c) 2018, Robbe Van der Gucht |
155 | 1 | ragna | # All rights reserved. |
156 | 1 | ragna | |
157 | 1 | ragna | # Redistribution and use in source and binary forms, with or without |
158 | 1 | ragna | # modification, are permitted provided that the following conditions are met: |
159 | 1 | ragna | # 1. Redistributions of source code must retain the above copyright |
160 | 1 | ragna | # notice, this list of conditions and the following disclaimer. |
161 | 1 | ragna | # 2. Redistributions in binary form must reproduce the above copyright |
162 | 1 | ragna | # notice, this list of conditions and the following disclaimer in the |
163 | 1 | ragna | # documentation and/or other materials provided with the distribution. |
164 | 1 | ragna | # 3. All advertising materials mentioning features or use of this software |
165 | 1 | ragna | # must display the following acknowledgement: |
166 | 1 | ragna | # This product includes software developed by the <organization>. |
167 | 1 | ragna | # 4. Neither the name of the <organization> nor the |
168 | 1 | ragna | # names of its contributors may be used to endorse or promote products |
169 | 1 | ragna | # derived from this software without specific prior written permission. |
170 | 1 | ragna | |
171 | 1 | ragna | # THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ''AS IS'' AND ANY |
172 | 1 | ragna | # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
173 | 1 | ragna | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
174 | 1 | ragna | # DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY |
175 | 1 | ragna | # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
176 | 1 | ragna | # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
177 | 1 | ragna | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
178 | 1 | ragna | # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
179 | 1 | ragna | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
180 | 1 | ragna | # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
181 | 1 | ragna | |
182 | 1 | ragna | #-----------------------------------------------------------------------------# |
183 | 1 | ragna | # GPL Clauses |
184 | 1 | ragna | # Copyright (c) 2018, Robbe Van der Gucht |
185 | 1 | ragna | # All rights reserved. |
186 | 1 | ragna | |
187 | 1 | ragna | # This program is free software: you can redistribute it and/or modify |
188 | 1 | ragna | # it under the terms of the GNU General Public License as published by |
189 | 1 | ragna | # the Free Software Foundation, either version 2 of the License, or |
190 | 1 | ragna | # (at your option) any later version. |
191 | 1 | ragna | |
192 | 1 | ragna | # This program is distributed in the hope that it will be useful, |
193 | 1 | ragna | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
194 | 1 | ragna | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
195 | 1 | ragna | # GNU General Public License for more details. |
196 | 1 | ragna | |
197 | 1 | ragna | # You should have received a copy of the GNU General Public License |
198 | 1 | ragna | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
199 | 1 | ragna | </code></pre> |
200 | 3 | ragna | |
201 | 3 | ragna | It was decided in "PR 294":https://github.com/quassel/quassel/pull/294 to put this on the wiki instead of the main repo. |