Home / Community / Blog

Atfer standard Redmine instalation I've had (Administration->Information) red cross after

Plugin assets directory writable

according to instruction I've created directory

mkdir /var/www/redmine/public/plugin_assets

and I've set up rights to write to apache user. It helped.

Po prawie roku wróciłem do programowania mojego oscyloskopu. Zacząłem od tego, że Petteri Aimonen wydał nowszą wersję środowiska. Wersje od 0.04 włącznie (a nie jak pisałem wcześniej 0.05) wymagają poprawionego BIOS'a, ale 0.03 i wcześniejsze można zainstalować na fabrycznym.

Instaluje się standardowo - trzeba włączyć oscyloskop wciskając przycisk >|| podłączyć kablem USB a następnie zamontować jako dysk. U mnie wyglądało to tak (polecenia wykonuje jako root)

# mount -t msdos /dev/sdb /mnt/MINIDSO/

główny i jedyny dysk to sda, więc oscyloskop pojawił się jako sdb. Teraz wystarczy skopiować ściągnięty plik (w przykładzie wersja 0.03) skopiować na oscyloskop. Odmontować i zamontować ponownie. Nazwa pliku, a w zasadzie rozszerzenie powinno się zmienić z HEX na RDY. U mnie wyglądało to tak:

# cp /home/jaqb/Pobrane/PAWN_003.HEX /mnt/MINIDSO/
# ls /mnt/MINIDSO/
pawn_003.hex
# umount /mnt/MINIDSO/
# mount -t msdos /dev/sdb /mnt/MINIDSO/
# ls /mnt/MINIDSO/
pawn_003.rdy

Do kompletu potrzebny jest jeszcze kompilator w odpowiedniej do tzw. run-time'a wersji. W moim przypadku była to wersja 0.03.

W związku z przesiadką na nowy telefon (Android) musiałem jakoś przenieść kontakty z wysłużonego już SE W200i. Jako że miałem wykonaną kopię kontaktów za pomocą gammu to przeniesienie sprowadziło się do konwersji kontaktów do formatu vCard (vcf)

gammu convertbackup /tmp/W200i.backup /tmp/W200i.vcf

(oraz przejrzenia - przy okazji usunąłem trochę śmieci) i importu pliku do nowego telefonu.

Tą sama metodą można przenieść kontakty z dowolnego telefonu obsługiwanego przez gammu.

Kiedyś było LOGO, teraz dzieciaki mogą trenować na Scratch. Zamiast żółwiem porusza się kotem, ale w sumie na to samo wychodzi.

Tak jak pisałem ostatnio instalacja tego rozszerzenia jest prosta. Konfiguracja też. Wystarczy skopiować domyślny plik konfiguracyjny:

cd /usr/share/roundcubemail/plugins/managesieve
cp config.inc.php.dist config.inc.php

Zmienić w pliku /usr/share/roundcubemail/plugins/managesieve/config.inc.php port z 2000 na 4190. U mnie wygląda to tak:

$rcmail_config['managesieve_port'] = 4190;

To oczywiście ma związek z plikiem /etc/cyrus.conf w którym mam wpis:

SERVICES {
(...)
  sieve         cmd="timsieved" listen="sieve" prefork=0

jeżeli jest wykomentowany to trzeba włączyć.

Wejście w konfigurację filtrów powoduje założenie domyślnego zbioru filtrów o nazwie managesieve oraz link do niego defaultbc i tym samym rozwiązuje problem wpisów w logu typu

lmtpunix[1000]: IOERROR: fstating sieve script /var/lib/imap/sieve/u/user/defaultbc: No such file or directory

ale tylko dla tego konkretnego użytkownika. Jest to łatwiejsze niż posługiwanie się poleceniem interfejsem znakowym sieveshell.

W poprzednim odcinku pisałem jak zainstalować roundcube z paczki. Teraz opiszę instalację rozszerzeń, tzw. plugin'ów.

Zakładam, że czytający ma przynajmniej podstawową wiedzę z zakresu programowania obiektowego, biegłą znajomość SQL z obsługą triggerów w szczególności oraz potrafi policzyć transkonduktancję czwórnika.

No to do dzieła. Otwieramy w ulubionym edytorze (oczywiście vi) plik /etc/roundcubemail/main.inc.php i poprawiamy linię

$rcmail_config['plugins'] = array();

na np. taką:

$rcmail_config['plugins'] = array('managesieve', 'markasjunk');

właśnie włączyliśmy dwie nowe funkcje: zarządzanie skryptami sieve i przenoszenie wiadomości do katalogu Spam jednym przyciskiem.

W standardowej instalacji RoundCubeMail jest dostarczony z następującymi rozszerzeniami:

acl
additional_message_headers
archive
autologon
database_attachments
debug_logger
emoticons
enigma
example_addressbook
filesystem_attachments
help
hide_blockquote
http_authentication
jqueryui
managesieve
markasjunk
newmail_notifier
new_user_dialog
new_user_identity
password
redundant_attachments
show_additional_headers
squirrelmail_usercopy
subscriptions_option
userinfo
vcard_attachments
virtuser_file
virtuser_query

więcej o nich można przeczytać na specjalnej stronie.

W CentOS z EPEL (u mnie epel-release-6-8) instalacja jest prosta:

yum install roundcubemail

i już.

Teraz trzeba przygotować bazę. Tu nie ma filozofii tak jak każe plik INSTALL. Zmieniłem nazwę bazy i użytkownika: rcm, to skrót od RoundCubeMail:

create database rcm character set utf8;
create user 'rcmuser'@'localhost' identified by 'tajnehaslo';
grant all privileges on rcm.* to 'rcmuser'@'localhost';

Jak widać hasło jest tajne ;-) Teraz trzeba te same nazwy ustawić w pliku:

/etc/roundcubemail/db.inc.php

w linii

$rcmail_config['db_dsnw'] = 'mysql://rcmuser:tajnehaslo@localhost/rcm';

a następnie zainicjować bazę poleceniem

mysql -u rcmuser -p rcm < /usr/share/doc/roundcubemail-0.8.5/SQL/mysql.initial.sql

wystarczy podać hasło i chwilę poczekać.

Dodatkowo w pliku

/etc/httpd/conf.d/roundcubemail.conf

trzeba dodać uprawnienia dla własnego komputera (jeżeli nie instalujemy lokalnie). W oryginale było:

Alias /roundcubemail /usr/share/roundcubemail

<Directory /usr/share/roundcubemail/>
    <IfModule mod_authz_core.c>
        # Apache 2.4
        Require local
    </IfModule>
    <IfModule !mod_authz_core.c>
        # Apache 2.2
        Order Deny,Allow
        Deny from all
        Allow from 127.0.0.1
        Allow from ::1
    </IfModule>
</Directory>

ja zmieniłem na:

Alias /roundcubemail /usr/share/roundcubemail

<Directory /usr/share/roundcubemail/>
    <IfModule mod_authz_core.c>
        # Apache 2.4
        Require local
    </IfModule>
    <IfModule !mod_authz_core.c>
        # Apache 2.2
        Order Deny,Allow
        Deny from all
        Allow from 127.0.0.1
        Allow from 1.2.3.4
        Allow from ::1
    </IfModule>
</Directory>

gdzie 1.2.3.4 to zewnętrzny adres IP z którego konfigurowałem zdalnie serwer.

Teraz już można się zalogować na serwer (gdy IP jest 4.3.2.1):

http://4.3.2.1/roundcubemail/

i używać podając wszystkie dane konta. W teorii za pomocą tak postawionego serwera można sprawdzać pocztę na dowolnym innym.

W przypadku CentOS 6.4 można zamiast wiadomości dostać komunikat: Service Unavailable Error 500, a w pliku logu

tail /var/log/roundcubemail/errors

miałem:

PHP Error: Could not perform encryption; make sure Mcrypt is installed or lib/des.inc is available in /usr/share/roundcubemail/program/include/rcmail.php on line 1474 (POST /roundcubemail/?_task=login&_action=login)

rozwiązaniem jest zamiana w pliku

/etc/php.d/mcrypt.ini

lini

extension=module.so

na

extension=mcrypt.so

i restart serwera.

Ponieważ RoundCubeMail ma aspiracje bycia aplikacją, więc trzeba podać również nazwę serwera. Tutaj zakładam, że serwer powinien być jeden (co najwyżej kilka do wyboru z listy), bo po co obcy ludzie mają mi zapychać łącze.

Podstawową modyfikacją jest ustawienie wartości $rcmail_config['default_host'] na coś sensownego. Ja mam:

$rcmail_config['default_host']='ssl://localhost:993';

oczywiście przy połączeniu lokalnym można nie używać szyfrowania, ale to następnym razem...

Opis instalacji Redmine 2.3 na Cent OS 6.4 - zaktualizowana wersja wcześniejszego opisu.

Podstawy

Redmine do działania wymaga serwera Apache i bazy danych (np. MySQL) oraz najczęściej jest używany wraz z jakimś systemem kontroli wersji, zakładam, że to SVN. Na świeżym systemie trzeba doinstalować pakiety:

yum install httpd mysql-server subversion

Subversion (lub Mercurial) będzie także potrzeby do ściągnięcia źródeł Redmine'a.

Ruby

Wbrew temu co napisali zainstalowałem ruby z paczki (wersja prawie ta sama 1.8.7.358 a 1.8.7.352):

yum install ruby

doinstalowały się zależności: compat-readline5 i ruby-libs.

Następny etap to instalacja rubygems w wersji 1.4.2. W paczce jest 1.3.7, ale dokumentacja ostrzega tylko przed wersją 1.5, no to instaluję

yum install rubygems

doinstalowały się zależności: ruby-irb i ruby-rdoc.

Teraz zaczyna się magia. Instaluję jakieś cuda nie wiadomo gdzie i jak. Łatwiej by było z pakietów, ale przykład nie chce się zainstalować - brakuje libev.

gem install passenger

oczywiście błąd:

mkmf.rb can't find header files for ruby at /usr/lib/ruby/ruby.h

pewnie brakuje ruby-devel, i make , i gcc. Zainstalowałem:

yum install ruby-devel make gcc

teraz już poszło - nie wymagało gcc-c++.

Teraz powinno być

passenger-install-apache2-module

ale kreator grzecznie informuje, że pakiety devel są potrzebne, więc instaluję:

yum install gcc-c++ curl-devel openssl-devel zlib-devel \
                      httpd-devel apr-devel apr-util-devel

instalacja pakietów i instalacja (kompilacja) modułu chwilę trwa. Kreator pokazuje co trzeba dodać do konfiguracji serwera apache (będzie potrzebne później):

LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.19/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.19
PassengerRuby /usr/bin/ruby

i jak podłączyć przykładową aplikację w ruby:

Suppose you have a Rails application in /somewhere. Add a virtual host to your
Apache configuration file and set its DocumentRoot to /somewhere/public:

   <VirtualHost *:80>
      ServerName www.yourhost.com
      # !!! Be sure to point DocumentRoot to 'public'!
      DocumentRoot /somewhere/public    
      <Directory /somewhere/public>
         # This relaxes Apache security settings.
         AllowOverride all
         # MultiViews must be turned off.
         Options -MultiViews
      </Directory>
   </VirtualHost>

And that's it! You may also want to check the Users Guide for security and optimization tips, troubleshooting and other useful information:
/usr/lib/ruby/gems/1.8/gems/passenger-3.0.18/doc/Users guide Apache.html

Instalacja i wstępna konfiguracja

Teraz ściągnąłem jak kazali:

cd /var/www
svn co http://svn.redmine.org/redmine/branches/2.3-stable redmine-2.3
ln -s redmine-2.3 redmine

i zrobiłem link, żeby był w standardowej ścieżce i łatwo było zrobić aktualizację.

Dygresja: Do działania svn z serwerami pośredniczącymi (proxy) trzeba zmienić konfigurację (jest w pliku np.: ~/.subversion/servers). Ustawienie zmiennej http_proxy nic nie da.

Założyłem bazę i użytkownika (tu opis dla MySQL):

create database redmine character set utf8;
create user 'redmine'@'localhost' identified by 'jakieshaslo';
grant all privileges on redmine.* to 'redmine'@'localhost';

Teraz dalej (oczywiście zamiast nano używam mcedit):

cd /var/www/redmine/config
cp database.yml.example database.yml
mcedit database.yml

zmieniłem tylko hasło w części production (i to spowodowało błąd później, najlepiej od razu ustawić też nazwę użytkownika).

Znowu magia:

cd /var/www/redmine
gem install bundler

Zainstalował się bundler-1.3.4. Plik /var/www/redmine/Gemfile już był (automagicznie) więc uruchomiłem:

bundle install

ale zwraca błąd:

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

/usr/bin/ruby extconf.rb
checking for libxml/parser.h... no
-----
libxml2 is missing.  please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

no to zgodnie z sugestią uruchomiłem (potem były jeszcze inne)

yum install libxml2-devel libxslt-devel mysql-devel

chwile to trwało. Teraz wysypał się na:

Installing rmagick (2.13.2)
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

/usr/bin/ruby extconf.rb
checking for Ruby version >= 1.8.5... yes
checking for gcc... yes
checking for Magick-config... no
Can't install RMagick 2.13.2. Can't find Magick-config in /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

no to doinstalowałem oczywiście

yum install ImageMagick-devel

i teraz poszło

Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.

Konfiguracja właściwego Redmine'a

W pliku

/var/www/redmine/config/environment.rb

odkomentowałem linię

ENV['RAILS_ENV'] ||= 'production'

Magia (już się zaczynam przyzwyczajać):.

rake generate_secret_token

i jeszcze raz

RAILS_ENV=production rake db:migrate

tym razem pokazało błąd

rake aborted!
Access denied for user 'root'@'localhost' (using password: YES)

(See full trace by running task with --trace)

jak się okazało to błąd połączenia do bazy MySQL, poprawiłem nazwę użytkownika w pliku

config/database.yml

, bo przecież wcześniej zmieniłem tylko hasło ;-).

Pominąłem ładowanie domyślnych danych, bo było opcjonalne, ale i tak je załadowałem przy pierwszym zalogowaniu się. Można uruchomić:

RAILS_ENV=production rake redmine:load_default_data

Konfiguracja Apache.

Pozamieniałem nazwy skryptów CGI jak kazali:

cd /var/www/redmine/public
cp dispatch.fcgi.example dispatch.fcgi

nadal nic nie działa.

Teraz wg. HowTo configure Apache to run Redmine. Najpierw włączyłem obsługę wielu domen dopisując

NameVirtualHost *:80

w pliku /etc/httpd/conf/httpd.conf. Utworzyłem plik /etc/httpd/conf.d/redmine.conf z zawartością (na podstawie wzoru podanego przez instalator wcześniej):

LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.19/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.19
PassengerRuby /usr/bin/ruby

<VirtualHost *:80>
    ServerName redmine.mojadomena.pl
    ServerAdmin ja@mojadomena.pl
    DocumentRoot /var/www/redmine/public/
    ErrorLog logs/redmine_error_log
   RailsEnv production

  <Directory /var/www/redmine/public/>
        Options Indexes ExecCGI FollowSymLinks
        Order allow,deny
        Allow from all
        AllowOverride all
    </Directory>
</VirtualHost>

zmieniłem uprawnienia do plików

cd /var/www
chown -R apache:apache redmine-2.3

jak widać zmieniam na katalogu gdzie są pliki, a nie na linku symbolicznym.

ale zamiast aplikacji wyświetlała mi się zawartość katalogu. Wskazówkę znalazłem w logach apache'a:

[error] *** Passenger could not be initialized because of this error: Unable to start the Phusion Passenger watchdog (/usr/lib/ruby/gems/1.8/gems/passenger-3.0.19/agents/PassengerWatchdog): Permission denied (13)

oraz /var/log/audit/audit.log:

type=SYSCALL msg=audit(1364567881.023:309): arch=c000003e syscall=0 success=no exit=-13 a0=b a1=7fbc8a040000 a2=400 a3=22 items=0 ppid=1 pid=14356 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4 comm="PassengerHelper" exe="/usr/lib/ruby/gems/1.8/gems/passenger-3.0.19/agents/apache2/PassengerHelperAgent" subj=unconfined_u:system_r:httpd_t:s0 key=(null)

zamiast wyłączyć SELinux lepiej go skonfigurować:

setenforce Permissive
chcon -t httpd_t /usr/lib/ruby/gems/1.8/gems/passenger-3.0.19/agents/apache2/PassengerHelperAgent
chcon -t httpd_t /usr/lib/ruby/gems/1.8/gems/passenger-3.0.19/agents/PassengerWatchdog
setenforce Enforcing

Nadal nie chce działać - zamiast aplikacji wyświetlała mi się zawartość katalogu. Wskazówkę znalazłem w logach apache'a:

ERROR: Cannot create directory '/var/log/passenger-analytics': Permission denied (13)

rozwiązanie było proste:

mkdir /var/log/passenger-analytics

W końcu działa!

Zamiast puenty

Sprawdziłem magiczne instalatory:

which gem
yum provides /usr/bin/gem

plik gem jest w pakiecie rubygems (rubygems-1.3.7-1.el6.noarch) i instaluje pakiety w

/usr/lib/ruby/gems/1.8/gems

teraz już nie jest tak magicznie.

Po sieci krążą obrazy płyt (tym razem Lego Mindstorms Robotics Invention System 2.0) w różnych dziwnych formatach (BIN, MDF, PDI, CDI, NRG itp.). Na szczęście istnieje narzędzie iat (Iso9660 Analyzer Tool​) które potrafi je konwertować do ISO. W moim przypadku wystarczyło polecenie:

iat -i RIS2.mdf --iso -o RIS2.iso

Przetestowałem zabezpieczenie przed przypadkowy zrobieniem commit'a do repozytorium bez podania numeru zgłoszenia (ticket). Zrobiłem to za pomocą hook'a pre-commit. Wszystkie polecenia podaję względem katalogu repozytorium, u mnie jest to /var/lib/svn/test. Skopiowałem szablon skryptu (parametr -p jest ważny, bo inaczej można popsuć uprawnienia)

cp -p hooks/pre-commit.tpl hooks/pre-commit
chmod u+x hooks/pre-commit

i wykomentowałem linię:

commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1

na koniec po innych testach, tuż przed linią

exit 0

dopisałem taki kawałek kodu

blad=0
$SVNLOOK log -t "$TXN" "$REPOS" \
| grep "#[1-9][0-9]*" > /dev/null || blad=1
if [ $blad -eq 1 ] ; then
    echo -e "Dodaj numer ticket'a,\nnp.: Zgloszenie #123" 1>&2
    exit 2
fi

który sprawdza czy w treści komentarza zawiera #N (gdzie N to dowolna liczba naturalna większa od 0) i zwraca komunikat błędu - użytkownik zobaczy to co wysyłane jest na wyjście błędu. Właściwy test to:

grep "#[1-9][0-9]*"

Dla Trac'a to wystarczy. Można go rozbudować, np. o sprawdzenie czy zawiera refs #N (N to znowu ciąg cyfr) - tak, żeby w Redmine ładnie pokazywał. Wtedy warunek będzie wyglądał tak (ja używam tylko refs):

grep "refs #[1-9][0-9]*"

Oczywiście można jeszcze dodać sprawdzanie pozostałych Referencing keywords oraz Fixing keywords.

Wypadało by też zmienić wyświetlany komunikat na np. Podaj numer zgłoszenia poprzedzony słowem refs, np:\nrefs #123, ale by wstawić tam znak końca wiersza (\n) trzeba dodać parametr -e do polecenia echo. Razem wygląda tak:

echo -e "Podaj numer zgłoszenia poprzedzony słowem refs, \
np:\nrefs #123" 1>&2

Mechanizm uchwytów (hook) do zdarzeń można wykorzystać dowolnie, także do bardziej zaawansowanych testów: np. by zabezpieczyć przed commit'em kodu który się nie da skompilować (chociaż ja bym tego nie robił) lub automatycznego budowania po commit'cie za pomocą post-commit (tego też bym nie robił).

Just my blog...

Mon Tue Wed Thu Fri Sat Sun
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30