slish annotate slish @ rev 13
Tiny edits
author | Paul Issott <paul@slitaz.org> |
---|---|
date | Sat Feb 01 17:29:57 2014 +0000 (2014-02-01) |
parents | 27c18235251c |
children |
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@9 | 23 rhapsody tcc glibc-dev lua tinypy" |
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 |
paul@10 | 36 last Show last chrooted 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} |
paul@13 | 73 # Add /usr/bin/slish to /etc/shells (dropbear needs it) |
pankso@11 | 74 if ! fgrep -q '/usr/bin/slish' /etc/shells; then |
pankso@11 | 75 echo "Adding /bin/slish to the list of valid shells..." |
pankso@11 | 76 echo '/usr/bin/slish' >> /etc/shells |
pankso@11 | 77 fi |
pankso@1 | 78 echo "All done!" |
pankso@1 | 79 } |
pankso@1 | 80 |
pankso@6 | 81 # Show user configs |
pankso@6 | 82 show_queued_user() { |
pankso@6 | 83 . ${queue}/${user}/account.conf |
pankso@6 | 84 newline |
pankso@6 | 85 separator |
pankso@6 | 86 cat << EOT |
pankso@6 | 87 User : $user |
pankso@6 | 88 Name : $name |
pankso@6 | 89 Mail : $mail |
pankso@6 | 90 EOT |
pankso@6 | 91 separator |
pankso@6 | 92 } |
pankso@6 | 93 |
pankso@1 | 94 # Gen a user config file |
pankso@1 | 95 user_config() { |
pankso@1 | 96 echo -n "Creating SliSH account configuration..." |
pankso@1 | 97 mkdir -p ${people}/${user} |
pankso@1 | 98 cat > ${people}/${user}/account.conf << EOT |
pankso@1 | 99 # SliSH account configuration |
pankso@1 | 100 |
pankso@1 | 101 NAME="$name" |
pankso@1 | 102 USER="$user" |
pankso@1 | 103 MAIL="$mail" |
pankso@1 | 104 |
pankso@1 | 105 ULIMIT="-d 4096 -m 4096 -l 32 -p 5 -v 16384" |
pankso@6 | 106 QUOTA="50" |
pankso@1 | 107 |
pankso@1 | 108 EOT |
pankso@1 | 109 chmod 0600 ${people}/${user}/account.conf |
pankso@1 | 110 chown ${user}.${user} ${people}/${user}/account.conf |
pankso@1 | 111 status |
pankso@1 | 112 } |
pankso@1 | 113 |
pankso@1 | 114 # Mail body. |
pankso@8 | 115 mail_new_account() { |
pankso@1 | 116 cat << EOT |
pankso@1 | 117 From: SliSH <shell@${domain}> |
pankso@1 | 118 To: $mail |
pankso@1 | 119 Date: $(date '+%a, %d %b %Y %H:%M:%S %z') |
pankso@1 | 120 Subject: SliSH - Account created |
pankso@1 | 121 Content-Type: text/plain; charset=utf-8 |
pankso@1 | 122 Content-Transfer-Encoding: 8bit |
pankso@1 | 123 |
pankso@11 | 124 Hi $name, |
pankso@1 | 125 |
pankso@1 | 126 Your custom SliTaz GNU/Linux SHell is ready to use! You can login with: |
pankso@1 | 127 |
pankso@1 | 128 $ ssh ${user}@${domain} |
pankso@1 | 129 |
pankso@1 | 130 Visit http://slish.in and http://www.slitaz.org for the latest news about |
pankso@1 | 131 both projects. |
pankso@1 | 132 |
pankso@1 | 133 Happy SliTaz :-) |
pankso@1 | 134 |
pankso@1 | 135 --- |
pankso@1 | 136 Sent by the SliSH Mailer |
pankso@1 | 137 |
pankso@1 | 138 EOT |
pankso@1 | 139 } |
pankso@1 | 140 |
pankso@1 | 141 # Add a new SliSH user |
pankso@1 | 142 add_user() { |
pankso@11 | 143 #home="$root/./home/$user" |
pankso@1 | 144 home="$root/home/$user" |
pankso@1 | 145 shell="/usr/bin/slish" |
pankso@1 | 146 |
pankso@11 | 147 # Check values |
pankso@11 | 148 if [ ! "$user" ] || [ ! "$name" ] || [ ! "$pass" ] || [ ! "$mail" ]; then |
pankso@11 | 149 newline |
pankso@11 | 150 echo "Missing option(s): --user= --name= --pass= --mail=" |
pankso@11 | 151 newline && exit 0 |
pankso@11 | 152 fi |
pankso@11 | 153 |
paul@13 | 154 # Exit if user already exists |
pankso@1 | 155 if grep -q ^${user}: /etc/passwd; then |
pankso@1 | 156 newline |
pankso@1 | 157 echo -n "User already exists: "; colorize 31 "$user" |
pankso@6 | 158 rm -rf ${queue}/${user} |
pankso@6 | 159 newline && exit 1 |
pankso@1 | 160 fi |
pankso@6 | 161 |
pankso@1 | 162 newline |
pankso@11 | 163 echo -n "$(boldify 'Creating user:') "; colorize 34 "$user" |
pankso@1 | 164 separator |
pankso@1 | 165 echo -e "$pass\n$pass" | adduser -h "$home" -g "SliSH User" \ |
pankso@1 | 166 -s ${shell} ${user} >/dev/null |
pankso@1 | 167 |
pankso@1 | 168 # Add user to chroot /etc/passwd |
pankso@1 | 169 if ! grep -q ^${user}: ${root}/etc/passwd; then |
pankso@1 | 170 echo -n "Adding $user to: $root" |
pankso@1 | 171 grep "^$user:" /etc/passwd >> ${root}/etc/passwd |
pankso@1 | 172 grep "^$user:" /etc/group >> ${root}/etc/group |
pankso@1 | 173 sed -i s"!$root!!" ${root}/etc/passwd |
pankso@1 | 174 status |
pankso@1 | 175 fi |
pankso@1 | 176 |
pankso@1 | 177 # We don't want any files from /etc/skel. |
pankso@1 | 178 echo -n "Cleaning home and creating: ~/.ssh" |
pankso@1 | 179 rm -rf ${home} && mkdir -p ${home}/.ssh |
pankso@1 | 180 status |
pankso@1 | 181 |
pankso@1 | 182 # Let a web server access an eventual ~/Public dir |
pankso@1 | 183 echo -n "Changing mode on user home..." |
pankso@1 | 184 chown -R ${user}.${user} ${home} |
pankso@1 | 185 chown ${user}.www ${home} |
pankso@1 | 186 chmod 0750 ${home} |
pankso@1 | 187 chmod 0700 ${home}/.ssh |
pankso@1 | 188 status |
pankso@1 | 189 user_config |
pankso@6 | 190 |
pankso@1 | 191 # Send mail to notify user account creation |
pankso@1 | 192 if [ -x /usr/sbin/sendmail ]; then |
pankso@1 | 193 echo -n "Sending mail to: $mail" |
pankso@8 | 194 mail_new_account | /usr/sbin/sendmail -f "shell@${domain}" "$mail" |
pankso@1 | 195 status |
pankso@1 | 196 fi |
pankso@1 | 197 separator && newline |
pankso@1 | 198 } |
pankso@1 | 199 |
pankso@6 | 200 # Add all users from the signup queue |
pankso@6 | 201 add_queued_user() { |
pankso@11 | 202 echo "Checking: $queue" |
pankso@6 | 203 for user in $(ls ${queue}) |
pankso@6 | 204 do |
pankso@6 | 205 . ${queue}/${user}/account.conf |
pankso@6 | 206 pass=$(cat ${queue}/${user}/passwd | base64 -d) |
pankso@6 | 207 add_user |
pankso@6 | 208 rm -rf ${queue}/${user} |
pankso@6 | 209 done |
pankso@6 | 210 } |
pankso@6 | 211 |
pankso@1 | 212 # Delete a SliSH user |
pankso@1 | 213 del_user() { |
pankso@1 | 214 home="$root/home/$user" |
pankso@1 | 215 if [ ! -d "$home" ] || [ ! "$user" ]; then |
pankso@1 | 216 newline |
pankso@1 | 217 echo "Missing --user= name option or invalid user name" |
pankso@1 | 218 newline && exit 0 |
pankso@1 | 219 fi |
pankso@1 | 220 newline |
pankso@11 | 221 echo "$(boldify 'Deleting user:') $(colorize 34 "$user")" |
pankso@1 | 222 separator |
pankso@7 | 223 echo -n "Removing user account from $(hostname) server" |
pankso@1 | 224 deluser "$user"; status |
pankso@1 | 225 sed -i "/^$user:/"d ${root}/etc/passwd |
pankso@1 | 226 sed -i "/^$user:/"d ${root}/etc/group |
pankso@1 | 227 echo -n "Removing all files in : $home" |
pankso@11 | 228 rm -rf ${home}; status |
pankso@1 | 229 echo -n "Removing user config : $people/$user" |
pankso@11 | 230 rm -rf "${people}/${user}"; status |
pankso@1 | 231 separator && newline |
pankso@1 | 232 } |
pankso@1 | 233 |
pankso@1 | 234 # Create a minimal chroot environment |
pankso@1 | 235 gen_chroot() { |
pankso@1 | 236 [ "$clean" ] && clean_chroot |
pankso@1 | 237 if [ -d "$root/bin" ]; then |
paul@5 | 238 echo "A chroot already exists: Use -cc command or --clean option" |
pankso@1 | 239 exit 1 |
pankso@1 | 240 fi |
pankso@1 | 241 [ "$clean" ] || newline |
pankso@1 | 242 boldify "Creating chroot in: $root" |
pankso@1 | 243 separator |
pankso@1 | 244 mkdir -p ${root} |
pankso@1 | 245 for pkg in ${chrootpkgs} |
pankso@1 | 246 do |
pankso@1 | 247 echo -n "Installing: $pkg" |
pankso@1 | 248 tazpkg -gi ${pkg} --root=${root} >/dev/null |
pankso@1 | 249 status |
pankso@1 | 250 done |
pankso@1 | 251 echo -n "Installing: /bin/slish.sh" |
pankso@1 | 252 install -m 0755 ${data}/slish.sh ${root}/bin |
pankso@1 | 253 cp -a /etc/resolv.conf ${root}/etc |
pankso@1 | 254 status |
pankso@1 | 255 separator && newline |
pankso@1 | 256 } |
pankso@1 | 257 |
pankso@1 | 258 # Clean up a chroot environment |
pankso@1 | 259 clean_chroot() { |
pankso@1 | 260 if [ ! -d "$root/bin" ]; then |
pankso@1 | 261 echo "No chroot found in: $root" && exit 0 |
pankso@1 | 262 fi |
pankso@1 | 263 newline |
pankso@1 | 264 boldify "Cleaning: $root" |
pankso@1 | 265 separator |
pankso@1 | 266 cd ${root} |
pankso@1 | 267 for dir in * |
pankso@1 | 268 do |
pankso@1 | 269 size=$(du -sh $dir | awk '{print $1}') |
pankso@1 | 270 case "$dir" in |
pankso@1 | 271 etc|home|root|lost*) continue ;; |
pankso@1 | 272 *) |
pankso@1 | 273 echo -n "Removing: $dir $size" |
pankso@1 | 274 rm -rf ${dir} ; status ;; |
pankso@1 | 275 esac |
pankso@1 | 276 done && separator && newline |
pankso@1 | 277 } |
pankso@1 | 278 |
pankso@1 | 279 # |
pankso@1 | 280 # Handle commands |
pankso@1 | 281 # |
pankso@1 | 282 |
pankso@1 | 283 case "$1" in |
pankso@6 | 284 info) |
pankso@1 | 285 check_root |
pankso@6 | 286 newline |
pankso@6 | 287 boldify "Info" |
pankso@6 | 288 separator |
pankso@6 | 289 echo -n "Chroot size : " && du -sh ${root} |
pankso@6 | 290 echo -n "Users accounts : " && ls -1 ${people} | wc -l |
pankso@6 | 291 echo -n "Signup queue : " && ls -1 ${queue} | wc -l |
pankso@6 | 292 separator && newline ;; |
pankso@6 | 293 last) |
pankso@6 | 294 check_root |
pankso@6 | 295 newline |
pankso@6 | 296 boldify "Last users" |
pankso@6 | 297 separator |
pankso@6 | 298 tac ${activity} | head -n 20 |
pankso@6 | 299 separator && newline ;; |
pankso@7 | 300 users) |
pankso@7 | 301 check_root |
pankso@7 | 302 newline |
pankso@7 | 303 boldify "Users list" |
pankso@7 | 304 separator |
pankso@7 | 305 for user in $(ls ${people}) |
pankso@7 | 306 do |
pankso@7 | 307 . ${people}/${user}/account.conf |
pankso@7 | 308 echo -n "$(colorize 34 "$user")" |
pankso@7 | 309 echo -n "$(indent 20 "$NAME")" && indent 46 "<$MAIL>" |
pankso@7 | 310 done |
pankso@7 | 311 separator && newline ;; |
pankso@1 | 312 setup) |
pankso@1 | 313 check_root |
pankso@1 | 314 setup ;; |
pankso@1 | 315 adduser) |
pankso@6 | 316 # We can adduser from cmdline or from the signup queue |
pankso@1 | 317 check_root |
pankso@11 | 318 if [ "$queued" ]; then |
pankso@6 | 319 add_queued_user |
pankso@6 | 320 else |
pankso@6 | 321 add_user |
pankso@6 | 322 fi ;; |
pankso@1 | 323 deluser) |
pankso@1 | 324 check_root |
pankso@1 | 325 del_user ;; |
pankso@1 | 326 -gc|gen-chroot) |
pankso@1 | 327 check_root |
pankso@1 | 328 gen_chroot ;; |
pankso@1 | 329 -cc|clean-chroot) |
pankso@1 | 330 check_root |
pankso@1 | 331 clean_chroot ;; |
pankso@1 | 332 -c|chroot) |
pankso@1 | 333 echo "Chrooting to: $root" |
pankso@1 | 334 chroot ${root} /bin/sh |
pankso@1 | 335 echo "Exiting from: $root" ;; |
pankso@6 | 336 -lq|list-queue) |
pankso@6 | 337 # Check online signup queue but do nothing |
pankso@8 | 338 for user in $(ls ${queue}) |
pankso@1 | 339 do |
pankso@6 | 340 show_queued_user |
pankso@6 | 341 done |
pankso@6 | 342 echo "" ;; |
pankso@1 | 343 *) |
pankso@6 | 344 # /usr/bin/slish is executed on login to chroot the user |
pankso@1 | 345 if [ -d "$root/home/$USER" ]; then |
pankso@1 | 346 . ${people}/"$USER"/account.conf |
pankso@1 | 347 log "Chrooting user: $USER" |
pankso@1 | 348 ulimit $(echo "$ULIMIT") |
pankso@11 | 349 exec /usr/sbin/chroot ${root} /bin/slish.sh "$@" |
pankso@1 | 350 else |
pankso@1 | 351 usage |
pankso@1 | 352 fi ;; |
pankso@1 | 353 esac |
pankso@1 | 354 |
pankso@1 | 355 exit 0 |