slish annotate slish @ rev 8
Fix a typo and change a function name
author | Christophe Lincoln <pankso@slitaz.org> |
---|---|
date | Fri Jan 24 20:15:38 2014 +0100 (2014-01-24) |
parents | 65ad158a371b |
children | faccc5330d1b |
rev | line source |
---|---|
pankso@1 | 1 #!/bin/sh |
pankso@1 | 2 # |
paul@5 | 3 # SliSH - The SliTaz SHell on demand. No gettext this is a pure admin |
paul@5 | 4 # mainly developed for slish.in but which can be used by other projects. |
pankso@1 | 5 # |
pankso@1 | 6 # Copyright (C) 2014 SliTaz GNU/Linux - BSD License |
pankso@1 | 7 # Author: Christophe Lincoln <pankso@slitaz.org> |
pankso@1 | 8 # |
pankso@1 | 9 export LANG=en LC_ALL=en |
pankso@1 | 10 . /lib/libtaz.sh |
pankso@1 | 11 |
pankso@1 | 12 [ "$root" ] || root="/home/slish/chroot" |
pankso@1 | 13 people="$(dirname $root)/people" |
pankso@1 | 14 data="/usr/share/slish" |
pankso@1 | 15 logs="$(dirname $root)/logs" |
pankso@1 | 16 cache="$(dirname $root)/cache" |
pankso@1 | 17 activity="$logs/activity.log" |
pankso@1 | 18 queue="${cache}/signup-queue" |
pankso@1 | 19 domain="slish.in" |
pankso@1 | 20 |
pankso@6 | 21 # Default chroot packages |
pankso@1 | 22 chrootpkgs="glibc-base slitaz-base-files ncursesw nano ytree busybox-slish |
pankso@1 | 23 tcc rhapsody" |
pankso@1 | 24 |
pankso@1 | 25 # |
pankso@1 | 26 # Functions |
pankso@1 | 27 # |
pankso@1 | 28 |
pankso@1 | 29 usage() { |
pankso@1 | 30 cat << EOT |
pankso@1 | 31 |
pankso@1 | 32 $(boldify "Usage:") $(basename $0) [command] [--option] |
pankso@1 | 33 |
pankso@1 | 34 $(boldify "Commands:") |
pankso@1 | 35 info Display paths, configs and some stats |
pankso@7 | 36 last Show last chroted users |
pankso@7 | 37 users List all users with name and mail |
paul@5 | 38 setup Setup SliSH server and user chroot |
pankso@1 | 39 gen-chroot Generate a new default or user chroot |
pankso@1 | 40 clean-chroot Clean the chroot but skip home and root |
pankso@1 | 41 adduser Add a user to the server with \$HOME in chroot |
pankso@1 | 42 deluser Delete a SliSH user from server and chroot |
pankso@6 | 43 list-queue List users in the signup queue |
pankso@6 | 44 chroot Chroot to SliSH users default chroot |
pankso@1 | 45 |
pankso@1 | 46 $(boldify "Options:") |
pankso@1 | 47 --root= Set the path to the SliSH or user chroot |
pankso@1 | 48 --clean Clean the chroot before gen-chroot |
pankso@6 | 49 --queued Add all users from the signup queue |
pankso@1 | 50 |
pankso@1 | 51 EOT |
pankso@1 | 52 } |
pankso@1 | 53 |
pankso@1 | 54 # Setup SliSH server |
pankso@1 | 55 setup() { |
pankso@1 | 56 # Allow users to use the chroot command |
pankso@1 | 57 if ! grep -q "^chroot =" /etc/busybox.conf; then |
pankso@1 | 58 echo "Allowing all users to use: chroot" |
pankso@1 | 59 echo 'chroot = ssx root.root' >> /etc/busybox.conf |
pankso@1 | 60 fi |
pankso@1 | 61 # Gen a chroot if not yet done |
pankso@1 | 62 if [ ! -d "$root" ]; then |
pankso@1 | 63 echo "Creating a chroot environment..." |
pankso@1 | 64 gen_chroot |
pankso@1 | 65 fi |
pankso@1 | 66 # Also used by the CGI web interface |
pankso@1 | 67 for dir in ${people} ${cache} ${logs}; do |
pankso@1 | 68 echo "Setting up the $(basename $dir) directory..." |
pankso@1 | 69 mkdir -p ${dir} && chown www.www ${dir} |
pankso@1 | 70 done |
paul@5 | 71 # Activity log must be writable by users |
pankso@1 | 72 touch ${activity} && chmod 0666 ${activity} |
pankso@1 | 73 echo "All done!" |
pankso@1 | 74 } |
pankso@1 | 75 |
pankso@6 | 76 # Show user configs |
pankso@6 | 77 show_queued_user() { |
pankso@6 | 78 . ${queue}/${user}/account.conf |
pankso@6 | 79 newline |
pankso@6 | 80 separator |
pankso@6 | 81 cat << EOT |
pankso@6 | 82 User : $user |
pankso@6 | 83 Name : $name |
pankso@6 | 84 Mail : $mail |
pankso@6 | 85 EOT |
pankso@6 | 86 separator |
pankso@6 | 87 } |
pankso@6 | 88 |
pankso@1 | 89 # Gen a user config file |
pankso@1 | 90 user_config() { |
pankso@1 | 91 echo -n "Creating SliSH account configuration..." |
pankso@1 | 92 mkdir -p ${people}/${user} |
pankso@1 | 93 cat > ${people}/${user}/account.conf << EOT |
pankso@1 | 94 # SliSH account configuration |
pankso@1 | 95 |
pankso@1 | 96 NAME="$name" |
pankso@1 | 97 USER="$user" |
pankso@1 | 98 MAIL="$mail" |
pankso@1 | 99 |
pankso@1 | 100 ULIMIT="-d 4096 -m 4096 -l 32 -p 5 -v 16384" |
pankso@6 | 101 QUOTA="50" |
pankso@1 | 102 |
pankso@1 | 103 EOT |
pankso@1 | 104 chmod 0600 ${people}/${user}/account.conf |
pankso@1 | 105 chown ${user}.${user} ${people}/${user}/account.conf |
pankso@1 | 106 status |
pankso@1 | 107 } |
pankso@1 | 108 |
pankso@1 | 109 # Mail body. |
pankso@8 | 110 mail_new_account() { |
pankso@1 | 111 cat << EOT |
pankso@1 | 112 From: SliSH <shell@${domain}> |
pankso@1 | 113 To: $mail |
pankso@1 | 114 Date: $(date '+%a, %d %b %Y %H:%M:%S %z') |
pankso@1 | 115 Subject: SliSH - Account created |
pankso@1 | 116 Content-Type: text/plain; charset=utf-8 |
pankso@1 | 117 Content-Transfer-Encoding: 8bit |
pankso@1 | 118 |
pankso@1 | 119 Hi, |
pankso@1 | 120 |
pankso@1 | 121 Your custom SliTaz GNU/Linux SHell is ready to use! You can login with: |
pankso@1 | 122 |
pankso@1 | 123 $ ssh ${user}@${domain} |
pankso@1 | 124 |
pankso@1 | 125 Visit http://slish.in and http://www.slitaz.org for the latest news about |
pankso@1 | 126 both projects. |
pankso@1 | 127 |
pankso@1 | 128 Happy SliTaz :-) |
pankso@1 | 129 |
pankso@1 | 130 --- |
pankso@1 | 131 Sent by the SliSH Mailer |
pankso@1 | 132 |
pankso@1 | 133 EOT |
pankso@1 | 134 } |
pankso@1 | 135 |
pankso@1 | 136 # Add a new SliSH user |
pankso@1 | 137 add_user() { |
pankso@1 | 138 home="$root/home/$user" |
pankso@1 | 139 shell="/usr/bin/slish" |
pankso@1 | 140 |
pankso@1 | 141 if grep -q ^${user}: /etc/passwd; then |
pankso@1 | 142 newline |
pankso@1 | 143 echo -n "User already exists: "; colorize 31 "$user" |
pankso@6 | 144 rm -rf ${queue}/${user} |
pankso@6 | 145 newline && exit 1 |
pankso@1 | 146 fi |
pankso@6 | 147 |
pankso@1 | 148 newline |
pankso@1 | 149 echo -n "$(boldify 'Creating user:') "; colorize 32 "$user" |
pankso@1 | 150 separator |
pankso@1 | 151 echo -e "$pass\n$pass" | adduser -h "$home" -g "SliSH User" \ |
pankso@1 | 152 -s ${shell} ${user} >/dev/null |
pankso@1 | 153 |
pankso@1 | 154 # Add user to chroot /etc/passwd |
pankso@1 | 155 if ! grep -q ^${user}: ${root}/etc/passwd; then |
pankso@1 | 156 echo -n "Adding $user to: $root" |
pankso@1 | 157 grep "^$user:" /etc/passwd >> ${root}/etc/passwd |
pankso@1 | 158 grep "^$user:" /etc/group >> ${root}/etc/group |
pankso@1 | 159 sed -i s"!$root!!" ${root}/etc/passwd |
pankso@1 | 160 status |
pankso@1 | 161 fi |
pankso@1 | 162 |
pankso@1 | 163 # We don't want any files from /etc/skel. |
pankso@1 | 164 echo -n "Cleaning home and creating: ~/.ssh" |
pankso@1 | 165 rm -rf ${home} && mkdir -p ${home}/.ssh |
pankso@1 | 166 status |
pankso@1 | 167 |
pankso@1 | 168 # Let a web server access an eventual ~/Public dir |
pankso@1 | 169 echo -n "Changing mode on user home..." |
pankso@1 | 170 chown -R ${user}.${user} ${home} |
pankso@1 | 171 chown ${user}.www ${home} |
pankso@1 | 172 chmod 0750 ${home} |
pankso@1 | 173 chmod 0700 ${home}/.ssh |
pankso@1 | 174 status |
pankso@1 | 175 user_config |
pankso@6 | 176 |
pankso@1 | 177 # Send mail to notify user account creation |
pankso@1 | 178 if [ -x /usr/sbin/sendmail ]; then |
pankso@1 | 179 echo -n "Sending mail to: $mail" |
pankso@8 | 180 mail_new_account | /usr/sbin/sendmail -f "shell@${domain}" "$mail" |
pankso@1 | 181 status |
pankso@1 | 182 fi |
pankso@1 | 183 separator && newline |
pankso@1 | 184 } |
pankso@1 | 185 |
pankso@6 | 186 # Add all users from the signup queue |
pankso@6 | 187 add_queued_user() { |
pankso@6 | 188 for user in $(ls ${queue}) |
pankso@6 | 189 do |
pankso@6 | 190 . ${queue}/${user}/account.conf |
pankso@6 | 191 pass=$(cat ${queue}/${user}/passwd | base64 -d) |
pankso@6 | 192 add_user |
pankso@6 | 193 rm -rf ${queue}/${user} |
pankso@6 | 194 done |
pankso@6 | 195 } |
pankso@6 | 196 |
pankso@1 | 197 # Delete a SliSH user |
pankso@1 | 198 del_user() { |
pankso@1 | 199 home="$root/home/$user" |
pankso@1 | 200 if [ ! -d "$home" ] || [ ! "$user" ]; then |
pankso@1 | 201 newline |
pankso@1 | 202 echo "Missing --user= name option or invalid user name" |
pankso@1 | 203 newline && exit 0 |
pankso@1 | 204 fi |
pankso@1 | 205 newline |
pankso@1 | 206 echo "$(boldify 'Deleting user:') $(colorize 32 "$user")" |
pankso@1 | 207 separator |
pankso@7 | 208 echo -n "Removing user account from $(hostname) server" |
pankso@1 | 209 deluser "$user"; status |
pankso@1 | 210 sed -i "/^$user:/"d ${root}/etc/passwd |
pankso@1 | 211 sed -i "/^$user:/"d ${root}/etc/group |
pankso@1 | 212 echo -n "Removing all files in : $home" |
pankso@1 | 213 rm -rf ${home} ; status |
pankso@1 | 214 echo -n "Removing user config : $people/$user" |
pankso@1 | 215 rm -rf "${people}/${user}" ; status |
pankso@1 | 216 separator && newline |
pankso@1 | 217 } |
pankso@1 | 218 |
pankso@1 | 219 # Create a minimal chroot environment |
pankso@1 | 220 gen_chroot() { |
pankso@1 | 221 [ "$clean" ] && clean_chroot |
pankso@1 | 222 if [ -d "$root/bin" ]; then |
paul@5 | 223 echo "A chroot already exists: Use -cc command or --clean option" |
pankso@1 | 224 exit 1 |
pankso@1 | 225 fi |
pankso@1 | 226 [ "$clean" ] || newline |
pankso@1 | 227 boldify "Creating chroot in: $root" |
pankso@1 | 228 separator |
pankso@1 | 229 mkdir -p ${root} |
pankso@1 | 230 for pkg in ${chrootpkgs} |
pankso@1 | 231 do |
pankso@1 | 232 echo -n "Installing: $pkg" |
pankso@1 | 233 tazpkg -gi ${pkg} --root=${root} >/dev/null |
pankso@1 | 234 status |
pankso@1 | 235 done |
pankso@1 | 236 echo -n "Installing: /bin/slish.sh" |
pankso@1 | 237 install -m 0755 ${data}/slish.sh ${root}/bin |
pankso@1 | 238 cp -a /etc/resolv.conf ${root}/etc |
pankso@1 | 239 status |
pankso@1 | 240 separator && newline |
pankso@1 | 241 } |
pankso@1 | 242 |
pankso@1 | 243 # Clean up a chroot environment |
pankso@1 | 244 clean_chroot() { |
pankso@1 | 245 if [ ! -d "$root/bin" ]; then |
pankso@1 | 246 echo "No chroot found in: $root" && exit 0 |
pankso@1 | 247 fi |
pankso@1 | 248 newline |
pankso@1 | 249 boldify "Cleaning: $root" |
pankso@1 | 250 separator |
pankso@1 | 251 cd ${root} |
pankso@1 | 252 for dir in * |
pankso@1 | 253 do |
pankso@1 | 254 size=$(du -sh $dir | awk '{print $1}') |
pankso@1 | 255 case "$dir" in |
pankso@1 | 256 etc|home|root|lost*) continue ;; |
pankso@1 | 257 *) |
pankso@1 | 258 echo -n "Removing: $dir $size" |
pankso@1 | 259 rm -rf ${dir} ; status ;; |
pankso@1 | 260 esac |
pankso@1 | 261 done && separator && newline |
pankso@1 | 262 } |
pankso@1 | 263 |
pankso@1 | 264 # |
pankso@1 | 265 # Handle commands |
pankso@1 | 266 # |
pankso@1 | 267 |
pankso@1 | 268 case "$1" in |
pankso@6 | 269 info) |
pankso@1 | 270 check_root |
pankso@6 | 271 newline |
pankso@6 | 272 boldify "Info" |
pankso@6 | 273 separator |
pankso@6 | 274 echo -n "Chroot size : " && du -sh ${root} |
pankso@6 | 275 echo -n "Users accounts : " && ls -1 ${people} | wc -l |
pankso@6 | 276 echo -n "Signup queue : " && ls -1 ${queue} | wc -l |
pankso@6 | 277 separator && newline ;; |
pankso@6 | 278 last) |
pankso@6 | 279 check_root |
pankso@6 | 280 newline |
pankso@6 | 281 boldify "Last users" |
pankso@6 | 282 separator |
pankso@6 | 283 tac ${activity} | head -n 20 |
pankso@6 | 284 separator && newline ;; |
pankso@7 | 285 users) |
pankso@7 | 286 check_root |
pankso@7 | 287 newline |
pankso@7 | 288 boldify "Users list" |
pankso@7 | 289 separator |
pankso@7 | 290 for user in $(ls ${people}) |
pankso@7 | 291 do |
pankso@7 | 292 . ${people}/${user}/account.conf |
pankso@7 | 293 echo -n "$(colorize 34 "$user")" |
pankso@7 | 294 echo -n "$(indent 20 "$NAME")" && indent 46 "<$MAIL>" |
pankso@7 | 295 done |
pankso@7 | 296 separator && newline ;; |
pankso@1 | 297 setup) |
pankso@1 | 298 check_root |
pankso@1 | 299 setup ;; |
pankso@1 | 300 adduser) |
pankso@6 | 301 # We can adduser from cmdline or from the signup queue |
pankso@1 | 302 check_root |
pankso@6 | 303 if [ "$from-queu" ]; then |
pankso@6 | 304 add_queued_user |
pankso@6 | 305 else |
pankso@6 | 306 add_user |
pankso@6 | 307 fi ;; |
pankso@1 | 308 deluser) |
pankso@1 | 309 check_root |
pankso@1 | 310 del_user ;; |
pankso@1 | 311 -gc|gen-chroot) |
pankso@1 | 312 check_root |
pankso@1 | 313 gen_chroot ;; |
pankso@1 | 314 -cc|clean-chroot) |
pankso@1 | 315 check_root |
pankso@1 | 316 clean_chroot ;; |
pankso@1 | 317 -c|chroot) |
pankso@1 | 318 echo "Chrooting to: $root" |
pankso@1 | 319 chroot ${root} /bin/sh |
pankso@1 | 320 echo "Exiting from: $root" ;; |
pankso@6 | 321 -lq|list-queue) |
pankso@6 | 322 # Check online signup queue but do nothing |
pankso@8 | 323 for user in $(ls ${queue}) |
pankso@1 | 324 do |
pankso@6 | 325 show_queued_user |
pankso@6 | 326 done |
pankso@6 | 327 echo "" ;; |
pankso@1 | 328 *) |
pankso@6 | 329 # /usr/bin/slish is executed on login to chroot the user |
pankso@1 | 330 if [ -d "$root/home/$USER" ]; then |
pankso@1 | 331 . ${people}/"$USER"/account.conf |
pankso@1 | 332 log "Chrooting user: $USER" |
pankso@1 | 333 ulimit $(echo "$ULIMIT") |
pankso@6 | 334 exec chroot ${root} /bin/slish.sh "$@" |
pankso@1 | 335 else |
pankso@1 | 336 usage |
pankso@1 | 337 fi ;; |
pankso@1 | 338 esac |
pankso@1 | 339 |
pankso@1 | 340 exit 0 |