Pokazywanie postów oznaczonych etykietą postgresql. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą postgresql. Pokaż wszystkie posty

2018-04-04

How to examine PostgreSQL server's SSL certificate?

Save script info file postgres_get_server_cert.py
#!/usr/bin/env python

import argparse
import socket
import ssl
import struct
import subprocess
import sys
import urlparse


def main():
    args = get_args()
    target = get_target_address_from_args(args)
    sock = socket.create_connection(target)
    try:
        certificate_as_pem = get_certificate_from_socket(sock)
        print certificate_as_pem
    except Exception as exc:
        sys.stderr.write('Something failed while fetching certificate: %s' %
            exc.message)
        sys.exit(1)
    finally:
        sock.close()


def get_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('database', help='Either an IP address, hostname or'
        ' URL with host and port')
    return parser.parse_args()


def get_target_address_from_args(args):
    specified_target = args.database
    if '//' not in specified_target:
        specified_target = '//' + specified_target
    parsed = urlparse.urlparse(specified_target)
    return (parsed.hostname, parsed.port or 5432)


def get_certificate_from_socket(sock):
    request_ssl(sock)
    ssl_context = get_ssl_context()
    sock = ssl_context.wrap_socket(sock)
    sock.do_handshake()
    certificate_as_der = sock.getpeercert(binary_form=True)
    certificate_as_pem = encode_der_as_pem(certificate_as_der)
    return certificate_as_pem


def request_ssl(sock):
    # 1234.5679 is the magic protocol version used to request TLS, defined
    # in pgcomm.h)
    version_ssl = postgres_protocol_version_to_binary(1234, 5679)

    packet = '%(length)s%(version)s' % {
        'length': struct.pack('!I', 8),
        'version': version_ssl,
    }
    sock.sendall(packet)
    data = read_n_bytes_from_socket(sock, 1)
    if data != 'S':
        raise Exception('Backend does not support TLS')


def get_ssl_context():
    # Return the strongest SSL context available locally
    for proto in ('PROTOCOL_TLSv1_2', 'PROTOCOL_TLSv1', 'PROTOCOL_SSLv23'):
        protocol = getattr(ssl, proto, None)
        if protocol:
            break
    return ssl.SSLContext(protocol)


def encode_der_as_pem(cert):
    # Forking out to openssl to not have to add any dependencies to script,
    # preferably you'd do this with pycrypto or other ssl libraries.
    cmd = ['openssl', 'x509', '-inform', 'DER']
    pipe = subprocess.PIPE
    process = subprocess.Popen(cmd, stdin=pipe, stdout=pipe, stderr=pipe)
    stdout, stderr = process.communicate(cert)
    if stderr:
        raise Exception('openssl errored when converting cert to PEM: %s' %
            stderr)
    return stdout.strip()


def read_n_bytes_from_socket(sock, n):
    buf = bytearray(n)
    view = memoryview(buf)
    while n:
        nbytes = sock.recv_into(view, n)
        view = view[nbytes:] # slicing views is cheap
        n -= nbytes
    return str(buf)


def postgres_protocol_version_to_binary(major, minor):
    return struct.pack('!I', major << 16 | minor)


if __name__ == '__main__':
    main()
Save certificate into file cert.txt
postgres_get_server_cert.py example.com:5432 | openssl x509 > cert.txt
Check certificate dates:
postgres_get_server_cert.py example.com:5432 | openssl x509 -noout -dates
Check full certificate:
postgres_get_server_cert.py example.com:5432 | openssl x509 -noout -text
source:

2015-06-21

Przeniesienie Redmine (2.0) na inny serwer (Ubuntu 14.04)

Na starej maszynce wykonujemy kopię katalogu, w którym znajduje się Redmine (u mnie to katalog redmine katalogu domowym) oraz zrzut bazy (u mnie bazą jest PostgreSQL). Następnie dane przenosimy na docelowy serwer i jedziemy wg poniższej instrukcji:
sudo apt-get install make
sudo apt-get install postgresql
sudo apt-get install postgresql-server-dev-9.3

# utworzenie w bazie usera redmine
psql -U postgresql template1
create user redmine with password 'twoje_haselko';
alter user redmine with superuser;
# wczytanie kopii bazy
\i backup/redmine/day/redmine-2015.03.21.15.28.sql

# wychodzimy z bazy i instalujemy kolejne rzeczy
sudo apt-get install ruby1.9.3 libmysqlclient-dev
sudo apt-get install libmagickcore-dev libmagickwand-dev
sudo gem install bundler
sudo gem install json -v '1.7.3'
sudo gem install pg -v '0.13.2'
cd redmine/redmine-2.0/
bundle install --without development test

# odpalenie redmine
bundle exec ruby script/rails server webrick -e production

# sprawdzenie czy wszystko smiga wchodzac przez http://ip-serwera:3000
Jeśli wszytko ładnie działa to możemy zabrać się za instalację Apache2 oraz Passengera:
sudo apt-get install apache2
sudo gem install passenger
sudo apt-get install libapache2-mod-passenger
Dodajemy PassengerDefaultUser www-data (tylko tę linię) do pliku /etc/apache2/mods-available/passenger.conf - cały plik powinien wyglądać mniej więcej tak:

  PassengerDefaultUser www-data
  PassengerRoot /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
  PassengerDefaultRuby /usr/bin/ruby

Tworzymy plik /etc/apache2/sites-available/redmine i wpisujemy w nim:
[VirtualHost *:80]
    ServerName redmine.lh
    DocumentRoot /home/user/redmine/redmine-2.0/public
    ServerAdmin twoj@mail.pl
    LogLevel warn
    ErrorLog /var/log/apache2/redmine_error
    CustomLog /var/log/apache2/redmine_access combined
    [Directory /home/user/redmine/redmine-2.0/public]
       Options Indexes FollowSymLinks MultiViews
       AllowOverride None
       Order allow,deny
       allow from all
       RailsBaseURI /redmine
       PassengerResolveSymlinksInDocumentRoot on
    [/Directory]
[/VirtualHost]
Zamień znaki [] na <>.

sudo ln -s /etc/apache2/sites-available/redmine /etc/apache2/sites-enabled/redmine
sudo a2enmod passenger
sudo service apache2 restart

2015-01-14

Doctrine i Symfony - wyświetlenie SQL'a z parametrami

Wyświetlić utworzonego SQL'a możemy za pomocą polecenia:
$qb->getQuery()->getSQL();

a parametry tegoż zapytania za pomocą polecenia:
$qb->getParameters();

Wcześniej oczywiście tworzymy obiekt $qb oraz zapytanie - np:
$qb = $this->createQueryBuilder('l')
 ->where('l.del = :del')
 ->andWhere('l.wysw = :wysw')
 ->andWhere('lower(l.nazwisko) LIKE lower(:szukana) OR lower(l.nrpwz) LIKE lower(:szukana)')
 ->orderBy('l.nazwisko')
 ->setParameters(array(
  'del' => 'false',
  'wysw' => 'true',
  'szukana' => '%' . $szukana . '%'
 ));

Wynik zapytania pobieramy w poniższy sposób:
$qb->getQuery()->getResult();

2015-01-13

Doctrine Symfony PostgreSQL - LIKE i OR

Przykład zapytania SQL z klauzulą LIKE:
$qb = $this->createQueryBuilder('k')
 ->where('k.kod_res_8 = :kod_res_8')
 ->andWhere('lower(k.ulica) LIKE lower(:ulica)')
 ->setParameter('kod_res_8', $kod_res_8)
 ->setParameter('ulica', $ulica . '%')
 ->setMaxResults(1);

Przykład zapytania SQL z klauzulą LIKE i OR:
$qb = $this->createQueryBuilder('j')
 ->where('j.del = :del')
 ->andWhere('j.wysw = :wysw')
 ->andWhere('lower(j.nazw) LIKE lower(:szukana) OR lower(j.regon) LIKE lower(:szukana)')
 ->orderBy('j.nazw')
 ->setParameters(array(
  'del' => 'false',
  'wysw' => 'true',
  'szukana' => '%' . $szukana . '%'
 ));

return $qb->getQuery()->getResult();

2014-04-08

[pgsql] Zmiana typu kolumny na potrzeby sortowania

Załóżmy, że mamy tabelę z kolumną typu varchar, w której są kody (np. 14.5). Jeśli chcielibyśmy posortować dane za pomocą order by:

SELECT kod FROM tabela ORDER BY kod;

to otrzymalibyśmy je w kolejności:
0.1
0.16
0.3
10.11
10.4
10.6
10.8
11.11
11.4
1.16
11.6
1.2
12.11
12.4
(...)

Jeśli chcielibyśmy posortować kolumnę wg wielkości liczby to musimy rzutować kolumnę na numeric. Zapytanie wyglądać powinno zatem w ten sposób:

SELECT kod FROM tabela ORDER BY kod::numeric;

dzięki temu otrzymamy wynik:
0.1
0.16
0.3
1.16
1.2
2.17
2.4
2.5
3.4
3.9
4.10
4.4
5.8
6.10
6.16
6.4
(...)

2014-02-27

[pgsql] Funkcja replace() - zmiana treści

Kiedyś pisałem już o postgresowej funkcji replace(). Ostatnio przydała mi się ona ponownie i postanowiłem po raz kolejny o niej wspomnieć. Wykorzystałem ją do zmiany nazwy ulicy - zdarzyło mi się, że adresy niektórych użytkowników posiadały (zamiast polskich znaków) niezrozumiałe znaki (spowodowane to było przenoszeniem danych między różnymi systemami na przestrzeni wielu lat).
Poniżej przedstawiam sposób wykorzystania funkcji replace() na małym przykładzie, w którym zmieniamy w tabeli user w kolumnie ulica znaki "¦" na "Ś":

UPDATE user SET ulica=replace(ulica, '¦', 'Ś') WHERE ulica like '%¦%';

Powyższe zapytanie zaktualizuje wszystkie wpisy w tabeli user, które mają w polu ulica znak "¦" na "Ś". Warto przed odpaleniem takiego zapytania najpierw sprawdzić co tak naprawdę zwraca funkcja i ile rekordów zostanie zmienionych. Poniższe zapytanie da nam taką odpowiedź:

SELECT id, ulica, replace(ulica, '¦', 'Ś') FROM user WHERE ulica like '%¦%';

źródło: http://www.postgresql.org/docs/9.1/static/functions-string.html

2013-05-14

[psql] Usunięcie postgresql i apache z autostartu

W przypadku Debiana / Ubuntu / Minta wystarczy użyć polecenia update-rc.d:

PostgreSQL:

sudo update-rc.d -f postgresql remove 
 Removing any system startup links for /etc/init.d/postgresql ...
   /etc/rc0.d/K21postgresql
   /etc/rc1.d/K21postgresql
   /etc/rc2.d/S19postgresql
   /etc/rc3.d/S19postgresql
   /etc/rc4.d/S19postgresql
   /etc/rc5.d/S19postgresql
   /etc/rc6.d/K21postgresql

Apache:

sudo update-rc.d -f apache2 remove
 Removing any system startup links for /etc/init.d/apache2 ...
   /etc/rc0.d/K09apache2
   /etc/rc1.d/K09apache2
   /etc/rc2.d/S91apache2
   /etc/rc3.d/S91apache2
   /etc/rc4.d/S91apache2
   /etc/rc5.d/S91apache2
   /etc/rc6.d/K09apache2

W przypadku potrzeby skorzystania z PostgreSql'a czy Apache'a wystarczy odpalić go ręcznie z konsoli:
sudo /etc/init.d/postgresql start
sudo /etc/init.d/apache2 start

2013-02-17

[psql][mysql] Kilka różnic między MySql'em a PostgreSql'em

Po dłuuugiej przerwie usiadłem przed bazą MySQL'a i próbuję jakoś ją ogarnąć. Ostatnio stykam się głównie z PostgreSQL'em i nabrałem już kilka nawyków, które nie do końca się sprawdzają przy MySQL'u. Jest między tymi bazami kilka różnic w obsłudze i postaram się je w tym wpisie zbierać i przedstawić.
Odwykłem od nakładek typu phpMyAdmin - wszystkie zapytania i modyfikacje wykonuję w postgresie z konsoli i jest mi z tym dobrze. :) Spróbuję tak samo działać w MySQl'u.

Już na starcie niestety uderzył mnie w MySQL'u brak "podpowiadania" poleceń po wciśnięciu Tab - to jakaś masakra (EDIT: okazuje się że podpowiada jak się pisze dużymi literami). Nie podpowiada też ścieżki do pliku, który chciałbym na przykład wczytać...

Oto kilka różnic, które dostrzegłem po kilku chwilach:

Tworzenie nowej bazy danych


W PostgreSQL i w MySQL wygląda to tak samo:
CREATE DATABASE nazwa_bazy;

W postgresie można utowrzyć nową bazę jeszcze nie będąc w psql:
createdb -U nazwa_usera nazwa_bazy

W mysql pewnie też można ale ja tego póki co nie odkryłem... :)

Wejście do bazy danych


psql:
psql -W -U nazwa_usera nazwa_bazy

mysql:
mysql -u nazwa_usera -p -D nazwa_bazy

Wczytanie kodu SQL z pliku


psql:
$ psql -U nazwa_usera nazwa_bazy -f /var/www/projekt/sql/0001.sql

lub
\i /var/www/projekt/sql/0001.sql


mysql:
$ mysql -u nazwa_usera -p nazwa_bazy < /var/www/projekt/sql/0001.sql
lub
\. /var/www/projekt/sql/0001.sql
Wielkich różnic tutaj nie ma - oprócz wyżej wspomnianego braku podpowiadania...

Wyświetlenie baz danych

psql:
select datname from pg_database;
mysql:
show databases;

Wyświetlenie tabel bazy danych

psql:
\dt
mysql:
show tables;

Wyświetlenie szczegółów tabeli

psql:
\d nazwa_tabeli
mysql:
describe nazwa_tabeli;

Modyfikacja kolumny tabeli

psql:
ALTER TABLE t1 ALTER COLUMN test TYPE VARCHAR(255);
mysql:
ALTER TABLE t1 MODIFY test VARCHAR(255);



Jest na pewno jeszcze pół miliona więcej różnic - jak coś zauważę to dodam do listy.

2013-01-10

[psql] Wyciągnięcie id z inserta i wykorzystanie go w innym insercie

Tym razem problem SQL'owy. Miałem dziś potrzebę stworzenia zapytania, które rozpisze dane z pewnej tabeli do dwóch powiązanych ze sobą tabel. Potrzebowałem w tym celu id zapisywanej pozycji aby móc ją wykorzystać w innym insercie. Tutaj z pomocą przyszła mi możliwość utworzenia w PostgreSQL funkcji oraz triggerów. Jako pierwsze stworzyłem funkcję insert_po_insercie() za pomocą której dokonuję operacji na tej drugiej tabeli (posiadając już id):
create function insert_po_insercie()
  returns trigger
as $$
begin
  insert into table_02 (ido, idm, komentarz, idp, idupr, iddest) values ('0', '0', 'testowy komentarz', new.idp, (select id from upr where kod='ewus'), new.id);
  return new;
end;
$$ language plpgsql;
Później stworzyłem triggera insert_po_insercie, który wygląda tak:
create trigger insert_po_insercie
  after insert on table_01
for each row
execute procedure insert_po_insercie();
Widać tutaj, że po insercie do tabeli table_01 wywoływana jest funkcja insert_po_insercie(). Mając już tak funkcję i triggera można wykonać inserty do tabeli table_01:
INSERT INTO table_01 (id_operacji, data_czas_operacji, idp) SELECT id_operacji, data_czas_operacji, idp FROM guilty_table;
W funkcji przy tworzeniu inserta skorzystałem z świeżo utworzonego id (new.id) oraz przy okazji idp (new.idp), które również było mi potrzebne. Można w ten sposób pobierać dowolną kolumnę z tabeli źródłowej. Funkcja poza pokazanym na przykładzie insertem może robić wiele innych czynności. Na przykład po insercie można umieścić update do jeszcze innej tabeli, w której z kolei skorzystamy z id nowoutowrzonego inserta:
create function insert_po_insercie()
  returns trigger
as $$
begin
  insert into table_02 (ido, idm, komentarz, idp, idupr, iddest) values ('0', '0', 'testowy komentarz', new.idp, (select id from upr where kod='ewus'), new.id);
  update table_03 set idx=currval('table_02_id_seq'::regclass) where id=new.id;
  return new;
end;
$$ language plpgsql;
Całość wygląda zatem tak:
create function insert_po_insercie()
  returns trigger
as $$
begin
  insert into table_02 (ido, idm, komentarz, idp, idupr, iddest) values ('0', '0', 'testowy komentarz', new.idp, (select id from upr where kod='ewus'), new.id);
  update table_03 set idx=currval('table_02_id_seq'::regclass) where id=new.id;
  return new;
end;
$$ language plpgsql;

create trigger insert_po_insercie
  after insert on table_01
for each row
execute procedure insert_po_insercie();

INSERT INTO table_01 (id_operacji, data_czas_operacji, idp) SELECT id_operacji, data_czas_operacji, idp FROM guilty_table;
Pozdrawiam!

2012-10-02

[psql] Funkcja replace

Jeśli masz potrzebę zmiany ciągu znaków bezpośrednio w PostgreSQL to możesz tego dokonać przy pomocy funkcji replace. Możesz dzięki tej funkcji zamienić znaki nowej linii oraz inne znaki specjalne - wystarczy, że skorzystasz z literki E.

Dla przykładu przedstawiam funkcję zamieniającą znak nowej linii na spację:

replace(przykladowa_kolumna, E'\n','')

2012-03-29

NetBeans IDE dla PHP

Dziś postanowiłem odpocząć od Eclipse i poszukać alternatywnego IDE dla PHP - padło na NetBeans.
Pierwsze testy przeszły bardzo pomyślnie - założenie projektu z istniejącego źródła poszło bezboleśnie, svn działa bez żadnych problemów bez konieczności kombinowania w ustawieniach. NetBeans poza obsługą MySql umożliwia również podpięcie się do bazy PostgreSQL - wystarczy jedynie podać parametry - żadnych dodatkowych "szpagatów". To dla mnie fantastyczna sprawa... :-)
Jak na razie problem miałem jedynie z zaznaczaniem bloku tekstu (Block Selection Mode), który w Eclipse dla PHP jest dostępny po wciśnięciu kombinacji klawiszy Ctrl+Shift+A. W NetBeans trzeba ściągnąć i zainstalować plugin, który umożliwia tego typu zaznaczanie tekstu. Plugin nazywa się Rectangular Edit Tools i można go znaleźć pod adresem: http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=33497

Już po chwili gotów jestem zaryzykować stwierdzenie, że NetBeans IDE w wersji 7.1.1 jest naprawdę godny uwagi... :)

2010-12-08

[psql] Prosta funkcja w PostgreSQLu

PostgreSQL umożliwia tworzenie funkcji - poniżej można zobaczyć na prostym przykładzie jak tego dokonać:

CREATE OR REPLACE FUNCTION prosta_funkcja(pierwsza_zmienna integer, druga_zmienna integer) RETURNS void AS
$$
BEGIN
INSERT INTO jakas_tabela (dodata, modata, idoper, kod, nazw) SELECT now() as dodata, now() as modata, $2 as idoper, kod, nazw FROM jakas_tabela WHERE idoper=$1;
END;
$$ LANGUAGE plpgsql;

To taki zupełnie prosty przykład - więcej można znaleźć w dokumentacji.
Szczegóły funkcji można w każdej chwili sobie obejrzeć za pomocą komendy

\dt prosta_funkcja

2010-07-22

[psql] Obliczanie wieku funkcją age() i date_part()

Funkcja age() w Postgresie to bardzo fajna sprawa. Za pomocą niej można w prosty sposób obliczyć wiek użytkownika.
Zapytanie:

SELECT age(data_ur) as wiek FROM user WHERE id=1;

(gdzie data_ur jest typu date) może dać wynik:

wiek
-------------------------
6 years 11 mons 21 days

Jeśli chcielibyśmy się dowiedzieć ile użytkownik miał lat na przykład 21 kwietnia 2009 roku wystarczy napisać:

SELECT age(timestamp '2009-04-21', data_ur) as wiek FROM user WHERE id=1;

co da wynik w postaci:

wiek
------------------------
5 years 8 mons 20 days

Za pomocą funkcji date_part() można w prosty sposób "wyciągnąć" z wyniku np. jedynie ilość lat (bez informacji o miesiącach i dniach):

SELECT date_part('year', age(timestamp '2009-04-21', data_ur)) as wiek FROM user WHERE id=1

wynik:

wiek
------
5

2010-01-25

[psql] CASE WHEN END

Wyrażenie CASE w Postgresie działa i na pewno można je zastosować na wiele sposobów - mi się dziś przydało przy łączeniu dwóch kolumn.

2010-01-19

[psql] Insert z select'em w środku

Istnieje możliwość wrzucenia zawartości tego co otrzymaliśmy z SELECT'a bezpośrednio do tabeli za pomocą INSERT'a pisząc:

INSERT INTO moja_tabela (data_dodania, oper_id, poz_id, kodpozycji_id, ilosc) SELECT now() as data_dodania, '0' as oper_id, poz_id, kodpozycji_id, ilosc FROM moja_tabela WHERE poz_id=7 and ilosc=0;

Za pomocą takiej konstrukcji możliwe jest kopiowanie danych. Należy tylko pamiętać aby pola miały taki sam typ (int, date, timestamp itp.).

2010-01-13

[psql] Grupowanie i funkcja min()

Funkcja min() PostgreSQL'a w połączniu z grupowaniem daje bardzo fajną użyteczność.
Załóżmy, że mamy trzy tabele: ojciec, dziecko i powiazanie. Jeden rodzic może mieć wiele dzieci: