View posts for Category "Howto"

Windows server lockout

Since there are not only unix-based servers out there in the web, I sometimes also encounter Windows servers which I have to maintain.

Usually, you connect to a Windows server using Microsoft’s “Remote Desktop Connection” (RDC) client. If you’re not running a terminal server, the number of allowed sessions on the server is limited to two sessions at a time.

Unfortunately a session isn’t ended and closed if you close your RDC client window, but only if you log off, i.e. by clicking on “Start” -> “Log Off”. So if you just close your RDC window without to log yourself really off, there’s a good chance that you lock yourself out from the server and thus get the following message “Terminal Server Has Exceeded the Maximum Number of Allowed Connections”.

If you have access to your server, you can easily log on to the server on-site and remove all “dead” sessions, but if your server is somewhere on this planet where you can’t just go over to, you should be served by using the following command:

C:\>mstsc -v:your_server_name_or_ip -admin

This command gives you access to a special session, namely the session 0 and you should be able to log in as “Administrator” and remove the dead sessions.

This two sessions at a time restriction is really annoying and it gets even more annoying if other people also use the server and don’t log off correctly. Having such stupid problems is probably one reason why many people get mad a Microsoft and their products. It’s simply a licensing issue you don’t have on Linux and *BSD systems ;-).

Sorry, comments are closed for this post.

Upgrading Debian Etch to Lenny

On last Saturday Debian 5.0 “Lenny” has been released as stable. This probably means a lot of updating work for many administrators. I was updating a couple of servers during the last days. Due to Debian’s APT system it’s a pretty easy process.

Step 1: Edit your /etc/apt/sources.list. Replace every occurrence of “etch” (I assume you’re updating from Debian “Etch”) with “lenny”. Your sources.list should now be looking roughly like that:

deb http://ftp.de.debian.org/debian/ stable main
deb-src http://ftp.de.debian.org/debian/ stable main

deb http://security.debian.org/ stable/updates main contrib
deb-src http://security.debian.org/ stable/updates main contrib

Step 2: Simply run apt-get updateand you should probably get something like this:

srv:~# apt-get update
Get:1 http://ftp.de.debian.org stable Release.gpg [386B]
Hit http://ftp.de.debian.org stable Release                                    
Get:2 http://security.debian.org stable/updates Release.gpg [189B]
Hit http://security.debian.org stable/updates Release
...
Hit http://security.debian.org stable/updates/main Sources
Hit http://security.debian.org stable/updates/contrib Sources
Fetched 2B in 0s (15B/s)
Reading package lists... Done
W: There is no public key available for the following key IDs:
4D270D06F42584E6
W: You may want to run apt-get update to correct these problems

Apparently, this means you need to get the public key for 4D270D06F42584E6. 😉 This can easily be done with the following commands.

srv:~# gpg --keyserver wwwkeys.eu.pgp.net --recv-keys 4D270D06F42584E6
gpg: directory `/root/.gnupg' created
gpg: can't open `/gnupg/options.skel': No such file or directory
gpg: keyring `/root/.gnupg/secring.gpg' created
gpg: keyring `/root/.gnupg/pubring.gpg' created
gpg: requesting key F42584E6 from hkp server wwwkeys.eu.pgp.net
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key F42584E6: public key "Lenny Stable Release Key <debian-release@lists.debian.org>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1
srv:~# apt-key add /root/.gnupg/pubring.gpg
OK

Please note that the key ID and though the public key needed on your system can differ from this one.

Step 3 Finally, you can rerun the package-list update and run the actual upgrade.

srv:~# apt-get update
srv:~# apt-get dist-upgrade

Depending on your machine’s capacity and your internet connection speed the upgrade can take from about 15 minutes to some hours. The avarege time my updates took was 30 minutes. After that you can reboot your freshly upgraded system with the new kernel and you’re done.

1 Comment

Basic Authentication problems with Phusion Passanger (mod_rails)

Phusion Passenger aka. “mod_rails” is great! It makes Rails deployment pretty easy and time-saving. Unfortunately it has a bug in it’s current 2.0.6 version which breaks Basic Authentication. Though this bug is fixed in the unreleased 2.1 version (see here) you need to care about the problem by yourself for now. The only working solution for me was to user Rails’ Basic Authentication functionality by hacking the following into my application controller:

class ApplicationController < ActionController::Base

  before_filter :http_auth  
 
  ...

  private
 
  def http_auth
    authenticate_or_request_with_http_basic do |user_name, password|
      user_name == "JohnDoe" && password == "secret123"
    end
  end

end

At this point you can be as creative as you want with reading the user name and password form a file or database and checking hashed passwords instead of plain text. For my purposes this was just enough, so I didn’t waste any more time on it. At the end of this post be warned: Basic Authentication through Rails does only protect your application, but it does not protect the static content in your public directory.

1 Comment

Archiving Thunderbird e-mails

Looking for a smart way to archive your e-mails from Thunderbird? There are many advices like copy your “/home/(username)/.mozilla/…” directory, which (in my opinion) are not very smart. After googling quite a while, I found a very cool TB extension called SmartSave and it lives up to its name! It needed less than ten seconds to export 1900 mails with a total size of 150 MB. I like it!

Sorry, comments are closed for this post.

How to download videos from YouTube

YouTube is the world’s #1 source for more or less funny or interesting videos. Unfortunately YouTube does not offer any options to download the videos from their site. YouTube even hides the direct links to their video resources. Even though it’s quite easy to find a download link for the real .flv videos:

  • Just go to the site where your desired video is i.e. http://de.youtube.com/watch?v=-xEzGIuY7kw .
  • View the source code of the site and search for a section that starts with “swfArgs”.
  • From this section you need the values for “video_id” and “t” (i.e. “video_id”: “dsfaAfdaAfs” and “t”: “sdfkljasldfjlkasflshdfjaiosjjsknfjkhJhjdf”)
  • With these values you should be able to call “http://www.youtube.com/get_video.php?video_id=<your video_id value>&t=<your t vlaue>” and to download your desired video.

I’ve made a little shell script for Linux and Mac that does all the searching stuff for me and that returns the url to the video source.

#!/bin/sh

if [ $1 == "" ]; then echo -e "$0: No URL specified\nUsage: $0 <url>\n"; exit 1; fi

which curl > /dev/null
if [ "$?" == 0 ]; then GET_COMMAND=curl
else
  which wget > /dev/null
  if [ "$?" == 0 ]; then echo "Didn't find curl nor wget. Exiting."; exit 1;
  else
    GET_COMMAND=wget -O ytf| cat ytf; rm ytf;
  fi
fi

# Use GNU version of sed on Darwin/OS X
if [ `uname -s` == "Darwin" ]; then SED=gsed;
else SED=sed; fi

RELEVANT_DATA=`$GET_COMMAND $1 | grep 'swfArgs' | $SED 's/,/\n/g'`
VIDEO_ID=`echo "$RELEVANT_DATA" | grep 'video_id' | $SED 's/"//g' | $SED 's/ //g' | $SED 's/:/=/g'`
T=`echo "$RELEVANT_DATA" | grep 't"' | $SED 's/"//g' | $SED 's/ //g' | $SED 's/:/=/g'`

LINK="http://www.youtube.com/get_video.php?$VIDEO_ID&$T"

if [ "$VIDEO_ID" != "" ] && [ "$T" != "" ]; then echo $LINK; exit 0;
else echo "Couldn't retrieve the needed data from the specified URL."; exit 1;
fi

To run the script correctly the GNU version of “sed” is needed.

Sorry, comments are closed for this post.

Qt4.4 for beginners

Quite some time ago I have worked with Qt3 and C++ to do some Linux projects. I had taken a look on GTK and wxWidgets too, but I felt most comfortable with Qt.

Now I had to build small program that was able to play a list of audio files and to give the user an option to rate these files. It’s a quite simple little program which for some reasons is needed to be written in C++.

So I installed Qt4.4 and started Qt’s Designer. I spent half an hour searching the source code editor in Designer. After five minutes with Google I found out that one “feature” of Qt4 was the complete separation of GUI code and logic code, so I had to work a slightly different way from what I was familiar with. Though I never used Qt’s Designer that way (usually I coded the whole GUI stuff by hand or used Designer’s built-in source code editor), I started “designing” my GUI. After I was finished I saved the file as “MainWindow.ui” (I know it’s not a smart name but I don’t care). So, what now? There were no other files and the Designer wasn’t able to produce any other files. The answer: qmake! qmake is some kind of Qt’s own make, which is not intended to replace make, but to give you a smart ability to handle *.ui and other Qt related files. One just needs to create a file named somefile.pro and add something like the following code to it:

HEADERS += MainWindow.h #as my ui file is MainWindow.ui
FORMS += MainWindow.ui # my ui file created by Qt Designer
SOURCES  += main.cpp MainWindow.cpp

This should be enough for a valid and working .pro file. Now there are three new file mentioned in the .pro file which are not existing yet. So where do we get these files from? We just create them ourselves. Let’s start with the main.cpp. It’s intended to be – guess what… So, what does it look like:

#include "MainWindow.h" // to integrate my MainWindow class from created by the Designer.
int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
  MainWindow *window = new MainWindow;  //create an instance of our window
  window->show();                       // show our window
  return app.exec();
}

Curious about what the MainWindow.h file is needed and used for?

#ifnedf MAINWINDOW_H
#define MAINWINDOW_H
#include "ui_MainWindow.h"
class MainWindow : public QMainWindow, private Ui::MainWindow
{
  Q_OBJECT
  public:
  MainWindow(QWidget *parent = 0);
};
#endif

First of all one has to understand where the “ui_mainWindow.h” comes from. It’s automatically generated by qmake when you call it. qmake simply generates C++ code out of the XML-ui file. Your can call qmake right now it should generate an “ui_MainWindow.h” file and a Makefile which will be called later. Another alternative to generating “ui_MainWindow.h” is to call the command

uic -o ui_MainWindow.h MainWindow.ui

qmake itself calls uic to get the “ui_MainWindow.h”. Now if you take a look at the “ui_MainWindow.h” you’ll see that it contains pure C++ code calling the different Qt classes to draw the GUI. With “class MainWindow : public QMainWindow, private Ui::MainWindow” in MainWindow.h we inherit the Ui::MainWindow class produced by uic and are able to define our methods, attributes an so on… Now it’s time to create our MainWindow.cpp. This file is also pretty simple but important.

#include "MainWindow.h"
MainWindow::MainWindow(QWidget *parent) {
  setupUi(this);
}

By calling setupUi in the constructor, the GUI elements, which were added to the interface with the Designer, are painted the first time. You can comment the setupUi line out and see what’s happening. After all of these steps we’re finally finished… or let’s say nearly finished. If you have followed all these steps carefully you should call

make

to process the Makefile previously created by qmake. Note: If you use Qt/Aqua on MacOS X, the qmake will produce a something.xcodeproj file/directory instead of a Makefile. To build your foo.app you’ll need to call xcodebuild instead of make.

If you get some errors while building your app, you’re on your own. I’m done for now ;-). If you need more information on Qt then take a look at http://doc.trolltech.com/4.4/index.html . But you’re also free to comment or ask to me ;-).

1 Comment