Monday, December 6, 2010

Java: run command as root by Runtime.getRuntime().exec() in Ubuntu

Hey :)

a few days ago I needed to run `/etc/init.d/networking restart` command by Runtime.getRuntime().exec() in Java EE web application. The first and easiest way that came to mind was sudo without password and... It Worked!
* To execute sudo without password, open /etc/sudoers by text editor like `nano`:
[bash]
$ sudo nano /etc/sudoers
[/bash]
And add your user or group to the end of file like below:
[shell]
# for user
USER_NAME ALL= NOPASSWD: ALL

# for group
%GROUP_NAME ALL= NOPASSWD: ALL
[/shell]

let's see my Java code:
[java]
String command = "sudo /etc/init.d/networking restart";
Runtime runtime = Runtime.getRuntime();
try {
Process process = runtime.exec(command);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
[/java]

Troubleshooting
if you get `sudo: no tty present and no askpass program specified` error, make sure the user that runs command is in /etc/sudoers.

let me know if you find similar or easier way :)

Tuesday, November 2, 2010

/etc/network/interfaces configuration for 802.1x authentication

Hey :)

I have a problem with adjust Network Manager for 802.x1 Tunneled TLS (TTLS) and MD5 in Ubuntu. MD5 does not exist in `Inner Authentication` when I choose TTLS.
I was forced to enter the settings to interfaces file (/etc/network/interfaces). Interfaces file content is shown below:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address xx.xx.xx.xx
netmask xx.xx.xx.xx
gateway xx.xx.xx.xx
wpa-driver wired
wpa-eap TTLS MD5
wpa-key-mgmt IEEE8021X
wpa-anonymous-identity USER_NAME
wpa-identity USER_NAME
wpa-password PASSWORD
wpa-phase1 auth=MD5
wpa-phase2 auth=PAP password=PASSWORD


Also you can use Open1X (XSupplicant).

Links
IEEE 802.1X
Network 802.1x Authentication
Open1X (XSupplicant)

Have a good time ;)

Thursday, September 23, 2010

TV show "SefroYek": "Open Source operating systems"

Hey,

A few days ago, I was invited to "SefroYek" a technical TV show that discusses with experts. That was second session and I've been there to talk about “Open Source operation systems”. I opened the discussion with GNU/Linux. Next, I answered the questions. There were many questions about equivalent windows softwares in GNU/Linux. I uploaded the first part. It’s in Persian language.


I've wrote more information about this TV show in my Persian blog.

Have a good time ;)

Monday, July 5, 2010

Fetch full posts content of FeedWordPress feeds

Hi :)

I use WordPress and FeedWordPress plugin to create a planet. It's great plugin. Some bloggers don't show full post content on their feeds. If you like to get the full content of posts, you can contact to blogger and ask his/her to enable full content on the feed or continue to read this article.
I create functions to get full content of posts.

Requirement

  • PHP with cURL support (Client URL Library)

  • Permissions to modify theme files

  • Text editor

  • basic php programming skills


Step 1 - Where is post content?
It's easy. just open the web page and see the page source.
For example, open http://zebardast.ir/en/linux-and-unix-bash-shell-aliases/ (Single post with full content) and see the page source.
On the page source you can see the content which is started by below code:
<div  class="postBody">

and ended by :
			</div> 

<div class="postFooter">

* It's not ended only by </div> because there is some divs on post content. So I add some html code after </div> which is unique.

Step 2 - Add started and ended code to `Custom Feed Settings`
Open the wordpress administration panel and go to the `Feed and Update Settings` page. Select the feed from drop down menu (Here `Saeid Zebardast's Blog`).
Add started and ended code to `Custom Feed Settings`:


Step 3 - Fetch full content from source and update post on wordpress
Open functions.php in text editor and add the below codes to the end of it:

<?php
function validLink($link) {
if(preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $link)) {
return true;
} else {
return false;
}
}


/**
* Get a web file (HTML, XHTML, XML, image, etc.) from a URL. Return an
* array containing the HTTP server response header fields and content.
*/
function get_web_page( $url )
{
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => false, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => "ayy.ir spider", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
);

$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );

$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
return $header;
}


function before ($this, $inthat)
{
return substr($inthat, 0, strpos($inthat, $this));
};

function after ($this, $inthat)
{
if (!is_bool(strpos($inthat, $this)))
return substr($inthat, strpos($inthat,$this)+strlen($this));
};

function multi_between($this, $that, $inthat)
{
$counter = 0;
while ($inthat)
{
$counter++;
$elements[$counter] = before($that, $inthat);
$elements[$counter] = after($this, $elements[$counter]);
$inthat = after($that, $inthat);
}
return $elements;
}

function strbet($inputStr, $delimeterLeft, $delimeterRight, $debug=false) {
$posLeft=strpos($inputStr, $delimeterLeft);

if ( $debug ) {
echo $posLeft;
}

if ( $posLeft===false ) {
if ( $debug ) {
echo "Warning: left delimiter '{$delimeterLeft}' not found";
}
return false;
}
$posLeft+=strlen($delimeterLeft);
$posRight=strpos($inputStr, $delimeterRight, $posLeft);
if ( $posRight===false ) {
if ( $debug ) {
echo "Warning: right delimiter '{$delimeterRight}' not found";
}
return false;
}


if ( $debug ) {
echo $posLeft;
echo $posRight;
}

return substr($inputStr, $posLeft, $posRight-$posLeft);
}

?>

Close functions.php and open single.php in text editor. Add the below codes after `<?php if (have_posts()) : while (have_posts()) : the_post(); ?>`:

<?php
$my_content = get_the_content();
if (is_syndicated()) :

$syndication_permalink = get_post_meta(get_the_ID(),"syndication_permalink", true);
$syndication_source = get_post_meta(get_the_ID(),"syndication_source", true);
$syndication_source_uri = get_post_meta(get_the_ID(),"syndication_source_uri", true);

if (!validLink($syndication_permalink) && validLink($syndication_source_uri)) {
$syndication_permalink = $syndication_source_uri . "/" . $syndication_permalink;
}

$post_updated = get_post_meta(get_the_ID(),"post_updated", true);
if (empty($post_updated) || $post_updated == false) {

$start_content = get_feed_meta('start_content');
$end_content = get_feed_meta('end_content');

if (!empty ($start_content) && !empty($end_content)) {
$result = get_web_page($syndication_permalink);
$my_page = $result['content'];

if (!empty($my_page)) {
$valid_texts = array();
$valid_texts = strbet($my_page, $start_content, $end_content);
if (is_array($valid_texts)) {
$valid_texts = $valid_texts[0];
}

if (!empty($valid_texts)) {
$my_post = array();
$my_post['ID'] = get_the_ID();
$my_post['post_content'] = $valid_texts;
$my_content = $valid_texts;
wp_update_post($my_post);
update_post_meta(get_the_ID(), 'post_updated', true);
}
}
}
}

endif; //is_syndicated()
?>

After it, replace `the_content()` with:
 echo $my_content; 

Close text editor and Upload functions.php and single.php to your theme folder. Now go to the single post and see the full content.
Just try it!

See also
How do I get FeedWordPress to include the full content of posts, instead of just a short summary or excerpt of the text?

External links
WordPress
FeedWordPress (Homepage)
FeedWordPress (WordPress plugin directory)
Client URL Library

Good luck :)

Monday, May 3, 2010

Installing Sun JDK 5 on Ubuntu 9.10 and 10.04

Hello :)

As you known, Sun JDK version 1.5 or 5 is deleted from Ubuntu 10.4 and 9.10 repositories and the version 6 has been replaced.

The easiest way to install Sun JDK 5 version is add its repository from Ubuntu 9.04 to the list of repositories in 9.10 and 10.04. For this purpose, follow the steps.

1- Open /etc/apt/sources.list with a text editor like gedit:
sudo gedit /etc/apt/sources.list

2- Add the following lines to the end of the file then save it and close:
  ## For sun-java5-jdk
deb http://ir.archive.ubuntu.com/ubuntu jaunty-updates main multiverse

3- Update the packages lists and install sun-java5-jdk:
 sudo aptitude update
sudo aptitude install sun-java5-jdk

* Above method can be used for other applications.

Another way to install jdk 5 is download software package and its dependencies from packages.ubuntu.com.

Good luck

Monday, March 1, 2010

How to find hardware information from command line on Linux

linux

Hi

In this post you can see some useful command to find and show hardware information on Linux.

Default commands


ALL devices


dmesg

dmesg will show you the kernel messages which can show you all the devices the kernel has found (hard disks,cdroms,etc)

CPU


# cat /proc/cpuinfo


Memory


# cat /proc/meminfo
$ free


PCI (including usb bridges,agp cards etc)


$ lspci


USB devices (mice,etc)


$ lsusb


Hard drives


# fdisk -l
$ df -h



Additional Command


lshw


lshw is a Linux command which provides details of all the hardware in your PC. The details provided by the lshw command run the gamut of processors, memory, slots, onboard sound, video chipset and more.
Install lshw

Arch:
# pacman -S lshw

Debain, Ubuntu or any of its derivatives:
$ sudo aptitude install lshw

Redhat, fedora, CentOS:
# yum install lshw

Gentoo:
# emerge lshw


Run lshw

# lshw
# lshw -short

To get the output in HTML, you use the -html option as follows:
# lshw -html > hardware-info.html

• See lshw command – List hardware information in Linux

dmidecode


dmidecode command reads the system DMI table to display hardware and BIOS information of the server. Apart from getting current configuration of the system, you can also get information about maximum supported configuration of the system using dmidecode. For example, dmidecode gives both the current RAM on the system and the maximum RAM supported by the system.
dmidecode is installed by default on many linux distribution like debain, ubuntu and fedora.
• See How To Get Hardware Information On Linux Using dmidecode Command

have a good time :)