Gin Memcached Middleware

If you are using gin to build a webservice, and you want to use memcached to store your data, you will search some articles about how to create a middleware to do that. After read some articles, I only found this middleware. But I got no luck. I cannot get a value from a key on one endpoint after I set it on another endpoint. So I didn’t use gin session and create my own middleware with gomemcache.

package main

import (
    "github.com/gin-gonic/gin"
    "github.com/bradfitz/gomemcache/memcache"
)

func MCMiddleware(mc *memcache.Client) gin.HandlerFunc {
    return func(c *gin.Context) {
        c.Set("mem", mc)
        c.Next()
    }
}

func main() {
    r := gin.Default()

    mc := memcache.New("127.0.0.1:11211")

    r.Use(MCMiddleware(mc))

    r.GET("/set", func(c *gin.Context) {
        mem, _ := c.MustGet("mem").(*memcache.Client)
        mem.Set(&memcache.Item{Key: "somekey", Value: []byte("somevalue")})
        c.String(200, "ok\n")
    })

    r.GET("/get", func(c *gin.Context) {
        mem, _ := c.MustGet("mem").(*memcache.Client)
        data, _ := mem.Get("somekey")
        c.String(200, string([]byte(data.Value))+"\n")
    })

    r.Run(":8000")
}

Then you can set and get a value from a key on all endpoints.

linx@crawler ~ $ curl localhost:8000/set
ok
linx@crawler ~ $ curl localhost:8000/get
somevalue
Continue Reading

Gogstash – Logstash Alternative

I am now doing some projects that need a monitoring application to monitor the webservice. After having some chit and chat, we decide to use ELK (Elasticsearch, Logstash, and Kibana). If you want to know what ELK is, just search on Google and there will be so many articles related to it.

If you have already read some articles about ELK, you will know that ELK is the application to monitor and analyze all types of log.

  • Elasticsearch: indexing the data.
  • Logstash: log processing / parsing.
  • Kibana: visualize the data.

But after trying to configure and run ELK, I found out that Logstash is heavy to be run on the server with small specification. Because of this reason, I am trying to find some Logstash alternatives, and finally I found Gogstash, Logstash like, written in Golang.

While reading the documentation, I found out that there are some differences between Gogstash and Logstash when using the filter (I am using grok filter in Logstash). I tried to apply same pattern in Gogstash but it didn’t work. After all these things, I decide to use another filter. I am using gonx filter.

Although grok pattern and gonx pattern is different, it is not so difficult to create the configuration for gonx filter. And after some modification, Gogstash run smoothly. For your information, I am using flask for building the webservice, and this is an example line of the application log.

192.168.100.57 - - [05/Dec/2017 16:27:27] "GET / HTTP/1.1" 200 -

There are two types of Gogstash configuration, json and yml format. Here is my yml configuration.

input:
  - type: file
    path: '/home/linggar/webapp/nohup.out'

filter:
  - type: gonx
    format: '$clientip - - [$date $time] "$full_request" $status -'
    source: message
  - type: gonx
    format: '$verb $request HTTP/$httpversion'
    source: full_request

output:
  - type: elastic
    url: 'http://127.0.0.1:9200'
    index: gogstash_log
    document_type: testtype

And that’s it. Although Gogstash is not as powerful as Logstash, it is very light and one of so many Logstash alternatives which you could try.

Continue Reading

Wifi Id Misconfiguration

Everyone, especially Indonesian people, should know what wifi id is. Yes, wifi id is an internet hotspot that provided by Indonesian Telkom. Some wifi id internet hotspot need no account, so everyone could do browsing with no cost, but most of it, the wifi id internet hotspot need account to access it. It means, you have to pay additional fee to get the account if you subscribe Telkom internet connection. Or, you could buy wifi id voucher directly on wifi id landing page.

Continue Reading

Easy Transfer Scanner

Setelah hampir dua tahun tidak menulis sepatah kata pun di blog ini, akhirnya saya memutuskan untuk sedikit berbagi lagi hal-hal terkait teknologi informasi, tentunya hal-hal yang sedang saya alami dan saya kerjakan. Apa yang akan saya bahas adalah tentang sebuah aplikasi Windows Phone 8.1 yang kemarin baru saja saya install, yaitu Easy Transfer. Easy Transfer adalah aplikasi yang memudahkan penggunanya untuk melakukan manajemen berkas pada sebuah device berbasis Windows melalui browser pada komputer (kebetulan saya memakai Nokia Lumia 920).

easy_transfer_phone

 

 

 

 

 

 

 

 

 

Aplikasi Easy Transfer ini sangat memudahkan saya untuk memindahkan berkas dari handphone saya ke komputer, ataupun sebaliknya melalui wifi dengan protokol HTTP. Sebelumnya saya agak kesulitan dalam memindahkan berkas dari handphone karena laptop saya menggunakan OS Linux dan mtpfs yang digunakan di Linux agak rewel ketika harus berhadapan dengan Nokia Lumia.

easy_transfer

 

 

 

 

Unduh, unggah, penamaan ulang, dan menghapus berkas dapat dilakukan melalui browser ketika kita sudah menginstall aplikasi Easy Transfer di device Windows Phone yang kita pakai. Tetapi ketika saya menggunakan, ada hal yang kurang pas dalam aplikasi ini, yaitu akses yang dilakukan tanpa menggunakan autentikasi. Jadi, ketika kita mengetahui alamat ip dari sebuah device Windows Phone yang sedang membuka aplikasi Easy Transfer, kita langsung dapat mengaksesnya. Lalu berbekal pemikiran itu, akhirnya saya membuat sebuah script sederhana untuk melakukan scanning dalam jaringan yang sedang saya gunakan terhadap device yang sedang membuka Easy Transfer. 😛

#!/usr/bin/env python

import argparse
import sys
import socket
import fcntl
import struct
import time
import multiprocessing
import urllib2
import re
import datetime

def unwrap_self_f(arg, **kwarg):
	return GetEasy.scan_easy(*arg, **kwarg)

class GetEasy:
	def __init__(self):
		self.now_int = time.time()

	def get_self_ip(self, device):
		# get ip address code from activestate
		# http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/
		s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
		try:
			my_ip = socket.inet_ntoa(fcntl.ioctl(
				s.fileno(),
				0x8915,  # SIOCGIFADDR
				struct.pack('256s', device[:15])
				)[20:24])
			return my_ip
		except:
			return False

	def scan_easy(self, host):
		sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		result = sock.connect_ex((host, 80))
		if result == 0:
			try:
				get_page = urllib2.urlopen('http://%s' %host).read()
				if re.search(r'Easy Transfer', get_page):
					print 'Easy Transfer Detected in %s' %host
					return host
			except Exception, err:
				pass

	def run(self, threads, ip_range):
		pool = multiprocessing.Pool(processes=int(threads))
		hosts = []
		for i in xrange(1,255):
			hosts.append('%s.%d' %('.'.join(ip_range.split('.')[0:3]), i))
		get_ips = pool.map(unwrap_self_f, zip([self]*len(hosts), hosts))
		
		return get_ips

if __name__ == '__main__':
	now_int = time.time()

	parser = argparse.ArgumentParser()
	parser.add_argument('-i', '--interface', help='network interface')
	parser.add_argument('-t', '--threads', help='total threads, if not specified, will use single thread')
	args = parser.parse_args()

	if len(sys.argv) == 1:
		parser.print_help()
		sys.exit(1)

	if not args.interface:
		parser.print_help()
		sys.exit(1)

	if not args.threads:
		threads = 1
	else:
		threads = args.threads
	
	c = GetEasy()
	ip_addr = c.get_self_ip(args.interface)
	if not ip_addr:
		print 'invalid interface'
		sys.exit(1)

	print 'scanning wifi area...'
	Detected = c.run(threads, ip_addr)

	scanned_time = time.time() - now_int
	print '255 hosts scanned in %s' %(datetime.timedelta(seconds=scanned_time))

Lalu ketika dijalankan, hasilnya adalah sebagai berikut

easy_scanner

Setelah scanning dilakukan dan terdeteksi ada orang yang membuka aplikasi Easy Transfer, kita bisa mengakses alamat ipnya langsung di browser dan kita bisa melakukan apa saja dengan berkas pada ip itu. 😛

Lalu bagaimana cara kita mengakses berkas dengan menggunakan Easy Transfer secara aman? Caranya gampang, yaitu gunakan fitur internet sharing pada Windows Phone, agar jaringan yang kita gunakan adalah jaringan pribadi, bukan jaringan terbuka yang bisa diakses siapa saja. Tentunya dengan memberikan kata kunci yang agak sulit untuk ditebak juga. Ingat, jangan percaya bahwa semua yang ada di dalam satu jaringan itu adalah orang baik, bisa saja yang terlihat baik itu adalah orang yang sedang mengakses data-data kamu. Kalau saya? Ya orang baiklah 😀

Continue Reading