Ticket #318: fix_318-3.diff

File fix_318-3.diff, 18.9 kB (added by anarcat, 1 month ago)

third brain dump, ~500 lines unified

  • debian/postinst

    old new  
    8383# Mail server hostname 
    8484DEFAULT_MX="" 
    8585 
    86 # MySQL configuration 
    87 MYSQL_HOST="" 
    88 MYSQL_DATABASE="" 
    89 MYSQL_USER="" 
    90 MYSQL_PASS="" 
     86# Note: MySQL username/password configuration now stored in /etc/alternc/mysql-root.cnf 
     87 
    9188# quels clients mysql sont permis (%, localhost, etc) 
    9289MYSQL_CLIENT="" 
    9390 
     
    119116    update_var alternc/ns2 NS2_HOSTNAME 
    120117    update_var alternc/bind_internal BIND_INTERNAL 
    121118    update_var alternc/default_mx DEFAULT_MX  
    122     update_var alternc/mysql/host MYSQL_HOST  
    123     update_var alternc/mysql/db MYSQL_DATABASE  
    124     update_var alternc/mysql/user MYSQL_USER  
    125     update_var alternc/mysql/password MYSQL_PASS  
    126119    update_var alternc/mysql/client MYSQL_CLIENT  
    127120    update_var alternc/alternc_location ALTERNC_LOC 
    128121    update_var alternc/mynetwork SMTP_RELAY_NETWORKS 
    129122    sed -e "$SED_SCRIPT" < $CONFIGFILE > $CONFIGFILE.tmp 
    130123    mv -f $CONFIGFILE.tmp $CONFIGFILE 
    131124 
     125    echo "Updating /etc/alternc/mysql.cnf" 
     126    # build local.sh if it does not exist 
     127    if [ ! -f $CONFIGFILE ]; then 
     128        cat > $CONFIGFILE <<EOF 
     129# AlternC - Web Hosting System - MySQL Configuration 
     130# Automatically generated by AlternC configuration, do not edit 
     131# This file will be modified on package configuration 
     132# (e.g. upgrade or dpkg-reconfigure alternc) 
     133[client] 
     134host = "" 
     135database = "" 
     136user = "" 
     137password = "" 
     138EOF 
     139        chown root:www-data $CONFIGFILE 
     140        chmod 640 $CONFIGFILE 
     141    fi 
     142 
     143    # Setup grants 
     144    db_get "alternc/mysql/host" 
     145    MYSQL_HOST="$RET" 
     146    if [ "$MYSQL_HOST" != "localhost" -o -e /usr/sbin/mysqld ]; then 
     147        # compatibility shims 
     148        # XXX: should be deprecated 
     149        sqlserver="$RET" 
     150        db_get "alternc/mysql/db" 
     151        systemdb="$RET" 
     152        db_get "alternc/mysql/user" 
     153        rootlogin="$RET" 
     154        db_get "alternc/mysql/password" 
     155        rootpass="$RET" 
     156        # we don't execute the script 
     157        # ...so that it gets the local environment above 
     158        . /usr/share/alternc/install/mysql.sh 
     159    fi 
     160 
     161    # Update the mysql configuration file 
     162    SED_SCRIPT="" 
     163    update_var alternc/mysql/host host 
     164    update_var alternc/mysql/db database 
     165    update_var alternc/mysql/user user 
     166    update_var alternc/mysql/password password 
     167    # take extra precautions here with the mysql password: 
     168    # put the sed script in a temporary file 
     169    SED_SCRIPT_NAME=`mktemp` 
     170    cat > $SED_SCRIPT_NAME <<EOF 
     171$SED_SCRIPT 
     172EOF 
     173    sed -f "$SED_SCRIPT_NAME" < /etc/alternc/mysql.cnf > /etc/alternc/mysql.cnf.$$ 
     174    mv -f /etc/alternc/mysql.cnf.$$ /etc/alternc/mysql.cnf 
     175    rm -f $SED_SCRIPT_NAME 
     176 
    132177    # forget the password 
    133178    db_reset alternc/mysql/password || true 
    134179    db_fset alternc/mysql/password "seen" "false" || true 
    135180 
     181    if [ "$MYSQL_HOST" != "localhost" -o -e /usr/sbin/mysqld ]; then 
     182        echo "Final msqyl setup" 
     183 
     184        # Now we can use the mysql configuration 
     185        mysql="/usr/bin/mysql --defaults-file=/etc/alternc/mysql.cnf" 
     186 
     187        echo " * creating AlternC database '$systemdb'... " 
     188        $mysql -e "CREATE DATABASE IF NOT EXISTS $systemdb;" || echo cannot create database 
     189 
     190        echo " * installing AlternC schema..." 
     191        $mysql $systemdb < /usr/share/alternc/install/mysql.sql || echo cannot load database schema 
     192    fi 
     193 
    136194    if [ -e $CONFIGFILE ]; then 
    137195      # source local.sh variables 
    138196      . $CONFIGFILE 
  • debian/postrm

    old new  
    1515 
    1616case "$1" in 
    1717  purge) 
    18     rm -f /etc/alternc/local.sh /etc/alternc/bureau.conf 
     18    rm -f /etc/alternc/local.sh /etc/alternc/mysql.cnf /etc/alternc/bureau.conf 
    1919    rm -f /var/backups/alternc/etc-installed.tar.gz 
    2020 
    2121    # Purge database? 
  • debian/changelog

    old new  
    11alternc (0.9.7+dev) stable; urgency=low UNRELEASED 
    22 
     3  * move mysql configuration into a valid MySQL configuration file 
     4    (/etc/alternc/mysql.cnf). This fixes a serious security issue 
     5    (#318) where the MySQL root password was passed on the commandline. 
    36  * standardisation of the web interface, along with some esthetic changes, by 
    47    Marc Angles, sponsored by Koumbit 
    58  * styles can now be changed locally in admin/styles/base.css 
  • debian/config

    old new  
    3838    # source the current config 
    3939    . /etc/alternc/local.sh 
    4040fi 
     41if [ -r /etc/alternc/mysql.cnf ]; then 
     42    # make mysql configuration available as shell variables 
     43    # to convert from .cnf to shell syntax, we: 
     44    # * match only lines with "equal" in them (/=/) 
     45    # * remove whitespace (s) 
     46    # * convert mysql variables into our MYSQL_ naming convention (;s) 
     47    # * print the result (;p) 
     48    # XXX: removing the ws breaks passwords with spaces, which are legal 
     49    eval `sed -n -e '/=/{s/ //g;s/host/MYSQL_HOST/;s/user/MYSQL_LOGIN/;s/password/MYSQL_PWD/;p}' /etc/alternc/mysql.cnf` 
     50fi 
    4151 
    4252# mettre les valeurs de local.sh comme "default" pour debconf 
    4353db_get alternc/hostingname 
  • bureau/class/local.php

    old new  
    2222} 
    2323 
    2424fclose($config_file); 
     25 
     26$config_file = fopen('/etc/alternc/mysql.cnf', 'r'); 
     27while (FALSE !== ($line = fgets($config_file))) { 
     28    if (ereg('^([A-Za-z0-9_]*) *= *(.*)$', trim($line), $regs)) { 
     29        switch ($regs[1]) { 
     30        case "user": 
     31            $GLOBALS['L_MYSQL_LOGIN'] = $regs[2]; 
     32            break; 
     33        case "password": 
     34            $GLOBALS['L_MYSQL_PWD'] = $regs[2]; 
     35            break; 
     36        case "host": 
     37            $GLOBALS['L_MYSQL_HOST'] = $regs[2]; 
     38            break; 
     39        case "database": 
     40            $GLOBALS['L_MYSQL_DATABASE'] = $regs[2]; 
     41            break; 
     42        } 
     43    } 
     44} 
     45 
     46fclose($config_file); 
  • src/functions.sh

    old new  
    309309        else 
    310310                # implantons localement ce que nous avons besoin, puisque admintools 
    311311                # n'est pas là 
    312                 mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS -D$MYSQL_DATABASE -B -N -e \ 
     312                mysql --defaults-file=/etc/alternc/mysql.cnf -B -N -e \ 
    313313                'SELECT a.login FROM membres a, sub_domaines b WHERE a.uid = b.compte AND \ 
    314314                CONCAT(IF(sub="", "", CONCAT(sub, ".")), domaine) = "'"$1"'" LIMIT 1;' 
    315315        fi 
  • src/sqlbackup.sh

    old new  
    2929 
    3030set -e 
    3131 
    32 # Get mysql user and password :  
    33 . /etc/alternc/local.sh 
    34  
    3532function dobck { 
    3633    local ext 
    3734    local i 
     
    6360        mv -f "${target_dir}/${db}.sql${ext}" \ 
    6461              "${target_dir}/${db}.sql.${i}${ext}" 2>/dev/null || true  
    6562        if [ "$compressed" -eq 1 ]; then 
    66             mysqldump -h"$MYSQL_HOST" -u"$login" -p"$pass" "$db" --add-drop-table --allow-keywords -Q -f -q -a -e | 
     63            mysqldump --defaults-file=/etc/alternc/mysql-alternc.cnf --add-drop-table --allow-keywords -Q -f -q -a -e | 
    6764                gzip -c > "${target_dir}/${db}.sql${ext}" 
    6865        else 
    69             mysqldump -h"$MYSQL_HOST" -u"$login" -p"$pass" "$db" --add-drop-table --allow-keywords -Q -f -q -a -e \ 
     66            mysqldump --defaults-file=/etc/alternc/mysql-alternc.cnf --add-drop-table --allow-keywords -Q -f -q -a -e \ 
    7067                > "${target_dir}/${db}.sql" 
    7168        fi 
    7269 
     
    8380    mode=1 
    8481fi 
    8582 
    86 /usr/bin/mysql -h"$MYSQL_HOST" -u"$MYSQL_USER" -p"$MYSQL_PASS" \ 
    87     "$MYSQL_DATABASE" -B << EOF | tail -n '+2' | dobck 
     83/usr/bin/mysql --defaults-file=/etc/alternc/mysql.cnf -B << EOF | tail -n '+2' | dobck 
    8884SELECT login, pass, db, bck_history, bck_gzip, bck_dir 
    8985  FROM db 
    9086 WHERE bck_mode=$mode; 
  • src/update_domains.sh

    old new  
    7474 
    7575. "$CONFIG_FILE" 
    7676 
    77 if [ -z "$MYSQL_HOST" -o -z "$MYSQL_DATABASE" -o -z "$MYSQL_USER" -o \ 
    78      -z "$MYSQL_PASS" -o -z "$DEFAULT_MX" -o -z "$PUBLIC_IP" ]; then 
     77if [ -z "$DEFAULT_MX" -o -z "$PUBLIC_IP" ]; then 
    7978    echo "Bad configuration. Please use:" 
    8079    echo "   dpkg-reconfigure alternc" 
    8180    exit 1 
     
    9695HTTP_DNS="$DATA_ROOT/dns" 
    9796HTML_HOME="$DATA_ROOT/html" 
    9897 
    99 MYSQL_SELECT="mysql -h${MYSQL_HOST} -u${MYSQL_USER} 
    100                     -p${MYSQL_PASS} -Bs ${MYSQL_DATABASE}" 
    101 MYSQL_DELETE="mysql -h${MYSQL_HOST} -u${MYSQL_USER} 
    102                     -p${MYSQL_PASS} ${MYSQL_DATABASE}" 
     98MYSQL_SELECT="mysql --defaults-file=/etc/alternc/mysql-alternc.cnf -Bs " 
     99MYSQL_DELETE="mysql --defaults-file=/etc/alternc/mysql-alternc.cnf " 
    103100 
    104101######################################################################## 
    105102# Functions 
  • src/fixperms.sh

    old new  
    6363    done 
    6464} 
    6565 
    66 mysql -h"$MYSQL_HOST" -p"$MYSQL_PASS" -u"$MYSQL_USER" "$MYSQL_DATABASE" -B -e "select uid,login from membres" |grep -v ^uid|doone 
     66mysql --defaults-file=/etc/alternc/mysql.cnf -B -e "select uid,login from membres" |grep -v ^uid|doone 
    6767 
  • tools/get_domains_by_account

    old new  
    7474# Have to get AlternC conf file : 
    7575! [ -f "$ALTERNC_CONF_FILE" ] && { echo $MISSING_CONF_FILE ; exit 1 ; } || . $ALTERNC_CONF_FILE 
    7676# Must have access to mysql to retreive accounts owning domains : 
    77 [ -z "$MYSQL_HOST" ] && MYSQL_HOST=localhost 
    78 $mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS -D$MYSQL_DATABASE -e "select count(*) from domaines_standby;" > /dev/null 2>&1 
    79 [ "$?" != 0 ] && { echo "$MYSQL_UNREACHABLE_DATABASE" ; exit 1 ; } || mysql="$mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS -D$MYSQL_DATABASE -B -N -e " 
     77mysql="$mysql --defaults-file=/etc/alternc/mysql.cnf -B -N -e" 
     78$mysql "select count(*) from domaines_standby;" > /dev/null 2>&1 
     79[ "$?" != 0 ] && { echo "$MYSQL_UNREACHABLE_DATABASE" ; exit 1 ; } 
    8080 
    8181# Does the stuff 
    8282$mysql "select concat(a.sub, if(a.sub=\"\",\"\", \".\"), a.domaine) from sub_domaines a, membres b where a.compte = b.uid and b.login = \"${1}\";" 
  • tools/top_http_users

    old new  
    168168# Have to get AlternC conf file : 
    169169[ -f "$ALTERNC_CONF_FILE" ] || { echo $MISSING_CONF_FILE ; exit 1 ; } && . $ALTERNC_CONF_FILE 
    170170# Must have access to mysql to retreive accounts owning domains : 
    171 [ -z "$MYSQL_HOST" ] && MYSQL_HOST=localhost 
    172 $mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS -D$MYSQL_DATABASE -e "select count(*) from domaines_standby;" > /dev/null 2>&1 
    173 [ "$?" != 0 ] && { echo "$MYSQL_UNREACHABLE_DATABASE" ; exit 1 ; } || mysql="$mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS -D$MYSQL_DATABASE -B -N -e " 
    174  
     171mysql="$mysql --defaults-file=/etc/alternc/mysql.cnf -B -N -e" 
     172$mysql "select count(*) from domaines_standby;" > /dev/null 2>&1 
     173[ "$?" != 0 ] && { echo "$MYSQL_UNREACHABLE_DATABASE" ; exit 1 ; } 
    175174# Prevents executing more than one shell at the same time 
    176175$lockfilecreate --retry 1 $LOCK_FILE 
    177176if [ $? != 0 ] 
  • tools/get_account_by_domain

    old new  
    7575[ "$1" = "-h" ] || [ "$1" = "--help" ] && { echo $HELP ; echo $USAGE ; exit 0 ; } 
    7676# Have to get AlternC conf file : 
    7777! [ -f "$ALTERNC_CONF_FILE" ] && { echo $MISSING_CONF_FILE ; exit 1 ; } || . $ALTERNC_CONF_FILE 
    78 # Must have access to mysql to retreive accounts owning domains : 
    79 [ -z "$MYSQL_HOST" ] && MYSQL_HOST=localhost 
    80 $mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS -D$MYSQL_DATABASE -e "select count(*) from domaines_standby;" > /dev/null 2>&1 
    81 [ "$?" != 0 ] && { echo "$MYSQL_UNREACHABLE_DATABASE" ; exit 1 ; } || mysql="$mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS -D$MYSQL_DATABASE -B -N -e " 
     78mysql=$mysql --defaults-file=/etc/alternc/mysql.cnf 
     79$mysql -e "select count(*) from domaines_standby;" > /dev/null 2>&1 
     80[ "$?" != 0 ] && { echo "$MYSQL_UNREACHABLE_DATABASE" ; exit 1 ; } 
    8281 
    8382# Does the stuff 
    84 $mysql "select concat(a.login, \" (\", a.mail, \")\") from membres a, sub_domaines b where a.uid = b.compte and concat(if(sub=\"\", \"\", concat(sub, \".\")), domaine)  = \"${1}\";" 
     83$mysql -B -N -e "select concat(a.login, \" (\", a.mail, \")\") from membres a, sub_domaines b where a.uid = b.compte and concat(if(sub=\"\", \"\", concat(sub, \".\")), domaine)  = \"${1}\";" 
    8584 
    8685 
  • install/alternc.install

    old new  
    55# on a new server. THIS SCRIPT ERASE ALL DATA ON THE AlternC SYSTEM !! 
    66# YOU HAVE BEEN WARNED ! 
    77 
     8# This script now assumes it has MySQL connectivity through 
     9# /etc/alternc/mysql.cnf 
     10 
    811set -e  
    912 
    1013. /usr/lib/alternc/functions.sh 
     
    101104    MONITOR_IP="127.0.0.1" 
    102105fi 
    103106 
    104 SED_SCRIPT=" 
     107# XXX: I assume this is secure if /tmp is sticky (+t) 
     108# we should have a better way to deal with templating, of course. 
     109SED_SCRIPT=`mktemp` 
     110cat > $SED_SCRIPT <<EOF 
    105111s\\%%hosting%%\\$HOSTING\\; 
    106112s\\%%fqdn%%\\$FQDN\\; 
    107113s\\%%public_ip%%\\$PUBLIC_IP\\; 
     
    121127s\\%%fqdn_lettre%%\\$FQDN_LETTER\\; 
    122128s\\%%version%%\\$VERSION\\; 
    123129s\\%%ns2_ip%%\\$NS2_IP\\; 
    124 
     130EOF 
    125131 
    126132####################################################################### 
    127133# Backup configuration files 
     
    145151for file in $CONFIG_FILES; do 
    146152    TEMPLATE="$TEMPLATE_DIR/${file##etc/}" 
    147153    if [ -f "$TEMPLATE" ]; then 
    148         sed -e "$SED_SCRIPT" < $TEMPLATE > /$file 
     154        sed -f "$SED_SCRIPT" < $TEMPLATE > /$file 
    149155    fi 
    150156done 
     157rm -f $SED_SCRIPT 
    151158 
    152159####################################################################### 
    153160# Save installed files to check them during next install 
    154161# 
    155162tar -zcf "$INSTALLED_CONFIG_TAR" -C / $CONFIG_FILES 
    156163 
    157 ###################################################################### 
    158 # Initialize database 
    159 # 
    160 if [ "$MYSQL_HOST" != "localhost" -o -e /usr/sbin/mysqld ]; then 
    161     echo "Setup MySQL and database..." 
    162     /usr/share/alternc/install/mysql.sh "$MYSQL_HOST" "$MYSQL_USER" "$MYSQL_PASS" "$MYSQL_DATABASE" 
    163 fi 
    164  
    165164########################################################################  
    166165# Ad-hoc fixes 
    167166# 
     
    263262/usr/lib/alternc/basedir_prot.sh 
    264263 
    265264# Creating admin user if needed 
    266 HAS_ROOT="`mysql -h"$MYSQL_HOST" -u"$MYSQL_USER" -p"$MYSQL_PASS" "$MYSQL_DATABASE" -e "SELECT COUNT(*) FROM membres WHERE login = 'admin' OR login = 'root' and su = 1" | tail -1`" 
     265HAS_ROOT=`mysql --defaults-file=/etc/alternc/mysql.cnf -e "SELECT COUNT(*) FROM membres WHERE login = 'admin' OR login = 'root' and su = 1" | tail -1` 
    267266if [ "$HAS_ROOT" != "1" ]; then 
    268267    echo "Creating admin user..." 
    269268    echo "" 
  • install/mysql.sh

    old new  
    2828# USAGE : "mysql.sh loginroot passroot systemdb" 
    2929# ---------------------------------------------------------------------- 
    3030# 
     31  
     32# This script expects the following environment to exist: 
     33# * sqlserver 
     34# * rootlogin 
     35# * rootpass 
     36# * systemdb 
     37# 
     38# So this file should generally be sourced like this: 
     39# . /usr/share/alternc/install/mysql.sh 
     40# 
     41# Those values are used to set the username/passwords... 
    3142 
    32 sqlserver="$1" 
    33 rootlogin="$2" 
    34 rootpass="$3" 
    35 systemdb="$4" 
     43# The grant all is the most important right needed in this script. 
     44echo "Granting users..." 
    3645 
    37 if [ -z "$rootlogin" -o -z "$rootpass" -o -z "$systemdb" ] 
    38 then 
    39     echo "Usage: mysql.sh <mysqlserver> <rootlogin> <rootpass> <systemdb>" 
    40     exit 1 
    41 fi 
    42  
    43 mysql="/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -h$sqlserver " 
    44  
    45 # The grant all is the most important right needed in this script. 
     46echo -n " * Trying debian.cnf... " 
     47mysql="/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf" 
    4648# If this call fail, we may be connected to a mysql-server version 5.0. 
    47 echo "Granting users " 
    48 # In that case, change mysql parameters and retry. Use root / nopassword. 
    49 $mysql -e "GRANT ALL ON *.* TO '$rootlogin'@'${MYSQL_CLIENT}' IDENTIFIED BY '$rootpass' WITH GRANT OPTION" 
     49# In that case, change mysql parameters and retry. Use root / nopassword. 
     50$mysql <<EOF 
     51GRANT ALL ON *.* TO '$rootlogin'@'${MYSQL_CLIENT}' IDENTIFIED BY '$rootpass' WITH GRANT OPTION 
     52EOF 
    5053if [ "$?" -ne "0" ] 
    5154then 
    52     echo "debian-sys-maintainer doesn't have the right credentials, assuming we're doing an upgrade" 
    53     mysql="/usr/bin/mysql -h$sqlserver -u$rootlogin -p$rootpass"  
    54     $mysql -e "GRANT ALL ON *.* TO '$rootlogin'@'${MYSQL_CLIENT}' IDENTIFIED BY '$rootpass' WITH GRANT OPTION" 
     55    echo "failed: debian-sys-maintainer doesn't have the right credentials" 
     56    echo -n "are we doing an upgrade? " 
     57    mysql="/usr/bin/mysql --defaults-file=/etc/alternc/mysql.cnf"  
     58    $mysql <<EOF 
     59GRANT ALL ON *.* TO '$rootlogin'@'${MYSQL_CLIENT}' IDENTIFIED BY '$rootpass' WITH GRANT OPTION 
     60EOF 
    5561    if [ "$?" -ne "0" ]  
    56         then  
    57         echo "Still not working, assuming clean install and empty root password" 
     62    then  
     63        echo "No" 
     64        echo - "Assuming clean install (empty root password)... " 
    5865        mysql="/usr/bin/mysql -h$sqlserver -uroot " 
    59         $mysql -e "GRANT ALL ON *.* TO '$rootlogin'@'${MYSQL_CLIENT}' IDENTIFIED BY '$rootpass' WITH GRANT OPTION" 
     66        $mysql <<EOF 
     67GRANT ALL ON *.* TO '$rootlogin'@'${MYSQL_CLIENT}' IDENTIFIED BY '$rootpass' WITH GRANT OPTION 
     68EOF 
    6069        if [ "$?" -ne "0" ]  
    6170        then  
     71            echo "Failed" 
    6272            echo "Can't grant system user $rootlogin, aborting";  
    6373            exit 1  
    6474        fi 
    6575    fi 
    6676fi 
     77echo "ok!" 
    6778 
    68 # Now we can use rootlogin and rootpass.  
    69 mysql="/usr/bin/mysql -h$sqlserver -u$rootlogin -p$rootpass"  
     79echo "Checking for MySQL connectivity" 
     80/usr/bin/mysql --defaults-file=/etc/alternc/mysql.cnf -e "SHOW TABLES" >/dev/null && echo "MYSQL.SH OK!" || echo "MYSQL.SH FAILED!" 
    7081 
    71 echo "Setting AlternC '$systemdb' system table and privileges " 
    72 $mysql -e "CREATE DATABASE IF NOT EXISTS $systemdb;"  
    73  
    74 echo "Installing AlternC schema " 
    75 $mysql $systemdb < /usr/share/alternc/install/mysql.sql 
    76  
    77 /usr/bin/mysql -h$sqlserver -u$rootlogin -p$rootpass $systemdb -e "SHOW TABLES" >/dev/null && echo "MYSQL.SH OK!" || echo "MYSQL.SH FAILED!"