Switching to the system Perl using perlbrew - perl

First, some background.
perlbrew is a tool to assist with the installation of Perl into a non-standard directory (usually under your home directory).
It also helps you control which Perl installation is used when executing perl in an interactive shell. Switching between installations is done using perlbrew use and perlbrew switch. perlbrew use only affects the current shell, while perlbrew switch is more permanent.
$ perl -V:version | $ perl -V:version
version='5.20.0'; | version='5.20.0';
|
$ perlbrew use 5.18.2t | $ perlbrew switch 5.18.2t
|
$ perl -V:version | $ perl -V:version
version='5.18.2'; | version='5.18.2';
|
$ bash -ic 'perl -V:version' | $ bash -ic 'perl -V:version'
version='5.20.0'; | version='5.18.2';
perlbrew off is used to revert to using the system Perl, but it's temporary like perlbrew use. Is there a way to revert to the system Perl with the permanency of perlbrew switch?

To have perlbrew manage an installation of perl that wasn't installed by perlbrew, pick a name ("system" in my example) and create a link to its bin directory as follows:
cd "${PERLBREW_ROOT:-$HOME/perl5/perlbrew}"
mkdir perls/system
ln -s /usr/bin perls/system/bin
It will now appear in perlbrew list
$ perlbrew list
...
system (5.10.1)
5.18.2t
* 5.20.0t
...
And you'll be able to use perlbrew use and perlbrew switch.
$ perl -V:version
version='5.20.0';
$ perlbrew switch system
$ perl -V:version
version='5.10.1';
$ bash -ic 'perl -V:version'
version='5.10.1';
This works best with installations that have the same installbin, installvendorbin (if applicable) and installsitebin directories, as returned by
perl -V:'install.*bin'
By the way, a similar approach can be used to create aliases for perlbrew installs. For example,
ln -s 5.26.1 perls/5.26 # Point to the latest release of a version.
ln -s 5.26.1 perls/project_name # Point to the install used by a project.

You can use the following command
perlbrew switch-off

Related

Perl not recognizing module / module path for root user

I am new to Perl so please bear with me. Thank you for your assistance.
I have an Ubuntu machine with Perl on it. I followed the local::lib bootstrapping guide
I used cpanm to install DBI and other modules to my system. I am concerned there may be other DBI modules available on my system which could be part of the problem. This is the result of find / -name 'DBI.pm' 2>/dev/null:
/home/ubuntu/.cpanm/work/16125643.6178/DBI-1.643/blib/lib/DBI.pm
/home/ubuntu/.cpanm/work/16125643.6178/DBI-1.643/blib/lib/Bundle/DBI.pm
/home/ubuntu/.cpanm/work/16125643.6178/DBI-1.643/DBI.pm
/home/ubuntu/.cpanm/work/16125643.6178/DBI-1.643/lib/Bundle/DBI.pm
/home/ubuntu/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/DBI.pm
/home/ubuntu/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/Bundle/DBI.pm
I added 2 lines to my .bashrc file. (I added the second line because I broke things for the non-root user and this fixed it; maybe I broke something with local::lib?)
eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"
PERL5LIB="/home/ubuntu/perl5/lib/perl5"
I can run my perl script as a non-root user.
If I run with sudo perlScript.pl I get this error: Can't locate DBI.pm in #INC (you may need to install the DBI module)
I have been troubleshooting #INC for a while now and cannot figure out how to adjust it for the root user. I have tried various things including adding PERL5LIB to .profile and calling my script like so: sudo sh -c '. ~/.profile; perl ~/perlScripts/perlScript.pl "argForScript"' (I verified that PERL5LIB is being set with sudo sh -c '. ~/.profile; echo $PERL5LIB')
However I always get the #INC error. The most obvious thing I have noticed is comparing sudo perl -V and perl -V. The sudo call does not show any ENV vars and the #INC does not include the desired PERL5LIB location. The non-sudo call does show the desired ENV and #INC vars.
I am considering wiping things and doing a fresh install with root privileges for local::lib and cpan. Not really sure what else to try at this point.
These are the commands that ended up working for me. I corrupted my first environment with local::lib / non-sudo cpan install, so I setup a fresh VM.
sudo apt install make
sudo apt install build-essential
sudo apt install libmysqlclient-dev
sudo cpan App::cpanminus
cpanm --sudo DBI
cpanm --sudo Array::Utils
cpanm --sudo DBD::mysql

How can I install Net::SSLeay with perlbrew in macOS Catalina?

I am trying to install Net::SSLeay perl package on Mac OSX Catalina using perlbrew cpanm and failing due to openssl related issues.
I tried all of the bellow solutions to no avail:
cmake - osx/mac - openssl brew
https://gist.github.com/andyjack/7dd4d7b65d262b2a6e56
https://medium.com/#deepak.gulati/installing-net-ssleay-on-os-x-el-capitan-446c40cffeba
https://phillipadsmith.com/2016/03/Installing-Net-SSLeay-on-OS-X-El-Capitan.html
https://apple.stackexchange.com/questions/240589/crypt-ssleay-on-a-macbook
https://macosx.com/threads/howto-installing-openssl-and-the-ssl-perl-module-net-ssleay-pm.12075/
I have open ssl latest and added the suggested exports to my .zshrc
I added these to .zshrc:
# Warning: Refusing to link macOS-provided software: openssl#1.1
# If you need to have openssl#1.1 first in your PATH run:
export PATH="/usr/local/opt/openssl#1.1/bin:$PATH"
# For compilers to find openssl#1.1 you may need to set:
export LDFLAGS="-L/usr/local/opt/openssl#1.1/lib"
export CPPFLAGS="-I/usr/local/opt/openssl#1.1/include"
# For pkg-config to find openssl#1.1 you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/openssl#1.1/lib/pkgconfig"
the basic failure is:
cpanm (App::cpanminus) 1.7044 on perl 5.030001 built for darwin-2level
Work directory is /Users/<me>
/.cpanm/work/1583739797.88350
You have make /usr/bin/make
You have LWP 6.43
You have /usr/bin/tar: bsdtar 3.3.2 - libarchive 3.3.2 zlib/1.2.11 liblzma/5.0.5 bz2lib/1.0.6
You have /usr/bin/unzip
Searching Net::SSLeay () on cpanmetadb ...
--> Working on Net::SSLeay
Fetching http://www.cpan.org/authors/id/C/CH/CHRISN/Net-SSLeay-1.88.tar.gz
-> OK
Unpacking Net-SSLeay-1.88.tar.gz
Entering Net-SSLeay-1.88
Checking configure dependencies from META.json
Checking if you have ExtUtils::MakeMaker 6.58 ... Yes (7.34)
Configuring Net-SSLeay-1.88
Running Makefile.PL
Do you want to run external tests?
These tests *will* *fail* if you do not have network connectivity. [n] n
*** Found LibreSSL-2.8.3 installed in /usr
*** Be sure to use the same compiler and options to compile your OpenSSL, perl,
and Net::SSLeay. Mixing and matching compilers is not supported.
Checking if your kit is complete...
Looks good
Generating a Unix-style Makefile
Writing Makefile for Net::SSLeay
Writing MYMETA.yml and MYMETA.json
-> OK
Checking dependencies from MYMETA.json ...
Checking if you have Test::More 0.60_01 ... Yes (1.302162)
Checking if you have ExtUtils::MakeMaker 0 ... Yes (7.34)
Checking if you have MIME::Base64 0 ... Yes (3.15)
Building and testing Net-SSLeay-1.88
cp lib/Net/SSLeay.pm blib/lib/Net/SSLeay.pm
AutoSplitting blib/lib/Net/SSLeay.pm (blib/lib/auto/Net/SSLeay)
blib/lib/Net/SSLeay.pm: some names are not unique when truncated to 8 characters:
directory blib/lib/auto/Net/SSLeay:
do_https3.al, do_https2.al, do_https4.al, do_https.al truncate to do_https
do_httpx3.al, do_httpx2.al, do_httpx4.al truncate to do_httpx
get_https.al, get_https3.al, get_https4.al, get_http.al, get_http3.al, get_http4.al, get_httpx.al, get_httpx3.al, get_httpx4.al truncate to get_http
head_https.al, head_https3.al, head_https4.al, head_http.al, head_http3.al, head_http4.al, head_httpx.al, head_httpx3.al, head_httpx4.al truncate to head_htt
post_https.al, post_https3.al, post_https4.al, post_http.al, post_http3.al, post_http4.al, post_httpx.al, post_httpx3.al, post_httpx4.al truncate to post_htt
put_https.al, put_https3.al, put_https4.al, put_http.al, put_http3.al, put_http4.al, put_httpx.al, put_httpx3.al, put_httpx4.al truncate to put_http
ssl_read_all.al, ssl_read_until.al, ssl_read_CRLF.al truncate to ssl_read
ssl_write_all.al, ssl_write_CRLF.al truncate to ssl_writ
tcp_read_all.al, tcp_read_until.al, tcp_read_CRLF.al truncate to tcp_read
tcp_write_all.al, tcp_write_CRLF.al truncate to tcp_writ
cp lib/Net/SSLeay/Handle.pm blib/lib/Net/SSLeay/Handle.pm
cp lib/Net/SSLeay.pod blib/lib/Net/SSLeay.pod
Running Mkbootstrap for SSLeay ()
chmod 644 "SSLeay.bs"
"/Users/<me>
/perl5/perlbrew/perls/perl-5.30.1/bin/perl" -MExtUtils::Command::MM -e 'cp_nonempty' -- SSLeay.bs blib/arch/auto/Net/SSLeay/SSLeay.bs 644
"/Users/<me>
/perl5/perlbrew/perls/perl-5.30.1/bin/perl" "/Users/<me>
/perl5/perlbrew/perls/perl-5.30.1/lib/5.30.1/ExtUtils/xsubpp" -typemap '/Users/<me>
/perl5/perlbrew/perls/perl-5.30.1/lib/5.30.1/ExtUtils/typemap' -typemap '/Users/<me>
/.cpanm/work/1583739797.88350/Net-SSLeay-1.88/typemap' SSLeay.xs > SSLeay.xsc
mv SSLeay.xsc SSLeay.c
cc -c -fno-common -DPERL_DARWIN -mmacosx-version-min=10.15 -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -DPERL_USE_SAFE_PUTENV -O3 -DVERSION=\"1.88\" -DXS_VERSION=\"1.88\" "-I/Users/<me>
/perl5/perlbrew/perls/perl-5.30.1/lib/5.30.1/darwin-2level/CORE" SSLeay.c
SSLeay.xs:163:10: fatal error: 'openssl/err.h' file not found
#include <openssl/err.h>
^~~~~~~~~~~~~~~
1 error generated.
make: *** [SSLeay.o] Error 1
-> FAIL Installing Net::SSLeay failed. See /Users/<me>
/.cpanm/work/1583739797.88350/build.log for details. Retry with --force to force install it.
Finally after much fiddling I found this post:
OSX Catalina work around
I uninstalled latest perlversion:
perlbrew uninstall perl-5.30.1
Then I ran this script
#!/usr/bin/env bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
echo "$0 is running from: $DIR"
# make this file's location working dir
cd "$(dirname "$0")"
v='perl-5.30.1'
perl_versions=$(perlbrew list)
echo "perl_versions $perl_versions"
if [[ "$perl_versions" == *"$v"* ]]; then
echo "$v is installed in perlbrew."
else
echo "$v is not!!! installed in perlbrew. installing ...."
perlbrew install perl-5.30.1 --notest --force
fi
current_perl_version=$(which perl)
echo "current_perl_version: $current_perl_version"
if [[ "$current_perl_version" == *"$v"* ]]; then
echo "$v is current version."
else
echo "$v is not current version."
perlbrew switch $v
fi
cpanm install --force Test::Block
cpanm install Try::Tiny
cpanm install YAML
cpanm install YAML::XS
cpanm install JSON
cpanm install JSON::MaybeXS
cpanm install HTTP::Request
cpanm install HTTP::Response
cpanm install HTTP::Daemon
cpanm install GD::Simple
cpanm install GD::Graph
cpanm install Data::HexDump::Range
cpanm install Proc::Daemon
cpanm install Test::Block
cpanm install Text::Colorizer
cpanm install Gzip::Faster
cpanm install IO::Socket::INET6
#export PATH="/usr/local/opt/openssl#1.1/bin:$PATH"
#export LDFLAGS="-L/usr/local/opt/openssl#1.1/lib"
#export CPPFLAGS="-I/usr/local/opt/openssl#1.1/include"
cpanm install DBI
#cpanm install Net::SSLeay
OPENSSL_PREFIX=/usr/local/opt/openssl#1.1 cpanm --interactive --verbose --force Net::SSLeay
cpanm install --force Cassandra::Client
cpanm install DBD::Cassandra
#cpanm install https://cpan.metacpan.org/authors/id/T/TV/TVDW/Cassandra-Client-0.16.tar.gz
cpanm install Proc::ProcessTable
cpanm install Kafka::Connection
During the Net::SSLeay installation I was prompted for manual confirmation for tests dependant on network connectivity and answered y. If anyone knows auto-approve in perlbrew please post a comment, A quick scower of perlbrew -h wasn't informative as to auto approve options at first glance.
I tried this on macOS Catalina (note my shell is bash and not the default zsh):
brew install openssl
\curl -L https://install.perlbrew.pl | bash
After perlbrew is installed, edit ~/.bash_profile :
source ~/perl5/perlbrew/etc/bashrc
export PATH="/usr/local/opt/openssl#1.1/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/openssl#1.1/lib"
export CPPFLAGS="-I/usr/local/opt/openssl#1.1/include"
Then save, and execute
$ source ~/.bash_profile
$ perlbrew install-cpanm
$ perlbrew install perl-5.30.1 --notest
$ perlbrew switch perl-5.30.1
$ cpanm Net::SSLeay
--> Working on Net::SSLeay
Fetching http://www.cpan.org/authors/id/C/CH/CHRISN/Net-SSLeay-1.88.tar.gz ... OK
Configuring Net-SSLeay-1.88 ... OK
Building and testing Net-SSLeay-1.88 ... OK
Successfully installed Net-SSLeay-1.88
1 distribution installed
So my guess would be that the issue is related to zsh, since I used bash and you used zsh.

Which yum group(s) contain a given package?

Is there a way to ask yum which group(s) contain a given package? I know how to ask what packages are in a given group, and could write a quick script to trawl over all of the groups, but it would be nice to have a simpler mechanism than that.
If you are only looking for a 'simpler mechanism' to be used by a human and don't need it in some kind of script or so, you might get by with this one:
yum groupinfo '*' | less +/sendmail-cf
Of course, replace sendmail-cf with the package name you're interested in.
You can find a group to which the specified package belongs, by using yum-list-data plugin.
$ sudo yum -y install yum-plugin-list-data
$ yum -C list-groups ftp
Loaded plugins: fastestmirror, list-data
==================== Available Packages ====================
Console internet tools 1 (100%)
list-groups done
Or, if you are not allowed to install the plugin, please save the following script and try to run it with one argument, the name of the package you try to find:
#!/bin/sh
search_name=$1
LANG=C yum grouplist -v | grep "^ " | awk -F'(' '{print $1}' | sed -e 's/^ *//' | while read line
do
if [ "${search_name}" != "" ]; then
yum groupinfo "${line}" | grep -q "^ *${search_name}$"
if [ $? -eq 0 ]; then
echo ${line}
break
fi
fi
done
I don't know about yum, but remember that it sits on top of rpm. The rpm command you're looking for is:
rpm -q --qf %{group} yourRPM
You might want to add a \n at the end, depending on that you are up to:
[root#Niflheim ~]# rpm -q --qf %{group} setarch
System Environment/Kernel[root#Niflheim ~]# rpm -q --qf "%{group}\n" setarch
System Environment/Kernel
[root#Niflheim ~]#

Need help installing Spreadsheet::ParseExcel

I am trying to install Spreadsheet::ParseExcel to use with ExcelLatex. This is what I did:
Installed Active perl, Then install CPAN.pm by perl -MCPAN -e shell
I was asked for configuration and mirror site and I let perl do the auoconfoguration. At the end I got the following message: Autoconfiguration complete.Then I tried:
perl -MCPAN -e 'install "Spreadsheet::WriteExcel"'
And it tried to install it but at the end I got the following error:
ERROR: Can't create '/Library/Perl/5.12/Spreadsheet'
mkdir /Library/Perl/5.12/Spreadsheet: Permission denied at /System/Library/Perl/5.12/ExtUtils/Install.pm line 494
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
at -e line 1
make: *** [pure_site_install] Error 13
JMCNAMARA/Spreadsheet-WriteExcel-2.37.tar.gz
/usr/bin/make install -- NOT OK
I really appreciate it one please help me how I can solve the problem
It is trying to create a directory in the root (mkdir /Library/Perl/5.12/Spreadsheet)
You have to be root to be able to do that.
You may could use PerlBrew or local::lib to install your perl libs into your home dir.
# Install Spreadsheet::WriteExcel and its missing dependencies to the '~/perl5' directory
perl -MCPAN -Mlocal::lib -e 'CPAN::install(Spreadsheet::WriteExcel)'
# Just print out useful shell commands
$ perl -Mlocal::lib
export PERL_MB_OPT='--install_base /home/username/perl5'
export PERL_MM_OPT='INSTALL_BASE=/home/username/perl5'
export PERL5LIB='/home/username/perl5/lib/perl5/i386-linux:/home/username/perl5/lib/perl5'
export PATH="/home/username/perl5/bin:$PATH"
#create a environment setting script and execute it.
perl -Mlocal::lib > ~/.setenv && . ~/.setenv
Regards,

Package manager command that returns 0 or 1 in Ubuntu/Debian if a package is installed or not

I'm writing a package installer script in Perl. I need a command (probably OS command) that returns a simple 0 or 1 to the caller script if a Ubuntu/Debian package is installed or not.
I've tried
dpkg -s
It always returns 0.
dpkg -L
almost works but if the user does not
apt-get --purge remove
the packages, some files are left and always returns 0
I don't want to grep text - a simple true or false is what I need.
Any ideas?
#Andy:
aptitude remove unixodbc -y
dpkg-query -W unixodbc; echo $?
unixodbc 2.2.11-21
0
aptitude install unixodbc -y
dpkg-query -W unixodbc; echo $?
unixodbc 2.2.11-21
0
Maybe not ideal, but this works:
dpkg -s "$package" | grep '^Status:' | grep -q ' installed'
Or just
dpkg -s "$package" | grep -q '^Status:.* installed'
I think this does it:
test -n "`aptitude search '?name(^packagename$)~i'`"
Won't work on virtual packages.
If you're going to use the dpkg database, I concur with the "use grep" suggestions. Weighing the possibility that the output format of the package tools changes against the complexity of the alternative solutions, it's probably better to use grep.
That said, here are some possibilities:
use dpkg --get-selections. The exit status is always zero, but the output is very simple: <package><white space><status>. This is the "requested state" (install/hold/deinstall/purge), which can differ from the actual package state, but usually won't.
use one of the utilities in the dctrl-tools or dpkg-awk packages
implement a test that directly determines whether the dependency is present, e.g., use pkg-config, or search for a program in PATH. This has the advantage that it will allow the install to continue on systems where the dependency has been built by hand and installed without the knowledge of the package manager. This also makes your install script more portable.
you may want to look in to PackageKit