Ugly things : Autologin of console at startup

→ Ugly but okay in a development virtual machine…

Add “– – autologin root” at the end of /etc/init/tty1.conf

It will auto-log you as root for the first console. For the others, do the same with /etc/init/tty[1-5].conf

You can autolog as “student” by replacing root by student. It’s a little safer … but still ugly.

How to debug at boot time

If all you get is a black screen when booting, boot in recovery mode to see a little more information :

recovery

When you are in the grub menu, choose the “recovery” version

If there is none or if it’s still black type “e” in the grub menu over the kernel entry you want. Find the line starting by linux, and add “ro single recovery” at the end.
Type F10 to boot.

recovery2

Grub normally have a “Previous versions” menu to allow you to boot with the ubuntu default kernel…

 

In fact if you get a black screen when booting, chances is that you’re missing some modules. But you can get more:

  • Add a serial device to your virtualbox, select “file” mode, with e.g. /tmp/vbox-jerry
  • run tail -f /tmp/vbox-jerry on your machine to watch that log file,
  • before booting, press e to edit the config and add at the tail of the command line ” console=ttyS0,57600″
  • this will work only for boot time, when syslogd will start, the log will go to /var/log/syslog
  • You can use the /etc/default/grub file like for the screen size (see slides of info0940) to make it permanent

A network problem during boot may stall you for 120 seconds, with or without a black screen ! So wait a little !

Grignoux Cinema

This post is in French as it concerns only people from my area

Grignoux Cinema Grignoux Cinema


Je suis l’auteur de l’application “Grignoux Cinéma” qui permet de voir les horaires des cinémas grignoux à Liège (Churchill, Parc et Sauvenière) sur les terminaux Android. J’ai déposé le code sur Github, et rend donc open source cette application (licence GPL). N’hésitez pas à contribuer, je manque un peu de temps… J’aimerais rajouter certains fonctions comme la recherche par cinéma, une légende, etc…

Lien github

Lien Google Play Store

VM and Kernel compiling troubleshooting

Start’up Troubleshooting

 

  • Log in as “student” with the password mentioned in the auditorium and the slides.
  • If your virtual machine does not boot, you can check the boot log with a right-click on the virtual machine entry in VirtualBox.
    The kernel installed on ubuntu server *requires* PAE/NX extension to be enabled in your virtual box. This can be tuned in Settings>System>Processor for your virtual machine.
  • Ubuntu remembers which “network card” you have installed, so that interface IDs (i.e. eth0, eth1…) is consistent when you reboot. This may cause you to lose network connectivity when you copy your .vdi from one machine to another. If that happens (boot stalls on networking setup) reset the content of your /etc/udev/rules.d/*persistent-net.rules file.

Building Kernel Troubleshooting

  • The config file you’ve been given should provide all the options for a i386 build of the reference kernel sources. If you’re prompted with [Y/n/m] questions in “make oldconfig” step, you’re very likely to be trying to compile an amd64 kernel itself, which won’t work on the reference virtual machine. It is mandatory to compile the kernel in i386, see Shell, Linux and Kernel slides for more informations.
  • “CONFIG_DEBUG_SECTION_MISMATCH errors” essentially occurs when you’re including unsafe drivers in your kernel. Unless you’re experiencing this during “make bzImage”, you can safely ignore this.
  • quota exceeded while building may occur on ms8xx, with various error messages. use quota -v -s to check how much more space you can eat on the shared filesystem (/home). kdirstat $HOME can assist you in finding files that take too much room. You have 500Mo allowed, clearly not enough to build the kernel in your home directory. Beware, the compiler suite installed on ms8xx makes use of a “compiler cache”, in the (hidden) $HOME/.ccache directory. You’d more likely want to use some location in /tmp for that purpose. If that’s the case, create a personal sub-folder and export CCACHE_DIR=/tmp/OS$USER/ccache before you start compiling the kernel. Alternatively, you may prefer to restrict the size .ccache can grow. Check out the manpage for details.
  • permission denied during make install might occur. Part of the ‘install’ process is designed by your distribution maintainers for upgrading the distribution itself. This usually happens after vmlinuz and friends have been copied to $INSTALL_PATH, so most of the times, you do not need to bother.

Booting Kernel Troubleshooting

  • “init: failed to create pty…” errors on boot? may occur with your custom-built kernel. It’s annoying, but it’s not just you: it’s a bug not yet fixed in the distributed image. Retrieve the update definitions with sudo aptitude update and then selectively upgrade the buggy package (upstart): sudo aptitude upgrade upstart.
    the screen is completely black with your new kernel ? don’t panic (yet). Chances are that you’re missing some modules. The kernel has started, but cannot access some hardware (including fancy graphic modes). Try out the “recovery mode” for the corresponding kernel, then dig kern.log for an explanation. Use “insert CTRL+ALT+DEL” on your vbox’s “Machine” menu to return to the boot.
  • booting takes ages. Most likely, you’re stuck at network configuration. That may take several minutes when no network card is found (cf. Startup) or when modules for the network card cannot be located.

Read and write PIC EEPROM

More a little post-it than a post, I wanted to put somewhere the commands :

Using the eeprom is as simple as these two commands :

[code lang=”c”]EEPROM_READ(addr) EEPROM_WRITE(addr,value) [/code]

A little example (reading from the USART a value and putting it in the EEPROM address 0x00)

[code] while (!DataRdyUSART()); char data = ReadUSART(); EEPROM_WRITE(0x00,data); [/code]

Note that theses header are defined in the standard xc8 header which will include (or , …) or High Tech C headers if you come from the past :

[code lang=”c”] // MACROS for EEPROM Access /* macro versions of EEPROM read and write */ /* NOTE WELL: EEPROM_READ() is NOT safe to use immediately after any write to EEPROM, as it does NOT wait for WR to clear. This is by design, to allow minimal code size if a sequence of reads is desired. To guarantee uncorrupted writes insert while(WR)continue; before calling EEPROM_READ(). */ #if _EEPROMSIZE > 0 && defined(_PLIB) #define EEPROM_READ(addr) Read_b_eep(addr) #define eeprom_read(addr) Read_b_eep(addr) #else #define EEPROM_READ(addr) 0 // Added only for code portability #define eeprom_read(addr) 0 #endif #if _EEPROMSIZE > 0 && defined(_PLIB) #define EEPROM_WRITE(addr, value) (Busy_eep(), Write_b_eep(addr,value)) #define eeprom_write(addr, value) (Busy_eep(), Write_b_eep(addr,value)) #else #define EEPROM_WRITE(addr, value) // Added only for code portability #define eeprom_write(addr, value) #endif [/code]

Detecting if another user is connected on UNIX systems

How to detect if another user is connected to your machine or your server? You can use the command “users” to check yourself is someone is connected. But to do it automatically, you’ll have to use some pipe :

[code lang=”bash”]expr length “`users | sed -e “s/\($USER\|\[ \]*\)//ig”`”[/code]

The first thing executed by the shell will be the thing under french apostrophe ( ` ). Theses are for evaluation a command, and replace it by what it outputs (normally print on the screen). The command users print the list of connected users into a pipe, to sed which evaluate its command as a regular expression (-e parameter). The command is “s” for substitute, and the rest tells him to find “$USER” (replaced by the currently connected user, you) and spaces and replace them by … nothing. So this part will be an empty string if there is no other users connected than “$USER” and something not empty if there is.

The “expr length” return the length of a string. So this commands print 0 if there is no other user connected, and >0 if there is some !

In a shell script to do something if yes or no…
[code lang=”bash”]#!/bin/sh
usersstripped=`users | sed -e “s/\(tom\|\[ \]*\)//ig”`
connected=`expr length “$usersstripped”`
if [ “$connected” -eq “0” ] ; then
echo “No other user is connected”
else
echo “Other user connected !”
fi[/code]

It is essentially the same command but done in two times, as in a shell script this command would not be evaluated correctly.

And if you want to put that in a cron to eg. send you a mail, you just have to type “crontab -e” and put a line like :

[code]* * * * * /home/tom/connected[/code]

To launch it every minutes. But if you do that you’d better do something like detecting a connection…

My .ZSHRC

To gain a lot of time, you can replace the old “bash” by “zsh”, which is a very more powerful shell with autocompletion, but not only… It has a configuration file called “.zshrc” that you have to put in your home. You can try zsh by installing it and typing “zsh”, and if you’re convinced, keeping it by typing chsh and choosing /bin/zsh.
You have my entire .zshrc but I choose 3 snippets that I prefer to show you the usefullness :
As I use Fedora, Debian, and Ubuntu, I made this to type “i program” to install profram on any system, and “u” to update the system. 
[code lang=”bash”] #i for install, u for update if [ -e /bin/yum ]; then alias i=”sudo yum install” alias u=”sudo yum update” else alias i=”sudo apt-get install” alias u=”sudo apt-get update && sudo apt-get dist-upgrade” fi [/code] Force sudo for commands that anyway need it [code lang=”bash”] alias yum=”sudo yum” alias apt-get=”sudo apt-get” alias service=”sudo service” [/code]   Setting vi as default editor : [code lang=”bash”] export EDITOR=”vi” [/code]   The multiples ssh shorcuts [code lang=”bash”]alias sshd=”ssh mappam.dyndns.org -X” alias sshc=”ssh itstudents.be -X -L 3129:localhost:3129″[/code] I use my zshrc on multiple system and multiple environment, hence you have some tricks and multiplications like different variables for the same program in the path variable. [code lang=”bash”] #Using color schemes autoload -U colors && colors #Adding ADB to path variable export PATH=${PATH}:/usr/src/android-sdk-linux/platform-tools/:/usr/src/android-sdk-linux/tools/:/opt/android/platform-tols/ ################## # Aliases ################## #SSH shorcuts alias sshd=”ssh mappam.dyndns.org -X” alias sshc=”ssh itstudents.be -X -L 3129:localhost:3129″ alias ssha=”ssh asbss.be -X” alias sshu=”ssh barbette@ms806.montefiore.ulg.ac.be -X” alias sshq=”ssh barbette@queen.run.montefiore.ulg.ac.be -X” alias scpi=”scp -i /home/tom/.ssh/id_rsa” alias scp3=”scp -P 3690 -i /home/tom/.ssh/id_rsa” alias sam=”ssh-add /home/tom/.ssh/id_rsa.montefiore” #I have all my usefull scripts on my server itstudents, this alias update all scripts on a client, including this .zshrc alias us=”mkdir -p /home/tom/.scripts && scpi tom@itstudents.be:/home/tom/.ssh/authorized_keys /home/tom/.ssh/authorized_keys && scpi tom@itstudents.be:/home/tom/.zshrc /home/tom/.zshrc && scpi -r tom@itstudents.be:/home/tom/.scripts/ /home/tom/ && source /home/tom/.zshrc” #Alias for these scripts… #Archiver pack a folder in tar.gz alias archiver=”/home/tom/.scripts/archiver” #Archiver7 pack a folder in a tar.7z alias archiver7=”/home/tom/.scripts/archiver7″ #Update and reset permissions of an svn alias svnup=”/home/tom/.scripts/svnup” #Push an rsa key to the list of authorized keys alias pushrsa=”ssh tom@itstudents.be \”cat – >> /home/tom/.ssh/authorized_keys\” < ” #Mount some local shares alias mh=”sudo mount -t nfs debserver:/home/tom /mnt/debserver-home” alias mp=”sudo mount -t nfs debserver:/pub /mnt/debserver-pub” #Force sudo for some sudo-only commands like installers alias yum=”sudo yum” alias apt-get=”sudo apt-get” alias service=”sudo service” #Some copy-pasted shorcut from elsewhere alias k=’tree’ alias ltr=’ls -ltr’ alias r=’screen -D -R’ alias ls=’ls –color’ alias l=’ls -lh’ alias ll=’ls -la’ #i for install, u for update if [ -e /bin/yum ]; then alias i=”sudo yum install” alias u=”sudo yum update” else alias i=”sudo apt-get install” alias u=”sudo apt-get update && sudo apt-get dist-upgrade” fi #Some links to launch programs on my android devices alias adbf=”ard && adb forward tcp:8999 tcp:8999 && google-chrome http://localhost:8999 &” alias agmail=”adb shell am start -a android.intent.action.MAIN -n com.google.android.gm/.ConversationListActivityGmail” alias amail=”adb shell am start -a android.intent.action.MAIN -n com.google.android.email/com.android.email.activity.EmailActivity” alias ard=”adb shell am start -a android.intent.action.MAIN -n net.xdevelop.rm/.RemoteMobile” alias rr=”sudo route del default && sudo route add default gw 10.0.0.1″ #Wake on lan shorcuts alias wdebian=”sudo etherwake 8C:89:A5:C1:D2:8A”     # Meta-u to chdir to the parent directory bindkey -s ‘\eu’ ‘^Ucd ..; ls^M’ bindkey ‘\e[1~’ beginning-of-line bindkey ‘\e[4~’ end-of-line bindkey ‘\e[7~’ beginning-of-line bindkey ‘\e[8~’ end-of-line bindkey ‘\eOH’ beginning-of-line bindkey ‘\eOF’ end-of-line bindkey ‘\e[H’ beginning-of-line bindkey ‘\e[F’ end-of-line bindkey ‘\e[5~’ beginning-of-history bindkey ‘\e[6~’ end-of-history bindkey ‘\e[3~’ delete-char #Enable auto correct for commands setopt correct # Pipe the current command through less bindkey -s “\el” ” 2>&1|less^M” zstyle ‘:completion:*:(all-|)files’ ignored-patterns ‘(|*/)CVS’ zstyle ‘:completion:*:cd:*’ ignored-patterns ‘(*/)#CVS’ #Mode verbose pour cp, rm, chmod, chown et rename for c in cp rm chmod chown rename; do alias $c=”$c -v” done #Pendunt une complétion affiche les points expand-or-complete-with-dots() { echo -n “\e[31m……\e[0m” zle expand-or-complete zle redisplay } zle -N expand-or-complete-with-dots bindkey “^I” expand-or-complete-with-dots setopt EXTENDED_GLOB setopt NO_BEEP export EDITOR=”vi” setopt ZLE setopt AUTO_CD ################## # Completion Stuff ################## bindkey -M viins ‘\C-i’ complete-word # Faster! (?) zstyle ‘:completion::complete:*’ use-cache 1 # generate descriptions with magic. zstyle ‘:completion:*’ auto-description ‘specify: %d’ # Don’t prompt for a huge list, page it! zstyle ‘:completion:*:default’ list-prompt ‘%S%M matches%s’ # Don’t prompt for a huge list, menu it! zstyle ‘:completion:*:default’ menu ‘select=0’ # Have the newer files last so I see them first zstyle ‘:completion:*’ file-sort modification reverse # color code completion!!!! Wohoo! zstyle ‘:completion:*’ list-colors “=(#b) #([0-9]#)*=36=31″ unsetopt LIST_AMBIGUOUS setopt COMPLETE_IN_WORD # Separate man page sections. Neat. zstyle ‘:completion:*:manuals’ separate-sections true # Egomaniac! zstyle ‘:completion:*’ list-separator ‘fREW’ # complete with a menu for xwindow ids zstyle ‘:completion:*:windows’ menu on=0 zstyle ‘:completion:*:expand:*’ tag-order all-expansions # more errors allowed for large words and fewer for small words zstyle ‘:completion:*:approximate:*’ max-errors ‘reply=( $(( ($#PREFIX+$#SUFFIX)/3 )) )’ # Errors format zstyle ‘:completion:*:corrections’ format ‘%B%d (errors %e)%b’ # Don’t complete stuff already on the line zstyle ‘:completion::*:(rm|vi):*’ ignore-line true # Don’t complete directory we are already in (../here) zstyle ‘:completion:*’ ignore-parents parent pwd zstyle ‘:completion::approximate*:*’ prefix-needed false #}}} export GREP_COLOR=31 alias grep=’grep –color=auto’ #{{{ Prompt! colors host_color=cyan history_color=yellow user_color=green root_color=red directory_color=magenta error_color=red jobs_color=green host_prompt=”%{$fg_bold[$host_color]%}%m%{$reset_color%}” jobs_prompt1=”%{$fg_bold[$jobs_color]%}(%{$reset_color%}” jobs_prompt2=”%{$fg[$jobs_color]%}%j%{$reset_color%}” jobs_prompt3=”%{$fg_bold[$jobs_color]%})%{$reset_color%}” jobs_total=”%(1j.${jobs_prompt1}${jobs_prompt2}${jobs_prompt3} .)” history_prompt1=”%{$fg_bold[$history_color]%}[%{$reset_color%}” history_prompt2=”%{$fg[$history_color]%}%h%{$reset_color%}” history_prompt3=”%{$fg_bold[$history_color]%}]%{$reset_color%}” history_total=”${history_prompt1}${history_prompt2}${history_prompt3}” error_prompt1=”%{$fg_bold[$error_color]%}<%{$reset_color%}” error_prompt2=”%{$fg[$error_color]%}%?%{$reset_color%}” error_prompt3=”%{$fg_bold[$error_color]%}>%{$reset_color%}” error_total=”%(?..${error_prompt1}${error_prompt2}${error_prompt3} )” case “$TERM” in (screen) function precmd() { print -Pn “\033]0;S $TTY:t{%100<…<%~%<<}\007″ } ;; (xterm) directory_prompt=”%{$fg[$directory_color]%}%~%{$reset_color%} ” ;; (*) directory_prompt=”%{$fg[$directory_color]%}%~%{$reset_color%} ” ;; esac if [[ $USER == root ]]; then post_prompt=”%{$fg_bold[$root_color]%}%#%{$reset_color%}” else post_prompt=”%{$fg_bold[$user_color]%}%#%{$reset_color%}” fi fg_light_gray=$’%{\e[0;34m%}’ PS1=”${host_prompt} ${jobs_total}${history_total} ${error_total}${post_prompt} ” RPROMPT=”%{$fg_bold[$user_color]%}<%{$reset_color%} ${directory_prompt}${fg_light_gray}[%*]%{$reset_color%}” #}}} #Type f to flush the console to history file alias f=”fc -W” HISTSIZE=10000 SAVEHIST=10000 HISTFILE=~/.history setopt LIST_PACKED #Append to history file instead of re-writing setopt APPEND_HISTORY #To share history between terminal, not what I want as I always have multiple terminals like one for generating packet, the other to receive them #setopt SHARE_HISTORY #Remove blanks setopt hist_reduce_blanks #Remove duplicates setopt hist_ignore_all_dups #Do not store commands in history starting with white space setopt hist_ignore_space #Init autoload -U compinit promptinit zcalc zsh-mime-setup compinit promptinit zsh-mime-setup[/code]

Wanscam IP Camera Update

As IP Camera are cheaper than real alarm, I decided to buy a cheap IP Camera like ones you see for 50€ when typing “ip camera” on amazon :

(Re)brand : Wanscam
Model : FR4020A2
Original system firmware  : 0.37.2.46
Original WEB UI : 0.9.4.16

webcam

It can detect movement, move horizontally and vertically by a web interface, send mail, send image on ftp, etc etc…

But the reference nearly doesn’t exist, and finding a newer firmware is nearly impossible. But this camera looks a lot like a lot of others, including Foscam. So I decided to find a newer firmware for similar webcams. I found that the firmware for mine was named lr_cmos_0_X_Y_Z.bin, and I searched for newer version. I finaly came acrosse this page : http://www.dericam.com/bbs/forum.php?mod=viewthread&tid=85 where a link to a firmware for the Dericam M801W is given containing a file named “lr_cmos_0_41_2_51.bin”, I decided to flash it and… It works ! It doesn’t seem that there exist any newer firmware…

About the web ui firmware, I searched for a firmware in the web coming with the system firmware around 41.2.51, and I came accross http://www.openipcam.com/forum/index.php/topic,128.0.html#msg1956 . The web ui firmware number is smaller but  clearly, the interface is newer… It comes with something we can call a “design”, far away from the horrible original nearly “text only” interface.

So my final versions are :

  Device Firmware Version   0.41.2.51
  Device Embeded Web UI Version   0.2.9.12

You can download the files here : lr_cmos_0_41_2_51 (flash the lr_cmos first!) and WEB UI 0.2.9.12.bin. The video quality is really better ! Wifi is working, etc…

The update process doesn’t lost configuration or passwords !

 

A little tips working with all of theses ip camera, create some favorites to directly set or unset alarm :

Set alarm to send by ftp and by mail : http://10.0.0.50:99/set_alarm.cgi?next_url=alarm.htm&motion_armed=1&input_armed=0&motion_sensitivity=5&iolinkage=0&mail=1&upload_interval=1&ioin_level=1&ioout_level=0&schedule_enable=0&schedule_sun_0=0&schedule_sun_1=0&schedule_sun_2=0&schedule_mon_0=0&schedule_mon_1=0&schedule_mon_2=0&schedule_tue_0=0&schedule_tue_1=0&schedule_tue_2=0&schedule_wed_0=0&schedule_wed_1=0&schedule_wed_2=0&schedule_thu_0=0&schedule_thu_1=0&schedule_thu_2=0&schedule_fri_0=0&schedule_fri_1=0&schedule_fri_2=0&schedule_sat_0=0&schedule_sat_1=0&schedule_sat_2=0

Set alarm to send by ftp only  : http://10.0.0.50:99/set_alarm.cgi?next_url=alarm.htm&motion_armed=1&input_armed=0&motion_sensitivity=5&iolinkage=0&mail=0&upload_interval=1&ioin_level=1&ioout_level=0&schedule_enable=0&schedule_sun_0=0&schedule_sun_1=0&schedule_sun_2=0&schedule_mon_0=0&schedule_mon_1=0&schedule_mon_2=0&schedule_tue_0=0&schedule_tue_1=0&schedule_tue_2=0&schedule_wed_0=0&schedule_wed_1=0&schedule_wed_2=0&schedule_thu_0=0&schedule_thu_1=0&schedule_thu_2=0&schedule_fri_0=0&schedule_fri_1=0&schedule_fri_2=0&schedule_sat_0=0&schedule_sat_1=0&schedule_sat_2=0

Unset alarm : http://10.0.0.50:99/set_alarm.cgi?next_url=alarm.htm&motion_armed=0&input_armed=0&motion_sensitivity=5&iolinkage=0&mail=0&upload_interval=0&schedule_enable=0&schedule_sun_0=0&schedule_sun_1=0&schedule_sun_2=0&schedule_mon_0=0&schedule_mon_1=0&schedule_mon_2=0&schedule_tue_0=0&schedule_tue_1=0&schedule_tue_2=0&schedule_wed_0=0&schedule_wed_1=0&schedule_wed_2=0&schedule_thu_0=0&schedule_thu_1=0&schedule_thu_2=0&schedule_fri_0=0&schedule_fri_1=0&schedule_fri_2=0&schedule_sat_0=0&schedule_sat_1=0&schedule_sat_2=0

Don’t forget to change your ip adress/port of course… You can change the “motion_sensitivity=5” to another value according to your environment…

Assistant Professor
UCLouvain, Belgium
tom.barbette@uclouvain.be
+32 479 60 94 63
Reaumur A 041 (Floor 0)
Place Sainte Barbe 2/L5.02.01
1348 Louvain-la-Neuve
Tom Barbette’s brief

Check my research page !

Un·e académique en Sciences de la Communication | SFSIC2022 – …Assistant Professor
Un·e académique en Sciences de la Communication | SFSIC2021 – 2022Post-Doc @ INL
kth-logo.jpg | FEMS - The Federation of European Materials Societies2018 – 2021 Post-Doc @ NSLab
Fichier:University of Liège logo.svg — Wikipédia2013 – 2018PhD Student @ RUN
Past positions

TPC: NSDI’24, CoNEXT’21,22,24, HPSR’22, ANCS’21, SIGCOMM’21 Poster session,
AEC: SIGCOMM’23,22,20
ACM/IEEE ToN, Elsevier Computer and Security, IEEE TNSM, CoNEXT’23 ext. review
GitHub — WikipédiaFastClick ; NPF ; WRK-MP
Community Service