আপনি এই নিবন্ধে পড়তে পারেন, আমি সম্প্রতি আমার ইমেল সার্ভারের সাথে কিছু সমস্যায় পড়েছিলাম এবং আমাজনের সাধারণ ইমেল পরিষেবা (এসইএস) ইমেল প্রশাসনকে আউটসোর্স করার সিদ্ধান্ত নিয়েছিলাম।
সেই সমাধানের সমস্যাটি ছিল যে আমার কাছে এসইএস একটি S3 বালতিতে নতুন বার্তা সংরক্ষণ ছিল এবং S3 বাকেটের মধ্যে ফাইলগুলি পড়ার জন্য AWS ম্যানেজমেন্ট কনসোল ব্যবহার করা সত্যিই দ্রুত বাসি হয়ে যায়।
তাই আমি নতুন বার্তা ডাউনলোড, সঠিকভাবে সংরক্ষণ এবং দেখার প্রক্রিয়া স্বয়ংক্রিয় করতে একটি ব্যাশ স্ক্রিপ্ট লেখার সিদ্ধান্ত নিয়েছি।
যখন আমি আমার উবুন্টু লিনাক্স ডেস্কটপে ব্যবহারের জন্য এই স্ক্রিপ্টটি লিখেছি, তখন এটিকে লিনাক্সের জন্য উইন্ডোজ সাবসিস্টেমের মাধ্যমে একটি macOS বা Windows 10 সিস্টেমে কাজ করতে খুব বেশি ঝাঁকুনির প্রয়োজন হবে না৷
এখানে সম্পূর্ণ স্ক্রিপ্ট সব এক টুকরা. আপনি এটি দেখার জন্য কয়েক মুহূর্ত সময় নেওয়ার পরে, আমি আপনাকে একে একে একে একে হাঁটব৷
#!/bin/bash
# Retrieve new messages from S3 and save to tmpemails/ directory:
aws s3 cp \
--recursive \
s3://bucket-name/ \
/home/david/s3-emails/tmpemails/ \
--profile myaccount
# Set location variables:
tmp_file_location=/home/david/s3-emails/tmpemails/*
base_location=/home/david/s3-emails/emails/
# Create new directory to store today's messages:
today=$(date +"%m_%d_%Y")
[[ -d ${base_location}/"$today" ]] || mkdir ${base_location}/"$today"
# Give the message files readable names:
for FILE in $tmp_file_location
do
mv $FILE ${base_location}/${today}/email$(rand)
done
# Open new files in Gedit:
for NEWFILE in ${base_location}/${today}/*
do
gedit $NEWFILE
done
আমার S3 বালতিতে বর্তমানে থাকা যেকোনো বার্তা ডাউনলোড করার জন্য আমরা একক কমান্ড দিয়ে শুরু করব (যাই হোক, আমি আমার গোপনীয়তা রক্ষা করতে বালতি এবং অন্যান্য ফাইল সিস্টেমের নাম এবং প্রমাণীকরণের বিবরণ পরিবর্তন করেছি)।
aws s3 cp \
--recursive \
s3://bucket-name/ \
/home/david/s3-emails/tmpemails/ \
--profile myaccount
অবশ্যই, এটি শুধুমাত্র তখনই কাজ করবে যদি আপনি ইতিমধ্যেই আপনার স্থানীয় সিস্টেমের জন্য AWS CLI ইনস্টল এবং কনফিগার করে থাকেন। আপনি যদি ইতিমধ্যে না করে থাকেন তবে এখনই এটি করার সময়৷
৷cp কমান্ড মানে "কপি," --পুনরাবৃত্ত CLI কে একাধিক বস্তুতেও অপারেশন প্রয়োগ করতে বলে, s3://bucket-name আমার বালতির দিকে নির্দেশ করে (আপনার বালতির নাম স্পষ্টতই আলাদা হবে), /home/david... লাইন হল পরম ফাইল সিস্টেম ঠিকানা যেখানে আমি বার্তাগুলি কপি করতে চাই, এবং --প্রোফাইল আর্গুমেন্ট CLI কে বলে যে আমি আমার একাধিক AWS অ্যাকাউন্টের কোনটি উল্লেখ করছি৷
৷পরবর্তী বিভাগে দুটি ভেরিয়েবল সেট করা হয়েছে যা স্ক্রিপ্টের বাকি অংশের মাধ্যমে ফাইল সিস্টেমের অবস্থানগুলি নির্দিষ্ট করা আমার জন্য অনেক সহজ করে তুলবে৷
tmp_file_location=/home/david/s3-emails/tmpemails/*
base_location=/home/david/s3-emails/emails/
tmp_file_location এর মান কেমন তা লক্ষ্য করুন পরিবর্তনশীল একটি তারকাচিহ্ন দিয়ে শেষ হয়। কারণ আমি ফাইলগুলির মধ্যে উল্লেখ করতে চাই৷ সেই ডিরেক্টরিটি, ডাইরেক্টরির চেয়ে।
পরে বার্তাগুলি খুঁজে পাওয়া আমার জন্য সহজ করার জন্য আমি .../emails/ অনুক্রমের মধ্যে একটি নতুন স্থায়ী ডিরেক্টরি তৈরি করব। এই নতুন ডিরেক্টরির নাম হবে বর্তমান তারিখ।
today=$(date +"%m_%d_%Y")
[[ -d ${base_location}/"$today" ]] || mkdir ${base_location}/"$today"
আমি প্রথমে আজ নামে একটি নতুন শেল ভেরিয়েবল তৈরি করি যেটি তারিখ +"%m_%d_%Y" এর আউটপুট দ্বারা পপুলেট করা হবে আদেশ তারিখ নিজেই সম্পূর্ণ তারিখ/টাইমস্ট্যাম্প আউটপুট করে, কিন্তু যা অনুসরণ করে ("%m_%d_%Y" ) সেই আউটপুটটিকে একটি সহজ এবং আরও পাঠযোগ্য বিন্যাসে সম্পাদনা করে৷
তারপরে আমি সেই নামটি ব্যবহার করে সরাসরি একটি অস্তিত্বের জন্য পরীক্ষা করি - যা নির্দেশ করবে যে আমি ইতিমধ্যেই সেই দিনে ইমেল পেয়েছি এবং তাই, ডিরেক্টরিটি পুনরায় তৈরি করার দরকার নেই। যদি এই ধরনের একটি ডিরেক্টরি না করে বিদ্যমান (||), তারপর mkdir এটা আমার জন্য তৈরি করবে। আপনি যদি এই পরীক্ষাটি না চালান, আপনার কমান্ড বিরক্তিকর ত্রুটি বার্তা ফেরত দিতে পারে৷
৷যেহেতু Amazon SES আমার S3 বালতিতে ড্রপ করা প্রতিটি বার্তাকে কুৎসিত এবং অপঠিত নাম দেয়, তাই আমি এখন তাদের নতুন বাড়িতে নিয়ে যাওয়ার সময় গতিশীলভাবে তাদের নাম পরিবর্তন করব (আমি এইমাত্র তৈরি তারিখের ডিরেক্টরিতে) .
for FILE in $tmp_file_location
do
mv $FILE ${base_location}/${today}/email$(rand)
done
এর জন্য...করুন... সম্পন্ন৷ লুপ $tmp_file_location দ্বারা উপস্থাপিত ডিরেক্টরির প্রতিটি ফাইল পড়বে ভেরিয়েবল এবং তারপর এটিকে আমার তৈরি করা ডিরেক্টরিতে নিয়ে যান ($base_location দ্বারা উপস্থাপিত $আজ এর বর্তমান মান ছাড়াও পরিবর্তনশীল )
একই অপারেশনের অংশ হিসাবে, আমি এটির নতুন নাম দেব, স্ট্রিং "email " এর পরে র্যান্ড দ্বারা উত্পন্ন একটি র্যান্ডম সংখ্যা৷ আদেশ আপনাকে একটি র্যান্ডম নম্বর জেনারেটর ইনস্টল করতে হতে পারে:এটি হবে যথাযথ ইনস্টল র্যান্ড উবুন্টুতে।
একটি count=1...count=$((count+1)) ব্যবহার করে ক্রমবর্ধমান সংক্ষিপ্ত, অনুক্রমিক সংখ্যা দ্বারা পৃথক করা স্ক্রিপ্টের একটি পূর্ববর্তী সংস্করণ নামগুলি তৈরি করেছে। এর জন্য এর মধ্যে যুক্তি লুপ. যতক্ষণ না আমি একই দিনে একাধিক ব্যাচের বার্তা না পাই ততক্ষণ এটি ঠিক কাজ করেছিল। যদি আমি করি, তাহলে নতুন বার্তাগুলি সেই দিনের ডিরেক্টরিতে পুরানো ফাইলগুলিকে ওভাররাইট করবে।
আমি মনে করি এটা গাণিতিকভাবে সম্ভব যে আমার র্যান্ড কমান্ড দুটি ফাইলে ওভারল্যাপিং নম্বর বরাদ্দ করতে পারে তবে ডিফল্ট পরিসর র্যান্ড ব্যবহার 1 থেকে 32,576 এর মধ্যে, এটি একটি ঝুঁকি যা আমি নিতে ইচ্ছুক৷
এই মুহুর্তে, আমার পাঠানো প্রতিটি নতুন বার্তার জন্য email3039, email25343, ইত্যাদি নাম সহ নতুন ডিরেক্টরিতে ফাইল থাকতে হবে।
গাছ চালানো হচ্ছে আমার নিজস্ব সিস্টেমে কমান্ড আমাকে দেখায় যে আমার 02_27_2020 ডিরেক্টরিতে পাঁচটি বার্তা সংরক্ষিত হয়েছে এবং আরও একটি 02_28_2020 এ (এই ফাইলগুলি আমার স্ক্রিপ্টের পুরানো সংস্করণ ব্যবহার করে তৈরি করা হয়েছে, তাই সেগুলিকে ক্রমানুসারে সংখ্যা করা হয়েছে)।
বর্তমানে tmpemails - এ কোন ফাইল নেই এর কারণ হল mv কমান্ড ফাইলগুলিকে তাদের নতুন অবস্থানে নিয়ে যায়, কিছুই পিছনে রাখে না।
$ tree
.
├── emails
│ ├── 02_27_2020
│ │ ├── email1
│ │ ├── email2
│ │ ├── email3
│ │ ├── email4
│ │ ├── email5
│ └── 02_28_2020
│ └── email1
└── tmpemails
স্ক্রিপ্টের চূড়ান্ত বিভাগটি আমার প্রিয় ডেস্কটপ পাঠ্য সম্পাদক (Gedit) এ প্রতিটি নতুন বার্তা খোলে। এটি একটি অনুরূপ for...do...done ব্যবহার করে লুপ, এইবার নতুন ডিরেক্টরিতে প্রতিটি ফাইলের নাম পড়া ("আজ ব্যবহার করে উল্লেখ করা হয়েছে) " কমান্ড) এবং তারপরে গেডিটে ফাইলটি খুলুন। ডিরেক্টরি অবস্থানের শেষে আমি যে তারকাচিহ্নটি যুক্ত করেছি তা নোট করুন।
for NEWFILE in ${base_location}/${today}/*
do
gedit $NEWFILE
done
আরও একটা কাজ বাকি আছে। যদি আমি আমার S3 বালতি পরিষ্কার না করি, আমি প্রতিবার স্ক্রিপ্ট চালানোর সময় এটি জমা হওয়া সমস্ত বার্তা ডাউনলোড করবে। এটি পরিচালনা করা ধীরে ধীরে কঠিন করে তুলবে।
সুতরাং, আমার নতুন বার্তাগুলি সফলভাবে ডাউনলোড করার পরে, আমি বালতির সমস্ত ফাইল মুছে ফেলার জন্য এই সংক্ষিপ্ত স্ক্রিপ্টটি চালাচ্ছি:
#!/bin/bash
# Delete all existing emails
aws s3 rm --recursive s3://bucket-name/ --profile myaccount