tag:blogger.com,1999:blog-113499132024-03-13T07:31:38.585-05:00Linux InfoInformation about various Linux / UNIX / OS X topicsJoe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.comBlogger182125tag:blogger.com,1999:blog-11349913.post-76864985557010451992017-11-03T15:11:00.001-05:002017-11-03T15:11:40.871-05:00ssh-copy-id: add authorized_keys entry automatically<br />
<b>Copy authorized key to remote server:</b><br />
ssh-copy-id -i ~/.ssh/id_rsa example.com<br />
<br />
-i = private key associated with the public key that you would like to copyJoe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com9tag:blogger.com,1999:blog-11349913.post-15523308802744314642017-06-17T18:30:00.000-05:002017-06-17T18:30:25.914-05:00Postgresql: Read-Only User<br />
<br />
create user <span style="color: blue;">xxxxx</span> with password '<span style="color: purple;">yyyy'</span>;<br />
GRANT connect ON DATABASE <span style="color: #38761d;">mydb1</span> TO <span style="color: blue;">xxxxx</span>;<br />
GRANT connect ON DATABASE <span style="color: #990000;">mydb2</span> TO <span style="color: blue;">xxxxx</span>;<br />
<br />
\c <span style="color: #38761d;">mydb1</span><br />
GRANT usage ON SCHEMA public TO <span style="color: blue;">xxxxx</span>;<br />
GRANT select ON ALL TABLES IN SCHEMA public TO <span style="color: blue;">xxxxx</span>;<br />
GRANT select ON ALL SEQUENCES IN SCHEMA public TO <span style="color: blue;">xxxxx</span>;<br />
<br />
\c <span style="color: #990000;">mydb2</span><br />
GRANT usage ON SCHEMA public TO <span style="color: blue;">xxxxx</span>;<br />
GRANT select ON ALL TABLES IN SCHEMA public TO <span style="color: blue;">xxxxx</span>;<br />
GRANT select ON ALL SEQUENCES IN SCHEMA public TO <span style="color: blue;">xxxxx</span>;Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com7tag:blogger.com,1999:blog-11349913.post-38916438356944711282016-06-12T20:44:00.001-05:002018-02-18T19:38:47.860-06:00Open Source Webservices<br />
<u>Version Control</u><br />
Gitlab - https://about.gitlab.com/<br />
Phabricator - http://phabricator.org/<br />
<br />
<u>Ticket Management (kanban)</u><br />
Gitlab Kanban Board - http://kanban.leanlabs.io/<br />
Taiga - https://taiga.io/<br />
Kanboard - https://kanboard.net/<br />
<br />
<u>Group Chat</u><br />
Mattermost - mattermost.org/ - also bundled with gitlab<br />
<div>
Rocket.Chat - https://rocket.chat/</div>
<div>
Let's Chat - http://sdelements.github.io/lets-chat/</div>
<div>
Friends - http://moose-team.github.io/friends/</div>
<div>
Zulip - https://www.zulip.org/</div>
<div>
<br />
Compare: https://blog.okturtles.com/2015/11/five-open-source-slack-alternatives/<br />
<u>Amazon S3 Compatible Alternatives</u><br />
Minio - https://www.minio.io/<br />
Red Hat Ceph - http://ceph.com/ <br />
<br />
<u>Password Generator</u><br />
Diceware - https://www.rempe.us/diceware/#eff<br />
<br />
<u>Make Image out of code:</u><br />
Cabon - https://carbon.now.sh<br />
<span style="line-height: 21px;"><br /></span>
<span style="line-height: 21px;"><u>PaaS</u></span><br />
<span style="line-height: 21px;">openstack</span><br />
Kubernetes<br />
<span style="line-height: 21px;">Kel - http://docs.kelproject.com/</span><br />
<span style="line-height: 21px;">Doku - http://dokku.viewdocs.io/dokku/</span><br />
<span style="line-height: 21px;">Flynn - https://flynn.io/</span>
<span style="line-height: 21px;"><br /></span>
More: https://www.quora.com/Is-there-open-source-software-that-implements-Amazon-S3-plug-compatible-storage<br />
<br />
<u>Malicatcher</u><br />
Send email to here for debugging<br />
https://hub.docker.com/r/schickling/mailcatcher/<br />
https://mailcatcher.me/</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com1tag:blogger.com,1999:blog-11349913.post-87362840479683910672016-03-04T20:34:00.000-06:002016-03-04T20:34:00.619-06:00Make Unix Password Hashmkpasswd --method=SHA-512Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0tag:blogger.com,1999:blog-11349913.post-44492987735778709432016-03-04T20:33:00.001-06:002016-12-19T10:33:59.211-06:00Webservices<br />
<b>Email Spam Checker</b><br />
http://www.mail-tester.com/<br />
<br />
<b>Git Hosting</b><br />
Gitlab - https://about.gitlab.com/ (open source)<br />
Phabricator - http://phabricator.org/ (open source)<br />
<br />
<b>Group Chat</b><br />
Mattermost - http://www.mattermost.org/ (open source)<br />
Slack - http://www.json-generator.com/<br />
HipChat - https://www.hipchat.com/<br />
Rocket - https://rocket.chat/features (open source)<br />
<br />
<b>Javascript Editor</b><br />
jsfiddle https://jsfiddle.net/<br />
Codepen - http://codepen.io/<br />
jsbin - https://jsbin.com/ (open source)<br />
<br />
<b>JSON Generator</b><br />
http://www.json-generator.com/<br />
<br />
<b>Online IDE</b><br />
Cloudnine - https://c9.io/ (open source)<br />
<br />
<b>HTML/CS/JS Cleanup</b><br />
http://www.dirtymarkup.com/<br />
<b><br /></b>
<b>SSL Certificate Checker</b><br />
https://www.ssllabs.com/ssltest<br />
<br />
<b>SSL Check Intermediate Certificate Chain</b><br />
https://www.sslshopper.com/ssl-checker.html<br />
<br />
<b>Fake Email Tester (Send emails to here on dev and view them)</b><br />
https://mailtrap.io/<br />
<br />
<b>Terminal Emulator:</b><br />
https://hyperterm.org/ (open source)<br />
<br />
<b>Note Taking Desktop App</b><br />
Boostnote - https://b00st.io/ (open source)Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com2tag:blogger.com,1999:blog-11349913.post-42240197314900337062016-03-04T20:33:00.000-06:002016-03-04T20:33:32.631-06:00Python/Django Storage Backend Notes<b>Inspired by:</b><br />
<a href="https://django-storages.readthedocs.org/en/latest/backends/amazon-S3.html#storage">https://django-storages.readthedocs.org/en/latest/backends/amazon-S3.html#storage</a><br />
<br />
<b>Interacting directly with storage backend</b><br />
from django.conf import settings<br />
from django.core.files.storage import get_storage_class<br />
STORAGE_CLASS_STRING = getattr(settings, "MY_STORAGE_CLASS", \<br />
settings.DEFAULT_FILE_STORAGE)<br />
sc = get_storage_class(STORAGE_CLASS_STRING)<br />
s = sc()<br />
s.url("jjj-test/JOE.jpg")<br />
# '/media/jjj-test/JOE.jpg'<br />
s.path("jjj-test/JOE.jpg")<br />
# u'/home/jjasinski/Sites/mysite/htdocs/media/jjj-test/JOE.jpg'<br />
s.exists("jjj-test/JOE.jpg")<br />
# False<br />
f = s.open("jjj-test/JOE.jpg", 'w')<br />
f.write("joe test")<br />
f.close()<br />
s.exists("jjj-test/JOE.jpg")<br />
# True<br />
s.delete("jjj-test/JOE.jpg")<br />
s.exists("jjj-test/JOE.jpg")<br />
# False<br />
<br />
<b>Interacting with a Model's storage</b><br />
from django.core.files.base import ContentFile<br />
obj = MyModel()<br />
obj.photo.save('django_test.txt', ContentFile('content'))<br />
obj.photo.size<br />
obj.photo.read()<br />
obj.delete()Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com1tag:blogger.com,1999:blog-11349913.post-30664408767420268582015-12-09T09:13:00.000-06:002015-12-09T09:14:41.902-06:00Django: staticfiles<b>Locate static file location in codebase:</b><br />
<br />
>>> from django.contrib.staticfiles.finders import find<br />
<br />
>>> find("img/logo.png", all=True)<br />
[u'/sites/static_in_pro/our_static/img/logo.png']<br />
<br />
>>> find("img/logo.png",)<br />
u'/sites/static_in_pro/our_static/img/logo.png'<br />
<div>
<br /></div>
Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0tag:blogger.com,1999:blog-11349913.post-61130325903514635942015-12-07T00:44:00.002-06:002015-12-07T09:14:07.592-06:00LetsEncrypt with HAProxy or Nginx<span style="color: blue;"><br /></span>
<span style="color: blue;">At this time, LetsEncrypt is in public beta, but I suspect that it will continue to evolve. </span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;"># all commands must be done as root</span><br />
sudo su<br />
<span style="color: blue;"><br /></span>
<span style="color: blue;"># Download the letsencrypt repo </span><br />
git clone https://github.com/letsencrypt/letsencrypt.git /top/letsencrypt/<br />
<br />
<span style="color: blue;"># change to the desired keys directory. All commands following are relative to this dir.</span><br />
cd /jaz/sites/common/etc/keys/<br />
<br />
<span style="color: blue;"># Generate a 4096 bit ssl private key</span><br />
openssl genrsa 4096 > jazstudios.com.key<br />
<span style="color: blue;"><br /></span>
<span style="color: blue;"># Generate the certificate signing request. The following allows lets you specify a SAN (Subject Alternative Name) which allows www and non-www versions of the same domain. The output needs to be in "der" format. </span><br />
<span style="font-size: x-small;"><br /></span>
<span style="font-size: x-small;">openssl req -new -sha256 \</span><br />
<span style="font-size: x-small;"> -key joejasinski.com.key \</span><br />
<span style="font-size: x-small;"> -subj "/C=US/ST=IL/L=Chicago/O=Jazstudios/OU=Information Technology/CN=www.joejasinski.com" \</span><br />
<span style="font-size: x-small;"> -reqexts SAN \</span><br />
<span style="font-size: x-small;"> -outform der \</span><br />
<span style="font-size: x-small;"> -config <(cat /etc/ssl/openssl.cnf \</span><br />
<span style="font-size: x-small;"> <(printf "[SAN]\nsubjectAltName=DNS:joejasinski.com,DNS:www.joejasinski.com")) \</span><br />
<span style="font-size: x-small;"> -out joejasinski.com.csr</span><br />
<br />
<span style="color: blue;"># execute the letsencrypt command. This will prompt you through a few actions. The most important is that you will need to stop any server running on port 80 and run the python script that they provide in the output. This will serve up a specific secret file at a specific location, allowing letsencrypt to authenticate the server. (You could also host the secret file with your webserver)</span><br />
<br />
<span style="font-size: x-small;">/opt/letsencrypt/letsencrypt-auto --email example@gmail.com --text \</span><br />
<span style="font-size: x-small;"> --authenticator manual \</span><br />
<span style="font-size: x-small;"> --work-dir /tmp/work/ \</span><br />
<span style="font-size: x-small;"> --config-dir /tmp/config/ \</span><br />
<span style="font-size: x-small;"> --logs-dir /tmp/logs/ auth \</span><br />
<span style="font-size: x-small;"> --cert-path /tmp/certs/ \</span><br />
<span style="font-size: x-small;"> --chain-path /tmp/chains/ \</span><br />
<span style="font-size: x-small;"> --csr joejasinski.com.csr</span><br />
<div style="color: blue;">
<span style="color: blue;"><br /></span></div>
<div>
<span style="color: blue;"># --text = use the text based 'wizard' installer instead of an ncurses one</span></div>
<div style="color: blue;">
<span style="color: blue;"># --authenticator manual = the admin must manually host the verification file</span></div>
<div style="color: blue;">
<span style="color: blue;"># --csr = path to the previously generated csr file</span></div>
<div style="color: blue;">
<span style="color: blue;"><br /></span></div>
<div style="color: blue;">
<br /></div>
<div style="color: blue;">
<span style="color: blue;"># The command that it will have you run looks something like this:</span></div>
<div style="color: blue;">
<span style="color: blue;"><br /></span></div>
<div>
<div class="p1">
<span class="s1"><span style="color: #444444; font-size: x-small;">mkdir -p /tmp/letsencrypt/public_html/.well-known/acme-challenge</span></span></div>
<div class="p1">
<span class="s1"><span style="color: #444444; font-size: x-small;">cd /tmp/letsencrypt/public_html</span></span></div>
<div class="p1">
<span class="s1"><span style="color: #444444; font-size: x-small;">printf "%s" asdfkjasfdasfdasfdasfdasdf > .well-known/acme-challenge/asdfasdfasfd</span></span></div>
<div class="p1">
<span class="s1"><span style="color: #444444; font-size: x-small;"># run only once per server:</span></span></div>
<div class="p1">
<span class="s1"><span style="color: #444444; font-size: x-small;">$(command -v python2 || command -v python2.7 || command -v python2.6) -c \</span></span></div>
<div class="p1">
<span class="s1"><span style="color: #444444; font-size: x-small;">"import BaseHTTPServer, SimpleHTTPServer; \</span></span></div>
<div class="p1">
<span class="s1"><span style="color: #444444; font-size: x-small;">s = BaseHTTPServer.HTTPServer(('', 80), SimpleHTTPServer.SimpleHTTPRequestHandler); \</span></span></div>
<div class="p1">
<span class="s1"><span style="color: #444444; font-size: x-small;">s.serve_forever()"</span></span></div>
</div>
<div>
<span style="color: blue;"><br /></span></div>
<div>
<span style="color: blue;"># The output of the of the letsencrypt-auto command will be a file called 0000_chain.pem. This file contains the host certificate and the intermediate certificate. It will look something like this. </span></div>
<div>
<br /></div>
<div>
<div class="p1">
<span class="s1">-----BEGIN CERTIFICATE-----</span></div>
<div class="p1">
Host certificate contents</div>
<div class="p1">
<span class="s1">-----END CERTIFICATE-----</span></div>
</div>
<div>
<div class="p1">
<span class="s1">-----BEGIN CERTIFICATE-----</span></div>
</div>
<div>
<div class="p1">
<span class="s1"> letsencrypt intermediate certificate</span></div>
<div class="p1">
<span class="s1">-----END CERTIFICATE-----</span></div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<span style="color: blue;"># Unrelated, but a good idea: generate a dhparam used for perfect forward security </span></div>
<div>
<span style="color: blue;"><br /></span>openssl dhparam -out dhparam.pem 4096</div>
<div>
<br /></div>
<div>
<span style="color: blue;"><b>For hosting with Nginx</b>, this file can be set to the <span style="font-size: 14.6667px; white-space: pre-wrap;"><span style="font-family: "courier new" , "courier" , monospace;">ssl_certificate </span></span><span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;">parameter. The </span></span><span style="font-size: 14.6667px; white-space: pre-wrap;"><span style="color: blue;"><span style="font-family: "courier new" , "courier" , monospace;">ssl_certificate_key</span><span style="font-family: "arial";"> setting would be set to the location of the key file.</span></span></span></div>
<div>
<br /></div>
<div>
<span style="color: blue;"><b>For hosting with HAProxy</b>, you want to modify the file so it looks something like this:</span></div>
<div>
<br /></div>
<div>
<div>
<div class="p1">
<span class="s1">-----BEGIN CERTIFICATE-----</span></div>
<div class="p1">
Host certificate contents</div>
<div class="p1">
<span class="s1">-----END CERTIFICATE-----</span></div>
<div class="p1">
<span class="s1">-----BEGIN RSA PRIVATE KEY-----</span></div>
<div class="p1">
<span class="s1"> Private key contents</span></div>
</div>
<div>
<div class="p1">
<span class="s1">-----END RSA PRIVATE KEY-----</span></div>
<div class="p1">
<span class="s1">-----BEGIN CERTIFICATE-----</span></div>
</div>
<div>
<div class="p1">
<span class="s1"> letsencrypt intermediate certificate</span></div>
<div class="p1">
<span class="s1">-----END CERTIFICATE-----</span></div>
<div class="p1">
<span class="s1">
</span></div>
<div class="p1">
<span class="s1">-----BEGIN DH PARAMETERS-----</span></div>
<div class="p1">
<span class="s1"> contents of dhparam.pem</span></div>
<div class="p1">
<span class="s1">
</span></div>
<div class="p1">
<span class="s1">-----END DH PARAMETERS-----</span></div>
</div>
</div>
Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0tag:blogger.com,1999:blog-11349913.post-15825126379083641102015-11-13T17:52:00.000-06:002017-10-24T11:54:33.105-05:00Dig Commands<br />
<b>Look up A record example.com as seen by 8.8.8.8 nameserver</b><br />
dig @8.8.8.8 exampe.com<br />
<br />
<b>Show the MX record for a yahoo domain</b><br />
dig yahoo.com MX<br />
<br />
<b>Show the TTL for a given domain</b><br />
dig imagescape.com TTL<br />
<br />
<b>Show the TXT record for an yahoo domain</b><br />
dig yahoo.com TXT<br />
<br />
<b>Show only the answer</b><br />
<div>
dig yahoo.com +nocomments +noquestion +noauthority +noadditional +nostats<br />
<br />
<b>All Records</b></div>
<div>
<div>
dig @8.8.8.8 imagescape.com ANY +noall +answer</div>
<div>
<br /></div>
<div>
<b>Reverse Lookup</b></div>
<div>
dig -x 198.178.132.10</div>
<div>
<br /></div>
<div>
<b>Nice output that looks like the domain record</b></div>
<div>
<div>
dig @ns.imagescape.com imagescape.com any +multiline +noall +answer</div>
</div>
<div>
<br /></div>
<div>
<b>Find the authoritative nameserver for a domain:</b></div>
<div>
dig -t ns imagescape.com +short</div>
<br />
<b>Find the SOA of the domain:</b><br />
dig joejasinski.com soa +noall +answer<br />
<br />
<br />
dig @ns1.linode.com joejasinski.com soa<br />
<br />
; <<>> DiG 9.10.3-P4-Ubuntu <<>> @ns1.linode.com joejasinski.com soa<br />
; (2 servers found)<br />
;; global options: +cmd<br />
;; Got answer:<br />
;; ->>HEADER<<- 64217="" id:="" noerror="" opcode:="" p="" query="" status:="">;; flags: qr <b>aa</b> rd; QUERY: 1, ANSWER: 1, AUTHORITY: 5, ADDITIONAL: 11<br />
;; WARNING: recursion requested but not available<br />
<br />
;; ANSWER SECTION:<br />
joejasinski.com.<span style="white-space: pre;"> </span>86400<span style="white-space: pre;"> </span>IN<span style="white-space: pre;"> </span>SOA<span style="white-space: pre;"> </span>ns1.linode.com. joe\.jasinski.gmail.com. <b>2014092859</b> 14400 14400 1209600 86400<br />
<div>
<br /></div>
<div>
<br /></div>
<div>
The presence "aa" indicates if the nameserver is the authoritative server.</div>
<div>
The "2014092859" is the serial</div>
<br />
<br />
<b>Download a zone file (zone transfer):</b><br />
dig axfr domain.com<br />
<br />
<br />
<b>Common Options:</b><br />
+short = show only the results<br />
+[no]comments = show/hide the comments<br />
+[no]question = show/hide the question section<br />
+[no]authority = show/hide the authority section<br />
+[no]stats = show/hide the stats section<br />
+[no]answer = show/hide the answer section<br />
+[no]all = show/hide everything<br />
<pre></pre>
<pre></pre>
<pre><a href="https://neverendingsecurity.wordpress.com/2015/04/13/dig-commands-cheatsheet/">https://neverendingsecurity.wordpress.com/2015/04/13/dig-commands-cheatsheet/</a></pre>
<pre><a href="https://www.madboa.com/geek/dig/">https://www.madboa.com/geek/dig/</a></pre>
<pre></pre>
<pre></pre>
<b>Nice articles:</b></-></div>
<div>
<br /></div>
<div>
Commands<br />
http://anouar.adlani.com/2011/12/useful-dig-command-to-troubleshot-your-domains.html</div>
<div>
<br /></div>
<div>
Create DNS Slave<br />
http://www.microhowto.info/howto/configure_bind_as_a_slave_dns_server.html<br />
<pre></pre>
<pre></pre>
<pre></pre>
</div>
Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com7tag:blogger.com,1999:blog-11349913.post-27132829872064980952015-11-02T15:56:00.004-06:002015-11-02T15:56:54.412-06:00Python Email Send<br />
<b>Simple email test from python</b><br />
<br />
import smtplib<br />
from email.mime.text import MIMEText<br />
f = "no-reply@example.com"<br />
t = "joe@example.com"<br />
s = smtplib.SMTP('localhost')<br />
msg = MIMEText("this is a test")<br />
msg["Subject"] = "This is a test - ignore"<br />
msg["To"] = t<br />
msg["From"] = f<br />
s.sendmail(f, [t], msg.as_string())Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0tag:blogger.com,1999:blog-11349913.post-9369164413837196002015-08-23T18:34:00.003-05:002015-08-23T18:39:22.558-05:00Docker Gitlab<span style="color: blue;">1) Create the following file</span><br />
<b>vim run_gitlab.sh</b><br />
<b><br /></b>
CONTAINER_NAME="gitlab_server"<br />
GITLAB_DATA_DIR="`pwd`/gitlab/"<br />
GITLAB_SSH_PORT="2222"<br />
GITLAB_HTTP_PORT="8080"<br />
GITLAB_HTTPS_PORT="8443"<br />
<br />
docker rm ${CONTAINER_NAME}<br />
sudo docker run --detach \<br />
--publish ${GITLAB_HTTPS_PORT}:443 \<br />
--publish ${GITLAB_HTTP_PORT}:8000 \<br />
--publish ${GITLAB_SSH_PORT}:22 \<br />
--name ${CONTAINER_NAME} \<br />
--restart always \<br />
--volume ${GITLAB_DATA_DIR}config:/etc/gitlab \<br />
--volume ${GITLAB_DATA_DIR}logs:/var/log/gitlab \<br />
--volume ${GITLAB_DATA_DIR}gitlab/data:/var/opt/gitlab \<br />
gitlab/gitlab-ce:latest<br />
<div>
<br /></div>
<div>
<span style="color: blue;">2) Run to create the initial directories</span></div>
<div>
</div>
<div>
sudo ./run_gitlab.sh </div>
<div>
<br /></div>
<div>
<span style="color: blue;">3) Configure: modify the following settings</span></div>
<div>
<br /></div>
<div>
<b> sudo vim gitlab/config/gitlab.rb</b> </div>
<div>
<br /></div>
<div>
external_url 'http://localhost:8000'</div>
<div>
gitlab_rails['gitlab_ssh_host'] = 'localhost'</div>
<div>
gitlab_rails['gitlab_shell_ssh_port'] = 2222</div>
<div>
<br /></div>
<div>
<span style="color: blue;">4) Restart docker</span></div>
<div>
<br /></div>
<div>
sudo docker restart gitlab_server</div>
<div>
<br /></div>
<div>
<span style="color: blue;">5) Visit http://localhost:8080 and login with</span></div>
<br />
root 5iveL!fe<br />
<br />
<br />
Source:<br />
<a href="https://gitlab.com/gitlab-org/gitlab-ce/tree/master/docker">https://gitlab.com/gitlab-org/gitlab-ce/tree/master/docker</a><br />
<br />
Autostart:<br />
<a href="https://docs.docker.com/articles/host_integration/">https://docs.docker.com/articles/host_integration/</a><br />
<br />Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0tag:blogger.com,1999:blog-11349913.post-8294375468809236432015-07-24T17:17:00.000-05:002015-07-24T17:18:17.865-05:00Docker Redis<span style="color: blue;">1) Create a script as such:</span><br />
CONTAINER_NAME="<span style="color: #e06666;">redis_server</span>"<br />
REDIS_DATA_DIR="<span style="color: #e06666;">`pwd`/data-dir/redis/</span>"<br />
HOST_PORT_1="<span style="color: #e06666;">6379</span>"<br />
<br />
if [ ! -d "${REDIS_DATA_DIR}" ]<br />
then<br />
mkdir -p "${REDIS_DATA_DIR}"<br />
fi<br />
<br />
docker rm ${CONTAINER_NAME}<br />
docker run --name ${CONTAINER_NAME} --rm \<br />
-p ${HOST_PORT_1}:6379 \<br />
-v ${REDIS_DATA_DIR}:/data \<br />
redis<br />
<div>
<br /></div>
Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0tag:blogger.com,1999:blog-11349913.post-10924293059130007272015-07-24T14:33:00.004-05:002015-07-24T14:33:56.247-05:00Postgres Query: Given an index find associated tableselect<br />
t.relname as table_name,<br />
i.relname as index_name,<br />
array_to_string(array_agg(a.attname), ', ') as column_names<br />
from<br />
pg_class t,<br />
pg_class i,<br />
pg_index ix,<br />
pg_attribute a<br />
where<br />
t.oid = ix.indrelid<br />
and i.oid = ix.indexrelid<br />
and a.attrelid = t.oid<br />
and a.attnum = ANY(ix.indkey)<br />
and t.relkind = 'r'<br />
and i.relname = '<span style="color: #e06666;">Index_to_search_for</span>'<br />
group by<br />
t.relname,<br />
i.relname<br />
order by<br />
t.relname,<br />
i.relname;<br />
<br />
<br />
Source:<br />
<a href="http://stackoverflow.com/questions/2204058/list-columns-with-indexes-in-postgresql">http://stackoverflow.com/questions/2204058/list-columns-with-indexes-in-postgresql</a><br />
<br />Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com1tag:blogger.com,1999:blog-11349913.post-70410296106674305062015-07-24T11:35:00.000-05:002015-07-24T17:18:34.703-05:00Docker MongoDB<span style="color: blue;">1) Create a directory for local data:</span><br />
<br />
mkdir <span style="color: #e06666;">`pwd`/data-dir</span><br />
<br />
<span style="color: blue;">2) Create a script as such:</span><br />
<br />
CONTAINER_NAME="<span style="color: #e06666;">mongodb_server</span>"<br />
MONGO_DATA_DIR="<span style="color: #e06666;">`pwd`/data-dir</span>"<br />
HOST_PORT_1="<span style="color: #e06666;">27017</span>"<br />
<br />
if [ ! -d "${MONGO_DATA_DIR}" ]<br />
then<br />
mkdir -p "${MONGO_DATA_DIR}"<br />
fi<br />
<br />
docker rm ${CONTAINER_NAME}<br />
docker run --name ${CONTAINER_NAME} --rm \<br />
-p ${HOST_PORT_1}:27017 \<br />
-v ${MONGO_DATA_DIR}:/data/db \<br />
mongoJoe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0tag:blogger.com,1999:blog-11349913.post-69246684059620859382015-06-24T19:55:00.002-05:002015-06-24T19:55:13.394-05:00Django Manipulating the Session without a request<br />
<br />
<b>Django: Lookup a session without a request</b><br />
<br />
from django.conf import settings<br />
from importlib import import_module<br />
engine = import_module(settings.SESSION_ENGINE)<br />
session_store = engine.SessionStore("new_or_existing_sessionID")<br />
uid = session_store.get('_auth_user_id')<br />
<br />
try:<br />
del session_store['session_key']<br />
except IndexError:<br />
pass<br />
<br />
session_store.save()Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0tag:blogger.com,1999:blog-11349913.post-15930659034288980742015-05-12T20:27:00.000-05:002015-11-22T20:37:20.995-06:00GlusterFS ConfigurationAssume node1 is: 192.168.33.10<br />
Assume node2 is: 192.168.33.11<br />
<br />
<b>Sources:</b><br />
<a href="https://www.digitalocean.com/community/tutorials/how-to-create-a-redundant-storage-pool-using-glusterfs-on-ubuntu-servers">https://www.digitalocean.com/community/tutorials/how-to-create-a-redundant-storage-pool-using-glusterfs-on-ubuntu-servers</a><br />
<a href="http://www.jamescoyle.net/how-to/457-glusterfs-firewall-rules">http://www.jamescoyle.net/how-to/457-glusterfs-firewall-rules</a><br />
<h3>
<b><br /></b></h3>
<h3>
<b>On BOTH nodes</b></h3>
<span style="color: blue;"># set hosts file entry (or configure DNS)</span><br />
vim /etc/hosts<br />
192.168.33.10 gluster1<br />
192.168.33.11 gluster2<br />
<br />
<span style="color: blue;"># On Ubuntu: install requirements </span><br />
sudo add-apt-repository ppa:semiosis/ubuntu-glusterfs-3.5<br />
sudo apt-get update<br />
sudo apt-get install glusterfs-server<br />
sudo apt-get install glusterfs-client<br />
<br />
<span style="color: blue;"># On Centos: install requirements</span><br />
<div>
wget -P /etc/yum.repos.d http://download.gluster.org/pub/gluster/glusterfs/LATEST/RHEL/glusterfs-epel.repo</div>
<div>
yum install glusterfs-server</div>
<div>
yum install glusterfs-client<br />
<br />
<span style="color: blue;"># make storage location for gluster data</span><br />
sudo mkdir /gluster-storage<br />
<br />
<span style="color: blue;"># make a mountpoint </span><br />
sudo mkdir /mnt/media/<br />
<h3>
</h3>
<h3>
ON GLUSTER 1</h3>
<span style="color: blue;"># connect node 1 and node 2</span><br />
sudo gluster peer probe gluster2<br />
sudo gluster peer status<br />
<br />
<span style="color: blue;"># create a Gluster replica volume </span><br />
sudo gluster volume create volume1 replica 2 transport tcp \<br />
<div>
gluster1:/gluster-storage \</div>
<div>
gluster2:/gluster-storage force<br />
<div>
<br />
<span style="color: blue;"># list volumes</span><br />
sudo gluster volume list<br />
<br />
<span style="color: blue;"># start the gluster volume</span><br />
sudo gluster volume start volume1<br />
<br />
<span style="color: blue;"># mount the volume</span><br />
sudo mount -t glusterfs gluster1:/volume1 /mnt/media/<br />
<br />
<span style="color: blue;"># only allow given ips</span><br />
sudo gluster volume set volume1 auth.allow gluster1,gluster2<br />
<br />
sudo gluster volume info<br />
sudo gluster volume profile volume1 start<br />
sudo gluster volume profile volume1 info<br />
sudo gluster volume status<br />
<br />
<span style="color: blue;"># stop the volume</span><br />
sudo gluster volume stop volume1<br />
<br />
<h3>
FSTAB Entries</h3>
** ON Gluster 1<br />
gluster1:/volume1 /mnt/media/ glusterfs defaults,_netdev,backupvolfile-server=gluster2 0 0<br />
<br />
** ON Gluster 2<br />
gluster2:/volume1 /mnt/media/ glusterfs defaults,_netdev,backupvolfile-server=gluster1 0 0<br />
<br /></div>
</div>
</div>
Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0tag:blogger.com,1999:blog-11349913.post-58035017985795564532015-05-12T20:07:00.002-05:002016-08-15T11:11:07.411-05:00systemd quickstart<br />
Source:<br />
https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet<br />
https://wiki.ubuntu.com/SystemdForUpstartUsers<br />
http://wiki.nginx.org/FedoraSystemdServiceFile<br />
<br />
<b>Start/stop/reload a service:</b><br />
service <i>foo</i> start <span style="color: blue;"># or</span><br />
systemctl start <i>foo</i><br />
<br />
service <i>foo</i> stop <span style="color: blue;"># or </span><br />
systemctl stop <i>foo</i><br />
<br />
service <i>foo</i> restart <span style="color: blue;"># or </span><br />
systemctl restart <i>foo</i><br />
<br />
<b>Reload a service using reload signal:</b><br />
service <i>foo</i> reload<br />
<br />
<b>See if service is running:</b><br />
service <i>foo</i> status <span style="color: blue;"># or </span><br />
systemctl status <i>foo</i><br />
<br />
<b>See tree listing of all services:</b><br />
systemctl status<br />
<br />
<b>See job log: </b><br />
<tt class="backtick">sudo journalctl -u <i>foo</i> -f</tt><br />
<br />
<b>Enable a service (to start on boot):</b><br />
systemctl enable <i>foo</i><br />
<i><br /></i>
<b>Disable a service:</b><br />
systemctl disable <i>foo</i><br />
<br />
<b>Service Definition Directory:</b><br />
/lib/systemd/system/<br />
<br />
<b>Example Nginx Service: /lib/systemd/system/nginx.service </b><br />
<div>
[Unit]<br />
Description=The nginx HTTP and reverse proxy server<br />
After=syslog.target network.target remote-fs.target nss-lookup.target<br />
<br />
[Service]<br />
Type=forking<br />
PIDFile=/run/nginx.pid<br />
ExecStartPre=/usr/sbin/nginx -t<br />
ExecStart=/usr/sbin/nginx<br />
ExecReload=/bin/kill -s HUP $MAINPID<br />
ExecStop=/bin/kill -s QUIT $MAINPID<br />
PrivateTmp=true<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
<br />
<b>Links:</b><br />
<a href="https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/">https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/</a><br />
<br /></div>
Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0tag:blogger.com,1999:blog-11349913.post-31804505566271592042015-05-09T08:30:00.001-05:002015-05-09T08:30:38.277-05:00Simple ClamAV Usage<br />
<b>Source: Nice Resource</b><br />
http://askubuntu.com/questions/250290/how-do-i-scan-for-viruses-with-clamav<br />
<br />
<b>Install:</b><br />
sudo apt-get install clamav<br />
<br />
<b>Refresh virus definition database:</b><br />
sudo freshclam<br />
<br />
<b>Scan all files on computer showing each</b><br />
clamscan -r /<br />
<br />
<b>Only display infected files and ring bell</b><br />
clamscan -r --bell -i /<br />
<br />
<b>Scan all files and move them to infected dir</b><br />
clamscan -r --move=/home/USER/VIRUS /home/USER<br />
<br />
<b>Scan all files and remove bad ones</b><br />
clamscan -r --remove /home/USERJoe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0tag:blogger.com,1999:blog-11349913.post-31080310202877369052015-04-03T17:01:00.000-05:002015-04-03T17:04:19.606-05:00Python TokenlibMake an expiring token using a known secret.<br />
<br />
Source:<br />
<a href="https://github.com/mozilla-services/tokenlib/blob/master/tokenlib/__init__.py">https://github.com/mozilla-services/tokenlib</a><br />
<br />
<b>Make a token, hashed with a secret, and storing an IP, that expires in 12 seconds</b><br />
>>> t = tokenlib.make_token({"ip":"1.1.1.1."}, secret="1234567890", timeout=12)<br />
<br />
<b>Parse a token before expiration time is up</b><br />
>>> tokenlib.parse_token(t, secret="1234567890")<br />
{u'ip': u'1.1.1.1.', u'expires': 1428098130.01954, u'salt': u'fbd08e'}<br />
<br />
<b>Parse a token after expiration time is up</b><br />
>>> tokenlib.parse_token(t, secret="1234567890")<br />
Traceback (most recent call last):<br />
File "<stdin>", line 1, in <module></module></stdin><br />
File "tokenlib/__init__.py", line 186, in parse_token<br />
return TokenManager(**kwds).parse_token(token, now=now)<br />
File "/tokenlib/__init__.py", line 143, in parse_token<br />
raise errors.ExpiredTokenError()<br />
tokenlib.errors.ExpiredTokenError: token has expired<br />
<div>
<br /></div>
Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0tag:blogger.com,1999:blog-11349913.post-67917806138063285642015-03-27T10:46:00.001-05:002015-07-09T11:22:04.982-05:00Simple Python Http ServerServes up files in the current directory.<br />
<br />
<b>Python 3</b><br />
python3 -m http.server<br />
<span style="color: blue;">or</span><br />
python3 -m http.server 8080<br />
<br />
<b>Python 2</b><br />
python -m SimpleHTTPServer<br />
<span style="color: blue;">or </span><br />
python -m SimpleHTTPServer 8080<br />
<br />
<div>
<b>Source:</b><br />
<a href="http://www.reddit.com/r/Python/comments/2ysd91/what_are_some_nifty_python_snippets_that_you_have/">http://www.reddit.com/r/Python/comments/2ysd91/what_are_some_nifty_python_snippets_that_you_have/</a></div>
<div>
<br /></div>
Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0tag:blogger.com,1999:blog-11349913.post-46615816379606763452015-03-01T23:34:00.000-06:002015-03-02T00:25:41.394-06:00Nodejs Hue QuicksheetSummary of the following article:<br />
<a href="https://github.com/peter-murray/node-hue-api">https://github.com/peter-murray/node-hue-api</a><br />
<br />
<div>
<br />
<span style="color: blue;">// load the module</span><br />
var hue = require('node-hue-api');<br />
<br />
<span style="color: blue;">// define some display functions</span><br />
var displayResult = function(result) {<br />
console.log("Created user: " + JSON.stringify(result));<br />
};<br />
<br />
<span style="color: blue;">// define some display functions</span><br />
var displayError = function(err) {<br />
console.error(err);<br />
};<br />
<br />
<span style="color: blue;">// search for bridges</span><br />
<div>
timeout = 6000 <span style="color: blue;">// 6 seconds</span><br />
<div>
hue.upnpSearch(timeout).then(displayBridges).done();</div>
</div>
<br />
<span style="color: blue;">// register a new user</span></div>
<div>
hostname = '192.168.1.112';</div>
<div>
newUserName = null;</div>
<div>
userDescription = "some description";</div>
<div>
hue.registerUser(hostname, newUserName, userDescription)</div>
<div>
.then(displayResult).fail(displayError).done();<br />
<br />
<span style="color: blue;">// define connection information</span><br />
var hostname = "192.168.1.112",<br />
username="*************************",<br />
api;<br />
<br />
<span style="color: blue;">// create the api object</span><br />
api = new hue.HueApi(hostname, username);<br />
<br />
<span style="color: blue;">// get basic information about the gateway api</span><br />
api.description().then(displayResult).fail(displayError).done();<br />
<br />
<span style="color: blue;">// get the full state of the gateway</span><br />
api.fullState().then(displayResult).fail(displayError).done();<br />
<br />
<span style="color: blue;">// see the users that are registered</span><br />
api.registeredUsers().then(displayResult).fail(displayError).done();<br />
<br />
<span style="color: blue;">// show the lights and their states</span><br />
api.lights().then(displayResult).fail(displayError).done();<br />
<br />
<span style="color: blue;">// define a state and set it to light #1</span><br />
state = hue.lightState.create().on().white(500, 100);<br />
api.setLightState(1, state).then(displayResult).fail(displayError).done();<br />
<br />
<span style="color: blue;">// turn light #1 on</span><br />
api.setLightState(1, state.on()).then(displayResult).fail(displayError).done();<br />
<br />
<span style="color: blue;">// turn light #1 off</span><br />
api.setLightState(1, state.off()).then(displayResult).fail(displayError).done();<br />
<br />
<span style="color: blue;">// get the status of light #1</span><br />
api.lightStatus(1).then(displayResult).fail(displayError).done();<br />
<br />
<span style="color: blue;">// see the light groups </span><br />
api.groups().then(displayResult).fail(displayError).done();<br />
<br />
<span style="color: blue;">// see the available scenes </span><br />
api.scenes().then(displayResult).fail(displayError).done();<br />
<br />
<span style="color: blue;">// create a new scene assign light #1-7 to it. Will include a scene 'id' in the result</span><br />
<div>
lightIds = [1,2,3,4,5,6,7]</div>
<div>
sceneName = "Demo Scene"<br />
<div>
api.createScene(lightIds, sceneName).then(displayResults).done();
<br />
<br /></div>
</div>
<div>
<span style="color: blue;">// update an existing scene</span></div>
<div>
<div>
lightIds = [1,2,3,4,5,6,]</div>
<div>
sceneName = "Updated Demo Scene"</div>
</div>
<div>
sceneId = "id-generated-by-gateway"</div>
api.updateScene(sceneId, lightIds, sceneName).then(displayResults).done();<br />
<div>
<br /></div>
<span style="color: blue;">// set states for light #1 in a scene</span><br />
<div>
state = lightState.create().on().hue(2000)</div>
<div>
sceneId = "id-generated-by-gateway"</div>
<div>
lightId = 1</div>
<div>
api.setSceneLightState(sceneId, lightId, state).then(displayResults).done();<br />
<br />
<span style="color: blue;">// recall scene</span><br />
api.recallScene(sceneId).then(displayResults).done();</div>
</div>
Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0tag:blogger.com,1999:blog-11349913.post-56932442867558374762014-09-21T22:53:00.001-05:002015-07-24T17:18:53.583-05:00Docker Elastisearch<h3>
<b>Simple Configuration</b></h3>
<br />
<span style="color: blue;">1) Create a directory for local data:</span><br />
<br />
mkdir <span style="color: #ea9999;">`pwd`/data-dir</span><br />
<br />
<span style="color: blue;">2) Create an elasticsearch config inside of the local data dir:</span><br />
<br />
<u>vim <span style="color: #e06666;">data-dir</span>/elasticsearch.yml</u><br />
<br />
path:<br />
<div>
logs: /data/log </div>
<div>
data: /data/data<br />
<br />
<span style="color: blue;">3) Create a script as such:</span><br />
<br />
CONTAINER_NAME="<span style="color: #e06666;">elasticsearch_server</span>"<br />
ELASTIC_DATA_DIR="<span style="color: #e06666;">`pwd`/data-dir</span>"<br />
HOST_PORT_1="<span style="color: #e06666;">9200</span>"<br />
HOST_PORT_2="<span style="color: #e06666;">9300</span>"<br />
<br />
if [ ! -d "${ELASTIC_DATA_DIR}" ]<br />
then<br />
mkdir -p "${ELASTIC_DATA_DIR}"<br />
fi<br />
<br />
docker rm ${CONTAINER_NAME}<br />
sudo docker run -it --name ${CONTAINER_NAME} --rm \<br />
-p ${HOST_PORT_1}:9200 \<br />
-p ${HOST_PORT_2}:9300 \<br />
-v ${ELASTIC_DATA_DIR}:/data \<br />
dockerfile/elasticsearch \<br />
/elasticsearch/bin/elasticsearch -Des.config=/data/elasticsearch.yml<br />
<div>
<br />
<br />
<br />
<span style="color: blue;">Source:</span><br />
<a href="https://github.com/dockerfile/elasticsearch">https://github.com/dockerfile/elasticsearch</a><br />
<b><br /></b>
<b><br /></b></div>
</div>
Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0tag:blogger.com,1999:blog-11349913.post-58714432182034131182014-09-18T17:54:00.002-05:002014-09-21T14:24:30.209-05:00Postgres As DockerCONTAINER_NAME="postgres_server"<br />
CONTAINER_DATA_DIR="/var/lib/postgresql/data"<br />
HOST_PORT="55432"<br />
POSTGRES_DOCKER_DIR=`pwd`<br />
HOST_DATA_DIR="${POSTGRES_DOCKER_DIR}/data-dir/"<br />
<br />
if [ ! -d "${HOST_DATA_DIR}" ]<br />
then<br />
mkdir -p "${HOST_DATA_DIR}"<br />
fi<br />
<br />
sudo docker run --rm --name ${CONTAINER_NAME} \<br />
-v ${HOST_DATA_DIR}:${CONTAINER_DATA_DIR} \<br />
-p ${HOST_PORT}:5432 \<br />
-it postgres $1<br />
<div>
<br /></div>
Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0tag:blogger.com,1999:blog-11349913.post-59350818300109127342014-09-18T14:32:00.000-05:002014-09-18T14:32:07.722-05:00Ubuntu: Apt find all outdated packagesapt-get --just-print upgrade | grep "Inst"| while read a b c d;<br />
do echo "\"$a\",\"$b\",\"$c\",\"$d\"";<br />
done<br />
<div>
<br /></div>
Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0tag:blogger.com,1999:blog-11349913.post-20472546537717467862014-09-18T11:25:00.003-05:002014-09-21T22:55:46.927-05:00Git Copy Branches Locally<br />
Source: <a href="https://coderwall.com/p/0ypmka">https://coderwall.com/p/0ypmka</a><br />
<br />
<span style="font-family: Courier New, monospace, monospace; font-size: x-small;"><span style="line-height: 20.1599998474121px; white-space: pre-wrap;">#!/bin/bash
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
git branch --track ${branch#remotes/origin/} $branch
done</span></span><br />
<br />
<br />Joe Jasinskihttp://www.blogger.com/profile/05381310347182579103noreply@blogger.com0