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ł).
Add comment